aws-cft-tools 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +10 -0
- data/.gitignore +52 -0
- data/.rspec +2 -0
- data/.rubocop.yml +19 -0
- data/.travis.yml +5 -0
- data/.yardopts +1 -0
- data/BEST-PRACTICES.md +136 -0
- data/CONTRIBUTING.md +38 -0
- data/Gemfile +8 -0
- data/LICENSE +15 -0
- data/README.md +118 -0
- data/Rakefile +17 -0
- data/USAGE.adoc +404 -0
- data/aws-cft-tools.gemspec +53 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/code.json +24 -0
- data/exe/aws-cft +176 -0
- data/lib/aws-cft-tools.rb +3 -0
- data/lib/aws_cft_tools.rb +31 -0
- data/lib/aws_cft_tools/aws_enumerator.rb +55 -0
- data/lib/aws_cft_tools/change.rb +66 -0
- data/lib/aws_cft_tools/client.rb +84 -0
- data/lib/aws_cft_tools/client/base.rb +40 -0
- data/lib/aws_cft_tools/client/cft.rb +93 -0
- data/lib/aws_cft_tools/client/cft/changeset_management.rb +109 -0
- data/lib/aws_cft_tools/client/cft/stack_management.rb +85 -0
- data/lib/aws_cft_tools/client/ec2.rb +136 -0
- data/lib/aws_cft_tools/client/templates.rb +84 -0
- data/lib/aws_cft_tools/deletion_change.rb +43 -0
- data/lib/aws_cft_tools/dependency_tree.rb +109 -0
- data/lib/aws_cft_tools/dependency_tree/nodes.rb +71 -0
- data/lib/aws_cft_tools/dependency_tree/variables.rb +37 -0
- data/lib/aws_cft_tools/errors.rb +25 -0
- data/lib/aws_cft_tools/runbook.rb +166 -0
- data/lib/aws_cft_tools/runbook/report.rb +30 -0
- data/lib/aws_cft_tools/runbooks.rb +16 -0
- data/lib/aws_cft_tools/runbooks/common/changesets.rb +30 -0
- data/lib/aws_cft_tools/runbooks/common/templates.rb +38 -0
- data/lib/aws_cft_tools/runbooks/deploy.rb +107 -0
- data/lib/aws_cft_tools/runbooks/deploy/reporting.rb +50 -0
- data/lib/aws_cft_tools/runbooks/deploy/stacks.rb +109 -0
- data/lib/aws_cft_tools/runbooks/deploy/templates.rb +37 -0
- data/lib/aws_cft_tools/runbooks/deploy/threading.rb +37 -0
- data/lib/aws_cft_tools/runbooks/diff.rb +28 -0
- data/lib/aws_cft_tools/runbooks/diff/context.rb +86 -0
- data/lib/aws_cft_tools/runbooks/diff/context/reporting.rb +87 -0
- data/lib/aws_cft_tools/runbooks/hosts.rb +43 -0
- data/lib/aws_cft_tools/runbooks/images.rb +43 -0
- data/lib/aws_cft_tools/runbooks/init.rb +86 -0
- data/lib/aws_cft_tools/runbooks/retract.rb +69 -0
- data/lib/aws_cft_tools/runbooks/retract/templates.rb +44 -0
- data/lib/aws_cft_tools/runbooks/stacks.rb +43 -0
- data/lib/aws_cft_tools/stack.rb +83 -0
- data/lib/aws_cft_tools/template.rb +177 -0
- data/lib/aws_cft_tools/template/dsl_context.rb +14 -0
- data/lib/aws_cft_tools/template/file_system.rb +62 -0
- data/lib/aws_cft_tools/template/metadata.rb +144 -0
- data/lib/aws_cft_tools/template/properties.rb +129 -0
- data/lib/aws_cft_tools/template_set.rb +120 -0
- data/lib/aws_cft_tools/template_set/array_methods.rb +63 -0
- data/lib/aws_cft_tools/template_set/closure.rb +77 -0
- data/lib/aws_cft_tools/template_set/dependencies.rb +55 -0
- data/lib/aws_cft_tools/template_set/each_slice_state.rb +58 -0
- data/lib/aws_cft_tools/version.rb +8 -0
- data/rubycritic.reek +3 -0
- metadata +321 -0
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'aws_cft_tools'
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
# require "pry"
|
12
|
+
# Pry.start
|
13
|
+
|
14
|
+
require 'irb'
|
15
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/code.json
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
{
|
2
|
+
"version": "2.0.0",
|
3
|
+
"measurementType": { "method": "linesOfCode" },
|
4
|
+
"agency": "SBA",
|
5
|
+
"releases": [
|
6
|
+
{
|
7
|
+
"name": "aws-cft-tools",
|
8
|
+
"repositoryURL": "https://github.com/USSBA/aws-cft-tools",
|
9
|
+
"description": "Command line tools to ease management of AWS infrastructure through CloudFormation",
|
10
|
+
"permissions": {
|
11
|
+
"license": {
|
12
|
+
"name": "Apache v2",
|
13
|
+
"URL": "https://www.apache.org/licenses/LICENSE-2.0"
|
14
|
+
},
|
15
|
+
"usageType": "openSource",
|
16
|
+
"exemptionText": null
|
17
|
+
},
|
18
|
+
"vcs": "git",
|
19
|
+
"laborHours": 1,
|
20
|
+
"tags": ["SBA", "DevOps", "AWS"],
|
21
|
+
"contact": { "email": "Andrew.Davy@sba.gov" }
|
22
|
+
}
|
23
|
+
]
|
24
|
+
}
|
data/exe/aws-cft
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'aws_cft_tools'
|
6
|
+
require 'clamp'
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
Clamp do
|
10
|
+
option ['-c', '--[no-]check'], :flag, 'only do non-destructive operations to check validity of request'
|
11
|
+
option ['-f', '--file'], 'FILE', 'set configuration file relative to the project root',
|
12
|
+
default: '.aws_cft', attribute_name: :config_file
|
13
|
+
option ['-n', '--[no-]noop'], :flag, 'only do operations that do not require modifying AWS',
|
14
|
+
attribute_name: :noop
|
15
|
+
option ['-p', '--profile'], 'PROFILE', 'set profile', default: 'default'
|
16
|
+
option ['-R', '--region'], 'REGION', 'set AWS region', environment_name: 'AWS_REGION',
|
17
|
+
default: 'us-east-1'
|
18
|
+
option ['-t', '--root'], 'DIRECTORY', 'set infrastructure project root' do |v|
|
19
|
+
Pathname.new(v)
|
20
|
+
end
|
21
|
+
option ['-T', '--tag'], 'NAME:VALUE', 'require a tag have the given value (may be given more than once)',
|
22
|
+
multivalued: true
|
23
|
+
option ['-v', '--[no-]verbose'], :flag, 'verbose narration of actions'
|
24
|
+
option '--version', :flag, 'Show version' do
|
25
|
+
puts AwsCftTools::VERSION
|
26
|
+
exit(0)
|
27
|
+
end
|
28
|
+
|
29
|
+
def default_root
|
30
|
+
Pathname.new(ENV['AWS_CFT_HOME'] || '.')
|
31
|
+
end
|
32
|
+
|
33
|
+
subcommand 'deploy', 'Deploy templates to AWS' do
|
34
|
+
option ['-e', '--environment'], 'ENVIRONMENT', 'set environment on which to operate' # , required: true
|
35
|
+
option ['-r', '--role'], 'ROLE', 'set role filter'
|
36
|
+
option ['-j', '--jobs'], 'INTEGER', 'maximum number of parallel stacks to build simultaneously',
|
37
|
+
default: 1 do |j|
|
38
|
+
if j == '-'
|
39
|
+
65_535
|
40
|
+
else
|
41
|
+
j.to_i
|
42
|
+
end
|
43
|
+
end
|
44
|
+
parameter '[TEMPLATES] ...', 'the templates to deploy'
|
45
|
+
|
46
|
+
def execute
|
47
|
+
AwsCftTools::Runbooks::Deploy.new(
|
48
|
+
with_file_options(
|
49
|
+
environment: environment,
|
50
|
+
role: role,
|
51
|
+
jobs: jobs,
|
52
|
+
templates: templates_list
|
53
|
+
)
|
54
|
+
)._run
|
55
|
+
rescue AwsCftTools::ToolingException => exception
|
56
|
+
puts "Unable to deploy: #{exception}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
subcommand 'diff', 'List differences between templates and AWS' do
|
61
|
+
option '--[no-]color', :flag, 'colorize output', default: $stdout.tty?, attribute_name: :color
|
62
|
+
option ['-e', '--environment'], 'ENVIRONMENT', 'set environment on which to operate'
|
63
|
+
option ['-r', '--role'], 'ROLE', 'set role filter'
|
64
|
+
parameter '[TEMPLATES] ...', 'the templates to diff'
|
65
|
+
|
66
|
+
def execute
|
67
|
+
AwsCftTools::Runbooks::Diff.new(
|
68
|
+
with_file_options(
|
69
|
+
colorize: color?,
|
70
|
+
environment: environment,
|
71
|
+
role: role,
|
72
|
+
templates: templates_list
|
73
|
+
)
|
74
|
+
)._run
|
75
|
+
rescue AwsCftTools::ToolingException => exception
|
76
|
+
puts "Unable to diff: #{exception}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
subcommand 'hosts', 'List running instances' do
|
81
|
+
option ['-e', '--environment'], 'ENVIRONMENT', 'set environment on which to operate'
|
82
|
+
option ['-r', '--role'], 'ROLE', 'set role filter'
|
83
|
+
|
84
|
+
def execute
|
85
|
+
AwsCftTools::Runbooks::Hosts.new(
|
86
|
+
with_file_options(
|
87
|
+
environment: environment,
|
88
|
+
role: role
|
89
|
+
)
|
90
|
+
)._run
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
subcommand 'images', 'List available AMIs' do
|
95
|
+
option ['-e', '--environment'], 'ENVIRONMENT', 'set environment on which to operate'
|
96
|
+
option ['-r', '--role'], 'ROLE', 'set role filter'
|
97
|
+
|
98
|
+
def execute
|
99
|
+
AwsCftTools::Runbooks::Images.new(
|
100
|
+
with_file_options(
|
101
|
+
environment: environment,
|
102
|
+
role: role
|
103
|
+
)
|
104
|
+
)._run
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
subcommand 'init', 'Initialize a new infrastructure project' do
|
109
|
+
def execute
|
110
|
+
AwsCftTools::Runbooks::Init.new(with_file_options)._run
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
subcommand 'retract', 'Retract templates from AWS' do
|
115
|
+
option ['-e', '--environment'], 'STRING', 'set environment on which to operate', required: true
|
116
|
+
option ['-r', '--role'], 'STRING', 'set role filter'
|
117
|
+
parameter '[TEMPLATES] ...', 'the templates to retract'
|
118
|
+
|
119
|
+
def execute
|
120
|
+
AwsCftTools::Runbooks::Retract.new(
|
121
|
+
with_file_options(
|
122
|
+
environment: environment,
|
123
|
+
role: role,
|
124
|
+
templates: templates_list
|
125
|
+
)
|
126
|
+
)._run
|
127
|
+
rescue AwsCftTools::ToolingException => exception
|
128
|
+
puts "Unable to retract: #{exception}"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
subcommand 'stacks', 'List deployed stacks in AWS' do
|
133
|
+
option ['-e', '--environment'], 'ENVIRONMENT', 'set environment on which to operate'
|
134
|
+
option ['-r', '--role'], 'ROLE', 'set role filter'
|
135
|
+
|
136
|
+
def execute
|
137
|
+
AwsCftTools::Runbooks::Stacks.new(
|
138
|
+
with_file_options(
|
139
|
+
environment: environment,
|
140
|
+
role: role
|
141
|
+
)
|
142
|
+
)._run
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def with_file_options(opts = {})
|
147
|
+
opts = global_options.merge(opts)
|
148
|
+
|
149
|
+
config_file_with_path = root + config_file
|
150
|
+
return opts unless config_file_with_path.exist?
|
151
|
+
config_options = YAML.safe_load(config_file_with_path.read, [Symbol])
|
152
|
+
config_options.merge(opts.reject { |_, v| v.nil? })
|
153
|
+
end
|
154
|
+
|
155
|
+
private
|
156
|
+
|
157
|
+
def global_options
|
158
|
+
{
|
159
|
+
config_file: config_file,
|
160
|
+
profile: profile,
|
161
|
+
root: root,
|
162
|
+
region: region,
|
163
|
+
noop: noop?,
|
164
|
+
check: check?,
|
165
|
+
verbose: verbose?,
|
166
|
+
tags: tag_hash
|
167
|
+
}
|
168
|
+
end
|
169
|
+
|
170
|
+
def tag_hash
|
171
|
+
tag_list.each_with_object({}) do |tag, acc|
|
172
|
+
k, v = tag.split(':', 2)
|
173
|
+
acc[k] = v
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'aws_cft_tools/version'
|
4
|
+
|
5
|
+
##
|
6
|
+
# = AWS CloudFormation Tools
|
7
|
+
#
|
8
|
+
# A collection of classes and methods to manage AWS Infrastructure using CloudFormation as the fundamental
|
9
|
+
# unit of infrastructure state. Aws::Cft supports JSON, YAML, and DSL templates with minimal decoration
|
10
|
+
# to establish dependencies between templates.
|
11
|
+
#
|
12
|
+
# == Command Line Interface
|
13
|
+
#
|
14
|
+
# A CLI is provided through the +aws-cft+ command that will run any of the "runbooks" under the
|
15
|
+
# +AwsCftTools::Runbooks::+ namespace.
|
16
|
+
#
|
17
|
+
# To find a complete list of subcommands, run +aws-cft --help+.
|
18
|
+
#
|
19
|
+
module AwsCftTools
|
20
|
+
require 'aws_cft_tools/errors'
|
21
|
+
require 'aws_cft_tools/aws_enumerator'
|
22
|
+
require 'aws_cft_tools/change'
|
23
|
+
require 'aws_cft_tools/deletion_change'
|
24
|
+
require 'aws_cft_tools/client'
|
25
|
+
require 'aws_cft_tools/dependency_tree'
|
26
|
+
require 'aws_cft_tools/stack'
|
27
|
+
require 'aws_cft_tools/template'
|
28
|
+
require 'aws_cft_tools/template_set'
|
29
|
+
require 'aws_cft_tools/runbook'
|
30
|
+
require 'aws_cft_tools/runbooks'
|
31
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AwsCftTools
|
4
|
+
##
|
5
|
+
# Provides common "closure" of paged results for the CFT client.
|
6
|
+
#
|
7
|
+
class AWSEnumerator < Enumerator
|
8
|
+
#
|
9
|
+
# @param client [Object] The client object used to retrieve the next set of responses.
|
10
|
+
# @param method [Symbol] The method to call on the client object.
|
11
|
+
# @param args [Hash] Any arguments that are the same across calls to the client object.
|
12
|
+
# @yield [Object] The response from calling the +method+ on the +client+.
|
13
|
+
#
|
14
|
+
# @example Enumerating All Stacks
|
15
|
+
#
|
16
|
+
# aws_client = Aws::CloudFormation::Client.new
|
17
|
+
# all_stacks = AWSEnumerator.new(aws_client, :describe_stacks, &:stacks).to_a
|
18
|
+
#
|
19
|
+
def initialize(client, method, args = {}, &block)
|
20
|
+
@client = client
|
21
|
+
@method = method
|
22
|
+
@next_token = nil
|
23
|
+
@args = args
|
24
|
+
|
25
|
+
super() do |yielder|
|
26
|
+
run_loop(yielder, &block)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def run_loop(yielder, &block)
|
33
|
+
resp = poll_client
|
34
|
+
loop do
|
35
|
+
process_response(yielder, resp, &block)
|
36
|
+
break unless @next_token
|
37
|
+
resp = poll_client
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def process_response(yielder, resp)
|
42
|
+
feed_results(yielder, yield(resp))
|
43
|
+
end
|
44
|
+
|
45
|
+
def poll_client
|
46
|
+
resp = @client.public_send(@method, @args.merge(next_token: @next_token))
|
47
|
+
@next_token = resp.next_token
|
48
|
+
resp
|
49
|
+
end
|
50
|
+
|
51
|
+
def feed_results(yielder, results)
|
52
|
+
results.each { |item| yielder << item }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
module AwsCftTools
|
6
|
+
# Represents a change in a changeset.
|
7
|
+
class Change
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
attr_reader :resource
|
11
|
+
|
12
|
+
# @param change [Aws::CloudFormation::Types::Change] The AWS SDK change object to be wrapped.
|
13
|
+
def initialize(change)
|
14
|
+
@resource = change.resource_change
|
15
|
+
end
|
16
|
+
|
17
|
+
def_delegators :resource, :action, :replacement
|
18
|
+
def_delegator :resource, :logical_resource_id, :logical_id
|
19
|
+
def_delegator :resource, :physical_resource_id, :physical_id
|
20
|
+
|
21
|
+
###
|
22
|
+
#
|
23
|
+
# @return [String] human readable type of resource being changed
|
24
|
+
#
|
25
|
+
# @example EC2::Network::ACL
|
26
|
+
#
|
27
|
+
# "ec2 network acl"
|
28
|
+
#
|
29
|
+
def type
|
30
|
+
humanize_camelized(resource.resource_type)
|
31
|
+
end
|
32
|
+
|
33
|
+
###
|
34
|
+
#
|
35
|
+
# @return [String] a comma-separated list of scopes
|
36
|
+
#
|
37
|
+
def scopes
|
38
|
+
resource.scope.sort.join(', ')
|
39
|
+
end
|
40
|
+
|
41
|
+
###
|
42
|
+
#
|
43
|
+
# @return [Hash] information useful for creating a tabular report
|
44
|
+
#
|
45
|
+
def to_narrative
|
46
|
+
{
|
47
|
+
action: action,
|
48
|
+
logical_id: logical_id,
|
49
|
+
physical_id: physical_id,
|
50
|
+
type: type,
|
51
|
+
scopes: scopes,
|
52
|
+
replacement: replacement
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
protected
|
57
|
+
|
58
|
+
def humanize_camelized(string)
|
59
|
+
string.sub(/^AWS::/, '')
|
60
|
+
.gsub(/:+/, ' ')
|
61
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1 \2')
|
62
|
+
.gsub(/([a-z\d])([A-Z])/, '\1 \2')
|
63
|
+
.downcase
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'aws-sdk'
|
4
|
+
require 'forwardable'
|
5
|
+
|
6
|
+
module AwsCftTools
|
7
|
+
##
|
8
|
+
# = AWS Tools Client
|
9
|
+
#
|
10
|
+
# A collection of higher-level business methods built on top of the AWS API.
|
11
|
+
#
|
12
|
+
class Client
|
13
|
+
require_relative 'client/base'
|
14
|
+
require_relative 'client/ec2'
|
15
|
+
require_relative 'client/cft'
|
16
|
+
require_relative 'client/templates'
|
17
|
+
|
18
|
+
extend Forwardable
|
19
|
+
|
20
|
+
##
|
21
|
+
# Create a new client instance.
|
22
|
+
#
|
23
|
+
# Options are passed on to domain-specific client objects within the +AwsCftTools::Client::+ namespace.
|
24
|
+
#
|
25
|
+
# @param options [Hash] client configuration
|
26
|
+
# @option options [String] :environment Environment with which the client is concerned.
|
27
|
+
# @option options [String] :parameter_dir The location of parameter files within the project.
|
28
|
+
# @option options [String] :profile The profile to use from the shared credentials file.
|
29
|
+
# @option options [String] :region The AWS region in which to operate.
|
30
|
+
# @option options [String] :role The role that resources are attached to.
|
31
|
+
# @option options [Pathname] :root The location of the top-level directory of the project.
|
32
|
+
# @option options [String] :template_dir The location of tmeplate files within the project.
|
33
|
+
#
|
34
|
+
def initialize(options)
|
35
|
+
@client_options = options.merge(client: self)
|
36
|
+
end
|
37
|
+
|
38
|
+
# @!method instances
|
39
|
+
# @see AwsCftTools::Client::EC2#instances
|
40
|
+
# @!method images
|
41
|
+
# @see AwsCftTools::Client::EC2#images
|
42
|
+
def_delegators :ec2_client, :instances, :images
|
43
|
+
|
44
|
+
# @!method exports
|
45
|
+
# @see AwsCftTools::Client::CFT#exports
|
46
|
+
# @!method stacks
|
47
|
+
# @see AwsCftTools::Client::CFT#stacks
|
48
|
+
# @!method create_stack
|
49
|
+
# @see AwsCftTools::Client::CFT::StackManagement#create_stack
|
50
|
+
# @!method delete_stack
|
51
|
+
# @see AwsCftTools::Client::CFT::StackManagement#delete_stack
|
52
|
+
# @!method update_stack
|
53
|
+
# @see AwsCftTools::Client::CFT::StackManagement#update_stack
|
54
|
+
# @!method all_stacks
|
55
|
+
# @see AwsCftTools::Client::CFT#all_stacks
|
56
|
+
# @!method changes_on_stack_update
|
57
|
+
# @see AwsCftTools::Client::CFT::ChangesetManagement#changes_on_stack_update
|
58
|
+
# @!method changes_on_stack_delete
|
59
|
+
# @see AwsCftTools::Client::CFT::ChangesetManagement#changes_on_stack_delete
|
60
|
+
# @!method changes_on_stack_create
|
61
|
+
# @see AwsCftTools::Client::CFT::ChangesetManagement#changes_on_stack_create
|
62
|
+
def_delegators :cft_client, :exports, :stacks, :create_stack, :update_stack, :all_stacks,
|
63
|
+
:changes_on_stack_update, :changes_on_stack_create, :changes_on_stack_delete,
|
64
|
+
:delete_stack
|
65
|
+
|
66
|
+
# @!method templates
|
67
|
+
# @see AwsCftTools::Client::Templates#templates
|
68
|
+
def_delegators :template_client, :templates
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def ec2_client
|
73
|
+
@ec2_client ||= AwsCftTools::Client::EC2.new(@client_options)
|
74
|
+
end
|
75
|
+
|
76
|
+
def cft_client
|
77
|
+
@cft_client ||= AwsCftTools::Client::CFT.new(@client_options)
|
78
|
+
end
|
79
|
+
|
80
|
+
def template_client
|
81
|
+
@template_client ||= AwsCftTools::Client::Templates.new(@client_options)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|