lambda_wrap 0.26.0 → 0.26.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fb6c46e052f6c1185e9810f52f51992a1973c2aa
4
- data.tar.gz: c4e14dda2fddb4fff94d757e877c6ce6ce0944ad
3
+ metadata.gz: 607ac6f7897fd02734b7becfde1a0433537d0834
4
+ data.tar.gz: 7a99c2c22b98f5ced65293bfcbfbd0ce8777310c
5
5
  SHA512:
6
- metadata.gz: c5e2cc04e1c7960382274252074adc6f2e0639d9f32076d13bd523c6a4808a96f691ffd0524e739fe8b3da77e4da4e04a7c8ef68cfe529bf908002a60f4c7e7c
7
- data.tar.gz: 342207c240ef3003382d97b6bbc1728e5894fd984f31efb87b452519c5c9121d8ee5f48a1a531997424b009bb6aaf6435dace12280078c96f2477c08609feff0
6
+ metadata.gz: 384e233666fdac0fe44c7c3ba03ad69ec02b9c418f6a45b39ac20b2b51048850215cad0f13076aa610227be4389d4d9bdf5db80a662b4c9202353fdd31d5bd7b
7
+ data.tar.gz: 09c693b615ed2c22ab7a72527afd01439d8d7e1dd55fe4003e2ba1c7760bf581499f3dca3d97dc640da0033f93c1d569776ecdc8d3cdba8765110c63fb4cb5dc
@@ -1,203 +1,203 @@
1
- require 'aws-sdk'
2
-
3
- module LambdaWrap
4
- # The ApiGatewayManager simplifies downloading the aws-apigateway-importer binary,
5
- # importing a {swagger configuration}[http://swagger.io], and managing API Gateway stages.
1
+ require 'aws-sdk'
2
+
3
+ module LambdaWrap
4
+ # The ApiGatewayManager simplifies downloading the aws-apigateway-importer binary,
5
+ # importing a {swagger configuration}[http://swagger.io], and managing API Gateway stages.
6
6
  # Added functionality to create APIGateway deom Swagger file. Thsi API is useful for gateway's having
