bash AWS 承担角色的脚本
bash script for AWS 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
但是,当我尝试 运行 一个简单的 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.
我尝试在终端中手动设置 AWS 密钥和令牌,令人惊讶的是 ecr list 命令有效。
export AWS_ACCESS_KEY_ID="XXX"
export AWS_SECRET_ACCESS_KEY="XXX"
export AWS_SESSION_TOKEN="XXX"
有人知道我的脚本有什么问题吗?
如果您按照自己的方式使用 jq
,您的导出值将包含引号,例如
"ASIASZHPM3IXQXXOXFOY"
而不是:
ASIASZHPM3IXQXXOXFOY
为避免这种情况,您必须将 -r
标记添加到 jq
:
AccessKeyId=$(cat $output | jq -r '.Credentials''.AccessKeyId')
SecretAccessKey=$(cat $output | jq -r '.Credentials''.SecretAccessKey')
SessionToken=$(cat $output | jq -r '.Credentials''.SessionToken')
这是不使用文件的单行..
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');
可能有用..
打印它以在另一个终端上用作 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;
打印它以在 JSON 上下文中使用
对 launch.json 在 vs code
上有用
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";
我正在尝试在 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
但是,当我尝试 运行 一个简单的 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.
我尝试在终端中手动设置 AWS 密钥和令牌,令人惊讶的是 ecr list 命令有效。
export AWS_ACCESS_KEY_ID="XXX"
export AWS_SECRET_ACCESS_KEY="XXX"
export AWS_SESSION_TOKEN="XXX"
有人知道我的脚本有什么问题吗?
如果您按照自己的方式使用 jq
,您的导出值将包含引号,例如
"ASIASZHPM3IXQXXOXFOY"
而不是:
ASIASZHPM3IXQXXOXFOY
为避免这种情况,您必须将 -r
标记添加到 jq
:
AccessKeyId=$(cat $output | jq -r '.Credentials''.AccessKeyId')
SecretAccessKey=$(cat $output | jq -r '.Credentials''.SecretAccessKey')
SessionToken=$(cat $output | jq -r '.Credentials''.SessionToken')
这是不使用文件的单行..
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');
可能有用..
打印它以在另一个终端上用作 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;
打印它以在 JSON 上下文中使用
对 launch.json 在 vs code
上有用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";