Skip to content

Commit 4339e6d

Browse files
Added support for EKS Pod Identity. (#721)
1 parent 95b1503 commit 4339e6d

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

lib/fog/aws/credential_fetcher.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ def fetch_credentials(options)
2929
role_data = connection.get(:path => credential_path, :idempotent => true, :expects => 200).body
3030
session = Fog::JSON.decode(role_data)
3131

32+
if region.nil?
33+
connection = options[:metadata_connection] || Excon.new(INSTANCE_METADATA_HOST)
34+
token_header = fetch_credentials_token_header(connection, options[:disable_imds_v2])
35+
region = connection.get(:path => INSTANCE_METADATA_AZ, :idempotent => true, :expects => 200, :headers => token_header).body[0..-2]
36+
end
37+
elsif ENV["AWS_CONTAINER_CREDENTIALS_FULL_URI"]
38+
connection = options[:connection] || Excon.new(ENV['AWS_CONTAINER_CREDENTIALS_FULL_URI'])
39+
container_authorization_token = File.read(options[:aws_container_authorization_token_file] || ENV['AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE'])
40+
role_data = connection.get(:idempotent => true, :expects => 200, :headers => {'Authorization' => container_authorization_token}).body
41+
session = Fog::JSON.decode(role_data)
42+
3243
if region.nil?
3344
connection = options[:metadata_connection] || Excon.new(INSTANCE_METADATA_HOST)
3445
token_header = fetch_credentials_token_header(connection, options[:disable_imds_v2])

tests/credentials_tests.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,30 @@
8585

8686
ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'] = nil
8787

88+
# Make sure fetched credentials are different from those of instance metadata endpoint
89+
container_credentials = {
90+
'AccessKeyId' => 'dummycontainerkey',
91+
'SecretAccessKey' => 'dummycontainersecret',
92+
'Token' => 'dummycontainertoken',
93+
'Expiration' => expires_at.xmlschema
94+
}
95+
96+
ENV['AWS_CONTAINER_CREDENTIALS_FULL_URI'] = 'http://169.254.170.23/v1/credentials'
97+
ENV['AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE'] = File.dirname(__FILE__) + '/lorem.txt'
98+
Excon.stub({ method: :get, scheme: 'http', host: '169.254.170.23', path: '/v1/credentials' },
99+
{ status: 200, body: Fog::JSON.encode(container_credentials) })
100+
101+
tests('#fetch_credentials with EKS Pod Identity') do
102+
returns(aws_access_key_id: 'dummycontainerkey',
103+
aws_secret_access_key: 'dummycontainersecret',
104+
aws_session_token: 'dummycontainertoken',
105+
region: 'us-west-1',
106+
aws_credentials_expire_at: expires_at) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true) }
107+
end
108+
109+
ENV['AWS_CONTAINER_CREDENTIALS_FULL_URI'] = nil
110+
ENV['AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE'] = nil
111+
88112
ENV['AWS_WEB_IDENTITY_TOKEN_FILE'] = File.dirname(__FILE__) + '/lorem.txt'
89113
ENV['AWS_ROLE_ARN'] = "dummyrole"
90114
ENV['AWS_ROLE_SESSION_NAME'] = "dummyrolesessionname"
@@ -259,6 +283,8 @@
259283
end
260284
ensure
261285
ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'] = nil
286+
ENV['AWS_CONTAINER_CREDENTIALS_FULL_URI'] = nil
287+
ENV['AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE'] = nil
262288
ENV['AWS_WEB_IDENTITY_TOKEN_FILE'] = nil
263289
Excon.stubs.clear
264290
Excon.defaults[:mock] = old_mock_value

0 commit comments

Comments
 (0)