7
- #custom authorization.
8
-
9
- # Note: The concept of an environment of the LambdaWrap gem matches a stage in AWS ApiGateway terms.
10
- class ApiGatewayManager
11
- #
12
- # The constructor does some basic setup
13
- # * Validating basic AWS configuration
14
- # * Creating the underlying client to interact with the AWS SDK.
15
- # * Defining the temporary path of the api-gateway-importer jar file
16
- def initialize
17
- # AWS api gateway client
18
- @client = Aws::APIGateway::Client.new
19
- # path to apigateway-importer jar
20
- @jarpath = File.join(Dir.tmpdir, 'aws-apigateway-importer-1.0.3-SNAPSHOT-jar-with-dependencies.jar')
21
- @versionpath = File.join(Dir.tmpdir, 'aws-apigateway-importer-1.0.3-SNAPSHOT-jar-with-dependencies.s3version')
22
- end
23
-
24
- ##
25
- # Downloads the aws-apigateway-importer jar from an S3 bucket.
26
- # This is a workaround since aws-apigateway-importer does not provide a binary.
27
- # Once a binary is available on the public internet, we'll start using this instead
28
- # of requiring users of this gem to upload their custom binary to an S3 bucket.
29
- #
30
- # *Arguments*
31
- # [s3_bucket] An S3 bucket from where the aws-apigateway-importer binary can be downloaded.
32
- # [s3_key] The path (key) to the aws-apigateay-importer binary on the s3 bucket.
33
- def download_apigateway_importer(s3_bucket, s3_key)
34
- s3 = Aws::S3::Client.new
35
-
36
- # current version
37
- current_s3_version = File.open(@versionpath, 'rb').read if File.exist?(@versionpath)
38
-
39
- # online s3 version
40
- desired_s3_version = s3.head_object(bucket: s3_bucket, key: s3_key).version_id
41
-
42
- # compare local with remote version
43
- if current_s3_version != desired_s3_version || !File.exist?(@jarpath)
44
- puts "Downloading aws-apigateway-importer jar with S3 version #{desired_s3_version}"
45
- s3.get_object(response_target: @jarpath, bucket: s3_bucket, key: s3_key)
46
- File.write(@versionpath, desired_s3_version)
47
- end
48
- end
49
-
50
- ##
51
- # Sets up the API gateway by searching whether the API Gateway already exists
52
- # and updates it with the latest information from the swagger file.
53
- #
54
- # *Arguments*
55
- # [api_name] The name of the API to which the swagger file should be applied to.
56
- # [env] The environment where it should be published (which is matching an API gateway stage)
57
- # [swagger_file] A handle to a swagger file that should be used by aws-apigateway-importer
58
- # [api_description] The description of the API to be displayed.
59
- # [stage_variables] A Hash of stage variables to be deployed with the stage. Adds an 'environment' by default.
60
- # [region] The region to deploy the API. Defaults to what is set as an environment variable.
61
- def setup_apigateway(api_name, env, swagger_file, api_description = 'Deployed with LambdaWrap',
62
- stage_variables = {}, region = ENV['AWS_REGION'])
63
- # ensure API is created
64
- api_id = get_existing_rest_api(api_name)
65
- api_id = setup_apigateway_create_rest_api(api_name, api_description) unless api_id
66
-
67
- # create resources
68
- setup_apigateway_create_resources(api_id, swagger_file, region)
69
-
70
- # create stages
71
- stage_variables.store('environment', env)
72
- create_stages(api_id, env, stage_variables)
73
-
74
- # return URI of created stage
75
- "https://#{api_id}.execute-api.#{region}.amazonaws.com/#{env}/"
76
- end
77
-
78
- ##
79
- # Shuts down an environment from the API Gateway. This basically deletes the stage
80
- # from the API Gateway, but does not delete the API Gateway itself.
81
- #
82
- # *Argument*
83
- # [api_name] The name of the API where the environment should be shut down.
84
- # [env] The environment (matching an API Gateway stage) to shutdown.
85
- def shutdown_apigateway(api_name, env)
86
- api_id = get_existing_rest_api(api_name)
87
- delete_stage(api_id, env)
88
- end
89
-
90
- ##
91
- # Gets the ID of an existing API Gateway api, or nil if it doesn't exist
92
- #
93
- # *Arguments*
94
- # [api_name] The name of the API to be checked for existance
95
- def get_existing_rest_api(api_name)
96
- apis = @client.get_rest_apis(limit: 500).data
97
- api = apis.items.select { |a| a.name == api_name }.first
98
-
99
- return api.id if api
100
- # nil is returned otherwise
101
- end
102
-
103
- ##
104
- # Creates the API with a given name and returns the id
105
- #
106
- # *Arguments*
107
- # [api_name] The name of the API to be created
108
- def setup_apigateway_create_rest_api(api_name, api_description)
109
- puts 'Creating API with name ' + api_name
110
- api = @client.create_rest_api(name: api_name, description: api_description)
111
- api.id
112
- end
113
-
114
- ##
115
- # Invokes the aws-apigateway-importer jar with the required parameter
116
- #
117
- # *Arguments*
118
- # [api_id] The AWS ApiGateway id where the swagger file should be applied to.
119
- # [swagger_file] The handle to a swagger definition file that should be imported into API Gateway
120
- def setup_apigateway_create_resources(api_id, swagger_file, region)
121
- raise 'API ID not provided' unless api_id
122
-
123
- cmd = "java -jar #{@jarpath} --update #{api_id} --region #{region} #{swagger_file}"
124
- raise 'API gateway not created' unless system(cmd)
125
- end
126
-
127
- ##
128
- # Creates a stage of the currently set resources
129
- #
130
- # *Arguments*
131
- # [api_id] The AWS ApiGateway id where the stage should be created at.
132
- # [env] The environment (which matches the stage in API Gateway) to create.
133
- def create_stages(api_id, env, stage_variables)
134
- deployment_description = 'Deployment of service to ' + env
135
- deployment = @client.create_deployment(
136
- rest_api_id: api_id, stage_name: env, cache_cluster_enabled: false, description: deployment_description,
137
- variables: stage_variables
138
- ).data
139
- puts deployment
140
- end
141
-
142
- ##
143
- # Deletes a stage of the API Gateway
144
- #
145
- # *Arguments*
146
- # [api_id] The AWS ApiGateway id from which the stage should be deleted from.
147
- # [env] The environment (which matches the stage in API Gateway) to delete.
148
- def delete_stage(api_id, env)
149
- begin
150
- @client.delete_stage({rest_api_id: api_id, stage_name: env})
151
- puts 'Deleted API gateway stage ' + env
152
- rescue Aws::APIGateway::Errors::NotFoundException
153
- puts 'API Gateway stage ' + env + ' does not exist. Nothing to delete.'
154
- end
155
- end
156
-
157
- # Generate or Update the API Gateway by using the swagger file.
7
+ # custom authorization.
8
+
9
+ # Note: The concept of an environment of the LambdaWrap gem matches a stage in AWS ApiGateway terms.
10
+ class ApiGatewayManager
11
+ #
12
+ # The constructor does some basic setup
13
+ # * Validating basic AWS configuration
14
+ # * Creating the underlying client to interact with the AWS SDK.
15
+ # * Defining the temporary path of the api-gateway-importer jar file
16
+ def initialize
17
+ # AWS api gateway client
18
+ @client = Aws::APIGateway::Client.new
19
+ # path to apigateway-importer jar
20
+ @jarpath = File.join(Dir.tmpdir, 'aws-apigateway-importer-1.0.3-SNAPSHOT-jar-with-dependencies.jar')
21
+ @versionpath = File.join(Dir.tmpdir, 'aws-apigateway-importer-1.0.3-SNAPSHOT-jar-with-dependencies.s3version')
22
+ end
23
+
24
+ ##
25
+ # Downloads the aws-apigateway-importer jar from an S3 bucket.
26
+ # This is a workaround since aws-apigateway-importer does not provide a binary.
27
+ # Once a binary is available on the public internet, we'll start using this instead
28
+ # of requiring users of this gem to upload their custom binary to an S3 bucket.
29
+ #
30
+ # *Arguments*
31
+ # [s3_bucket] An S3 bucket from where the aws-apigateway-importer binary can be downloaded.
32
+ # [s3_key] The path (key) to the aws-apigateay-importer binary on the s3 bucket.
33
+ def download_apigateway_importer(s3_bucket, s3_key)
34
+ s3 = Aws::S3::Client.new
35
+
36
+ # current version
37
+ current_s3_version = File.open(@versionpath, 'rb').read if File.exist?(@versionpath)
38
+
39
+ # online s3 version
40
+ desired_s3_version = s3.head_object(bucket: s3_bucket, key: s3_key).version_id
41
+
42
+ # compare local with remote version
43
+ if current_s3_version != desired_s3_version || !File.exist?(@jarpath)
44
+ puts "Downloading aws-apigateway-importer jar with S3 version #{desired_s3_version}"
45
+ s3.get_object(response_target: @jarpath, bucket: s3_bucket, key: s3_key)
46
+ File.write(@versionpath, desired_s3_version)
47
+ end
48
+ end
49
+
50
+ ##
51
+ # Sets up the API gateway by searching whether the API Gateway already exists
52
+ # and updates it with the latest information from the swagger file.
53
+ #
54
+ # *Arguments*
55
+ # [api_name] The name of the API to which the swagger file should be applied to.
56
+ # [env] The environment where it should be published (which is matching an API gateway stage)
57
+ # [swagger_file] A handle to a swagger file that should be used by aws-apigateway-importer
58
+ # [api_description] The description of the API to be displayed.
59
+ # [stage_variables] A Hash of stage variables to be deployed with the stage. Adds an 'environment' by default.
60
+ # [region] A string representing the region to deploy the API. Defaults to what is set as an environment variable.
61
+ def setup_apigateway(api_name, env, swagger_file, api_description = 'Deployed with LambdaWrap',
62
+ stage_variables = {}, region = ENV['AWS_REGION'])
63
+ # ensure API is created
64
+ api_id = get_existing_rest_api(api_name)
65
+ api_id = setup_apigateway_create_rest_api(api_name, api_description) unless api_id
66
+
67
+ # create resources
68
+ setup_apigateway_create_resources(api_id, swagger_file, region)
69
+
70
+ # create stages
71
+ stage_variables.store('environment', env)
72
+ create_stages(api_id, env, stage_variables)
73
+
74
+ # return URI of created stage
75
+ "https://#{api_id}.execute-api.#{region}.amazonaws.com/#{env}/"
76
+ end
77
+
78
+ ##
79
+ # Shuts down an environment from the API Gateway. This basically deletes the stage
80
+ # from the API Gateway, but does not delete the API Gateway itself.
81
+ #
82
+ # *Argument*
83
+ # [api_name] The name of the API where the environment should be shut down.
84
+ # [env] The environment (matching an API Gateway stage) to shutdown.
85
+ def shutdown_apigateway(api_name, env)
86
+ api_id = get_existing_rest_api(api_name)
87
+ delete_stage(api_id, env)
88
+ end
89
+
90
+ ##
91
+ # Gets the ID of an existing API Gateway api, or nil if it doesn't exist
92
+ #
93
+ # *Arguments*
94
+ # [api_name] The name of the API to be checked for existance
95
+ def get_existing_rest_api(api_name)
96
+ apis = @client.get_rest_apis(limit: 500).data
97
+ api = apis.items.select { |a| a.name == api_name }.first
98
+
99
+ return api.id if api
100
+ # nil is returned otherwise
101
+ end
102
+
103
+ ##
104
+ # Creates the API with a given name using the SDK and returns the id
105
+ #
106
+ # *Arguments*
107
+ # [api_name] A String representing the name of the API Gateway Object to be created
108
+ # [api_description] A String representing the description of the API
109
+ def setup_apigateway_create_rest_api(api_name, api_description)
110
+ puts 'Creating API with name ' + api_name
111
+ api = @client.create_rest_api(name: api_name, description: api_description)
112
+ api.id
113
+ end
114
+
115
+ ##
116
+ # Invokes the aws-apigateway-importer jar with the required parameter
117
+ #
118
+ # *Arguments*
119
+ # [api_id] The AWS ApiGateway id where the swagger file should be applied to.
120
+ # [swagger_file] The handle to a swagger definition file that should be imported into API Gateway
121
+ # [region] A string representing the target region to deploy the API
122
+ def setup_apigateway_create_resources(api_id, swagger_file, region)
123
+ raise 'API ID not provided' unless api_id
124
+
125
+ cmd = "java -jar #{@jarpath} --update #{api_id} --region #{region} #{swagger_file}"
126
+ raise 'API gateway not created' unless system(cmd)
127
+ end
128
+
129
+ ##
130
+ # Creates a stage of the currently set resources
131
+ #
132
+ # *Arguments*
133
+ # [api_id] The AWS ApiGateway id where the stage should be created at.
134
+ # [env] The environment (which matches the stage in API Gateway) to create.
135
+ # [stage_variables] A Hash of stage variables to deploy with the stage
136
+ def create_stages(api_id, env, stage_variables)
137
+ deployment_description = 'Deployment of service to ' + env
138
+ deployment = @client.create_deployment(
139
+ rest_api_id: api_id, stage_name: env, cache_cluster_enabled: false, description: deployment_description,
140
+ variables: stage_variables
141
+ ).data
142
+ puts deployment
143
+ end
144
+
145
+ ##
146
+ # Deletes a stage of the API Gateway
147
+ #
148
+ # *Arguments*
149
+ # [api_id] The AWS ApiGateway id from which the stage should be deleted from.
150
+ # [env]The environment (which matches the stage in API Gateway) to delete.
151
+ def delete_stage(api_id, env)
152
+ @client.delete_stage(rest_api_id: api_id, stage_name: env)
153
+ puts 'Deleted API gateway stage ' + env
154
+ rescue Aws::APIGateway::Errors::NotFoundException
155
+ puts 'API Gateway stage ' + env + ' does not exist. Nothing to delete.'
156
+ end
157
+
158
+ ##
159
+ # Generate or Update the API Gateway by using the swagger file and the SDK importer
160
+ #
158
161
  # *Arguments*
