Cross-account or elevated AWS CLI work should not depend on another set of long-lived keys. An AWS CLI role profile lets a saved source identity request temporary STS credentials for a target IAM role before the account-sensitive command runs.
Role profiles are stored in ~/.aws/config and need role_arn plus either source_profile or credential_source. When the profile is selected with --profile or AWS_PROFILE, the CLI calls STS AssumeRole, caches temporary credentials under ~/.aws/cli/cache, and signs the service request as the assumed role.
The source identity still needs permission for sts:AssumeRole, and the target role trust policy must allow that principal. The AWS account root user cannot assume roles this way. Role chaining limits sessions to one hour, and settings such as external_id, mfa_serial, and duration_seconds should match the role owner's trust policy and session-duration rules.
$ aws sts get-caller-identity --profile source-user --query Arn --output text arn:aws:iam::123456789012:user/source-user
The returned Arn should be the principal named in the target role trust policy or in the policy that grants sts:AssumeRole.
Related: How to configure multiple AWS CLI profiles
Related: How to log in to AWS CLI with IAM Identity Center
$ aws configure set role_arn arn:aws:iam::210987654321:role/CrossAccountAdmin --profile production-admin
Get the exact role ARN from the role owner. aws configure set writes role settings to the shared config file, not the shared credentials file.
Related: How to find the AWS CLI config file location
$ aws configure set source_profile source-user --profile production-admin
Use credential_source instead of source_profile only when the source credentials should come from Environment, Ec2InstanceMetadata, or EcsContainer. The two settings cannot be used in the same role profile.
$ aws configure set role_session_name workstation-prod-admin --profile production-admin
The session name appears as the final segment of the assumed-role ARN and can be visible in CloudTrail in the target account.
$ aws configure set region us-west-2 --profile production-admin
Commands can still override this value with --region or Region environment variables when one request needs another Region.
Related: How to set the default Region in AWS CLI
$ aws configure set external_id vendor-customer-42 --profile production-admin
Set external_id for third-party cross-account roles, mfa_serial for roles that require MFA, and duration_seconds only within the role's maximum session duration. A chained role session cannot exceed 3600 seconds.
$ cat ~/.aws/config [profile source-user] region = us-west-2 [profile production-admin] role_arn = arn:aws:iam::210987654321:role/CrossAccountAdmin source_profile = source-user role_session_name = workstation-prod-admin region = us-west-2 external_id = vendor-customer-42
If AWS_CONFIG_FILE is set, inspect that override path instead of ~/.aws/config.
$ aws configure list --profile production-admin NAME : VALUE : TYPE : LOCATION profile : production-admin : manual : --profile access_key : ****************ROLE : assume-role : secret_key : ****************0001 : assume-role : region : us-west-2 : config-file : ~/.aws/config
The TYPE column should show assume-role for the access key and secret key. If the role has mfa_serial, the CLI prompts for the current MFA code when it refreshes temporary credentials.
$ aws sts get-caller-identity --profile production-admin --query Arn --output text arn:aws:sts::210987654321:assumed-role/CrossAccountAdmin/workstation-prod-admin
The returned ARN should use the target account, target role name, and saved session name before service commands run with --profile production-admin.
Related: How to check the current caller identity in AWS CLI
If the command returns the original user or a different role, clear exported raw credential variables such as AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_SESSION_TOKEN before testing again.
Related: How to use AWS CLI environment variables