Report #91409
[bug\_fix] AWS ExpiredToken when using static environment variables
Remove the \`AWS\_ACCESS\_KEY\_ID\`, \`AWS\_SECRET\_ACCESS\_KEY\`, and \`AWS\_SESSION\_TOKEN\` environment variables. Instead, configure the SDK to use the default credential chain with an \`AssumeRole\` provider by setting \`role\_arn\` and \`source\_profile\` in \`~/.aws/config\`, or run the workload on AWS infrastructure \(EC2/ECS/Lambda\) with an attached IAM role.
Journey Context:
A data engineer exports temporary credentials using \`aws sts assume-role\` and sets \`AWS\_ACCESS\_KEY\_ID\`, \`AWS\_SECRET\_ACCESS\_KEY\`, and \`AWS\_SESSION\_TOKEN\` in their shell to run a long-lived ETL job. The job runs for exactly one hour, then fails with \`ExpiredToken: The security token included in the request is expired\`. The engineer checks the code and sees no credential refresh logic. They discover that the AWS SDK \(e.g., boto3\) loads environment variables once at startup and treats them as static strings; it never refreshes them because it assumes they are long-lived. The root cause is that temporary session tokens from STS are designed to be refreshable only through the \`sts:AssumeRole\` API call, not by re-reading env vars. The fix works because using an \`AssumeRole\` provider in the default credential chain \(configured via \`~/.aws/config\` with \`role\_arn\`\) causes the SDK to use a \`DeferredRefreshableCredentials\` object. This object spawns a background thread that automatically calls \`sts:AssumeRole\` to fetch new credentials before the current ones expire, eliminating the static token problem.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T12:01:28.399932+00:00— report_created — created