159
162
  # [api_name] API Gateway name
160
163
  # [local_swagger_file] Path of the local swagger file
161
- # [env] Environment
164
+ # [env] Environment identifier
165
+ # [stage_variables] hash of stage variables
162
166
  def setup_apigateway_by_swagger_file(api_name, local_swagger_file, env, stage_variables = {})
163
-
164
- #If API gateway with the name is already present then update it else create a new one
167
+ # If API gateway with the name is already present then update it else create a new one
165
168
  api_id = get_existing_rest_api(api_name)
166
- swagger_file_content = File.read(local_swagger_file)
169
+ swagger_file_content = File.read(local_swagger_file)
167
170
 
168
171
  gateway_response = nil
169
- if (api_id.nil?)
170
- #Create a new APIGateway
172
+ if api_id.nil?
173
+ # Create a new APIGateway
171
174
  gateway_response = @client.import_rest_api(fail_on_warnings: false, body: swagger_file_content)
172
175
  else
173
- #Update the exsiting APIgateway. By Merge the exsisting gateway will be merged with the new one supplied in teh Swagger file.
174
- gateway_response = @client.put_rest_api(rest_api_id: api_id, mode: 'merge', fail_on_warnings: false, body: swagger_file_content)
176
+ # Update the exsiting APIgateway. By Merge the exsisting gateway will be merged with the new
177
+ # one supplied in the Swagger file.
178
+ gateway_response = @client.put_rest_api(rest_api_id: api_id, mode: 'merge', fail_on_warnings: false,
179
+ body: swagger_file_content)
175
180
  end
