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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fb359b343b37bc026f547aa8edc0dcd01fc85786947ef5dc8a6d9ef8b6da05d1
4
- data.tar.gz: f0c0c888ac995d1f1c895ae359ff19bc93e46b3ea621852733b39475cad138e1
3
+ metadata.gz: 0c539b888e241eca594269dd052c7742eefdad57ab4dd5eeb0790a0fad507cff
4
+ data.tar.gz: 0ae613422476b0371f818eee49d7b8da5f659f93e4d8541f361816fb93afb3c4
5
5
  SHA512:
6
- metadata.gz: 698f828137a5d649ebe788b5d9c4ab42f333e0a80eeca47708044121703c8afa79248bd86ab8ec0f6afac221c8506d3e52e10356a6f2a3213a09a45926d2d4f0
7
- data.tar.gz: 2d68a15e5b41f608411a498fad5db04ec837cdf88791605a73f285e64d1f58964bb7b6d49d7ff6d570e8c919f3c280f607bf6bbc84554339cfbf1ea29eb8de88
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.6.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.573.0)
29
- aws-sdk-athena (1.52.0)
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.78.0)
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.62.0)
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.130.0)
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.0)
43
- aws-sdk-ec2 (1.305.0)
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.74.0)
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.76.0)
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.68.0)
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.0)
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.142.0)
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.62.0)
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.113.0)
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.134.0)
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.4.0)
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.1.1)
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.11
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}.first.to_h
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
- resource_record_set = get_resource_record_sets_by_instance_name(zone, instance_name, client)
21
- return if resource_record_set.empty?
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
- "action": 'DELETE',
26
- "resource_record_set": resource_record_set
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
@@ -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?) ? 'us-east-1' : region)
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?) ? 'us-west-2' : failregion)
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)
@@ -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
@@ -1,5 +1,5 @@
1
1
  module MovableInk
2
2
  class AWS
3
- VERSION = '2.6.2'
3
+ VERSION = '2.7.0'
4
4
  end
5
5
  end
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(2)
27
- expect(aws.resource_record_sets('Z123').first.name).to eq('host1.domain.tld.')
28
- expect(aws.resource_record_sets('Z123').last.name).to eq('host2.domain.tld.')
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 a rrset that exists' do
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.6.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-05-09 00:00:00.000000000 Z
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