MovableInkAWS 2.6.2 → 2.7.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/Gemfile.lock +19 -19
- data/lib/movable_ink/aws/iam.rb +23 -0
- data/lib/movable_ink/aws/route53.rb +9 -7
- data/lib/movable_ink/aws/ssm.rb +21 -2
- data/lib/movable_ink/aws.rb +4 -3
- data/lib/movable_ink/version.rb +1 -1
- data/spec/iam_spec.rb +43 -0
- data/spec/route53_spec.rb +28 -4
- data/spec/ssm_spec.rb +34 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c539b888e241eca594269dd052c7742eefdad57ab4dd5eeb0790a0fad507cff
|
4
|
+
data.tar.gz: 0ae613422476b0371f818eee49d7b8da5f659f93e4d8541f361816fb93afb3c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31f107ee7940dd7b18d7e7c50764fcc2971c63660eafc14ae642cf1819389487a118b2b26438912cd7e234b00e4009f95d60c58308a8200d31f47c86971390a3
|
7
|
+
data.tar.gz: 70b71c81bd0fe0a7806824b034dea3c4d08151582377de6eec2c9416a6d5fecc1fb4fae20f62ffe948a2c5c609f6399a70460d2fa4ba5cebdaae3726abc7bc8d
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
MovableInkAWS (2.
|
4
|
+
MovableInkAWS (2.7.0)
|
5
5
|
aws-sdk-athena (~> 1)
|
6
6
|
aws-sdk-autoscaling (~> 1)
|
7
7
|
aws-sdk-cloudwatch (~> 1)
|
@@ -25,53 +25,53 @@ GEM
|
|
25
25
|
addressable (2.7.0)
|
26
26
|
public_suffix (>= 2.0.2, < 5.0)
|
27
27
|
aws-eventstream (1.2.0)
|
28
|
-
aws-partitions (1.
|
29
|
-
aws-sdk-athena (1.
|
28
|
+
aws-partitions (1.605.0)
|
29
|
+
aws-sdk-athena (1.54.0)
|
30
30
|
aws-sdk-core (~> 3, >= 3.127.0)
|
31
31
|
aws-sigv4 (~> 1.1)
|
32
|
-
aws-sdk-autoscaling (1.
|
32
|
+
aws-sdk-autoscaling (1.79.0)
|
33
33
|
aws-sdk-core (~> 3, >= 3.127.0)
|
34
34
|
aws-sigv4 (~> 1.1)
|
35
|
-
aws-sdk-cloudwatch (1.
|
35
|
+
aws-sdk-cloudwatch (1.64.0)
|
36
36
|
aws-sdk-core (~> 3, >= 3.127.0)
|
37
37
|
aws-sigv4 (~> 1.1)
|
38
|
-
aws-sdk-core (3.
|
38
|
+
aws-sdk-core (3.131.2)
|
39
39
|
aws-eventstream (~> 1, >= 1.0.2)
|
40
40
|
aws-partitions (~> 1, >= 1.525.0)
|
41
41
|
aws-sigv4 (~> 1.1)
|
42
|
-
jmespath (~> 1.
|
43
|
-
aws-sdk-ec2 (1.
|
42
|
+
jmespath (~> 1, >= 1.6.1)
|
43
|
+
aws-sdk-ec2 (1.321.0)
|
44
44
|
aws-sdk-core (~> 3, >= 3.127.0)
|
45
45
|
aws-sigv4 (~> 1.1)
|
46
|
-
aws-sdk-eks (1.
|
46
|
+
aws-sdk-eks (1.75.0)
|
47
47
|
aws-sdk-core (~> 3, >= 3.127.0)
|
48
48
|
aws-sigv4 (~> 1.1)
|
49
|
-
aws-sdk-elasticache (1.
|
49
|
+
aws-sdk-elasticache (1.78.0)
|
50
50
|
aws-sdk-core (~> 3, >= 3.127.0)
|
51
51
|
aws-sigv4 (~> 1.1)
|
52
|
-
aws-sdk-iam (1.
|
52
|
+
aws-sdk-iam (1.69.0)
|
53
53
|
aws-sdk-core (~> 3, >= 3.127.0)
|
54
54
|
aws-sigv4 (~> 1.1)
|
55
|
-
aws-sdk-kms (1.
|
55
|
+
aws-sdk-kms (1.57.0)
|
56
56
|
aws-sdk-core (~> 3, >= 3.127.0)
|
57
57
|
aws-sigv4 (~> 1.1)
|
58
|
-
aws-sdk-rds (1.
|
58
|
+
aws-sdk-rds (1.148.0)
|
59
59
|
aws-sdk-core (~> 3, >= 3.127.0)
|
60
60
|
aws-sigv4 (~> 1.1)
|
61
|
-
aws-sdk-route53 (1.
|
61
|
+
aws-sdk-route53 (1.63.0)
|
62
62
|
aws-sdk-core (~> 3, >= 3.127.0)
|
63
63
|
aws-sigv4 (~> 1.1)
|
64
|
-
aws-sdk-s3 (1.
|
64
|
+
aws-sdk-s3 (1.114.0)
|
65
65
|
aws-sdk-core (~> 3, >= 3.127.0)
|
66
66
|
aws-sdk-kms (~> 1)
|
67
67
|
aws-sigv4 (~> 1.4)
|
68
68
|
aws-sdk-sns (1.53.0)
|
69
69
|
aws-sdk-core (~> 3, >= 3.127.0)
|
70
70
|
aws-sigv4 (~> 1.1)
|
71
|
-
aws-sdk-ssm (1.
|
71
|
+
aws-sdk-ssm (1.137.0)
|
72
72
|
aws-sdk-core (~> 3, >= 3.127.0)
|
73
73
|
aws-sigv4 (~> 1.1)
|
74
|
-
aws-sigv4 (1.
|
74
|
+
aws-sigv4 (1.5.0)
|
75
75
|
aws-eventstream (~> 1, >= 1.0.2)
|
76
76
|
crack (0.4.3)
|
77
77
|
safe_yaml (~> 1.0.0)
|
@@ -91,7 +91,7 @@ GEM
|
|
91
91
|
mime-types-data (~> 3.2015)
|
92
92
|
mime-types-data (3.2022.0105)
|
93
93
|
multi_xml (0.6.0)
|
94
|
-
multipart-post (2.
|
94
|
+
multipart-post (2.2.3)
|
95
95
|
public_suffix (4.0.5)
|
96
96
|
rspec (3.9.0)
|
97
97
|
rspec-core (~> 3.9.0)
|
@@ -121,4 +121,4 @@ DEPENDENCIES
|
|
121
121
|
webmock
|
122
122
|
|
123
123
|
BUNDLED WITH
|
124
|
-
2.3.
|
124
|
+
2.3.14
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'aws-sdk-iam'
|
2
|
+
|
3
|
+
module MovableInk
|
4
|
+
class AWS
|
5
|
+
module IAM
|
6
|
+
def is_arn_iam_user?(arn, username = nil)
|
7
|
+
# arn:aws:iam::account:user/user-name-with-path
|
8
|
+
!arn.match(/arn:aws:iam::\d+:user\/#{(username) ? username + '$' : ''}/).nil?
|
9
|
+
end
|
10
|
+
|
11
|
+
def is_arn_iam_role?(arn, rolename = nil)
|
12
|
+
# arn:aws:iam::account:role/role-name-with-path
|
13
|
+
!arn.match(/arn:aws:iam::\d+:role\/#{(rolename) ? rolename + '$' : ''}/).nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def is_arn_iam_assumed_role?(arn, rolename = nil, exact_match = true)
|
17
|
+
# arn:aws:sts::account:assumed-role/role-name/role-session-name
|
18
|
+
role_name_session_delimiter = (exact_match) ? '/' : ''
|
19
|
+
!arn.match(/arn:aws:sts::\d+:assumed\-role\/#{(rolename) ? rolename + role_name_session_delimiter : ''}/).nil?
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -13,18 +13,20 @@ module MovableInk
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def get_resource_record_sets_by_instance_name(zone, instance_name, client = nil)
|
16
|
-
resource_record_sets(zone, client).select{|rrs| rrs.set_identifier == instance_name}.
|
16
|
+
resource_record_sets(zone, client).select{|rrs| rrs.set_identifier == instance_name}.map(&:to_h)
|
17
17
|
end
|
18
18
|
|
19
19
|
def delete_resource_record_sets(zone, instance_name, client = nil)
|
20
|
-
|
21
|
-
return if
|
20
|
+
resource_record_sets = get_resource_record_sets_by_instance_name(zone, instance_name, client)
|
21
|
+
return if resource_record_sets.empty?
|
22
22
|
|
23
23
|
change_batch = {
|
24
|
-
"changes":
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
"changes": resource_record_sets.map { |resource_record_set|
|
25
|
+
{
|
26
|
+
"action": 'DELETE',
|
27
|
+
"resource_record_set": resource_record_set
|
28
|
+
}
|
29
|
+
}
|
28
30
|
}
|
29
31
|
|
30
32
|
run_with_backoff do
|
data/lib/movable_ink/aws/ssm.rb
CHANGED
@@ -4,14 +4,33 @@ module MovableInk
|
|
4
4
|
class AWS
|
5
5
|
module SSM
|
6
6
|
|
7
|
+
SSM_DEFAULT_REGION = 'us-east-1'
|
8
|
+
SSM_DEFAULT_FAILOVER_REGION = 'us-west-2'
|
9
|
+
|
10
|
+
def mi_secrets_config_file_path
|
11
|
+
'/etc/movableink/secrets_config.json'
|
12
|
+
end
|
13
|
+
|
14
|
+
def mi_secrets_config
|
15
|
+
@mi_secrets_config ||= (File.exist?(mi_secrets_config_file_path)) ? JSON.parse(File.read(mi_secrets_config_file_path), :symbolize_names => true) : nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def mi_ssm_clients_regions
|
19
|
+
default_regions = [SSM_DEFAULT_REGION, SSM_DEFAULT_FAILOVER_REGION]
|
20
|
+
|
21
|
+
return default_regions if !mi_secrets_config || !mi_secrets_config[:ssm_parameters_regions_map] || !mi_secrets_config[:ssm_parameters_regions_map].key?(my_region.to_sym)
|
22
|
+
my_region_map = mi_secrets_config[:ssm_parameters_regions_map][my_region.to_sym]
|
23
|
+
(my_region_map.keys == [:primary_region, :failover_region]) ? my_region_map.values : default_regions
|
24
|
+
end
|
25
|
+
|
7
26
|
def ssm_client(region = nil)
|
8
27
|
@ssm_clients_map ||= {}
|
9
|
-
@ssm_clients_map[region] ||= Aws::SSM::Client.new(region: (region.nil?) ?
|
28
|
+
@ssm_clients_map[region] ||= Aws::SSM::Client.new(region: (region.nil?) ? mi_ssm_clients_regions[0] : region)
|
10
29
|
end
|
11
30
|
|
12
31
|
def ssm_client_failover(failregion = nil)
|
13
32
|
@ssm_failover_clients_map ||= {}
|
14
|
-
@ssm_failover_clients_map[failregion] ||= Aws::SSM::Client.new(region: (failregion.nil?) ?
|
33
|
+
@ssm_failover_clients_map[failregion] ||= Aws::SSM::Client.new(region: (failregion.nil?) ? mi_ssm_clients_regions[1] : failregion)
|
15
34
|
end
|
16
35
|
|
17
36
|
def run_with_backoff_and_client_fallback(region = nil, failregion = nil, &block)
|
data/lib/movable_ink/aws.rb
CHANGED
@@ -7,13 +7,12 @@ require_relative 'aws/route53'
|
|
7
7
|
require_relative 'aws/ssm'
|
8
8
|
require_relative 'aws/athena'
|
9
9
|
require_relative 'aws/s3'
|
10
|
+
require_relative 'aws/iam'
|
10
11
|
require_relative 'aws/eks'
|
11
12
|
require_relative 'aws/elasticache'
|
12
13
|
require_relative 'aws/api_gateway'
|
13
14
|
require_relative 'consul/consul'
|
14
15
|
require 'aws-sdk-cloudwatch'
|
15
|
-
require 'aws-sdk-iam'
|
16
|
-
|
17
16
|
|
18
17
|
module MovableInk
|
19
18
|
class AWS
|
@@ -28,6 +27,7 @@ module MovableInk
|
|
28
27
|
include ElastiCache
|
29
28
|
include ApiGateway
|
30
29
|
include EKS
|
30
|
+
include IAM
|
31
31
|
|
32
32
|
class << self
|
33
33
|
def regions
|
@@ -36,7 +36,8 @@ module MovableInk
|
|
36
36
|
'rld' => 'us-west-2',
|
37
37
|
'dub' => 'eu-west-1',
|
38
38
|
'ord' => 'us-east-2',
|
39
|
-
'fra' => 'eu-central-1'
|
39
|
+
'fra' => 'eu-central-1',
|
40
|
+
'par' => 'eu-west-3'
|
40
41
|
}
|
41
42
|
end
|
42
43
|
end
|
data/lib/movable_ink/version.rb
CHANGED
data/spec/iam_spec.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative '../lib/movable_ink/aws'
|
2
|
+
|
3
|
+
describe MovableInk::AWS::IAM do
|
4
|
+
let(:aws) { MovableInk::AWS.new }
|
5
|
+
|
6
|
+
describe 'is_arn_iam_user?' do
|
7
|
+
it 'matches user by arn type' do
|
8
|
+
expect(aws.is_arn_iam_user?('arn:aws:iam::123:user/anosulchyk')).to eq true
|
9
|
+
expect(aws.is_arn_iam_user?('arn:aws:iam::123:role/anosulchyk')).to eq false
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'matches user by arn type and name' do
|
13
|
+
expect(aws.is_arn_iam_user?('arn:aws:iam::123:user/anosulchyk', 'anosulchyk')).to eq true
|
14
|
+
expect(aws.is_arn_iam_user?('arn:aws:iam::123:user/this/is/user/too', 'this/is/user/too')).to eq true
|
15
|
+
expect(aws.is_arn_iam_user?('arn:aws:iam::123:user/anosulchyk', 'anosulchik11')).to eq false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'is_arn_iam_role?' do
|
20
|
+
it 'matches role by arn type' do
|
21
|
+
expect(aws.is_arn_iam_role?('arn:aws:iam::123:role/anosulchyk')).to eq true
|
22
|
+
expect(aws.is_arn_iam_role?('arn:aws:sts::123:role/anosulchyk')).to eq false
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'matches role by arn type and name' do
|
26
|
+
expect(aws.is_arn_iam_role?('arn:aws:iam::123:role/anosulchyk', 'anosulchyk')).to eq true
|
27
|
+
expect(aws.is_arn_iam_role?('arn:aws:iam::123:role/anosulchyk', 'anosulchik11')).to eq false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'is_arn_iam_assumed_role?' do
|
32
|
+
it 'matches role by arn type' do
|
33
|
+
expect(aws.is_arn_iam_assumed_role?('arn:aws:sts::123:assumed-role/anosulchyk/session')).to eq true
|
34
|
+
expect(aws.is_arn_iam_assumed_role?('arn:aws:sts::123:role/anosulchyk')).to eq false
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'matches role by arn type and name' do
|
38
|
+
expect(aws.is_arn_iam_assumed_role?('arn:aws:sts::123:assumed-role/anosulchyk/session', 'anosulchyk')).to eq true
|
39
|
+
expect(aws.is_arn_iam_assumed_role?('arn:aws:sts::123:assumed-role/anosulchyk/session-name', '1anosulchyk1')).to eq false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
data/spec/route53_spec.rb
CHANGED
@@ -15,6 +15,11 @@ describe MovableInk::AWS::Route53 do
|
|
15
15
|
name: 'host2.domain.tld.',
|
16
16
|
set_identifier: '10_0_0_2',
|
17
17
|
type: '???'
|
18
|
+
},
|
19
|
+
{
|
20
|
+
name: 'host2-other.domain.tld.',
|
21
|
+
set_identifier: '10_0_0_2',
|
22
|
+
type: '???'
|
18
23
|
}
|
19
24
|
])
|
20
25
|
}
|
@@ -23,12 +28,23 @@ describe MovableInk::AWS::Route53 do
|
|
23
28
|
route53.stub_responses(:list_resource_record_sets, rrset_data)
|
24
29
|
allow(aws).to receive(:route53).and_return(route53)
|
25
30
|
|
26
|
-
expect(aws.resource_record_sets('Z123').count).to eq(
|
27
|
-
expect(aws.resource_record_sets('Z123').
|
28
|
-
expect(aws.resource_record_sets('Z123').
|
31
|
+
expect(aws.resource_record_sets('Z123').count).to eq(3)
|
32
|
+
expect(aws.resource_record_sets('Z123')[0].name).to eq('host1.domain.tld.')
|
33
|
+
expect(aws.resource_record_sets('Z123')[1].name).to eq('host2.domain.tld.')
|
34
|
+
expect(aws.resource_record_sets('Z123')[2].name).to eq('host2-other.domain.tld.')
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns all sets with an identifier" do
|
38
|
+
route53.stub_responses(:list_resource_record_sets, rrset_data)
|
39
|
+
allow(aws).to receive(:route53).and_return(route53)
|
40
|
+
|
41
|
+
sets = aws.get_resource_record_sets_by_instance_name('Z123', '10_0_0_2')
|
42
|
+
expect(sets.count).to eq(2)
|
43
|
+
expect(sets[0][:name]).to eq('host2.domain.tld.')
|
44
|
+
expect(sets[1][:name]).to eq('host2-other.domain.tld.')
|
29
45
|
end
|
30
46
|
|
31
|
-
it 'deletes
|
47
|
+
it 'deletes rrsets that exist under the same identifier' do
|
32
48
|
route53.stub_responses(:list_resource_record_sets, rrset_data)
|
33
49
|
allow(aws).to receive(:route53).and_return(route53)
|
34
50
|
|
@@ -41,6 +57,14 @@ describe MovableInk::AWS::Route53 do
|
|
41
57
|
type: "???",
|
42
58
|
set_identifier: "10_0_0_2"
|
43
59
|
}
|
60
|
+
},
|
61
|
+
{
|
62
|
+
action: "DELETE",
|
63
|
+
resource_record_set: {
|
64
|
+
name: "host2-other.domain.tld.",
|
65
|
+
type: "???",
|
66
|
+
set_identifier: "10_0_0_2"
|
67
|
+
}
|
44
68
|
}]
|
45
69
|
},
|
46
70
|
hosted_zone_id: "Z123"
|
data/spec/ssm_spec.rb
CHANGED
@@ -9,6 +9,8 @@ describe MovableInk::AWS::SSM do
|
|
9
9
|
value: 'too-many-secrets'
|
10
10
|
})
|
11
11
|
}
|
12
|
+
let(:mi_secrets_config_file_path) { '/etc/movableink/secrets_config.json' }
|
13
|
+
let(:mi_secrets_config_file_mock) { "{\"ssm_parameters_regions_map\": { \"us-east-1\": {\"primary_region\": \"us-east-1\", \"failover_region\": \"us-east-2\"}}}" }
|
12
14
|
let(:parameters) { ssm.stub_data(:get_parameters_by_path, parameters: [
|
13
15
|
{
|
14
16
|
name: '/test/zelda/Its',
|
@@ -113,4 +115,36 @@ describe MovableInk::AWS::SSM do
|
|
113
115
|
expect(results).to include(1, 2)
|
114
116
|
end
|
115
117
|
end
|
118
|
+
|
119
|
+
describe 'mi_secrets_config_file_path' do
|
120
|
+
it 'returns string' do
|
121
|
+
expect(aws.mi_secrets_config_file_path).to eq mi_secrets_config_file_path
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe 'mi_secrets_config' do
|
126
|
+
it 'parses config file with symbols' do
|
127
|
+
allow(File).to receive(:read).with(mi_secrets_config_file_path).and_return(mi_secrets_config_file_mock)
|
128
|
+
allow(File).to receive(:exist?).with(mi_secrets_config_file_path).and_return(true)
|
129
|
+
|
130
|
+
config = aws.mi_secrets_config
|
131
|
+
expect(config.keys).to eq([:ssm_parameters_regions_map])
|
132
|
+
expect(config[:ssm_parameters_regions_map][:"us-east-1"][:primary_region]).to eq 'us-east-1'
|
133
|
+
expect(config[:ssm_parameters_regions_map][:"us-east-1"][:failover_region]).to eq 'us-east-2'
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe 'mi_ssm_clients_regions' do
|
138
|
+
it 'returns values from config' do
|
139
|
+
allow(aws).to receive(:mi_secrets_config).and_return(JSON.parse(mi_secrets_config_file_mock, :symbolize_names => true))
|
140
|
+
allow(aws).to receive(:my_region).and_return('us-east-1')
|
141
|
+
expect(aws.mi_ssm_clients_regions).to eq ['us-east-1', 'us-east-2']
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'returns default values if config is missing' do
|
145
|
+
allow(aws).to receive(:mi_secrets_config).and_return(nil)
|
146
|
+
allow(aws).to receive(:my_region).and_return('us-east-1')
|
147
|
+
expect(aws.mi_ssm_clients_regions).to eq ['us-east-1', 'us-west-2']
|
148
|
+
end
|
149
|
+
end
|
116
150
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: MovableInkAWS
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Chesler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-core
|
@@ -255,6 +255,7 @@ files:
|
|
255
255
|
- lib/movable_ink/aws/eks.rb
|
256
256
|
- lib/movable_ink/aws/elasticache.rb
|
257
257
|
- lib/movable_ink/aws/errors.rb
|
258
|
+
- lib/movable_ink/aws/iam.rb
|
258
259
|
- lib/movable_ink/aws/metadata.rb
|
259
260
|
- lib/movable_ink/aws/route53.rb
|
260
261
|
- lib/movable_ink/aws/s3.rb
|
@@ -267,6 +268,7 @@ files:
|
|
267
268
|
- spec/consul_spec.rb
|
268
269
|
- spec/ec2_spec.rb
|
269
270
|
- spec/elasticache_spec.rb
|
271
|
+
- spec/iam_spec.rb
|
270
272
|
- spec/metadata_spec.rb
|
271
273
|
- spec/route53_spec.rb
|
272
274
|
- spec/s3_spec.rb
|