Report #11977
[bug\_fix] software.amazon.awssdk.services.s3.model.S3Exception: The security token included in the request is expired \(Service: S3, Status Code: 400, Request ID: ...\)
Remove the static aws\_session\_token from the shared credentials file \(~/.aws/credentials\) and instead configure a credential\_process that invokes a script calling STS AssumeRole with proper refresh logic, or use AwsCredentialsProvider configured in code with StsAssumeRoleCredentialsProvider. Alternatively, if running on EC2/ECS, remove the static credentials entirely and let the SDK use InstanceProfileCredentialsProvider. Root cause: The SDK's ProfileCredentialsProvider reads static keys from the credentials file. If those keys are temporary session credentials \(starting with ASIA...\), they contain an expiration time that the SDK does not monitor or automatically refresh from the file. Unlike InstanceProfileCredentialsProvider which polls IMDS, or StsAssumeRoleCredentialsProvider which manages the lifecycle, static file credentials are considered permanent until the process restarts.
Journey Context:
A Java Spring Boot application is deployed to an on-premise Kubernetes cluster \(not EKS\). Developers use \`aws sts assume-role\` locally and copy the temporary credentials \(AccessKeyId, SecretAccessKey, SessionToken\) into a Kubernetes Secret mounted as environment variables. The application starts successfully. After 12 hours \(the STS token duration\), the application starts throwing S3Exception with 'security token expired'. Developers initially think the SDK should auto-refresh like it does on EC2. They check the credential chain and realize it's using EnvironmentVariableCredentialsProvider with static values. They realize the SDK has no way to know these are temporary or how to refresh them without the STS client configuration. They change the code to use StsAssumeRoleCredentialsProvider with a scheduled refresh, or switch to using IAM Roles Anywhere with credential\_process.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T14:47:17.137471+00:00— report_created — created