AWS sts 在一个命令中承担角色
AWS sts assume role in one command
要在 CLI 中担任 AWS 角色,我执行以下命令:
aws sts assume-role --role-arn arn:aws:iam::123456789123:role/myAwesomeRole --role-session-name test --region eu-central-1
这给了我一个遵循模式的输出:
{
"Credentials": {
"AccessKeyId": "someAccessKeyId",
"SecretAccessKey": "someSecretAccessKey",
"SessionToken": "someSessionToken",
"Expiration": "2020-08-04T06:52:13+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "idOfTheAssummedRole",
"Arn": "theARNOfTheRoleIWantToAssume"
}
}
然后我手动将 AccessKeyId
、SecretAccessKey
和 SessionToken
的值复制并粘贴到一堆导出中,如下所示:
export AWS_ACCESS_KEY_ID="someAccessKeyId"
export AWS_SECRET_ACCESS_KEY="someSecretAccessKey"
export AWS_SESSION_TOKEN="someSessionToken"
最终担任角色。
我怎样才能一次做到这一点?我的意思是,无需手动干预将 aws sts ...
命令的输出复制并粘贴到 exports
。
最后,一位同事与我分享了这个一次性完成工作的精彩片段:
eval $(aws sts assume-role --role-arn arn:aws:iam::123456789123:role/myAwesomeRole --role-session-name test | jq -r '.Credentials | "export AWS_ACCESS_KEY_ID=\(.AccessKeyId)\nexport AWS_SECRET_ACCESS_KEY=\(.SecretAccessKey)\nexport AWS_SESSION_TOKEN=\(.SessionToken)\n"')
除了 AWS CLI,它只需要 jq
,通常安装在任何 Linux 桌面上。
您可以将 IAM 角色存储为 AWS CLI 中的配置文件,它会自动为您代入该角色。
这是来自 Using an IAM role in the AWS CLI - AWS Command Line Interface 的示例:
[profile marketingadmin]
role_arn = arn:aws:iam::123456789012:role/marketingadminrole
source_profile = user1
这是说:
- 如果用户指定
--profile marketingadmin
- 然后使用配置文件的凭据
user1
- 对指定角色调用
AssumeRole
这意味着您可以像这样简单地调用一个命令,它将承担该角色并自动使用返回的凭据:
aws s3 ls --profile marketingadmin
我遇到了同样的问题,我使用 CLI 为我提供的运行时之一进行了管理。
获得凭据后,我使用了这种方法,即使不是那么优雅(我使用 PHP 运行时,但您可以使用 CLI 中可用的内容):
- export AWS_ACCESS_KEY_ID=`php -r 'echo json_decode(file_get_contents("credentials.json"))->Credentials->AccessKeyId;'`
- export AWS_SECRET_ACCESS_KEY=`php -r 'echo json_decode(file_get_contents("credentials.json"))->Credentials->SecretAccessKey;'`
- export AWS_SESSION_TOKEN=`php -r 'echo json_decode(file_get_contents("credentials.json"))->Credentials->SessionToken;'`
其中 credentials.json 是假定角色的输出:
aws sts assume-role --role-arn "arn-of-the-role" --role-session-name "arbitrary-session-name" > credentials.json
显然这只是一种方法,特别是在您将流程自动化的情况下。它对我有用,但我不知道它是否是最好的。当然不是最线性的。
很好,但这里有一种不需要 jq 的方法:
eval $(aws sts assume-role \
--role-arn arn:aws:iam::012345678901:role/TrustedThirdParty \
--role-session-name=test \
--query 'join(``, [`export `, `AWS_ACCESS_KEY_ID=`,
Credentials.AccessKeyId, ` ; export `, `AWS_SECRET_ACCESS_KEY=`,
Credentials.SecretAccessKey, `; export `, `AWS_SESSION_TOKEN=`,
Credentials.SessionToken])' \
--output text)
没有 jq
,没有 eval
,没有多重导出 - 使用 printf
内置(即没有通过 /proc
的凭据泄漏)和命令替换:
export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \
$(aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/MyAssumedRole \
--role-session-name MySessionName \
--query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \
--output text))
要在 CLI 中担任 AWS 角色,我执行以下命令:
aws sts assume-role --role-arn arn:aws:iam::123456789123:role/myAwesomeRole --role-session-name test --region eu-central-1
这给了我一个遵循模式的输出:
{
"Credentials": {
"AccessKeyId": "someAccessKeyId",
"SecretAccessKey": "someSecretAccessKey",
"SessionToken": "someSessionToken",
"Expiration": "2020-08-04T06:52:13+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "idOfTheAssummedRole",
"Arn": "theARNOfTheRoleIWantToAssume"
}
}
然后我手动将 AccessKeyId
、SecretAccessKey
和 SessionToken
的值复制并粘贴到一堆导出中,如下所示:
export AWS_ACCESS_KEY_ID="someAccessKeyId"
export AWS_SECRET_ACCESS_KEY="someSecretAccessKey"
export AWS_SESSION_TOKEN="someSessionToken"
最终担任角色。
我怎样才能一次做到这一点?我的意思是,无需手动干预将 aws sts ...
命令的输出复制并粘贴到 exports
。
最后,一位同事与我分享了这个一次性完成工作的精彩片段:
eval $(aws sts assume-role --role-arn arn:aws:iam::123456789123:role/myAwesomeRole --role-session-name test | jq -r '.Credentials | "export AWS_ACCESS_KEY_ID=\(.AccessKeyId)\nexport AWS_SECRET_ACCESS_KEY=\(.SecretAccessKey)\nexport AWS_SESSION_TOKEN=\(.SessionToken)\n"')
除了 AWS CLI,它只需要 jq
,通常安装在任何 Linux 桌面上。
您可以将 IAM 角色存储为 AWS CLI 中的配置文件,它会自动为您代入该角色。
这是来自 Using an IAM role in the AWS CLI - AWS Command Line Interface 的示例:
[profile marketingadmin]
role_arn = arn:aws:iam::123456789012:role/marketingadminrole
source_profile = user1
这是说:
- 如果用户指定
--profile marketingadmin
- 然后使用配置文件的凭据
user1
- 对指定角色调用
AssumeRole
这意味着您可以像这样简单地调用一个命令,它将承担该角色并自动使用返回的凭据:
aws s3 ls --profile marketingadmin
我遇到了同样的问题,我使用 CLI 为我提供的运行时之一进行了管理。
获得凭据后,我使用了这种方法,即使不是那么优雅(我使用 PHP 运行时,但您可以使用 CLI 中可用的内容):
- export AWS_ACCESS_KEY_ID=`php -r 'echo json_decode(file_get_contents("credentials.json"))->Credentials->AccessKeyId;'`
- export AWS_SECRET_ACCESS_KEY=`php -r 'echo json_decode(file_get_contents("credentials.json"))->Credentials->SecretAccessKey;'`
- export AWS_SESSION_TOKEN=`php -r 'echo json_decode(file_get_contents("credentials.json"))->Credentials->SessionToken;'`
其中 credentials.json 是假定角色的输出:
aws sts assume-role --role-arn "arn-of-the-role" --role-session-name "arbitrary-session-name" > credentials.json
显然这只是一种方法,特别是在您将流程自动化的情况下。它对我有用,但我不知道它是否是最好的。当然不是最线性的。
eval $(aws sts assume-role \
--role-arn arn:aws:iam::012345678901:role/TrustedThirdParty \
--role-session-name=test \
--query 'join(``, [`export `, `AWS_ACCESS_KEY_ID=`,
Credentials.AccessKeyId, ` ; export `, `AWS_SECRET_ACCESS_KEY=`,
Credentials.SecretAccessKey, `; export `, `AWS_SESSION_TOKEN=`,
Credentials.SessionToken])' \
--output text)
没有 jq
,没有 eval
,没有多重导出 - 使用 printf
内置(即没有通过 /proc
的凭据泄漏)和命令替换:
export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \
$(aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/MyAssumedRole \
--role-session-name MySessionName \
--query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \
--output text))