176
181
 
177
- if (gateway_response.nil? && gateway_response.id.nil?)
178
- raise "Failed to create API gateway with name #{api_name}"
182
+ raise "Failed to create API gateway with name #{api_name}" if gateway_response.nil? && gateway_response.id.nil?
183
+
184
+ if api_id.nil?
185
+ puts "Created api gateway #{api_name} having id #{gateway_response.id}"
179
186
  else
180
- if (api_id.nil?)
181
- puts "Created api gateway #{api_name} having id #{gateway_response.id}"
182
- else
183
- puts "Updated api gateway #{api_name} having id #{gateway_response.id}"
184
- end
187
+ puts "Updated api gateway #{api_name} having id #{gateway_response.id}"
185
188
  end
186
189
 
187
- #Deploy the service
188
- deployment_description = 'Deployment of service to ' + env
190
+ # Deploy the service
189
191
  stage_variables.store('environment', env)
190
192
  create_stages(gateway_response.id, env, stage_variables)
191
193
 
192
194
  service_uri = "https://#{gateway_response.id}.execute-api.#{ENV['AWS_REGION']}.amazonaws.com/#{env}/"
193
195
  puts "Service deployed at #{service_uri}"
194
196
 
195
- return service_uri
196
-
197
+ service_uri
197
198
  end
198
199
 
199
-
200
- private :get_existing_rest_api, :setup_apigateway_create_rest_api, :setup_apigateway_create_resources,
201
- :create_stages, :delete_stage
202
- end
203
- end
200
+ private :get_existing_rest_api, :setup_apigateway_create_rest_api, :setup_apigateway_create_resources,
201
+ :create_stages, :delete_stage
202
+ end
203
+ end