aws/aws-sdk-ruby

aws-sdk-s3: NoMethodError: undefined method `account_id' for an instance of Aws::STS::Types::Credentials

Closed this issue · 4 comments

Describe the bug

Starting with 1.164.x, I'm seeing an exception when trying to assume a role via STS. 1.163.x does not exhibit this behavior. Specifically, the S3 SDK is attempting to access an apparently non-existent account_id property on Aws::STS::Types::Credentials.

Regression Issue

  • Select this option if this issue appears to be a regression.

Expected Behavior

I expected the code that I wrote and have been successfully using untouched for months to continue working.

Specifically, I'm using Aws::STS::Client to assume_role before performing S3 operations.

Current Behavior

NoMethodError: undefined method `account_id' for an instance of Aws::STS::Types::Credentials (NoMethodError)

          if context.config.credentials&.credentials&.account_id
                                                    ^^^^^^^^^^^^
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-s3-1.164.0/lib/aws-sdk-s3/plugins/endpoints.rb:63:in `with_metrics'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-s3-1.164.0/lib/aws-sdk-s3/plugins/endpoints.rb:52:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/endpoint_discovery.rb:84:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/seahorse/client/plugins/endpoint.rb:46:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-s3-1.164.0/lib/aws-sdk-s3/plugins/url_encoded_keys.rb:43:in `manage_keys'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-s3-1.164.0/lib/aws-sdk-s3/plugins/url_encoded_keys.rb:35:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/param_validator.rb:26:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/seahorse/client/plugins/raise_response_errors.rb:16:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-s3-1.164.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-s3-1.164.0/lib/aws-sdk-s3/plugins/dualstack.rb:21:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-s3-1.164.0/lib/aws-sdk-s3/plugins/accelerate.rb:43:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:16:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/invocation_id.rb:16:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/seahorse/client/plugins/request_callback.rb:89:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `block in call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/telemetry/no_op.rb:29:in `in_span'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/telemetry.rb:53:in `span_wrapper'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `call'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-core-3.209.0/lib/seahorse/client/request.rb:72:in `send_request'
/Users/jonathonfrisby/.rbenv/versions/3.3.1/gemsets/fasterbetter-app/gems/aws-sdk-s3-1.164.0/lib/aws-sdk-s3/client.rb:11713:in `list_objects'
/Users/jonathonfrisby/fb/app/lib/tasks/s3.rake:49:in `gc_bucket'
/Users/jonathonfrisby/fb/app/lib/tasks/s3.rake:77:in `block (3 levels) in <top (required)>'

Reproduction Steps

def session_token(env)
  role_arn = get_role(env)
  puts "Getting session credentials for role: #{role_arn}"

  client = Aws::STS::Client.new

  client.assume_role({
                       role_arn:,
                       role_session_name: "s3_gc",
                     })
end

# ...

client = Aws::S3::Client.new(credentials: session_token(env))

client.list_objects(bucket:).contents.each do |object| # <-- Exception happens here.
  # ...
end

Possible Solution

No response

Additional Information/Context

No response

Gem name ('aws-sdk', 'aws-sdk-resources' or service gems like 'aws-sdk-s3') and its version

aws-sdk-s3 1.164.x and 1.165.x.

Environment details (Version of Ruby, OS environment)

Ruby 3.3.1, macOS 14.6.1

Same issue as in: #3110

In general, we recommend that you use supported credentials objects rather than the responses returned by client calls - in this case, you can use the AssumeRoleCredentials which will give you automatic refreshing of the credentials as well!

Service clients expect credentials to be provided as a Aws::CredentialProvider, eg: see the S3 Client#initialize docs.

@alextwoods Thank you for the guidance. I'll take a look into that.

You should just be able to do: credentials = Aws::AssumeRoleCredentials.new(role_arn: get_role(env), role_session_name: 's3_gc') as a drop in replacement, then create your client with it.

This issue is now closed. Comments on closed issues are hard for our team to see.
If you need more assistance, please open a new issue that references this one.