chef-provisioning-aws 1.1.1 → 1.2.0
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/README.md +237 -12
- data/lib/chef/provider/aws_dhcp_options.rb +4 -1
- data/lib/chef/provider/aws_load_balancer.rb +1 -1
- data/lib/chef/provider/aws_route_table.rb +40 -6
- data/lib/chef/provider/aws_security_group.rb +1 -1
- data/lib/chef/provider/aws_subnet.rb +8 -1
- data/lib/chef/provider/aws_vpc.rb +47 -15
- data/lib/chef/provisioning/aws_driver/aws_provider.rb +41 -0
- data/lib/chef/provisioning/aws_driver/aws_resource_with_entry.rb +7 -0
- data/lib/chef/provisioning/aws_driver/driver.rb +114 -43
- data/lib/chef/provisioning/aws_driver/exceptions.rb +16 -0
- data/lib/chef/provisioning/aws_driver/super_lwrp.rb +1 -1
- data/lib/chef/provisioning/aws_driver/version.rb +1 -1
- data/lib/chef/resource/aws_ebs_volume.rb +2 -2
- data/lib/chef/resource/aws_eip_address.rb +3 -0
- data/lib/chef/resource/aws_route_table.rb +31 -0
- data/lib/chef/resource/aws_security_group.rb +29 -5
- data/spec/aws_support.rb +5 -1
- data/spec/aws_support/matchers/have_aws_object_tags.rb +63 -0
- data/spec/integration/aws_ebs_volume_spec.rb +8 -8
- data/spec/integration/aws_route_table_spec.rb +33 -0
- data/spec/integration/aws_security_group_spec.rb +86 -0
- data/spec/integration/aws_tagged_items_spec.rb +160 -0
- data/spec/integration/aws_vpc_spec.rb +2 -2
- metadata +6 -3
@@ -121,6 +121,8 @@ class AWSProvider < Chef::Provider::LWRPBase
|
|
121
121
|
aws_object = create_aws_object
|
122
122
|
end
|
123
123
|
|
124
|
+
converge_tags(aws_object)
|
125
|
+
|
124
126
|
#
|
125
127
|
# Associate the managed entry with the AWS object
|
126
128
|
#
|
@@ -221,6 +223,45 @@ class AWSProvider < Chef::Provider::LWRPBase
|
|
221
223
|
raise NotImplementedError, :destroy_aws_object
|
222
224
|
end
|
223
225
|
|
226
|
+
# Update AWS resource tags
|
227
|
+
#
|
228
|
+
# AWS resources which include the TaggedItem Module
|
229
|
+
# will have an 'aws_tags' attribute available.
|
230
|
+
# The 'aws_tags' Hash will apply all the tags within
|
231
|
+
# the hash, and remove existing tags not included within
|
232
|
+
# the hash. The 'Name' tag will not removed. The 'Name'
|
233
|
+
# tag can still be updated in the hash.
|
234
|
+
#
|
235
|
+
# @param aws_object Aws SDK Object to update tags
|
236
|
+
#
|
237
|
+
def converge_tags(aws_object)
|
238
|
+
desired_tags = new_resource.aws_tags
|
239
|
+
# If aws_tags were not provided we exit
|
240
|
+
if desired_tags.nil?
|
241
|
+
Chef::Log.debug "aws_tags not provided, nothing to converge"
|
242
|
+
return
|
243
|
+
end
|
244
|
+
current_tags = aws_object.tags.to_h
|
245
|
+
# AWS always returns tags as strings, and we don't want to overwrite a
|
246
|
+
# tag-as-string with the same tag-as-symbol
|
247
|
+
desired_tags = Hash[desired_tags.map {|k, v| [k.to_s, v.to_s] }]
|
248
|
+
tags_to_update = desired_tags.reject {|k,v| current_tags[k] == v}
|
249
|
+
tags_to_delete = current_tags.keys - desired_tags.keys
|
250
|
+
# We don't want to delete `Name`, just all other tags
|
251
|
+
tags_to_delete.delete('Name')
|
252
|
+
|
253
|
+
unless tags_to_update.empty?
|
254
|
+
converge_by "applying tags #{tags_to_update}" do
|
255
|
+
aws_object.tags.set(tags_to_update)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
unless tags_to_delete.empty?
|
259
|
+
converge_by "deleting tags #{tags_to_delete.inspect}" do
|
260
|
+
aws_object.tags.delete(*tags_to_delete)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
224
265
|
# Wait until aws_object obtains one of expected_status
|
225
266
|
#
|
226
267
|
# @param aws_object Aws SDK Object to check status on
|
@@ -3,6 +3,13 @@ require 'chef/provisioning/aws_driver/resources'
|
|
3
3
|
|
4
4
|
# Common AWS resource - contains metadata that all AWS resources will need
|
5
5
|
class Chef::Provisioning::AWSDriver::AWSResourceWithEntry < Chef::Provisioning::AWSDriver::AWSResource
|
6
|
+
|
7
|
+
# This should be a hash of tags to apply to the AWS object
|
8
|
+
#
|
9
|
+
# @param aws_tags [Hash] Should be a hash of keys & values to add. Keys and values
|
10
|
+
# can be provided as symbols or strings, but will be stored in AWS as strings.
|
11
|
+
attribute :aws_tags, kind_of: Hash
|
12
|
+
|
6
13
|
#
|
7
14
|
# Dissociate the ID of this object from Chef.
|
8
15
|
#
|
@@ -20,6 +20,8 @@ require 'chef/provisioning/aws_driver/credentials'
|
|
20
20
|
|
21
21
|
require 'yaml'
|
22
22
|
require 'aws-sdk-v1'
|
23
|
+
require 'retryable'
|
24
|
+
|
23
25
|
|
24
26
|
# loads the entire aws-sdk
|
25
27
|
AWS.eager_autoload!
|
@@ -84,10 +86,14 @@ module AWSDriver
|
|
84
86
|
updates << " attach subnets #{lb_options[:subnets].join(', ')}" if lb_options[:subnets]
|
85
87
|
updates << " with listeners #{lb_options[:listeners]}" if lb_options[:listeners]
|
86
88
|
updates << " with security groups #{lb_options[:security_groups]}" if lb_options[:security_groups]
|
89
|
+
updates << " with tags #{lb_options[:aws_tags]}" if lb_options[:aws_tags]
|
87
90
|
|
88
91
|
|
92
|
+
lb_aws_tags = lb_options[:aws_tags]
|
93
|
+
lb_options.delete(:aws_tags)
|
89
94
|
action_handler.perform_action updates do
|
90
95
|
actual_elb = elb.load_balancers.create(lb_spec.name, lb_options)
|
96
|
+
lb_options[:aws_tags] = lb_aws_tags
|
91
97
|
|
92
98
|
lb_spec.reference = {
|
93
99
|
'driver_version' => Chef::Provisioning::AWSDriver::VERSION,
|
@@ -269,6 +275,35 @@ module AWSDriver
|
|
269
275
|
end
|
270
276
|
end
|
271
277
|
|
278
|
+
# GRRRR curse you AWS and your crappy tagging support for ELBs
|
279
|
+
read_tags_block = lambda {|aws_object|
|
280
|
+
resp = elb.client.describe_tags load_balancer_names: [aws_object.name]
|
281
|
+
tags = {}
|
282
|
+
resp.data[:tag_descriptions] && resp.data[:tag_descriptions].each do |td|
|
283
|
+
td[:tags].each do |t|
|
284
|
+
tags[t[:key]] = t[:value]
|
285
|
+
end
|
286
|
+
end
|
287
|
+
tags
|
288
|
+
}
|
289
|
+
|
290
|
+
set_tags_block = lambda {|aws_object, desired_tags|
|
291
|
+
aws_form_tags = []
|
292
|
+
desired_tags.each do |k, v|
|
293
|
+
aws_form_tags << {key: k, value: v}
|
294
|
+
end
|
295
|
+
elb.client.add_tags load_balancer_names: [aws_object.name], tags: aws_form_tags
|
296
|
+
}
|
297
|
+
|
298
|
+
delete_tags_block=lambda {|aws_object, tags_to_delete|
|
299
|
+
aws_form_tags = []
|
300
|
+
tags_to_delete.each do |k, v|
|
301
|
+
aws_form_tags << {key: k}
|
302
|
+
end
|
303
|
+
elb.client.remove_tags load_balancer_names: [aws_object.name], tags: aws_form_tags
|
304
|
+
}
|
305
|
+
converge_tags(actual_elb, lb_options[:aws_tags], action_handler, read_tags_block, set_tags_block, delete_tags_block)
|
306
|
+
|
272
307
|
# Update instance list, but only if there are machines specified
|
273
308
|
if machine_specs
|
274
309
|
actual_instance_ids = actual_elb.instances.map { |i| i.instance_id }
|
@@ -326,22 +361,24 @@ module AWSDriver
|
|
326
361
|
# Image methods
|
327
362
|
def allocate_image(action_handler, image_spec, image_options, machine_spec, machine_options)
|
328
363
|
actual_image = image_for(image_spec)
|
364
|
+
aws_tags = image_options.delete(:aws_tags) || {}
|
329
365
|
if actual_image.nil? || !actual_image.exists? || actual_image.state == :failed
|
330
366
|
action_handler.perform_action "Create image #{image_spec.name} from machine #{machine_spec.name} with options #{image_options.inspect}" do
|
331
367
|
image_options[:name] ||= image_spec.name
|
332
368
|
image_options[:instance_id] ||= machine_spec.reference['instance_id']
|
333
369
|
image_options[:description] ||= "Image #{image_spec.name} created from machine #{machine_spec.name}"
|
334
370
|
Chef::Log.debug "AWS Image options: #{image_options.inspect}"
|
335
|
-
|
336
|
-
image.add_tag('From-Instance', :value => image_options[:instance_id]) if image_options[:instance_id]
|
371
|
+
actual_image = ec2.images.create(image_options.to_hash)
|
337
372
|
image_spec.reference = {
|
338
373
|
'driver_version' => Chef::Provisioning::AWSDriver::VERSION,
|
339
|
-
'image_id' =>
|
374
|
+
'image_id' => actual_image.id,
|
340
375
|
'allocated_at' => Time.now.to_i
|
341
376
|
}
|
342
377
|
image_spec.driver_url = driver_url
|
343
378
|
end
|
344
379
|
end
|
380
|
+
aws_tags['From-Instance'] = image_options[:instance_id] if image_options[:instance_id]
|
381
|
+
converge_tags(actual_image, aws_tags, action_handler)
|
345
382
|
end
|
346
383
|
|
347
384
|
def ready_image(action_handler, image_spec, image_options)
|
@@ -359,22 +396,12 @@ module AWSDriver
|
|
359
396
|
end
|
360
397
|
|
361
398
|
def destroy_image(action_handler, image_spec, image_options)
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
end
|
369
|
-
action_handler.perform_action "De-registering image #{image_spec.name}" do
|
370
|
-
actual_image.deregister
|
371
|
-
end
|
372
|
-
if snapshots.any?
|
373
|
-
action_handler.perform_action "Deleting image #{image_spec.name} snapshots" do
|
374
|
-
snapshots.each do |snap|
|
375
|
-
snap.delete
|
376
|
-
end
|
377
|
-
end
|
399
|
+
# TODO the driver should automatically be set by `inline_resource`
|
400
|
+
d = self
|
401
|
+
Provisioning.inline_resource(action_handler) do
|
402
|
+
aws_image image_spec.name do
|
403
|
+
action :destroy
|
404
|
+
driver d
|
378
405
|
end
|
379
406
|
end
|
380
407
|
end
|
@@ -402,25 +429,28 @@ EOD
|
|
402
429
|
# Machine methods
|
403
430
|
def allocate_machine(action_handler, machine_spec, machine_options)
|
404
431
|
actual_instance = instance_for(machine_spec)
|
432
|
+
bootstrap_options = bootstrap_options_for(action_handler, machine_spec, machine_options)
|
433
|
+
|
405
434
|
if actual_instance == nil || !actual_instance.exists? || actual_instance.status == :terminated
|
406
|
-
bootstrap_options = bootstrap_options_for(action_handler, machine_spec, machine_options)
|
407
435
|
|
408
436
|
action_handler.perform_action "Create #{machine_spec.name} with AMI #{bootstrap_options[:image_id]} in #{aws_config.region}" do
|
409
437
|
Chef::Log.debug "Creating instance with bootstrap options #{bootstrap_options}"
|
410
438
|
|
411
|
-
|
439
|
+
actual_instance = ec2.instances.create(bootstrap_options.to_hash)
|
412
440
|
|
413
441
|
# Make sure the instance is ready to be tagged
|
414
|
-
sleep 5
|
442
|
+
Retryable.retryable(:tries => 12, :sleep => 5, :on => [AWS::EC2::Errors::InvalidInstanceID::NotFound, TimeoutError]) do
|
443
|
+
raise TimeoutError unless actual_instance.status == :pending || actual_instance.status == :running
|
444
|
+
end
|
415
445
|
# TODO add other tags identifying user / node url (same as fog)
|
416
|
-
|
417
|
-
|
446
|
+
actual_instance.tags['Name'] = machine_spec.name
|
447
|
+
actual_instance.source_dest_check = machine_options[:source_dest_check] if machine_options.has_key?(:source_dest_check)
|
418
448
|
machine_spec.reference = {
|
419
449
|
'driver_version' => Chef::Provisioning::AWSDriver::VERSION,
|
420
450
|
'allocated_at' => Time.now.utc.to_s,
|
421
451
|
'host_node' => action_handler.host_node,
|
422
452
|
'image_id' => bootstrap_options[:image_id],
|
423
|
-
'instance_id' =>
|
453
|
+
'instance_id' => actual_instance.id
|
424
454
|
}
|
425
455
|
machine_spec.driver_url = driver_url
|
426
456
|
machine_spec.reference['key_name'] = bootstrap_options[:key_name] if bootstrap_options[:key_name]
|
@@ -429,6 +459,9 @@ EOD
|
|
429
459
|
end
|
430
460
|
end
|
431
461
|
end
|
462
|
+
# TODO because we don't want to add `provider_tags` as a base attribute,
|
463
|
+
# we have to update the tags here in driver.rb instead of the providers
|
464
|
+
converge_tags(actual_instance, machine_options[:aws_tags], action_handler)
|
432
465
|
end
|
433
466
|
|
434
467
|
def allocate_machines(action_handler, specs_and_options, parallelizer)
|
@@ -470,17 +503,15 @@ EOD
|
|
470
503
|
end
|
471
504
|
|
472
505
|
def destroy_machine(action_handler, machine_spec, machine_options)
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
machine_spec.reference = nil
|
506
|
+
d = self
|
507
|
+
Provisioning.inline_resource(action_handler) do
|
508
|
+
aws_instance machine_spec.name do
|
509
|
+
action :destroy
|
510
|
+
driver d
|
479
511
|
end
|
480
|
-
else
|
481
|
-
Chef::Log.warn "Instance #{machine_spec.reference['instance_id']} doesn't exist for #{machine_spec.name}"
|
482
512
|
end
|
483
513
|
|
514
|
+
# TODO move this into the aws_instance provider somehow
|
484
515
|
strategy = convergence_strategy_for(machine_spec, machine_options)
|
485
516
|
strategy.cleanup_convergence(action_handler, machine_spec)
|
486
517
|
end
|
@@ -563,6 +594,7 @@ EOD
|
|
563
594
|
|
564
595
|
def bootstrap_options_for(action_handler, machine_spec, machine_options)
|
565
596
|
bootstrap_options = (machine_options[:bootstrap_options] || {}).to_h.dup
|
597
|
+
bootstrap_options[:instance_type] ||= default_instance_type
|
566
598
|
image_id = bootstrap_options[:image_id] || machine_options[:image_id] || default_ami_for_region(aws_config.region)
|
567
599
|
bootstrap_options[:image_id] = image_id
|
568
600
|
if !bootstrap_options[:key_name]
|
@@ -650,23 +682,23 @@ EOD
|
|
650
682
|
|
651
683
|
case region
|
652
684
|
when 'ap-northeast-1'
|
653
|
-
'ami-
|
685
|
+
'ami-6cbca76d'
|
654
686
|
when 'ap-southeast-1'
|
655
|
-
'ami-
|
687
|
+
'ami-04c6ec56'
|
656
688
|
when 'ap-southeast-2'
|
657
|
-
'ami-
|
689
|
+
'ami-c9eb9ff3'
|
658
690
|
when 'eu-west-1'
|
659
|
-
'ami-
|
691
|
+
'ami-5f9e1028'
|
660
692
|
when 'eu-central-1'
|
661
|
-
'ami-
|
693
|
+
'ami-56c2f14b'
|
662
694
|
when 'sa-east-1'
|
663
|
-
'ami-
|
695
|
+
'ami-81f14e9c'
|
664
696
|
when 'us-east-1'
|
665
|
-
'ami-
|
697
|
+
'ami-12793a7a'
|
666
698
|
when 'us-west-1'
|
667
|
-
'ami-
|
699
|
+
'ami-6ebca42b'
|
668
700
|
when 'us-west-2'
|
669
|
-
'ami-
|
701
|
+
'ami-b9471c89'
|
670
702
|
else
|
671
703
|
raise 'Unsupported region!'
|
672
704
|
end
|
@@ -912,6 +944,7 @@ EOD
|
|
912
944
|
if actual_instance.status == :terminated
|
913
945
|
Chef::Log.warn "Machine #{machine_spec.name} (#{actual_instance.id}) is terminated. Recreating ..."
|
914
946
|
else
|
947
|
+
converge_tags(actual_instance, machine_options[:aws_tags], action_handler)
|
915
948
|
yield machine_spec, actual_instance if block_given?
|
916
949
|
next
|
917
950
|
end
|
@@ -951,6 +984,7 @@ EOD
|
|
951
984
|
machine_spec.driver_url = driver_url
|
952
985
|
instance.tags['Name'] = machine_spec.name
|
953
986
|
instance.source_dest_check = machine_options[:source_dest_check] if machine_options.has_key?(:source_dest_check)
|
987
|
+
converge_tags(instance, machine_options[:aws_tags], action_handler)
|
954
988
|
machine_spec.reference['key_name'] = bootstrap_options[:key_name] if bootstrap_options[:key_name]
|
955
989
|
%w(is_windows ssh_username sudo use_private_ip_for_ssh ssh_gateway).each do |key|
|
956
990
|
machine_spec.reference[key] = machine_options[key.to_sym] if machine_options[key.to_sym]
|
@@ -977,6 +1011,43 @@ EOD
|
|
977
1011
|
end.to_a
|
978
1012
|
end
|
979
1013
|
|
1014
|
+
# TODO This is currently duplicated from AWS Provider
|
1015
|
+
# Set the tags on the aws object to desired_tags, while ignoring any `Name` tag
|
1016
|
+
# If no tags need to be modified, will not perform a write call on AWS
|
1017
|
+
def converge_tags(
|
1018
|
+
aws_object,
|
1019
|
+
desired_tags,
|
1020
|
+
action_handler,
|
1021
|
+
read_tags_block=lambda {|aws_object| aws_object.tags.to_h},
|
1022
|
+
set_tags_block=lambda {|aws_object, desired_tags| aws_object.tags.set(desired_tags) },
|
1023
|
+
delete_tags_block=lambda {|aws_object, tags_to_delete| aws_object.tags.delete(*tags_to_delete) }
|
1024
|
+
)
|
1025
|
+
# If aws_tags were not provided we exit
|
1026
|
+
if desired_tags.nil?
|
1027
|
+
Chef::Log.debug "aws_tags not provided, nothing to converge"
|
1028
|
+
return
|
1029
|
+
end
|
1030
|
+
current_tags = read_tags_block.call(aws_object)
|
1031
|
+
# AWS always returns tags as strings, and we don't want to overwrite a
|
1032
|
+
# tag-as-string with the same tag-as-symbol
|
1033
|
+
desired_tags = Hash[desired_tags.map {|k, v| [k.to_s, v.to_s] }]
|
1034
|
+
tags_to_update = desired_tags.reject {|k,v| current_tags[k] == v}
|
1035
|
+
tags_to_delete = current_tags.keys - desired_tags.keys
|
1036
|
+
# We don't want to delete `Name`, just all other tags
|
1037
|
+
tags_to_delete.delete('Name')
|
1038
|
+
|
1039
|
+
unless tags_to_update.empty?
|
1040
|
+
action_handler.perform_action "applying tags #{tags_to_update}" do
|
1041
|
+
set_tags_block.call(aws_object, tags_to_update)
|
1042
|
+
end
|
1043
|
+
end
|
1044
|
+
unless tags_to_delete.empty?
|
1045
|
+
action_handler.perform_action "deleting tags #{tags_to_delete.inspect}" do
|
1046
|
+
delete_tags_block.call(aws_object, tags_to_delete)
|
1047
|
+
end
|
1048
|
+
end
|
1049
|
+
end
|
1050
|
+
|
980
1051
|
def get_listeners(listeners)
|
981
1052
|
case listeners
|
982
1053
|
when Hash
|
@@ -1035,7 +1106,7 @@ EOD
|
|
1035
1106
|
end
|
1036
1107
|
|
1037
1108
|
def default_instance_type
|
1038
|
-
'
|
1109
|
+
't2.micro'
|
1039
1110
|
end
|
1040
1111
|
|
1041
1112
|
PORT_DEFAULTS = {
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Chef
|
2
|
+
module Provisioning
|
3
|
+
module AWSDriver
|
4
|
+
module Exceptions
|
5
|
+
|
6
|
+
class MultipleSecurityGroupError < RuntimeError
|
7
|
+
def initialize(name, groups)
|
8
|
+
super "Found security groups with ids [#{groups.map {|sg| sg.id}}] that share name #{name}. " \
|
9
|
+
"Names are unique within VPCs - specify VPC to find by name."
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -45,7 +45,7 @@ end
|
|
45
45
|
|
46
46
|
module NoResourceCloning
|
47
47
|
def prior_resource
|
48
|
-
if resource_class
|
48
|
+
if resource_class <= Chef::Provisioning::AWSDriver::SuperLWRP
|
49
49
|
Chef::Log.debug "Canceling resource cloning for #{resource_class}"
|
50
50
|
nil
|
51
51
|
else
|
@@ -8,8 +8,8 @@ class Chef::Resource::AwsEbsVolume < Chef::Provisioning::AWSDriver::AWSResourceW
|
|
8
8
|
|
9
9
|
attribute :machine, kind_of: [ String, FalseClass, AwsInstance, AWS::EC2::Instance ]
|
10
10
|
|
11
|
-
attribute :availability_zone, kind_of: String
|
12
|
-
attribute :size, kind_of: Integer
|
11
|
+
attribute :availability_zone, kind_of: String, default: 'a'
|
12
|
+
attribute :size, kind_of: Integer, default: 8
|
13
13
|
attribute :snapshot, kind_of: String
|
14
14
|
|
15
15
|
attribute :iops, kind_of: Integer
|
@@ -6,6 +6,9 @@ class Chef::Resource::AwsEipAddress < Chef::Provisioning::AWSDriver::AWSResource
|
|
6
6
|
|
7
7
|
attribute :name, kind_of: String, name_attribute: true
|
8
8
|
|
9
|
+
# guh - every other AWSResourceWithEntry accepts tags EXCEPT this one
|
10
|
+
undef_method(:aws_tags)
|
11
|
+
|
9
12
|
# TODO network interface
|
10
13
|
attribute :machine, kind_of: [String, FalseClass]
|
11
14
|
attribute :associate_to_vpc, kind_of: [TrueClass, FalseClass]
|
@@ -34,6 +34,17 @@ class Chef::Resource::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSResource
|
|
34
34
|
#
|
35
35
|
attribute :vpc, kind_of: [ String, AwsVpc, AWS::EC2::VPC ], required: true
|
36
36
|
|
37
|
+
#
|
38
|
+
# Enable route propagation from one or more virtual private gateways
|
39
|
+
#
|
40
|
+
# The value should be an array of virtual private gateway ID:
|
41
|
+
# ```ruby
|
42
|
+
# virtual_private_gateways ['vgw-abcd1234', 'vgw-abcd5678']
|
43
|
+
# ```
|
44
|
+
#
|
45
|
+
attribute :virtual_private_gateways, kind_of: [ String, Array ],
|
46
|
+
coerce: proc { |v| [v].flatten }
|
47
|
+
|
37
48
|
#
|
38
49
|
# The routes for this route table.
|
39
50
|
#
|
@@ -58,6 +69,26 @@ class Chef::Resource::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSResource
|
|
58
69
|
#
|
59
70
|
attribute :routes, kind_of: Hash
|
60
71
|
|
72
|
+
#
|
73
|
+
# Regex to ignore one or more route targets.
|
74
|
+
#
|
75
|
+
# This is helpful when configuring HA NAT instances. If a NAT instance fails
|
76
|
+
# a auto-scaling group may launch a new NAT instance and update the route
|
77
|
+
# table accordingly. Chef provisioning should not attempt to change or remove
|
78
|
+
# this route.
|
79
|
+
#
|
80
|
+
# This attribute is specified as a regex since the full ID of the
|
81
|
+
# instance/network interface is not known ahead of time. In most cases the
|
82
|
+
# NAT instance route will point at a network interface attached to the NAT
|
83
|
+
# instance. The ID prefix for network interfaces is 'eni'. The following
|
84
|
+
# example shows how to ignore network interface routes.
|
85
|
+
#
|
86
|
+
# ```ruby
|
87
|
+
# ignore_route_targets ['^eni-']
|
88
|
+
# ```
|
89
|
+
attribute :ignore_route_targets, kind_of: [ String, Array ], default: [],
|
90
|
+
coerce: proc { |v| [v].flatten }
|
91
|
+
|
61
92
|
attribute :route_table_id, kind_of: String, aws_id_attribute: true, lazy_default: proc {
|
62
93
|
name =~ /^rtb-[a-f0-9]{8}$/ ? name : nil
|
63
94
|
}
|