nypl_ruby_util 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6c6483ada755b5092548e42bd0bc6f699af6c642d8863e1488fabb78345df59
4
- data.tar.gz: 343534e1ca8672cb04552aa958a22e98211bfb00fb8996698b28e2ed78f97368
3
+ metadata.gz: da7aea4ba395b2c168d1a664bd89c77baa98ac97fdd8bee6265ddf3b2d79e444
4
+ data.tar.gz: b165cc02c1e6d4ae1c7af762101c3c1edcd0b227c5d3b37af2500d75c4560c87
5
5
  SHA512:
6
- metadata.gz: e3bdaa197c01456afae42a28dd4d6c8e95e4f9e7d402ebe3e54f4c4980f2daee7517b8be4c1fb19f62cea77f0a10b7bfafdcf03c04dfc1153f79ca576e5c7cc6
7
- data.tar.gz: 3a48402301714fa235c8ed865f99e1582aa19064791d099a2d47510cbcd99224852593d14aceb29a998643c37f97386cc94307beda6c336d5b4b6b31aac56c5b
6
+ metadata.gz: 4c2b0df18c21d509453f8cd84ac26bd4c376d147ae355b1e1ee36a417b9307a4ccfe3afba15aa5b89e1239b51924e2ed780e0a0afbd86b3a03f95d6a25678342
7
+ data.tar.gz: 28237a7cae538c63046265761bb03c8c4e955b6970c7d0dbce69e658e9b074da919f7cfb70cc9b1e943b489690b4644edc7a32935c67112eb188425f5099fa1b
@@ -0,0 +1,152 @@
1
+ require 'aws-sdk-lambda'
2
+ require 'aws-sdk-cloudwatchevents'
3
+ require 'yaml'
4
+
5
+ # Utility class for running rake methods
6
+ class DeployHelper
7
+ attr_reader(
8
+ :travis_branch,
9
+ :aws_access_key_id,
10
+ :aws_secret_access_key,
11
+ :aws_configuration,
12
+ :region,
13
+ :lambda_client,
14
+ :yaml,
15
+ :lambda_config,
16
+ :function_name,
17
+ :event
18
+ )
19
+
20
+ def initialize
21
+ @travis_branch = ENV['TRAVIS_BRANCH'].upcase
22
+ @travis_branch = ['MAIN', 'MASTER'].include?(@travis_branch) ? 'PRODUCTION' : @travis_branch
23
+ @aws_access_key_id = ENV["AWS_ACCESS_KEY_ID_#{travis_branch}"]
24
+ @aws_secret_access_key = ENV["AWS_SECRET_ACCESS_KEY_#{travis_branch}"]
25
+ @yaml = YAML.safe_load(File.read('.travis.yml'))
26
+ @lambda_config = yaml['deploy'].find { |conf| name_matches_branch?(conf['function_name'], travis_branch) }
27
+ @region = @lambda_config['region']
28
+ @function_name = @lambda_config['function_name']
29
+ @aws_configuration = {
30
+ region: region,
31
+ access_key_id: aws_access_key_id,
32
+ secret_access_key: aws_secret_access_key
33
+ }
34
+ p 'using configuration: ', aws_configuration
35
+ p 'lambda config: ', lambda_config
36
+ @lambda_client = Aws::Lambda::Client.new(aws_configuration) if configured?
37
+ end
38
+
39
+ def configured?
40
+ aws_access_key_id && aws_secret_access_key && region
41
+ end
42
+
43
+ def name_matches_branch?(name, branch)
44
+ downcase_name = name.downcase
45
+ downcase_branch = branch.downcase
46
+ variants = [
47
+ ['dev', 'development'],
48
+ ['qa'],
49
+ ['main', 'master', 'production', 'prod'],
50
+ ]
51
+ variants.any? do |group|
52
+ group.any? { |variant| downcase_name.include? variant }\
53
+ && group.any? { |variant| downcase_branch.include?(variant) }
54
+ end
55
+ end
56
+
57
+ def update_lambda_configuration
58
+ unless configured? && lambda_config
59
+ p 'insufficient configuration'
60
+ return nil
61
+ end
62
+
63
+ updated_lambda_configuration = {
64
+ function_name: function_name,
65
+ vpc_config: lambda_config['vpc_config'],
66
+ environment: lambda_config['environment'],
67
+ layers: lambda_config['layers']
68
+ }
69
+ updated_lambda_configuration[:function_name] = function_name
70
+ p 'updating_function_configuration with: ', updated_lambda_configuration
71
+ update_configuration_resp = lambda_client.update_function_configuration(updated_lambda_configuration)
72
+ p 'update_configuration_resp: ', update_configuration_resp
73
+ end
74
+
75
+ def update_event
76
+ unless lambda_config['event']
77
+ p 'no event config'
78
+ return nil
79
+ end
80
+
81
+ @event = lambda_config['event']
82
+ if event['event_source_arn']
83
+ add_event_source
84
+ elsif event['schedule_expression']
85
+ add_cron
86
+ end
87
+ end
88
+
89
+ def add_event_source
90
+ existing_events = lambda_client.list_event_source_mappings({
91
+ function_name: function_name
92
+ }).event_source_mappings
93
+
94
+ existing_events.each do |existing_event|
95
+ p 'deleting event with uuid: ', existing_event.uuid, 'and arn: ', existing_event.event_source_arn
96
+ lambda_client.delete_event_source_mapping({ uuid: existing_event.uuid })
97
+ end
98
+ event_to_create = event.map { |k, v| [k.to_sym, v] }.to_h
99
+ event_to_create[:function_name] = function_name
100
+ p 'creating event: ', event_to_create
101
+ create_resp = lambda_client.create_event_source_mapping(event_to_create)
102
+ p 'created: ', create_resp
103
+ end
104
+
105
+ def add_cron
106
+ ## create the event
107
+ events_client = Aws::CloudWatchEvents::Client.new(aws_configuration)
108
+ schedule_expression = event['schedule_expression']
109
+ rule_name = "#{function_name}-rule"
110
+ p 'rule_name: ', rule_name, 'schedule_expression: ', schedule_expression
111
+ events_client.put_rule(name: rule_name, schedule_expression: schedule_expression)
112
+
113
+ ## next we have to connect the event to the lambda
114
+ ## the first step is to get the lambda
115
+
116
+ return 'missing function_name' unless function_name
117
+
118
+ p 'getting lambda with function name', function_name
119
+ lambda_resp = lambda_client.get_function(function_name: function_name).configuration
120
+ arn = lambda_resp.function_arn
121
+
122
+ ## next figure out if the lambda already has granted cloudwatch
123
+ ## permission to invoke
124
+ begin
125
+ policy_resp = lambda_client.get_policy(function_name: function_name)
126
+ unless policy_resp.policy.include?("#{function_name}-permission")
127
+ add_policy = true
128
+ else
129
+ p 'lambda already has permission'
130
+ end
131
+ rescue Aws::Lambda::Errors::ResourceNotFoundException
132
+ add_policy = true
133
+ p 'no policy'
134
+ end
135
+
136
+ ## if not, add permission to invoke
137
+ if add_policy
138
+ permission = lambda_client.add_permission({
139
+ function_name: function_name,
140
+ principal: 'events.amazonaws.com',
141
+ statement_id: "#{function_name}-permission",
142
+ action: 'lambda:InvokeFunction'
143
+ })
144
+ p 'permission: ', permission
145
+ end
146
+
147
+ ## finally we can tell the event to invoke the lambda
148
+ target_id = "#{function_name}-lambda"
149
+ p 'putting targets ', 'rule: ', rule_name, 'target_id: ', target_id, 'arn: ', arn
150
+ events_client.put_targets(rule: rule_name, targets: [{ id: target_id, arn: arn }])
151
+ end
152
+ end
@@ -6,6 +6,7 @@ require_relative 'directory'
6
6
  require_relative 'nypl_avro'
7
7
  require_relative 'errors'
8
8
  require_relative 'kinesis_client'
9
+ require_relative 'deploy_helper'
9
10
 
10
11
  class NYPLRubyUtil
11
12
  class SierraApiClient < SierraApiClient
@@ -25,4 +26,7 @@ class NYPLRubyUtil
25
26
 
26
27
  class KinesisClient < KinesisClient
27
28
  end
29
+
30
+ class DeployHelper < DeployHelper
31
+ end
28
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nypl_ruby_util
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Appel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-13 00:00:00.000000000 Z
11
+ date: 2020-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avro
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.36.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk-lambda
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: aws-sdk-cloudwatchevents
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: nypl_log_formatter
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -86,6 +114,7 @@ executables: []
86
114
  extensions: []
87
115
  extra_rdoc_files: []
88
116
  files:
117
+ - lib/deploy_helper.rb
89
118
  - lib/directory.rb
90
119
  - lib/errors.rb
91
120
  - lib/kinesis_client.rb