AWS 假设角色的 bash 脚本

Jak*_*ake 16 amazon-web-services amazon-ecr assume-role

我试图在 CI/CD 管道中承担 AWS 角色,因此我必须编写一个脚本来通过脚本更改角色。下面是执行此操作的脚本,我用来source <script>.sh替换现有的 AWS 访问和密钥,并添加会话密钥。

我通过在终端中回显 3 个环境变量来检查它们是否存在。

#!/bin/bash

output="/tmp/assume-role-output.json"

aws sts assume-role --role-arn "arn:aws:iam::<account-id>:role/<rolename>" --role-session-name AWSCLI-Session > $output
AccessKeyId=$(cat $output | jq '.Credentials''.AccessKeyId')
SecretAccessKey=$(cat $output | jq '.Credentials''.SecretAccessKey')
SessionToken=$(cat $output | jq '.Credentials''.SessionToken')

export AWS_ACCESS_KEY_ID=$AccessKeyId
export AWS_SECRET_ACCESS_KEY=$SecretAccessKey
export AWS_SESSION_TOKEN=$SessionToken
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行简单的 aws 命令来列出 ECR 映像时aws ecr list-images --registry-id <id> --repository-name <name>,它给出了以下错误消息。

An error occurred (UnrecognizedClientException) when calling the ListImages operation: 
The security token included in the request is invalid.
Run Code Online (Sandbox Code Playgroud)

我尝试在终端中手动设置 AWS 密钥和令牌,令人惊讶的是 ecr list 命令有效。

export AWS_ACCESS_KEY_ID="XXX"
export AWS_SECRET_ACCESS_KEY="XXX"
export AWS_SESSION_TOKEN="XXX"
Run Code Online (Sandbox Code Playgroud)

有谁知道我的脚本有什么问题吗?

car*_*mel 25

这是一个不使用文件的单行..

OUT=$(aws sts assume-role --role-arn arn:aws:iam::<YOUR_ACCOUNT>:role/<YOUR_ROLENAME> --role-session-name aaa);\
export AWS_ACCESS_KEY_ID=$(echo $OUT | jq -r '.Credentials''.AccessKeyId');\
export AWS_SECRET_ACCESS_KEY=$(echo $OUT | jq -r '.Credentials''.SecretAccessKey');\
export AWS_SESSION_TOKEN=$(echo $OUT | jq -r '.Credentials''.SessionToken');
Run Code Online (Sandbox Code Playgroud)

可能有用..

打印它以用作另一个终端上的 bash 导出

printf "export AWS_ACCESS_KEY_ID=\"%s\"\\n" $AWS_ACCESS_KEY_ID;\
printf "export AWS_SECRET_ACCESS_KEY=\"%s\"\\n" $AWS_SECRET_ACCESS_KEY;\
printf "export AWS_SESSION_TOKEN=\"%s\"\\n\\n\\n" $AWS_SESSION_TOKEN;
Run Code Online (Sandbox Code Playgroud)

打印它以在 JSON 上下文中使用

对于 vs code 上的 launch.json 很有用

printf "\"AWS_ACCESS_KEY_ID\":\"$AWS_ACCESS_KEY_ID\",\\n";\
printf "\"AWS_SECRET_ACCESS_KEY\":\"$AWS_SECRET_ACCESS_KEY\",\\n";\
printf "\"AWS_SESSION_TOKEN\":\"$AWS_SESSION_TOKEN\"\\n";
Run Code Online (Sandbox Code Playgroud)

更新

这是powershell版本

$OUT = aws sts assume-role --role-arn arn:aws:iam::<YOUR_ACCOUNT>:role/<YOUR_ROLENAME> --role-session-name aaa

$JSON_OUT = ConvertFrom-Json "$OUT"

$ACCESS_KEY=$JSON_OUT.Credentials.AccessKeyId
$SECRET_KEY=$JSON_OUT.Credentials.SecretAccessKey
$SESSION_TOKEN=$JSON_OUT.Credentials.SessionToken
"Paste these env variables to your terminal to assume the role"
-join ("`n", '$Env:AWS_ACCESS_KEY_ID="', "$ACCESS_KEY", '"')
-join ('$Env:AWS_SECRET_ACCESS_KEY="', "$SECRET_KEY", '"')
-join ('$Env:AWS_SESSION_TOKEN="', "$SESSION_TOKEN", '"')
Run Code Online (Sandbox Code Playgroud)

  • 如果 json 不是您的 aws 配置文件中的默认格式,则需要添加 `--output json` (2认同)

Mar*_*cin 8

如果您jq按照您的方式使用,您的导出值将包含引号,例如

"ASIASZHPM3IXQXXOXFOY"
Run Code Online (Sandbox Code Playgroud)

而不是:

ASIASZHPM3IXQXXOXFOY
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,您必须添加-r标志jq

AccessKeyId=$(cat $output | jq -r '.Credentials''.AccessKeyId')
SecretAccessKey=$(cat $output | jq -r '.Credentials''.SecretAccessKey')
SessionToken=$(cat $output | jq -r '.Credentials''.SessionToken')
Run Code Online (Sandbox Code Playgroud)