terrafying 1.7.4 → 1.7.5
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 +4 -4
- data/bin/terrafying +1 -0
- data/lib/terrafying/aws.rb +170 -168
- data/lib/terrafying/cli.rb +22 -20
- data/lib/terrafying/dynamodb/config.rb +7 -5
- data/lib/terrafying/dynamodb/named_lock.rb +55 -58
- data/lib/terrafying/dynamodb/state.rb +32 -32
- data/lib/terrafying/dynamodb.rb +7 -5
- data/lib/terrafying/generator.rb +70 -80
- data/lib/terrafying/lock.rb +7 -5
- data/lib/terrafying/state.rb +7 -5
- data/lib/terrafying/util.rb +12 -15
- data/lib/terrafying/version.rb +4 -2
- data/lib/terrafying.rb +28 -36
- metadata +30 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 72da5ae85bf0ba5022d413cb84c630beb572baed66c81713cb3c7d1d8d7cf146
|
|
4
|
+
data.tar.gz: d2a92ce8fc0eb4724df5436aef1ce09880881cca0db4f6eb56556386b8b2fed1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8983f67957a2b05e62231afc959f9e5c8e9acecf73551b4b97d7fcbef0764e2db5200d0a25fef69835106982836ea58ac21a20a324b2757bc55e3e4cb24bfe67
|
|
7
|
+
data.tar.gz: 0ea60981c01d8f9c71017b64a39990b19e915b77a96297738ce667407ce4e66ddc8db266a5472847f2f6c6454cac2ddb49af5a46467b5cd74fb7948e7abe5a19
|
data/bin/terrafying
CHANGED
data/lib/terrafying/aws.rb
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'aws-sdk-autoscaling'
|
|
2
4
|
require 'aws-sdk-ec2'
|
|
3
5
|
require 'aws-sdk-elasticloadbalancingv2'
|
|
4
6
|
require 'aws-sdk-route53'
|
|
5
7
|
require 'aws-sdk-s3'
|
|
6
8
|
require 'aws-sdk-sts'
|
|
9
|
+
require 'aws-sdk-pricing'
|
|
10
|
+
require 'json'
|
|
7
11
|
|
|
8
12
|
Aws.use_bundled_cert!
|
|
9
13
|
|
|
10
14
|
module Terrafying
|
|
11
15
|
module Aws
|
|
12
16
|
class Ops
|
|
13
|
-
|
|
14
17
|
attr_reader :region
|
|
15
18
|
|
|
16
19
|
def initialize(region)
|
|
@@ -19,11 +22,11 @@ module Terrafying
|
|
|
19
22
|
Kernel.sleep(Kernel.rand((sleep_time / 2)..sleep_time))
|
|
20
23
|
}
|
|
21
24
|
|
|
22
|
-
::Aws.config.update(
|
|
25
|
+
::Aws.config.update(
|
|
23
26
|
region: region,
|
|
24
27
|
retry_limit: 7,
|
|
25
28
|
retry_backoff: half_jitter
|
|
26
|
-
|
|
29
|
+
)
|
|
27
30
|
|
|
28
31
|
@autoscaling_client = ::Aws::AutoScaling::Client.new
|
|
29
32
|
@ec2_resource = ::Aws::EC2::Resource.new
|
|
@@ -32,6 +35,7 @@ module Terrafying
|
|
|
32
35
|
@route53_client = ::Aws::Route53::Client.new
|
|
33
36
|
@s3_client = ::Aws::S3::Client.new
|
|
34
37
|
@sts_client = ::Aws::STS::Client.new
|
|
38
|
+
@pricing_client = ::Aws::Pricing::Client.new(region: 'us-east-1') # no AWS Pricing endpoint in Europe
|
|
35
39
|
|
|
36
40
|
@region = region
|
|
37
41
|
end
|
|
@@ -52,14 +56,13 @@ module Terrafying
|
|
|
52
56
|
@security_groups ||= {}
|
|
53
57
|
@security_groups[name] ||=
|
|
54
58
|
begin
|
|
55
|
-
|
|
59
|
+
warn "Looking up id of security group '#{name}'"
|
|
56
60
|
groups = all_security_groups.select { |g| g.group_name == name }.take(2)
|
|
57
|
-
|
|
58
|
-
when groups.count == 1
|
|
61
|
+
if groups.count == 1
|
|
59
62
|
groups.first.id
|
|
60
|
-
|
|
63
|
+
elsif groups.count < 1
|
|
61
64
|
raise "No security group with name '#{name}' was found."
|
|
62
|
-
|
|
65
|
+
elsif groups.count > 1
|
|
63
66
|
raise "More than one security group with name '#{name}' found: " + groups.join(', ')
|
|
64
67
|
end
|
|
65
68
|
end
|
|
@@ -69,14 +72,13 @@ module Terrafying
|
|
|
69
72
|
@security_groups_in_vpc ||= {}
|
|
70
73
|
@security_groups_in_vpc[vpc_id + name] ||=
|
|
71
74
|
begin
|
|
72
|
-
|
|
75
|
+
warn "Looking up id of security group '#{name}'"
|
|
73
76
|
groups = all_security_groups.select { |g| g.vpc_id == vpc_id && g.group_name == name }.take(2)
|
|
74
|
-
|
|
75
|
-
when groups.count == 1
|
|
77
|
+
if groups.count == 1
|
|
76
78
|
groups.first.id
|
|
77
|
-
|
|
79
|
+
elsif groups.count < 1
|
|
78
80
|
raise "No security group with name '#{name}' was found."
|
|
79
|
-
|
|
81
|
+
elsif groups.count > 1
|
|
80
82
|
raise "More than one security group with name '#{name}' found: " + groups.join(', ')
|
|
81
83
|
end
|
|
82
84
|
end
|
|
@@ -87,12 +89,11 @@ module Terrafying
|
|
|
87
89
|
@security_groups_by_tags[tags] ||=
|
|
88
90
|
begin
|
|
89
91
|
groups = all_security_groups.select { |g| g.tags.any? { |t| t.key == tags.keys && t.value == tags.values } }.take(2)
|
|
90
|
-
|
|
91
|
-
when groups.count == 1
|
|
92
|
+
if groups.count == 1
|
|
92
93
|
groups.first.id
|
|
93
|
-
|
|
94
|
+
elsif groups.count < 1
|
|
94
95
|
raise "No security group with tags '#{tags}' was found."
|
|
95
|
-
|
|
96
|
+
elsif groups.count > 1
|
|
96
97
|
raise "More than one security group with tags '#{tags}' found: " + groups.join(', ')
|
|
97
98
|
end
|
|
98
99
|
end
|
|
@@ -103,19 +104,18 @@ module Terrafying
|
|
|
103
104
|
@instance_profiles[name] ||=
|
|
104
105
|
begin
|
|
105
106
|
resource = ::Aws::IAM::Resource.new
|
|
106
|
-
|
|
107
|
+
warn "Looking up id of instance profile '#{name}'"
|
|
107
108
|
# unfortunately amazon don't let us filter for profiles using
|
|
108
109
|
# a name filter, for now we have enumerate and filter manually
|
|
109
110
|
coll = resource.instance_profiles
|
|
110
111
|
profiles = []
|
|
111
|
-
profiles = coll.select {|p| p.instance_profile_name =~ /#{name}/}
|
|
112
|
+
profiles = coll.select { |p| p.instance_profile_name =~ /#{name}/ }
|
|
112
113
|
|
|
113
|
-
|
|
114
|
-
when profiles.count == 1
|
|
114
|
+
if profiles.count == 1
|
|
115
115
|
profiles.first.instance_profile_id
|
|
116
|
-
|
|
116
|
+
elsif profiles.count < 1
|
|
117
117
|
raise "No instance profile with name '#{name}' was found."
|
|
118
|
-
|
|
118
|
+
elsif profiles.count > 1
|
|
119
119
|
raise "More than one instance profile with name '#{name}' found: " + profiles.join(', ')
|
|
120
120
|
end
|
|
121
121
|
end
|
|
@@ -126,20 +126,18 @@ module Terrafying
|
|
|
126
126
|
@route_table_for_subnet[subnet_id] ||=
|
|
127
127
|
begin
|
|
128
128
|
resp = @ec2_client.describe_route_tables(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
})
|
|
129
|
+
filters: [
|
|
130
|
+
{ name: 'association.subnet-id', values: [subnet_id] }
|
|
131
|
+
]
|
|
132
|
+
)
|
|
134
133
|
|
|
135
134
|
route_tables = resp.route_tables
|
|
136
135
|
|
|
137
|
-
|
|
138
|
-
when route_tables.count == 1
|
|
136
|
+
if route_tables.count == 1
|
|
139
137
|
route_tables.first
|
|
140
|
-
|
|
138
|
+
elsif route_tables.count < 1
|
|
141
139
|
raise "No route table for subnet '#{subnet_id}' was found."
|
|
142
|
-
|
|
140
|
+
elsif profiles.count > 1
|
|
143
141
|
raise "More than route table for subnet '#{subnet_id}' found: " + route_tables.join(', ')
|
|
144
142
|
end
|
|
145
143
|
end
|
|
@@ -150,54 +148,50 @@ module Terrafying
|
|
|
150
148
|
@route_table_for_vpc[vpc_id] ||=
|
|
151
149
|
begin
|
|
152
150
|
resp = @ec2_client.describe_route_tables(
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
})
|
|
151
|
+
filters: [
|
|
152
|
+
{ name: 'association.main', values: ['true'] },
|
|
153
|
+
{ name: 'vpc-id', values: [vpc_id] }
|
|
154
|
+
]
|
|
155
|
+
)
|
|
159
156
|
|
|
160
157
|
route_tables = resp.route_tables
|
|
161
158
|
|
|
162
|
-
|
|
163
|
-
when route_tables.count == 1
|
|
159
|
+
if route_tables.count == 1
|
|
164
160
|
route_tables.first
|
|
165
|
-
|
|
161
|
+
elsif route_tables.count < 1
|
|
166
162
|
raise "No route table for vpc '#{vpc_id}' was found."
|
|
167
|
-
|
|
163
|
+
elsif profiles.count > 1
|
|
168
164
|
raise "More than route table for vpc '#{vpc_id}' found: " + route_tables.join(', ')
|
|
169
165
|
end
|
|
170
166
|
end
|
|
171
167
|
end
|
|
172
168
|
|
|
173
169
|
def security_groups(*names)
|
|
174
|
-
names.map{|n| security_group(n)}
|
|
170
|
+
names.map { |n| security_group(n) }
|
|
175
171
|
end
|
|
176
172
|
|
|
177
173
|
def security_groups_in_vpc(vpc_id, *names)
|
|
178
|
-
names.map{|n| security_group_in_vpc(vpc_id, n)}
|
|
174
|
+
names.map { |n| security_group_in_vpc(vpc_id, n) }
|
|
179
175
|
end
|
|
180
176
|
|
|
181
177
|
def subnet(name)
|
|
182
178
|
@subnets ||= {}
|
|
183
179
|
@subnets[name] ||=
|
|
184
180
|
begin
|
|
185
|
-
|
|
181
|
+
warn "Looking up id of subnet '#{name}'"
|
|
186
182
|
subnets = @ec2_resource.subnets(
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
case
|
|
196
|
-
when subnets.count == 1
|
|
183
|
+
filters: [
|
|
184
|
+
{
|
|
185
|
+
name: 'tag:Name',
|
|
186
|
+
values: [name]
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
).limit(2)
|
|
190
|
+
if subnets.count == 1
|
|
197
191
|
subnets.first.id
|
|
198
|
-
|
|
192
|
+
elsif subnets.count < 1
|
|
199
193
|
raise "No subnet with name '#{name}' was found."
|
|
200
|
-
|
|
194
|
+
elsif subnets.count > 1
|
|
201
195
|
raise "More than one subnet with this name '#{name}' found : " + subnets.join(', ')
|
|
202
196
|
end
|
|
203
197
|
end
|
|
@@ -208,23 +202,21 @@ module Terrafying
|
|
|
208
202
|
@subnets_by_id[id] ||=
|
|
209
203
|
begin
|
|
210
204
|
resp = @ec2_client.describe_subnets(
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
})
|
|
205
|
+
subnet_ids: [id]
|
|
206
|
+
)
|
|
214
207
|
subnets = resp.subnets
|
|
215
|
-
|
|
216
|
-
when subnets.count == 1
|
|
208
|
+
if subnets.count == 1
|
|
217
209
|
subnets.first
|
|
218
|
-
|
|
210
|
+
elsif subnets.count < 1
|
|
219
211
|
raise "No subnet with id '#{id}' was found."
|
|
220
|
-
|
|
212
|
+
elsif subnets.count > 1
|
|
221
213
|
raise "More than one subnet with this id '#{id}' found : " + subnets.join(', ')
|
|
222
214
|
end
|
|
223
215
|
end
|
|
224
216
|
end
|
|
225
217
|
|
|
226
218
|
def subnets(*names)
|
|
227
|
-
names.map{|n| subnet(n)}
|
|
219
|
+
names.map { |n| subnet(n) }
|
|
228
220
|
end
|
|
229
221
|
|
|
230
222
|
def subnets_for_vpc(vpc_id)
|
|
@@ -232,48 +224,42 @@ module Terrafying
|
|
|
232
224
|
@subnets_for_vpc[vpc_id] ||=
|
|
233
225
|
begin
|
|
234
226
|
resp = @ec2_client.describe_subnets(
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
})
|
|
227
|
+
filters: [
|
|
228
|
+
{ name: 'vpc-id', values: [vpc_id] }
|
|
229
|
+
]
|
|
230
|
+
)
|
|
240
231
|
|
|
241
232
|
subnets = resp.subnets
|
|
242
233
|
|
|
243
|
-
|
|
244
|
-
when subnets.count >= 1
|
|
234
|
+
if subnets.count >= 1
|
|
245
235
|
subnets
|
|
246
|
-
|
|
236
|
+
elsif subnets.count < 1
|
|
247
237
|
raise "No subnets found for '#{vpc_id}'."
|
|
248
238
|
end
|
|
249
239
|
end
|
|
250
240
|
end
|
|
251
241
|
|
|
252
|
-
def ami(name, owners=[
|
|
242
|
+
def ami(name, owners = ['self'])
|
|
253
243
|
@ami ||= {}
|
|
254
244
|
@ami[name] ||=
|
|
255
245
|
begin
|
|
256
|
-
|
|
257
|
-
resp = @ec2_client.describe_images(
|
|
258
|
-
if resp.images.count < 1
|
|
259
|
-
|
|
260
|
-
end
|
|
246
|
+
warn "looking for an image with prefix '#{name}'"
|
|
247
|
+
resp = @ec2_client.describe_images(owners: owners)
|
|
248
|
+
raise 'no images were found' if resp.images.count < 1
|
|
249
|
+
|
|
261
250
|
m = resp.images.select { |a| /^#{name}/.match(a.name) }
|
|
262
|
-
if m.count == 0
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
m.sort { |x,y| y.creation_date <=> x.creation_date }.shift.image_id
|
|
251
|
+
raise "no image with name '#{name}' was found" if m.count == 0
|
|
252
|
+
|
|
253
|
+
m.sort { |x, y| y.creation_date <=> x.creation_date }.shift.image_id
|
|
266
254
|
end
|
|
267
255
|
end
|
|
268
256
|
|
|
269
257
|
def availability_zones
|
|
270
258
|
@availability_zones ||=
|
|
271
259
|
begin
|
|
272
|
-
|
|
260
|
+
warn 'looking for AZs in the current region'
|
|
273
261
|
resp = @ec2_client.describe_availability_zones({})
|
|
274
|
-
resp.availability_zones.map
|
|
275
|
-
zone.zone_name
|
|
276
|
-
}
|
|
262
|
+
resp.availability_zones.map(&:zone_name)
|
|
277
263
|
end
|
|
278
264
|
end
|
|
279
265
|
|
|
@@ -281,18 +267,17 @@ module Terrafying
|
|
|
281
267
|
@vpcs ||= {}
|
|
282
268
|
@vpcs[name] ||=
|
|
283
269
|
begin
|
|
284
|
-
|
|
270
|
+
warn "looking for a VPC with name '#{name}'"
|
|
285
271
|
resp = @ec2_client.describe_vpcs({})
|
|
286
|
-
matching_vpcs = resp.vpcs.select
|
|
287
|
-
name_tag = vpc.tags.select { |tag| tag.key ==
|
|
272
|
+
matching_vpcs = resp.vpcs.select do |vpc|
|
|
273
|
+
name_tag = vpc.tags.select { |tag| tag.key == 'Name' }.first
|
|
288
274
|
name_tag && name_tag.value == name
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
when matching_vpcs.count == 1
|
|
275
|
+
end
|
|
276
|
+
if matching_vpcs.count == 1
|
|
292
277
|
matching_vpcs.first
|
|
293
|
-
|
|
278
|
+
elsif matching_vpcs.count < 1
|
|
294
279
|
raise "No VPC with name '#{name}' was found."
|
|
295
|
-
|
|
280
|
+
elsif matching_vpcs.count > 1
|
|
296
281
|
raise "More than one VPC with name '#{name}' was found: " + matching_vpcs.join(', ')
|
|
297
282
|
end
|
|
298
283
|
end
|
|
@@ -302,23 +287,20 @@ module Terrafying
|
|
|
302
287
|
@route_tables ||= {}
|
|
303
288
|
@route_tables[name] ||=
|
|
304
289
|
begin
|
|
305
|
-
|
|
290
|
+
warn "looking for a route table with name '#{name}'"
|
|
306
291
|
route_tables = @ec2_client.describe_route_tables(
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
],
|
|
314
|
-
}
|
|
292
|
+
filters: [
|
|
293
|
+
{
|
|
294
|
+
name: 'tag:Name',
|
|
295
|
+
values: [name]
|
|
296
|
+
}
|
|
297
|
+
]
|
|
315
298
|
).route_tables
|
|
316
|
-
|
|
317
|
-
when route_tables.count == 1
|
|
299
|
+
if route_tables.count == 1
|
|
318
300
|
route_tables.first.route_table_id
|
|
319
|
-
|
|
301
|
+
elsif route_tables.count < 1
|
|
320
302
|
raise "No route table with name '#{name}' was found."
|
|
321
|
-
|
|
303
|
+
elsif route_tables.count > 1
|
|
322
304
|
raise "More than one route table with name '#{name}' was found: " + route_tables.join(', ')
|
|
323
305
|
end
|
|
324
306
|
end
|
|
@@ -328,23 +310,20 @@ module Terrafying
|
|
|
328
310
|
@ips ||= {}
|
|
329
311
|
@ips[alloc_id] ||=
|
|
330
312
|
begin
|
|
331
|
-
|
|
313
|
+
warn "looking for an elastic ip with allocation_id '#{alloc_id}'"
|
|
332
314
|
ips = @ec2_client.describe_addresses(
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
],
|
|
340
|
-
}
|
|
315
|
+
filters: [
|
|
316
|
+
{
|
|
317
|
+
name: 'allocation-id',
|
|
318
|
+
values: [alloc_id]
|
|
319
|
+
}
|
|
320
|
+
]
|
|
341
321
|
).addresses
|
|
342
|
-
|
|
343
|
-
when ips.count == 1
|
|
322
|
+
if ips.count == 1
|
|
344
323
|
ips.first
|
|
345
|
-
|
|
324
|
+
elsif ips.count < 1
|
|
346
325
|
raise "No elastic ip with allocation_id '#{alloc_id}' was found."
|
|
347
|
-
|
|
326
|
+
elsif ips.count > 1
|
|
348
327
|
raise "More than one elastic ip with allocation_id '#{alloc_id}' was found: " + ips.join(', ')
|
|
349
328
|
end
|
|
350
329
|
end
|
|
@@ -354,16 +333,15 @@ module Terrafying
|
|
|
354
333
|
@hosted_zones ||= {}
|
|
355
334
|
@hosted_zones[fqdn] ||=
|
|
356
335
|
begin
|
|
357
|
-
|
|
358
|
-
hosted_zones = @route53_client.list_hosted_zones_by_name(
|
|
336
|
+
warn "looking for a hosted zone with fqdn '#{fqdn}'"
|
|
337
|
+
hosted_zones = @route53_client.list_hosted_zones_by_name(dns_name: fqdn).hosted_zones.select do |zone|
|
|
359
338
|
zone.name == "#{fqdn}." && !zone.config.private_zone
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
when hosted_zones.count == 1
|
|
339
|
+
end
|
|
340
|
+
if hosted_zones.count == 1
|
|
363
341
|
hosted_zones.first
|
|
364
|
-
|
|
342
|
+
elsif hosted_zones.count < 1
|
|
365
343
|
raise "No hosted zone with fqdn '#{fqdn}' was found."
|
|
366
|
-
|
|
344
|
+
elsif hosted_zones.count > 1
|
|
367
345
|
raise "More than one hosted zone with name '#{fqdn}' was found: " + hosted_zones.join(', ')
|
|
368
346
|
end
|
|
369
347
|
end
|
|
@@ -373,11 +351,11 @@ module Terrafying
|
|
|
373
351
|
@hosted_zones ||= {}
|
|
374
352
|
@hosted_zones[tag] ||=
|
|
375
353
|
begin
|
|
376
|
-
|
|
354
|
+
warn "looking for a hosted zone with tag '#{tag}'"
|
|
377
355
|
@aws_hosted_zones ||= @route53_client.list_hosted_zones.hosted_zones.map do |zone|
|
|
378
356
|
{
|
|
379
357
|
zone: zone,
|
|
380
|
-
tags: @route53_client.list_tags_for_resource(
|
|
358
|
+
tags: @route53_client.list_tags_for_resource(resource_type: 'hostedzone', resource_id: zone.id.split('/')[2]).resource_tag_set.tags
|
|
381
359
|
}
|
|
382
360
|
end
|
|
383
361
|
|
|
@@ -387,12 +365,11 @@ module Terrafying
|
|
|
387
365
|
end
|
|
388
366
|
end
|
|
389
367
|
|
|
390
|
-
|
|
391
|
-
when hosted_zones.count == 1
|
|
368
|
+
if hosted_zones.count == 1
|
|
392
369
|
hosted_zones.first[:zone]
|
|
393
|
-
|
|
370
|
+
elsif hosted_zones.count < 1
|
|
394
371
|
raise "No hosted zone with tag '#{tag}' was found."
|
|
395
|
-
|
|
372
|
+
elsif hosted_zones.count > 1
|
|
396
373
|
raise "More than one hosted zone with tag '#{tag}' was found: " + hosted_zones.join(', ')
|
|
397
374
|
end
|
|
398
375
|
end
|
|
@@ -402,7 +379,7 @@ module Terrafying
|
|
|
402
379
|
@s3_objects ||= {}
|
|
403
380
|
@s3_objects["#{bucket}-#{key}"] ||=
|
|
404
381
|
begin
|
|
405
|
-
resp = @s3_client.get_object(
|
|
382
|
+
resp = @s3_client.get_object(bucket: bucket, key: key)
|
|
406
383
|
resp.body.read
|
|
407
384
|
end
|
|
408
385
|
end
|
|
@@ -411,7 +388,7 @@ module Terrafying
|
|
|
411
388
|
@list_objects ||= {}
|
|
412
389
|
@list_objects[bucket] ||=
|
|
413
390
|
begin
|
|
414
|
-
resp = @s3_client.list_objects_v2(
|
|
391
|
+
resp = @s3_client.list_objects_v2(bucket: bucket)
|
|
415
392
|
resp.contents
|
|
416
393
|
end
|
|
417
394
|
end
|
|
@@ -421,23 +398,20 @@ module Terrafying
|
|
|
421
398
|
@endpoint_service[service_name] ||=
|
|
422
399
|
begin
|
|
423
400
|
resp = @ec2_client.describe_vpc_endpoint_service_configurations(
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
],
|
|
431
|
-
}
|
|
401
|
+
filters: [
|
|
402
|
+
{
|
|
403
|
+
name: 'service-name',
|
|
404
|
+
values: [service_name]
|
|
405
|
+
}
|
|
406
|
+
]
|
|
432
407
|
)
|
|
433
408
|
|
|
434
409
|
endpoint_services = resp.service_configurations
|
|
435
|
-
|
|
436
|
-
when endpoint_services.count == 1
|
|
410
|
+
if endpoint_services.count == 1
|
|
437
411
|
endpoint_services.first
|
|
438
|
-
|
|
412
|
+
elsif endpoint_services.count < 1
|
|
439
413
|
raise "No endpoint service with name '#{service_name}' was found."
|
|
440
|
-
|
|
414
|
+
elsif endpoint_services.count > 1
|
|
441
415
|
raise "More than one endpoint service with name '#{service_name}' was found: " + endpoint_services.join(', ')
|
|
442
416
|
end
|
|
443
417
|
end
|
|
@@ -449,16 +423,15 @@ module Terrafying
|
|
|
449
423
|
begin
|
|
450
424
|
resp = @ec2_client.describe_vpc_endpoint_service_configurations
|
|
451
425
|
|
|
452
|
-
services = resp.service_configurations.select
|
|
426
|
+
services = resp.service_configurations.select do |service|
|
|
453
427
|
service.network_load_balancer_arns.include?(arn)
|
|
454
|
-
|
|
428
|
+
end
|
|
455
429
|
|
|
456
|
-
|
|
457
|
-
when services.count == 1
|
|
430
|
+
if services.count == 1
|
|
458
431
|
services.first
|
|
459
|
-
|
|
432
|
+
elsif services.count < 1
|
|
460
433
|
raise "No endpoint service with lb arn '#{arn}' was found."
|
|
461
|
-
|
|
434
|
+
elsif services.count > 1
|
|
462
435
|
raise "More than one endpoint service with lb arn '#{arn}' was found: " + services.join(', ')
|
|
463
436
|
end
|
|
464
437
|
end
|
|
@@ -468,14 +441,13 @@ module Terrafying
|
|
|
468
441
|
@lbs ||= {}
|
|
469
442
|
@lbs[name] ||=
|
|
470
443
|
begin
|
|
471
|
-
load_balancers = @elb_client.describe_load_balancers(
|
|
444
|
+
load_balancers = @elb_client.describe_load_balancers(names: [name]).load_balancers
|
|
472
445
|
|
|
473
|
-
|
|
474
|
-
when load_balancers.count == 1
|
|
446
|
+
if load_balancers.count == 1
|
|
475
447
|
load_balancers.first
|
|
476
|
-
|
|
448
|
+
elsif load_balancers.count < 1
|
|
477
449
|
raise "No load balancer with name '#{name}' was found."
|
|
478
|
-
|
|
450
|
+
elsif load_balancers.count > 1
|
|
479
451
|
raise "More than one load balancer with name '#{name}' was found: " + load_balancers.join(', ')
|
|
480
452
|
end
|
|
481
453
|
end
|
|
@@ -486,9 +458,7 @@ module Terrafying
|
|
|
486
458
|
@target_groups[arn] ||=
|
|
487
459
|
begin
|
|
488
460
|
resp = @elb_client.describe_target_groups(
|
|
489
|
-
|
|
490
|
-
load_balancer_arn: arn,
|
|
491
|
-
}
|
|
461
|
+
load_balancer_arn: arn
|
|
492
462
|
)
|
|
493
463
|
|
|
494
464
|
resp.target_groups
|
|
@@ -500,16 +470,16 @@ module Terrafying
|
|
|
500
470
|
next_token = nil
|
|
501
471
|
|
|
502
472
|
loop do
|
|
503
|
-
resp = @autoscaling_client.describe_auto_scaling_groups(
|
|
473
|
+
resp = @autoscaling_client.describe_auto_scaling_groups(next_token: next_token)
|
|
504
474
|
|
|
505
|
-
asgs
|
|
506
|
-
matches = asg.tags.select
|
|
475
|
+
asgs += resp.auto_scaling_groups.select do |asg|
|
|
476
|
+
matches = asg.tags.select do |tag|
|
|
507
477
|
expectedTags[tag.key.to_sym] == tag.value ||
|
|
508
478
|
expectedTags[tag.key] == tag.value
|
|
509
|
-
|
|
479
|
+
end
|
|
510
480
|
|
|
511
481
|
matches.count == expectedTags.count
|
|
512
|
-
|
|
482
|
+
end
|
|
513
483
|
|
|
514
484
|
if resp.next_token
|
|
515
485
|
next_token = resp.next_token
|
|
@@ -520,7 +490,39 @@ module Terrafying
|
|
|
520
490
|
|
|
521
491
|
asgs
|
|
522
492
|
end
|
|
523
|
-
end
|
|
524
493
|
|
|
494
|
+
def products(products_filter, _region = 'us-east-1')
|
|
495
|
+
next_token = nil
|
|
496
|
+
Enumerator.new do |y|
|
|
497
|
+
loop do
|
|
498
|
+
resp = @pricing_client.get_products(products_filter.merge(next_token: next_token))
|
|
499
|
+
resp.price_list.each do |product|
|
|
500
|
+
y << product
|
|
501
|
+
end
|
|
502
|
+
next_token = resp.next_token
|
|
503
|
+
break if next_token.nil?
|
|
504
|
+
end
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
def instance_type_vcpu_count(instance_type, location = 'EU (Ireland)')
|
|
509
|
+
products_filter = {
|
|
510
|
+
service_code: 'AmazonEC2',
|
|
511
|
+
filters: [
|
|
512
|
+
{ field: 'operatingSystem', type: 'TERM_MATCH', value: 'Linux' },
|
|
513
|
+
{ field: 'tenancy', type: 'TERM_MATCH', value: 'Shared' },
|
|
514
|
+
{ field: 'instanceType', type: 'TERM_MATCH', value: instance_type },
|
|
515
|
+
{ field: 'location', type: 'TERM_MATCH', value: location },
|
|
516
|
+
{ field: 'preInstalledSw', type: 'TERM_MATCH', value: 'NA' }
|
|
517
|
+
],
|
|
518
|
+
format_version: 'aws_v1'
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
products(products_filter).each do |product|
|
|
522
|
+
vcpu = JSON.parse(product)['product']['attributes']['vcpu']
|
|
523
|
+
return vcpu.to_i if vcpu
|
|
524
|
+
end
|
|
525
|
+
end
|
|
526
|
+
end
|
|
525
527
|
end
|
|
526
528
|
end
|