AWS sts 在一个命令中扮演角色

Arc*_*nes 15 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
Run Code Online (Sandbox Code Playgroud)

这给了我一个遵循架构的输出:

{
    "Credentials": {
        "AccessKeyId": "someAccessKeyId",
        "SecretAccessKey": "someSecretAccessKey",
        "SessionToken": "someSessionToken",
        "Expiration": "2020-08-04T06:52:13+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "idOfTheAssummedRole",
        "Arn": "theARNOfTheRoleIWantToAssume"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我手动复制和粘贴 , 的值AccessKeyIdSecretAccessKeySessionToken在像这样的一堆导出中:

export AWS_ACCESS_KEY_ID="someAccessKeyId"                                                                                      
export AWS_SECRET_ACCESS_KEY="someSecretAccessKey"
export AWS_SESSION_TOKEN="someSessionToken"
Run Code Online (Sandbox Code Playgroud)

最终承担起这个角色。

我怎么能一次性做到这一点?我的意思是,无需手动干预将aws sts ...命令的输出复制和粘贴到exports.

Arc*_*nes 24

最后,一位同事与我分享了这个很棒的片段,可以一次性完成工作:

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"')
Run Code Online (Sandbox Code Playgroud)

除了 AWS CLI,它只需要jq通常安装在任何 Linux 桌面中的那个。

  • 这就是为什么我使用“通常”这个词 (9认同)
  • 您可能可以删除两个“\nexport”。一条导出命令可以一次性导出多个变量。即`export VAR1=value1 VAR2=value2 VAR3=value3` (5认同)
  • `jq` 可能广泛_可用_,但我不确定我是否会依赖它作为任何标准发行版的一部分安装。 (2认同)

Gre*_*low 14

Arcones 的答案很好,但这是一种不需要 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)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ein 6

您可以将 IAM 角色作为配置文件存储在 AWS CLI 中,它会自动为您代入该角色。

以下是在 AWS CLI - AWS 命令​​行界面中使用 IAM 角色的示例:

[profile marketingadmin]
role_arn = arn:aws:iam::123456789012:role/marketingadminrole
source_profile = user1
Run Code Online (Sandbox Code Playgroud)

这是在说:

  • 如果用户指定 --profile marketingadmin
  • 然后使用配置文件的凭据 user1
  • 调用AssumeRole指定角色

这意味着您可以简单地调用这样的命令,它将承担该角色并自动使用返回的凭据:

aws s3 ls --profile marketingadmin
Run Code Online (Sandbox Code Playgroud)

  • 如果您已经在使用角色(例如在 SSO 之后),它将不起作用:“源配置文件“your_profile”必须具有凭据。”,因此请回退到第二个答案。 (7认同)

Nev*_*kes 5

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))
Run Code Online (Sandbox Code Playgroud)

  • IMO 这应该是公认的答案。我喜欢 jq,但如果有一个没有外部依赖的简单解决方案,我会更喜欢它。 (22认同)
  • 如果在管道或脚本中使用这种方法,最好不要嵌套如此多的子 shell,并在单个变量赋值指令中解析假设角色调用,以便整个脚本可以在身份验证失败的情况下暂停。请参阅 https://unix.stackexchange.com/a/23099 (2认同)
  • 很好地使用了 `--query` 参数来代替需要使用 jq! (2认同)