awsstack 0.2.1

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 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: []