Skip to content

AWS: Use assumed-role credentials for REST SigV4 signing#16794

Open
GabrielBBaldez wants to merge 1 commit into
apache:mainfrom
GabrielBBaldez:aws-assume-role-rest-credentials
Open

AWS: Use assumed-role credentials for REST SigV4 signing#16794
GabrielBBaldez wants to merge 1 commit into
apache:mainfrom
GabrielBBaldez:aws-assume-role-rest-credentials

Conversation

@GabrielBBaldez

Copy link
Copy Markdown

What changed

RESTSigV4AuthSession signs catalog requests with AwsProperties#restCredentialsProvider(), whose decision chain only handled three cases:

  1. explicit static rest.* keys → StaticCredentialsProvider
  2. a custom client.credentials-provider → that provider
  3. otherwise → DefaultCredentialsProvider

There was no branch for client.assume-role.*. So when the catalog is configured with AssumeRoleAwsClientFactory, the assumed role is applied to the S3/Glue/KMS/DynamoDB clients (via applyAssumeRoleConfigurations) but never to the SigV4 REST signing path — REST calls silently fall back to the default credential chain and diverge from the other AWS clients.

This adds an assume-role branch between the custom-provider and default-chain steps that returns an StsAssumeRoleCredentialsProvider built from the existing client.assume-role.* properties (arn, region, session name, timeout, external id, tags), mirroring AssumeRoleAwsClientFactory#createCredentialsProvider. Explicit static rest.* keys and client.credentials-provider keep precedence.

This is the "fastest path" described in the issue. Happy to instead extract the STS provider construction into a shared utility (option 3 in the issue) if reviewers prefer to avoid the small duplication with AssumeRoleAwsClientFactory.

Closes #16667

Testing

New unit tests in TestAwsProperties:

  • assume-role configured → restCredentialsProvider() returns an StsAssumeRoleCredentialsProvider
  • no credentials configured → falls back to DefaultCredentialsProvider
  • explicit static rest.* keys → still returns StaticCredentialsProvider (precedence preserved)

./gradlew :iceberg-aws:test :iceberg-aws:spotlessJavaCheck :iceberg-aws:checkstyleMain :iceberg-aws:checkstyleTest passes locally.

RESTSigV4AuthSession signs requests with AwsProperties#restCredentialsProvider(), whose decision chain only handled static rest.* keys, a custom client.credentials-provider, and otherwise the default credential chain. When the catalog is configured with AssumeRoleAwsClientFactory, the assumed role is applied to the S3/Glue/KMS/DynamoDB clients but never to the SigV4 REST signing path, so REST calls silently fall back to the default credential chain and diverge from the other AWS clients.

Add an assume-role branch between the custom-provider and default-chain steps that returns an StsAssumeRoleCredentialsProvider built from the existing client.assume-role.* properties, mirroring AssumeRoleAwsClientFactory#createCredentialsProvider.
@GabrielBBaldez GabrielBBaldez force-pushed the aws-assume-role-rest-credentials branch from c64c9eb to 2c13a21 Compare June 12, 2026 14:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

AWS: restCredentialsProvider should return StsAssumeRoleCredentialsProvider when assume role configurations are set

1 participant