MovableInkAWS 2.6.1 → 2.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 238d21eb16377f58da3db182b93157e34f26e05b5a12a8f233039153e581ab1a
4
- data.tar.gz: 55249c69017ffb581c53478eedb109c026fce69fde1dec5f60580d66b42970af
3
+ metadata.gz: d617b4671eb664f2e36fc1f1df11607066c0a46c1c5e536a552eb2c7ac451545
4
+ data.tar.gz: 5d975ee847ec37369c1488dd7c4ecc11c5d4abae33bb9131308260af256a557d
5
5
  SHA512:
6
- metadata.gz: 365976f0e0e1ba918bfd8875e95e0d78d3ce59cf83ab6896b3c001250046cf5081e2cfe09b192196e01f7daef60c41523e647d720a5b8356980e2fca3900dfe2
7
- data.tar.gz: 2fed258445a35f69973085710a2465e09845a1e98068f1f535551cefb3e1ebd11af9fdaed90781055b4757961eb107f8b92745bb4a0f3443cb25ebe95d7c8b75
6
+ metadata.gz: 70ace6a3c1a4f9d4a60e1053f93c0d37e10e5737800b149c358f804b02b3de9522dd9624dc0723b1da66bc2912544ce91de18ee8852926e39665c61cc2d8a6d5
7
+ data.tar.gz: b51afda56e2c80126efa86737ef9359327698324a61fc67e9c86774e4f0eb191cead2c235e665f843c8fb4f0f7b6be881dee04c271671a6c9d3e70680f5862ad
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- MovableInkAWS (2.6.1)
4
+ MovableInkAWS (2.6.5)
5
5
  aws-sdk-athena (~> 1)
6
6
  aws-sdk-autoscaling (~> 1)
7
7
  aws-sdk-cloudwatch (~> 1)
@@ -9,6 +9,7 @@ PATH
9
9
  aws-sdk-ec2 (~> 1)
10
10
  aws-sdk-eks (~> 1)
11
11
  aws-sdk-elasticache (~> 1)
12
+ aws-sdk-iam (~> 1)
12
13
  aws-sdk-rds (~> 1)
13
14
  aws-sdk-route53 (~> 1)
14
15
  aws-sdk-s3 (~> 1)
@@ -48,6 +49,9 @@ GEM
48
49
  aws-sdk-elasticache (1.76.0)
49
50
  aws-sdk-core (~> 3, >= 3.127.0)
50
51
  aws-sigv4 (~> 1.1)
52
+ aws-sdk-iam (1.68.0)
53
+ aws-sdk-core (~> 3, >= 3.127.0)
54
+ aws-sigv4 (~> 1.1)
51
55
  aws-sdk-kms (1.55.0)
52
56
  aws-sdk-core (~> 3, >= 3.127.0)
53
57
  aws-sigv4 (~> 1.1)
@@ -117,4 +121,4 @@ DEPENDENCIES
117
121
  webmock
118
122
 
119
123
  BUNDLED WITH
120
- 2.1.4
124
+ 2.3.11
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.add_runtime_dependency 'aws-sdk-ec2', '~> 1'
17
17
  s.add_runtime_dependency 'aws-sdk-eks', '~> 1'
18
18
  s.add_runtime_dependency 'aws-sdk-elasticache', '~> 1'
19
+ s.add_runtime_dependency 'aws-sdk-iam', '~> 1'
19
20
  s.add_runtime_dependency 'aws-sdk-rds', '~> 1'
20
21
  s.add_runtime_dependency 'aws-sdk-route53', '~> 1'
21
22
  s.add_runtime_dependency 'aws-sdk-s3', '~> 1'
@@ -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
@@ -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,13 @@ 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
16
 
16
-
17
17
  module MovableInk
18
18
  class AWS
19
19
  include Metadata
@@ -27,6 +27,7 @@ module MovableInk
27
27
  include ElastiCache
28
28
  include ApiGateway
29
29
  include EKS
30
+ include IAM
30
31
 
31
32
  class << self
32
33
  def regions
@@ -35,7 +36,8 @@ module MovableInk
35
36
  'rld' => 'us-west-2',
36
37
  'dub' => 'eu-west-1',
37
38
  'ord' => 'us-east-2',
38
- 'fra' => 'eu-central-1'
39
+ 'fra' => 'eu-central-1',
40
+ 'par' => 'eu-west-3'
39
41
  }
40
42
  end
41
43
  end
@@ -84,7 +86,10 @@ module MovableInk
84
86
  Aws::SSM::Errors::Http503Error,
85
87
  Aws::SSM::Errors::Http502Error,
86
88
  Aws::Athena::Errors::ThrottlingException,
87
- MovableInk::AWS::Errors::NoEnvironmentTagError
89
+ MovableInk::AWS::Errors::NoEnvironmentTagError,
90
+ Aws::IAM::Errors::LimitExceededException,
91
+ Aws::IAM::Errors::RequestLimitExceeded,
92
+ Aws::IAM::Errors::Throttling
88
93
  sleep_time = (num+1)**2 + rand(10)
89
94
  if quiet
90
95
  (num >= tries - 1) ? notify_and_sleep(sleep_time, $!.class) : sleep(sleep_time)
@@ -1,5 +1,5 @@
1
1
  module MovableInk
2
2
  class AWS
3
- VERSION = '2.6.1'
3
+ VERSION = '2.6.5'
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/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.1
4
+ version: 2.6.5
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-04-29 00:00:00.000000000 Z
11
+ date: 2022-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-core
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: aws-sdk-iam
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: aws-sdk-rds
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -241,6 +255,7 @@ files:
241
255
  - lib/movable_ink/aws/eks.rb
242
256
  - lib/movable_ink/aws/elasticache.rb
243
257
  - lib/movable_ink/aws/errors.rb
258
+ - lib/movable_ink/aws/iam.rb
244
259
  - lib/movable_ink/aws/metadata.rb
245
260
  - lib/movable_ink/aws/route53.rb
246
261
  - lib/movable_ink/aws/s3.rb
@@ -253,6 +268,7 @@ files:
253
268
  - spec/consul_spec.rb
254
269
  - spec/ec2_spec.rb
255
270
  - spec/elasticache_spec.rb
271
+ - spec/iam_spec.rb
256
272
  - spec/metadata_spec.rb
257
273
  - spec/route53_spec.rb
258
274
  - spec/s3_spec.rb