awsstack 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f3a649d0e04854b4207945c9b426ee5b0e7b6b9a
4
+ data.tar.gz: 4882820003b414f5be911d8f5d4e737b06c670bc
5
+ SHA512:
6
+ metadata.gz: 2c605604f0e32d83829e4af3005ffbcc89c315794763cf686d5bb61d996708b7688a1d6f531526379be86e837273c54d2d28901875eb88b60e6cb5720d04765d
7
+ data.tar.gz: 1fb5979a4e5bab43422dea729ee16c18c5c31db7c0d8b649dcb2b2d5a3d789e4274618c0b7f318f45ca3dc9dc1987b9583f02f7b897ede0aa5230ec2bd8ea105
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ .bundle/
2
+ vendor/
3
+ /.yardoc
4
+ /Gemfile.lock
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
11
+ *.gem
12
+ .aws_session*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.1
5
+ before_install: gem install bundler -v 1.13.3
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in awsstack.gemspec
6
+ gemspec
data/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # Awsstack
2
+
3
+ AWS CloudFormation stack creation helper
4
+
5
+ ## Building
6
+
7
+ Clone this repository and run
8
+
9
+ gem build awsstack.gemspec
10
+
11
+ This will create `awsstack-<version>.gem`
12
+
13
+ you can then install this gem
14
+
15
+ [sudo] gem install awsstack-<version>.gem
16
+
17
+ ## Usage
18
+
19
+ awsstack --help
20
+ /usr/local/bin/awsstack [OPTION]
21
+
22
+ -h, --help:
23
+ show help
24
+
25
+ -r, --role <rolename>
26
+ IAM role to use. From ~/.aws/config
27
+
28
+ -o, --operation <operation>
29
+ Operation to perform on the template. (...)
30
+ Operations :
31
+ check Check a template on AWS
32
+ create Create a stack
33
+ update Update a stack
34
+ delete Delete a stack
35
+
36
+ -s, --stackname <stackname>
37
+ Stackname to operate on.
38
+
39
+ -t, --templatefile <file>
40
+ Template file to use. (JSON format)
41
+
42
+ -p, --paramfile <file>
43
+ Optional Parameter file. (JSON format)
44
+
45
+ -e, --environment <environment>
46
+ Execution environment. (dev, stag, prod, ...)
47
+
48
+ -d, --debug [level]:
49
+ Debug level.
50
+
51
+ ( Todo: Debug Level is not implemented )
52
+
53
+ ### example use
54
+
55
+ awsstack -r vrt-dpc-sandbox-admin -t output/aem_author.json -e dev -s Aemsecuritydev -o create
56
+
57
+ ### params file
58
+
59
+ To pass parameters to the CFN with this script, create a json file with the same
60
+ name as the template file but in the directory <repo>/params/<env>/<template>
61
+ The content should look like this.
62
+
63
+ This file will automatically be used and the params passed to CFN.
64
+
65
+ {
66
+ "Parameters": {
67
+ "AemEnvironmentNameParameter": "stag",
68
+ "LabelOwner": "zipkid"
69
+ }
70
+ }
71
+
72
+ You can also pass a --paramfile option specifying an alternate params file
73
+
74
+
75
+ ## Development
76
+
77
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
78
+
79
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
80
+
81
+ ## Contributing
82
+
83
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/awsstack.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/awsstack.gemspec ADDED
@@ -0,0 +1,38 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'awsstack/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'awsstack'
7
+ spec.version = AwsStack::VERSION
8
+ spec.licenses = ['MIT']
9
+ spec.authors = ['Stefan - Zipkid - Goethals']
10
+ spec.email = ['stefan.goethals@vrt.be']
11
+
12
+ spec.summary = 'AWS stack handling helper script.'
13
+ spec.description = 'AWS stack handling helper script.'
14
+ spec.homepage = 'https://github.com/'
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ if spec.respond_to?(:metadata)
19
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
20
+ else
21
+ raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
22
+ end
23
+
24
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
25
+ f.match(%r{^(test|spec|features)/})
26
+ end
27
+ spec.bindir = 'exe'
28
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ['lib']
30
+
31
+ spec.add_development_dependency 'bundler', '~> 1.13'
32
+ spec.add_development_dependency 'rake', '~> 10.0'
33
+ spec.add_development_dependency 'rspec', '~> 3.0'
34
+
35
+ spec.add_runtime_dependency 'aws_config', '~> 0.1', '>= 0.1.0'
36
+ spec.add_runtime_dependency 'aws-sdk', '~> 2.8', '>= 2.8.4'
37
+ spec.add_runtime_dependency 'awssession'
38
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "awsstack"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/awsstack ADDED
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env ruby
2
+ require 'getoptlong'
3
+ require 'pp'
4
+
5
+ require 'aws_config'
6
+ require 'awssession'
7
+ require 'awsstack'
8
+
9
+ def clidoc
10
+ puts <<-CLIDOC
11
+
12
+ #{$PROGRAM_NAME} [OPTION]
13
+
14
+ -h, --help:
15
+ show help
16
+
17
+ -r, --role <rolename>
18
+ IAM role to use. From ~/.aws/config
19
+
20
+ -s, --stackname <stackname>
21
+ Stackname to operate on.
22
+
23
+ -t, --templatefile <file>
24
+ Template file to use. (JSON format)
25
+
26
+ -e, --environment <environment>
27
+ Execution environment. (dev, stag, prod, ...)
28
+ Needed for automatic param file detection.
29
+
30
+ -p, --paramfile <file>
31
+ Optional Parameter file. (JSON format)
32
+
33
+ -o, --operation <operation>
34
+ Operation to perform on the template. (...)
35
+ Operations :
36
+ check Check a template on AWS
37
+ create Create a stack
38
+ update Update a stack
39
+ delete Delete a stack
40
+
41
+ -d, --debug [level]:
42
+ Debug level.
43
+
44
+ CLIDOC
45
+ end
46
+
47
+ opts = GetoptLong.new(
48
+ ['--help', '-h', GetoptLong::NO_ARGUMENT],
49
+ ['--role', '-r', GetoptLong::REQUIRED_ARGUMENT],
50
+ ['--stackname', '-s', GetoptLong::REQUIRED_ARGUMENT],
51
+ ['--templatefile', '-t', GetoptLong::REQUIRED_ARGUMENT],
52
+ ['--paramfile', '-p', GetoptLong::REQUIRED_ARGUMENT],
53
+ ['--environment', '-e', GetoptLong::REQUIRED_ARGUMENT],
54
+ ['--operation', '-o', GetoptLong::REQUIRED_ARGUMENT],
55
+ ['--debug', '-d', GetoptLong::OPTIONAL_ARGUMENT]
56
+ )
57
+
58
+ role = nil
59
+ operation = nil
60
+ stackname = nil
61
+ templatefile = nil
62
+ paramfile = nil
63
+ environment = nil
64
+ debug = 0
65
+
66
+ opts.each do |opt, arg|
67
+ case opt
68
+ when '--help'
69
+ clidoc
70
+ exit
71
+ when '--role'
72
+ role = arg
73
+ when '--operation'
74
+ operation = arg
75
+ when '--stackname'
76
+ stackname = arg
77
+ when '--templatefile'
78
+ templatefile = arg
79
+ when '--paramfile'
80
+ paramfile = arg
81
+ when '--environment'
82
+ environment = arg
83
+ when '--debug'
84
+ debug = if arg == ''
85
+ 1
86
+ else
87
+ arg.to_i
88
+ end
89
+ end
90
+ end
91
+
92
+ profile_name = role
93
+ profile = AWSConfig[profile_name]
94
+ profile['name'] = profile_name
95
+
96
+ awssession = AwsSession.new(profile: profile)
97
+ awssession.start
98
+
99
+ AwsStack::CloudFormation.new(
100
+ credentials: awssession.credentials,
101
+ operation: operation,
102
+ stackname: stackname,
103
+ templatefile: templatefile,
104
+ paramfile: paramfile,
105
+ environment: environment,
106
+ debug: debug
107
+ )
108
+
109
+ # vim:set fileencoding=utf8 fileformat=unix filetype=ruby tabstop=2 expandtab:
data/lib/awsstack.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'awsstack/version'
2
+ require 'awsstack/cloudformation'
3
+
4
+ module Awsstack
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,75 @@
1
+ require 'aws-sdk'
2
+
3
+ module AwsStack
4
+ # AWS CFN template file handling
5
+ class CfnTemplate
6
+ attr_reader :body, :url
7
+ def initialize(options)
8
+ @credentials = options[:credentials]
9
+ @templatefile = options[:templatefile]
10
+ @stackname = options[:stackname]
11
+ @bucket_name = 'awsstack.cloudformation.templates'
12
+ @bucket_template_filename = "#{@stackname}_#{File.basename(@templatefile)}"
13
+ template
14
+ end
15
+
16
+ def delete_template
17
+ s3.delete_object(
18
+ bucket: @bucket_name,
19
+ key: @bucket_template_filename
20
+ )
21
+ end
22
+
23
+ private
24
+
25
+ def template
26
+ case File.size? @templatefile
27
+ when nil, 0
28
+ raise "Template file : '#{@templatefile}', not found or zero length."
29
+ when 1..51_200
30
+ @body = template_file_body
31
+ when 51_201..460_800
32
+ @url = template_url
33
+ else
34
+ raise "Template file : '#{@templatefile}', Too large. (> 460.800 bytes)"
35
+ end
36
+ end
37
+
38
+ def template_file_body
39
+ File.open(@templatefile, 'r').read
40
+ end
41
+
42
+ def template_url
43
+ create_bucket unless bucket_exist?
44
+ put_template
45
+ "https://s3.amazonaws.com/#{@bucket_name}/#{@bucket_template_filename}"
46
+ end
47
+
48
+ def put_template
49
+ s3.put_object(
50
+ bucket: @bucket_name,
51
+ key: @bucket_template_filename,
52
+ body: template_file_body
53
+ )
54
+ end
55
+
56
+ def create_bucket
57
+ s3.create_bucket(
58
+ bucket: @bucket_name
59
+ )
60
+ end
61
+
62
+ def bucket_exist?
63
+ s3.head_bucket(
64
+ bucket: @bucket_name
65
+ )
66
+ true
67
+ rescue Aws::S3::Errors::NotFound # , Aws::S3::Errors::Http301Error
68
+ false
69
+ end
70
+
71
+ def s3
72
+ @s3 || @s3 = Aws::S3::Client.new(credentials: @credentials)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,146 @@
1
+ require 'aws-sdk'
2
+ require 'awsstack/cfntemplate'
3
+
4
+ module AwsStack
5
+ # AWS Session creation with profile
6
+ class CloudFormation
7
+ def initialize(options)
8
+ @credentials = options[:credentials]
9
+ create_cfn_client
10
+ @operation = options[:operation].to_sym
11
+ @stackname = options[:stackname]
12
+ @templatefile = options[:templatefile]
13
+ @paramfile = options[:paramfile]
14
+ @environment = options[:environment]
15
+ @debug = options[:debug]
16
+
17
+ if public_methods.include?(@operation)
18
+ public_send @operation
19
+ else
20
+ puts "Requested operation '#{@operation}' is not a public method."
21
+ end
22
+ end
23
+
24
+ def check
25
+ raise unless validate_template
26
+ puts "Template '#{@templatefile}' validated! OK."
27
+ end
28
+
29
+ def create
30
+ check
31
+ @params = read_param_file
32
+ pp create_stack
33
+ end
34
+
35
+ def update
36
+ check
37
+ @params = read_param_file
38
+ update_stack
39
+ end
40
+
41
+ def delete
42
+ delete_stack
43
+ puts 'Delete started...'
44
+ end
45
+
46
+ def operation_names
47
+ pp @cfn.operation_names
48
+ end
49
+
50
+ private
51
+
52
+ def create_cfn_client
53
+ @cfn = Aws::CloudFormation::Client.new(credentials: @credentials)
54
+ end
55
+
56
+ def read_file(file)
57
+ File.open(file, 'r').read
58
+ end
59
+
60
+ def template
61
+ @template_instance || @template_instance = AwsStack::CfnTemplate.new(
62
+ credentials: @credentials, templatefile: @templatefile, stackname: @stackname
63
+ )
64
+ end
65
+
66
+ def read_param_file
67
+ param_file = if @paramfile.class == NilClass
68
+ "params/#{@environment}/#{File.basename @templatefile}"
69
+ else
70
+ @paramfile
71
+ end
72
+ return unless File.file? param_file
73
+ param_string = read_file param_file
74
+ prepare_params JSON.parse(param_string)['Parameters']
75
+ end
76
+
77
+ def prepare_params(params)
78
+ params.map do |key, value|
79
+ {
80
+ parameter_key: key,
81
+ parameter_value: value,
82
+ use_previous_value: false
83
+ }
84
+ end
85
+ end
86
+
87
+ def list_stacks
88
+ @cfn.list_stacks
89
+ end
90
+
91
+ def validate_template
92
+ @cfn.validate_template(
93
+ template_body: template.body,
94
+ template_url: template.url
95
+ )
96
+ end
97
+
98
+ def create_stack
99
+ @cfn.create_stack(
100
+ stack_name: @stackname, # required
101
+ template_body: template.body,
102
+ template_url: template.url,
103
+ capabilities: ['CAPABILITY_IAM'],
104
+ parameters: @params
105
+ ).stack_id
106
+ rescue Aws::CloudFormation::Errors::AlreadyExistsException, Aws::CloudFormation::Errors::ValidationError => e
107
+ puts "#{e.class} : #{e.message}"
108
+ exit 1
109
+ end
110
+
111
+ def update_stack
112
+ @cfn.update_stack(
113
+ stack_name: @stackname, # required
114
+ template_body: template.body,
115
+ template_url: template.url,
116
+ capabilities: ['CAPABILITY_IAM'],
117
+ parameters: @params
118
+ ).stack_id
119
+ rescue Aws::CloudFormation::Errors::ValidationError => e
120
+ puts "#{e.class} : #{e.message}"
121
+ exit 1
122
+ end
123
+
124
+ def delete_stack
125
+ @cfn.delete_stack(
126
+ stack_name: @stackname, # required
127
+ )
128
+ end
129
+
130
+ def create_change_set
131
+ @cfn.create_change_set
132
+ end
133
+
134
+ def describe_change_set
135
+ @cfn.describe_change_set
136
+ end
137
+
138
+ def execute_change_set
139
+ @cfn.execute_change_set
140
+ end
141
+
142
+ def delete_change_set
143
+ @cfn.delete_change_set
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,3 @@
1
+ module AwsStack
2
+ VERSION = '0.2.1'.freeze
3
+ end
data/license.txt ADDED
@@ -0,0 +1,19 @@
1
+ Copyright 2017 VRT.be
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: awsstack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Stefan - Zipkid - Goethals
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-10-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.13'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws_config
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 0.1.0
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '0.1'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 0.1.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: aws-sdk
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.8'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 2.8.4
85
+ type: :runtime
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '2.8'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 2.8.4
95
+ - !ruby/object:Gem::Dependency
96
+ name: awssession
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ description: AWS stack handling helper script.
110
+ email:
111
+ - stefan.goethals@vrt.be
112
+ executables:
113
+ - awsstack
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - ".gitignore"
118
+ - ".rspec"
119
+ - ".travis.yml"
120
+ - Gemfile
121
+ - README.md
122
+ - Rakefile
123
+ - awsstack.gemspec
124
+ - bin/console
125
+ - bin/setup
126
+ - exe/awsstack
127
+ - lib/awsstack.rb
128
+ - lib/awsstack/cfntemplate.rb
129
+ - lib/awsstack/cloudformation.rb
130
+ - lib/awsstack/version.rb
131
+ - license.txt
132
+ homepage: https://github.com/
133
+ licenses:
134
+ - MIT
135
+ metadata:
136
+ allowed_push_host: https://rubygems.org
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 2.6.13
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: AWS stack handling helper script.
157
+ test_files: []