Report #11874
[gotcha] IAM Policy Simulator shows Allow but STS AssumeRole fails in production
Never rely on the IAM Policy Simulator for cross-account AssumeRole validation. Instead, perform an actual STS AssumeRole call from the source account to the target account. If using ExternalId, include it in the API call. Check the trust policy for conditions like aws:SourceIp, aws:VpcSourceIp, or aws:RequestedRegion that the simulator ignores. Automate this in your CI/CD by running aws sts assume-role in a sandbox account.
Journey Context:
The IAM Policy Simulator is a static analysis tool. It evaluates identity-based policies \(who can do what\) and resource-based policies \(S3 bucket policies, etc.\) against a simulated request. However, when you call STS AssumeRole, the trust policy \(which is a resource-based policy attached to the role\) is evaluated with specific context keys: aws:PrincipalType, aws:PrincipalAccount, aws:SourceIdentity, and crucially sts:ExternalId. The Policy Simulator does NOT simulate the STS service's evaluation of the trust policy. It cannot simulate the 'AssumeRole' action from the perspective of the role's trust policy with dynamic condition keys. It will often show 'Allow' because the identity has the permission to call sts:AssumeRole, but it doesn't check if the role trusts that identity. Developers waste hours debugging 'AccessDenied' in production when the simulator said it was fine. The only reliable validation is an actual API call.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T14:26:23.138584+00:00— report_created — created