lambda_wrap 0.26.0 → 0.26.6

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
  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