我有账户 A,我从中承担了账户 B 的角色。现在,由于我的工作已完成,我想承担账户 C 的角色。但由于只有账户 A 可以承担账户 C 的角色,而账户 B 则不能,所以我我无法这样做。
有什么方法可以使用户无效/切换所承担的角色吗?最短超时为 15 分钟,这对用户来说等待时间太长。
编辑:尝试通过 AWS CLI 实现它
运行以下命令:
aws sts assume-role --role-arn **** --role-session-name jenkins --external-id ****
据我了解,您使用assume-role,您将获得一组如下所示的凭据
{
"AssumedRoleUser": {
"AssumedRoleId": "AROA3XFRBF535PLBIFPI4:s3-access-example",
"Arn": "arn:aws:sts::123456789012:assumed-role/xaccounts3access/s3-access-example"
},
"Credentials": {
"SecretAccessKey": "9drTJvcXLB89EXAMPLELB8923FB892xMFI",
"SessionToken": "AQoXdzELDDY//////////wEaoAK1wvxJY12r2IrDFT2IvAzTCn3zHoZ7YNtpiQLF0MqZye/qwjzP2iEXAMPLEbw/m3hsj8VBTkPORGvr9jM5sgP+w9IZWZnU+LWhmg+a5fDi2oTGUYcdg9uexQ4mtCHIHfi4citgqZTgco40Yqr4lIlo4V2b2Dyauk0eYFNebHtYlFVgAUj+7Indz3LU0aTWk1WKIjHmmMCIoTkyYp/k7kUG7moeEYKSitwQIi6Gjn+nyzM+PtoA3685ixzv0R7i5rjQi0YE0lf1oeie3bDiNHncmzosRM6SFiPzSvp6h/32xQuZsjcypmwsPSDtTPYcs0+YN/8BRi2/IcrxSpnWEXAMPLEXSDFTAQAM6Dl9zR0tXoybnlrZIwMLlMi1Kcgo5OytwU=",
"Expiration": "2016-03-15T00:05:07Z",
"AccessKeyId": "ASIAJEXAMPLEXEG2JICEA"
}
}
您在运行命令时导出或直接使用的凭据。
当您直接使用它们时,您仅使用特定命令的凭据,在下一个命令中您将再次返回帐户 A。
导出时,您可以轻松调用 unset 命令来取消设置导出的 var,您将返回到帐户 A,然后再次调用假设角色并导出帐户 C 的凭据。
扩展@samtoddler 答案
虽然您无法使用 aws cli 直接“撤销”会话令牌,或者在将角色指定为 aws cli 配置文件时“重新承担”角色,但您可以通过调用 sts 直接承担角色来实现类似的结果:AssumeRole API 使用 aws CLI,然后将
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
,AWS_SESSION_TOKEN
,AWS_DEFAULT_REGION
设置为环境变量。
您可以使用此脚本来承担角色,并且每次调用都会使用新的会话令牌覆盖会话令牌
#!/bin/bash
# Run aws sts assume-role and capture the output
assume_role_output=$(aws sts assume-role "$@" | cat)
# Extract temporary credentials from the output
export AWS_ACCESS_KEY_ID=$(echo $assume_role_output | jq -r '.Credentials.AccessKeyId')
export AWS_SECRET_ACCESS_KEY=$(echo $assume_role_output | jq -r '.Credentials.SecretAccessKey')
export AWS_SESSION_TOKEN=$(echo $assume_role_output | jq -r '.Credentials.SessionToken')
# Extract AWS_DEFAULT_REGION from the --region parameter
AWS_DEFAULT_REGION=$(echo "$@" | awk -F'--region ' '{print $2}' | awk '{print $1}')
export AWS_DEFAULT_REGION
# Display the exported variables
echo "AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID"
echo "AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY"
echo "AWS_SESSION_TOKEN: $AWS_SESSION_TOKEN"
echo "AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION"
请注意,之前的会话令牌将保持有效,直至过期(通常为 1 小时)。
用途:
~/development/aws/training ······································································································································· 19:55:14 ─╮
❯ source assume-role --profile mine --role-arn arn:aws:iam::************:role/mine-admin-role --role-session-name mine-role-session --region us-east-1 ─╯
AWS_ACCESS_KEY_ID: ************
AWS_SECRET_ACCESS_KEY: ************
AWS_SESSION_TOKEN: ************
AWS_DEFAULT_REGION: us-east-1
~/development/aws/training ······································································································································· 20:07:53 ─╮
❯ aws sts get-caller-identity | cat ─╯
{
"UserId": "************:mine-role-session",
"Account": "************",
"Arn": "arn:aws:sts::************:assumed-role/mine-admin-role/mine-role-session"
请注意,使用
source
执行它,以便环境变量适用于您的 shell 会话。
就像魅力一样。
如果您使用 CLI,则无需“删除”假定的角色。
您应该使用 命名配置文件 并通过使用
--profile
CLI 开关显式指定配置文件名称,或者通过更改命令之间的 AWS_PROFILE
env 变量来在不同帐户中执行命令。