aws_assume_role 1.1.0-universal-openbsd
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rubocop.yml +57 -0
- data/.ruby-version +1 -0
- data/.simplecov +22 -0
- data/.travis.yml +24 -0
- data/CHANGELOG.md +61 -0
- data/Gemfile +18 -0
- data/LICENSE.md +201 -0
- data/README.md +303 -0
- data/Rakefile +63 -0
- data/aws_assume_role.gemspec +56 -0
- data/bin/aws-assume-role +4 -0
- data/i18n/en.yml +109 -0
- data/lib/aws_assume_role.rb +4 -0
- data/lib/aws_assume_role/cli.rb +20 -0
- data/lib/aws_assume_role/cli/actions/abstract_action.rb +61 -0
- data/lib/aws_assume_role/cli/actions/configure_profile.rb +24 -0
- data/lib/aws_assume_role/cli/actions/configure_role_assumption.rb +22 -0
- data/lib/aws_assume_role/cli/actions/console.rb +70 -0
- data/lib/aws_assume_role/cli/actions/delete_profile.rb +22 -0
- data/lib/aws_assume_role/cli/actions/includes.rb +12 -0
- data/lib/aws_assume_role/cli/actions/list_profiles.rb +12 -0
- data/lib/aws_assume_role/cli/actions/migrate_profile.rb +20 -0
- data/lib/aws_assume_role/cli/actions/reset_environment.rb +50 -0
- data/lib/aws_assume_role/cli/actions/run.rb +36 -0
- data/lib/aws_assume_role/cli/actions/set_environment.rb +62 -0
- data/lib/aws_assume_role/cli/actions/test.rb +35 -0
- data/lib/aws_assume_role/cli/commands/configure.rb +32 -0
- data/lib/aws_assume_role/cli/commands/console.rb +19 -0
- data/lib/aws_assume_role/cli/commands/delete.rb +13 -0
- data/lib/aws_assume_role/cli/commands/environment.rb +34 -0
- data/lib/aws_assume_role/cli/commands/list.rb +12 -0
- data/lib/aws_assume_role/cli/commands/migrate.rb +13 -0
- data/lib/aws_assume_role/cli/commands/run.rb +19 -0
- data/lib/aws_assume_role/cli/commands/test.rb +20 -0
- data/lib/aws_assume_role/cli/includes.rb +3 -0
- data/lib/aws_assume_role/configuration.rb +30 -0
- data/lib/aws_assume_role/core_ext/aws-sdk/credential_provider_chain.rb +4 -0
- data/lib/aws_assume_role/core_ext/aws-sdk/includes.rb +9 -0
- data/lib/aws_assume_role/credentials/factories.rb +11 -0
- data/lib/aws_assume_role/credentials/factories/abstract_factory.rb +33 -0
- data/lib/aws_assume_role/credentials/factories/assume_role.rb +39 -0
- data/lib/aws_assume_role/credentials/factories/default_chain_provider.rb +113 -0
- data/lib/aws_assume_role/credentials/factories/environment.rb +26 -0
- data/lib/aws_assume_role/credentials/factories/includes.rb +15 -0
- data/lib/aws_assume_role/credentials/factories/instance_profile.rb +19 -0
- data/lib/aws_assume_role/credentials/factories/repository.rb +37 -0
- data/lib/aws_assume_role/credentials/factories/shared.rb +19 -0
- data/lib/aws_assume_role/credentials/factories/static.rb +18 -0
- data/lib/aws_assume_role/credentials/includes.rb +6 -0
- data/lib/aws_assume_role/credentials/providers/assume_role_credentials.rb +60 -0
- data/lib/aws_assume_role/credentials/providers/includes.rb +9 -0
- data/lib/aws_assume_role/credentials/providers/mfa_session_credentials.rb +119 -0
- data/lib/aws_assume_role/credentials/providers/shared_keyring_credentials.rb +41 -0
- data/lib/aws_assume_role/includes.rb +38 -0
- data/lib/aws_assume_role/logging.rb +27 -0
- data/lib/aws_assume_role/profile_configuration.rb +73 -0
- data/lib/aws_assume_role/runner.rb +40 -0
- data/lib/aws_assume_role/store/includes.rb +8 -0
- data/lib/aws_assume_role/store/keyring.rb +61 -0
- data/lib/aws_assume_role/store/serialization.rb +20 -0
- data/lib/aws_assume_role/store/shared_config_with_keyring.rb +250 -0
- data/lib/aws_assume_role/types.rb +31 -0
- data/lib/aws_assume_role/ui.rb +57 -0
- data/lib/aws_assume_role/vendored/aws.rb +4 -0
- data/lib/aws_assume_role/vendored/aws/README.md +2 -0
- data/lib/aws_assume_role/vendored/aws/assume_role_credentials.rb +67 -0
- data/lib/aws_assume_role/vendored/aws/includes.rb +9 -0
- data/lib/aws_assume_role/vendored/aws/refreshing_credentials.rb +58 -0
- data/lib/aws_assume_role/vendored/aws/shared_config.rb +223 -0
- data/lib/aws_assume_role/version.rb +5 -0
- metadata +438 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "includes"
|
4
|
+
|
5
|
+
module AwsAssumeRole
|
6
|
+
class Configuration
|
7
|
+
extend Dry::Configurable
|
8
|
+
Types = Dry::Types.module
|
9
|
+
|
10
|
+
setting(:backend_plugin, ENV.fetch("AWS_ASSUME_ROLE_KEYRING_PLUGIN", nil)) do |value|
|
11
|
+
Types::Coercible::String[value]
|
12
|
+
end
|
13
|
+
|
14
|
+
setting(:backend, ENV.fetch("AWS_ASSUME_ROLE_KEYRING_BACKEND", "automatic")) do |value|
|
15
|
+
value == "automatic" ? nil : Types::Coercible::String[value]
|
16
|
+
end
|
17
|
+
|
18
|
+
setting(:log_level, ENV.fetch("AWS_ASSUME_ROLE_LOG_LEVEL", "WARN")) do |value|
|
19
|
+
{
|
20
|
+
DEBUG: 0,
|
21
|
+
INFO: 1,
|
22
|
+
WARN: 2,
|
23
|
+
ERROR: 3,
|
24
|
+
FATAL: 4,
|
25
|
+
UNKNOWN: 5,
|
26
|
+
}[value.to_sym] || 2
|
27
|
+
end
|
28
|
+
end
|
29
|
+
Config = Configuration.config
|
30
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "factories/repository"
|
4
|
+
require_relative "factories/abstract_factory"
|
5
|
+
require_relative "factories/default_chain_provider"
|
6
|
+
require_relative "factories/assume_role"
|
7
|
+
require_relative "factories/environment"
|
8
|
+
require_relative "factories/instance_profile"
|
9
|
+
require_relative "factories/shared_keyring"
|
10
|
+
require_relative "factories/shared"
|
11
|
+
require_relative "factories/static"
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "includes"
|
4
|
+
require_relative "repository"
|
5
|
+
require_relative "../../profile_configuration"
|
6
|
+
|
7
|
+
class AwsAssumeRole::Credentials::Factories::AbstractFactory
|
8
|
+
include AwsAssumeRole
|
9
|
+
include AwsAssumeRole::Credentials::Factories
|
10
|
+
include AwsAssumeRole::Logging
|
11
|
+
|
12
|
+
Dry::Types.register_class(Aws::SharedCredentials)
|
13
|
+
attr_reader :credentials, :region, :profile, :role_arn
|
14
|
+
|
15
|
+
def initialize(_options)
|
16
|
+
raise "Not implemented"
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.type(str)
|
20
|
+
@type = Types::Strict::Symbol.enum(:credential_provider, :second_factor_provider, :instance_role_provider)[str]
|
21
|
+
register_if_complete
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.priority(i)
|
25
|
+
@priority = Types::Strict::Int[i]
|
26
|
+
register_if_complete
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.register_if_complete
|
30
|
+
return unless @type && @priority
|
31
|
+
Repository.register_factory(self, @type, @priority)
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "abstract_factory"
|
4
|
+
require_relative "../providers/assume_role_credentials"
|
5
|
+
require_relative "../providers/mfa_session_credentials"
|
6
|
+
|
7
|
+
class AwsAssumeRole::Credentials::Factories::AssumeRole < AwsAssumeRole::Credentials::Factories::AbstractFactory
|
8
|
+
include AwsAssumeRole::Credentials::Factories
|
9
|
+
type :credential_provider
|
10
|
+
priority 20
|
11
|
+
|
12
|
+
def initialize(options)
|
13
|
+
logger.debug "AwsAssumeRole::Credentials::Factories::AssumeRole initiated with #{options}"
|
14
|
+
return unless options[:profile] || options[:role_arn]
|
15
|
+
if options[:profile]
|
16
|
+
logger.debug "AwsAssumeRole: #{options[:profile]} found. Trying with profile"
|
17
|
+
try_with_profile(options)
|
18
|
+
else
|
19
|
+
if options[:use_mfa]
|
20
|
+
options[:credentials] = AwsAssumeRole::Credentials::Providers::MfaSessionCredentials.new(options).credentials
|
21
|
+
end
|
22
|
+
@credentials = AwsAssumeRole::Credentials::Providers::AssumeRoleCredentials.new(options)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def try_with_profile(options)
|
27
|
+
return unless AwsAssumeRole.shared_config.config_enabled?
|
28
|
+
logger.debug "AwsAssumeRole: Shared Config enabled"
|
29
|
+
@profile = options[:profile]
|
30
|
+
@region = options[:region]
|
31
|
+
@credentials = assume_role_with_profile(options)
|
32
|
+
@region ||= AwsAssumeRole.shared_config.profile_region(@profile)
|
33
|
+
@role_arn ||= AwsAssumeRole.shared_config.profile_role(@profile)
|
34
|
+
end
|
35
|
+
|
36
|
+
def assume_role_with_profile(options)
|
37
|
+
AwsAssumeRole.shared_config.assume_role_credentials_from_config(options)
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "includes"
|
4
|
+
require_relative "../../logging"
|
5
|
+
require_relative "../../profile_configuration"
|
6
|
+
require_relative "abstract_factory"
|
7
|
+
require_relative "environment"
|
8
|
+
require_relative "repository"
|
9
|
+
require_relative "instance_profile"
|
10
|
+
require_relative "assume_role"
|
11
|
+
require_relative "shared"
|
12
|
+
require_relative "static"
|
13
|
+
|
14
|
+
class AwsAssumeRole::Credentials::Factories::DefaultChainProvider < Dry::Struct
|
15
|
+
constructor_type :schema
|
16
|
+
include AwsAssumeRole::Credentials::Factories
|
17
|
+
include AwsAssumeRole::Logging
|
18
|
+
|
19
|
+
attribute :access_key_id, Dry::Types["strict.string"].optional
|
20
|
+
attribute :credentials, Dry::Types["object"].optional
|
21
|
+
attribute :duration_seconds, Dry::Types["coercible.int"].optional
|
22
|
+
attribute :external_id, Dry::Types["strict.string"].optional
|
23
|
+
attribute :instance_profile_credentials_retries, Dry::Types["strict.int"].default(0)
|
24
|
+
attribute :instance_profile_credentials_timeout, Dry::Types["coercible.float"].default(1.0)
|
25
|
+
attribute :mfa_serial, Dry::Types["strict.string"].optional
|
26
|
+
attribute :no_profile, Dry::Types["strict.bool"].default(false)
|
27
|
+
attribute :path, Dry::Types["strict.string"].optional
|
28
|
+
attribute :persist_session, Dry::Types["strict.bool"].default(true)
|
29
|
+
attribute :profile_name, Dry::Types["strict.string"].optional
|
30
|
+
attribute :profile, Dry::Types["strict.string"].optional
|
31
|
+
attribute :region, Dry::Types["strict.string"].optional
|
32
|
+
attribute :role_arn, Dry::Types["strict.string"].optional
|
33
|
+
attribute :role_session_name, Dry::Types["strict.string"].optional
|
34
|
+
attribute :secret_access_key, Dry::Types["strict.string"].optional
|
35
|
+
attribute :serial_number, Dry::Types["strict.string"].optional
|
36
|
+
attribute :session_token, Dry::Types["strict.string"].optional
|
37
|
+
attribute :source_profile, Dry::Types["strict.string"].optional
|
38
|
+
attribute :use_mfa, Dry::Types["strict.bool"].default(false)
|
39
|
+
attribute :yubikey_oath_name, Dry::Types["strict.string"].optional
|
40
|
+
|
41
|
+
def self.new(options)
|
42
|
+
if options.respond_to? :resolve
|
43
|
+
finalize_instance new_with_seahorse(options)
|
44
|
+
else
|
45
|
+
finalize_instance(options)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.finalize_instance(options)
|
50
|
+
new_opts = options.to_h
|
51
|
+
new_opts[:profile_name] ||= new_opts[:profile]
|
52
|
+
new_opts[:original_profile] = new_opts[:profile_name]
|
53
|
+
instance = allocate
|
54
|
+
instance.send(:initialize, new_opts)
|
55
|
+
instance
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.new_with_seahorse(resolver)
|
59
|
+
keys = resolver.resolve
|
60
|
+
options = keys.map do |k|
|
61
|
+
[k, resolver.send(k)]
|
62
|
+
end
|
63
|
+
finalize_instance(options.to_h)
|
64
|
+
end
|
65
|
+
|
66
|
+
def resolve(nil_with_role_not_set: false, explicit_default_profile: false)
|
67
|
+
resolve_final_credentials(explicit_default_profile)
|
68
|
+
# nil_creds = Aws::Credentials.new(nil, nil, nil)
|
69
|
+
return nil if (nil_with_role_not_set &&
|
70
|
+
@role_arn &&
|
71
|
+
@credentials.credentials.session_token.nil?) || @credentials.nil?
|
72
|
+
@credentials
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_h
|
76
|
+
to_hash
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def resolve_final_credentials(explicit_default_profile = false)
|
82
|
+
resolve_credentials(:credential_provider, true, explicit_default_profile)
|
83
|
+
return @credentials if @credentials && @credentials.set? && !use_mfa && !role_arn
|
84
|
+
resolve_credentials(:second_factor_provider, true, explicit_default_profile)
|
85
|
+
return @credentials if @credentials && @credentials.set?
|
86
|
+
resolve_credentials(:instance_role_provider, true, explicit_default_profile)
|
87
|
+
return @credentials if @credentials && @credentials.set?
|
88
|
+
nil
|
89
|
+
end
|
90
|
+
|
91
|
+
def resolve_credentials(type, break_if_successful = false, explicit_default_profile = false)
|
92
|
+
factories_to_try = Repository.factories[type]
|
93
|
+
factories_to_try.each do |x|
|
94
|
+
options = to_h
|
95
|
+
options[:credentials] = credentials if credentials && credentials.set?
|
96
|
+
logger.debug "About to try credential lookup with #{x}"
|
97
|
+
factory = x.new(options)
|
98
|
+
@region ||= factory.region
|
99
|
+
@profile ||= factory.profile
|
100
|
+
@role_arn ||= factory.role_arn
|
101
|
+
next unless factory.credentials && factory.credentials.set?
|
102
|
+
logger.debug "Profile currently #{@profile}"
|
103
|
+
next if explicit_default_profile && (@profile == "default") && (@profile != @original_profile)
|
104
|
+
@credentials ||= factory.credentials
|
105
|
+
logger.debug "Got #{@credentials}"
|
106
|
+
break if break_if_successful
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
module AwsAssumeRole
|
112
|
+
DefaultProvider = AwsAssumeRole::Credentials::Factories::DefaultChainProvider
|
113
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "abstract_factory"
|
4
|
+
|
5
|
+
class AwsAssumeRole::Credentials::Factories::Environment < AwsAssumeRole::Credentials::Factories::AbstractFactory
|
6
|
+
type :credential_provider
|
7
|
+
priority 10
|
8
|
+
|
9
|
+
def initialize(_options, **)
|
10
|
+
key = %w[AWS_ACCESS_KEY_ID AMAZON_ACCESS_KEY_ID AWS_ACCESS_KEY]
|
11
|
+
secret = %w[AWS_SECRET_ACCESS_KEY AMAZON_SECRET_ACCESS_KEY AWS_SECRET_KEY]
|
12
|
+
token = %w[AWS_SESSION_TOKEN AMAZON_SESSION_TOKEN]
|
13
|
+
region = %w[AWS_DEFAULT_REGION]
|
14
|
+
profile = %w[AWS_PROFILE]
|
15
|
+
@credentials = Aws::Credentials.new(envar(key), envar(secret), envar(token))
|
16
|
+
@region = envar(region)
|
17
|
+
@profile = envar(profile)
|
18
|
+
end
|
19
|
+
|
20
|
+
def envar(keys)
|
21
|
+
keys.each do |key|
|
22
|
+
return ENV[key] if ENV.key?(key)
|
23
|
+
end
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../includes"
|
4
|
+
require_relative "../../logging"
|
5
|
+
require_relative "../../vendored/aws"
|
6
|
+
require_relative "../../../aws_assume_role"
|
7
|
+
|
8
|
+
module AwsAssumeRole::Credentials
|
9
|
+
module Factories
|
10
|
+
Types = Dry::Types.module
|
11
|
+
include AwsAssumeRole
|
12
|
+
include AwsAssumeRole::Logging
|
13
|
+
include AwsAssumeRole::Vendored::Aws
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "abstract_factory"
|
4
|
+
|
5
|
+
class AwsAssumeRole::Credentials::Factories::InstanceProfile < AwsAssumeRole::Credentials::Factories::AbstractFactory
|
6
|
+
type :instance_role_provider
|
7
|
+
priority 40
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
options[:retries] ||= options[:instance_profile_credentials_retries] || 0
|
11
|
+
options[:http_open_timeout] ||= options[:instance_profile_credentials_timeout] || 1
|
12
|
+
options[:http_read_timeout] ||= options[:instance_profile_credentials_timeout] || 1
|
13
|
+
@credentials = if ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"]
|
14
|
+
Aws::ECSCredentials.new(options)
|
15
|
+
else
|
16
|
+
Aws::InstanceProfileCredentials.new(options)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "includes"
|
4
|
+
require_relative "abstract_factory"
|
5
|
+
|
6
|
+
class AwsAssumeRole::Credentials::Factories::Repository
|
7
|
+
include AwsAssumeRole::Credentials::Factories
|
8
|
+
|
9
|
+
SubFactoryRepositoryType = Types::Hash.schema(Types::Coercible::Int => Types::Strict::Array)
|
10
|
+
|
11
|
+
FactoryRepositoryType = Types::Hash.schema(
|
12
|
+
credential_provider: SubFactoryRepositoryType,
|
13
|
+
second_factor_provider: SubFactoryRepositoryType,
|
14
|
+
instance_role_provider: SubFactoryRepositoryType,
|
15
|
+
)
|
16
|
+
|
17
|
+
def self.factories
|
18
|
+
repository.keys.map { |t| [t, flatten_factory_type_list(t)] }.to_h
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.repository
|
22
|
+
@repository ||= FactoryRepositoryType[
|
23
|
+
credential_provider: {},
|
24
|
+
second_factor_provider: {},
|
25
|
+
instance_role_provider: {},
|
26
|
+
]
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.register_factory(klass, type, priority)
|
30
|
+
repository[type][priority] ||= []
|
31
|
+
repository[type][priority] << klass
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.flatten_factory_type_list(type)
|
35
|
+
repository[type].keys.sort.map { |x| @repository[type][x] }.flatten
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "abstract_factory"
|
4
|
+
require_relative "../providers/shared_keyring_credentials"
|
5
|
+
|
6
|
+
class AwsAssumeRole::Credentials::Factories::Shared < AwsAssumeRole::Credentials::Factories::AbstractFactory
|
7
|
+
type :credential_provider
|
8
|
+
priority 30
|
9
|
+
|
10
|
+
def initialize(options = {})
|
11
|
+
logger.debug "Shared Factory initiated with #{options}"
|
12
|
+
@profile = options[:profile]
|
13
|
+
@credentials = AwsAssumeRole::Credentials::Providers::SharedKeyringCredentials.new(options)
|
14
|
+
@region = @credentials.region
|
15
|
+
@role_arn = @credentials.role_arn
|
16
|
+
rescue Aws::Errors::NoSuchProfileError
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "abstract_factory"
|
4
|
+
|
5
|
+
class AwsAssumeRole::Credentials::Factories::Static < AwsAssumeRole::Credentials::Factories::AbstractFactory
|
6
|
+
type :credential_provider
|
7
|
+
priority 0
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
@credentials = Aws::Credentials.new(
|
11
|
+
options[:access_key_id],
|
12
|
+
options[:secret_access_key],
|
13
|
+
options[:session_token],
|
14
|
+
)
|
15
|
+
@region = options[:region]
|
16
|
+
@profile = options[:profile]
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "includes"
|
4
|
+
require "set"
|
5
|
+
|
6
|
+
class AwsAssumeRole::Credentials::Providers::AssumeRoleCredentials
|
7
|
+
include AwsAssumeRole::Vendored::Aws::CredentialProvider
|
8
|
+
include AwsAssumeRole::Vendored::Aws::RefreshingCredentials
|
9
|
+
|
10
|
+
# @option options [required, String] :role_arn
|
11
|
+
# @option options [required, String] :role_session_name
|
12
|
+
# @option options [String] :policy
|
13
|
+
# @option options [Integer] :duration_seconds
|
14
|
+
# @option options [String] :external_id
|
15
|
+
# @option options [STS::Client] :client
|
16
|
+
#
|
17
|
+
#
|
18
|
+
|
19
|
+
STS_KEYS = %i[role_arn role_session_name policy duration_seconds external_id client credentials region].freeze
|
20
|
+
|
21
|
+
def initialize(options = {})
|
22
|
+
client_opts = {}
|
23
|
+
@assume_role_params = {}
|
24
|
+
options.each_pair do |key, value|
|
25
|
+
if self.class.assume_role_options.include?(key)
|
26
|
+
@assume_role_params[key] = value
|
27
|
+
else
|
28
|
+
next unless STS_KEYS.include?(key)
|
29
|
+
client_opts[key] = value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
@client = client_opts[:client] || ::Aws::STS::Client.new(client_opts)
|
33
|
+
super
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [STS::Client]
|
37
|
+
attr_reader :client
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def refresh
|
42
|
+
c = @client.assume_role(@assume_role_params).credentials
|
43
|
+
@credentials = ::Aws::Credentials.new(
|
44
|
+
c.access_key_id,
|
45
|
+
c.secret_access_key,
|
46
|
+
c.session_token,
|
47
|
+
)
|
48
|
+
@expiration = c.expiration
|
49
|
+
end
|
50
|
+
|
51
|
+
class << self
|
52
|
+
# @api private
|
53
|
+
def assume_role_options
|
54
|
+
@aro ||= begin
|
55
|
+
input = ::Aws::STS::Client.api.operation(:assume_role).input
|
56
|
+
Set.new(input.shape.member_names)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|