AWS sts在一个命令中担当角色

时间:2020-08-04 05:59:45

标签: amazon-web-services aws-cli aws-sts

要在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"
    }
}

然后我手动将AccessKeyIdSecretAccessKeySessionToken的值复制并粘贴到一堆导出中,如下所示:

export AWS_ACCESS_KEY_ID="someAccessKeyId"                                                                                      
export AWS_SECRET_ACCESS_KEY="someSecretAccessKey"
export AWS_SESSION_TOKEN="someSessionToken"

最终担任这个角色。

我该怎么做呢?我的意思是,没有手动干预,就将aws sts ...命令的输出复制并粘贴到exports上。

5 个答案:

答案 0 :(得分:5)

最后,一位同事与我分享了这个很棒的摘要,可让您一劳永逸地完成工作:

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桌面中。

答案 1 :(得分:2)

您可以将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

答案 2 :(得分:1)

我遇到了同样的问题,我使用 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

显然,这只是一种方法,在您实现流程自动化的情况下尤其有用。它对我有用,但我不知道它是否是最好的。当然不是最线性的。

答案 3 :(得分:1)

Arcones's answer 很好,但这里有一种不需要 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)

答案 4 :(得分:1)

没有 jq,没有 eval,没有多个导出 - 使用 printf 内置和命令替换:

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))