以下是aws官网上给出的IAM role的主要使用场景:
(一)下文介绍两种如何使用在aws client 去assume 一个IAM role(macOS)
前提条件:AWS上建好IAM 并且本地aws client对应的用户要有assume的权限。这个不细说,非本文主要内容。
方法一:命令行assume
1. 在aws client端执行assume role命令
aws sts assume-role --role-arn arn:aws:iam::28441135585:role/role-name --role-session-name "AnySessionName"
2. 把上面返回信息设置为环境变量,让当前aws iam user具有role权限
export AWS_ACCESS_KEY_ID=*
export AWS_SECRET_ACCESS_KEY=*
export AWS_SESSION_TOKEN=*
方法二:手动修改 ~/.aws/config文件
1.编辑~/.aws/config文件,在其内容后加入如下新profile信息。(修改.aws/config文件来assume role)有些参数无法通过configure命令或者环境变量设置。必须手动修改。
[profile PROFILE_TO_ASSUME_ROLE]
role_arn = arn:aws:iam::123456789012:role/YOUR_ROLE_NAME
source_profile =default
在修改前,我的config文件内容如下, 具有default和dev1_consoleA两个profile。加上上述内容后,我本地便具有3个aws profile。(source_profile应该设置为,包含有权限assume role的用户的密钥的profile)
[default]
region = ap-northeast-1
output = json
[profile dev1_consoleA]
region = us-east-1
output = json
2. 在执行aws命令时,直接指定profile名字即可assume对应role。比如获取CODEARTIFACT_AUTH_TOKEN
- export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain grand-world --domain-owner ACCOUNT --region ap-northeast-1 --query authorizationToken --output text --profile PROFILE_TO_ASSUME_ROLE`
验证是否assume成功
aws sts get-caller-identity 或者 aws sts get-caller-identity --profile PROFILE_TO_ASSUME_ROLE
在assume前这个命令的输出应该是:
assume role之后这个命令的输出应该是:
接下来做任何该role具有权限的事情,完后为了安全要unassume掉。
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
执行export命令。从终端输出中查看,以上环境变量是否已经被删除
export
(二)以上述知识点为背景,接下来讨论如何在执行gitlab cicd pipeline时,assume IAM role。(采用环境变量方式)
1. 首先,要有一个aws的IAM user,该用户需要具有执行terraform的基本权限。比如创建IAM role(无法创建role就无法有后续assume role的执行)、上传文件到s3(terraform的状态文件卧室持久化到s3上的,所以我需要)。
2. 在gitlab-runner上配置aws IAM user的credential,然后在pipeline中执行脚本来assume role
以下三个命令实现“从assume role命令的返回值中提取各个字段的方法”,这是在pipeline中实现assume role的关键。
- aws sts assume-role --role-arn "arn:aws:iam::284411369985:role/grand-world-development-role" --role-session-name "GitLabSession" --output json > temporary_credentials.json
- export AWS_ACCESS_KEY_ID=$(jq '.Credentials.AccessKeyId' -r temporary_credentials.json)
- export AWS_SESSION_TOKEN=$(jq '.Credentials.SessionToken' -r temporary_credentials.json)
- export AWS_SECRET_ACCESS_KEY=$(jq '.Credentials.SecretAccessKey' -r temporary_credentials.json)
- aws sts get-caller-identity
注意:设置的三个aws环境变量必须是同一次assume role 命令的执行输出,不可以用下面的方式
- export AWS_ACCESS_KEY_ID=$(aws sts assume-role --role-arn "arn:aws:iam::284411369985:role/grand-world-development-role" --role-session-name "GitLabSession" --query 'Credentials.AccessKeyId' --output text)
- export AWS_SECRET_ACCESS_KEY=$(aws sts assume-role --role-arn "arn:aws:iam::284411369985:role/grand-world-development-role" --role-session-name "GitLabSession" --query 'Credentials.SecretAccessKey' --output text)
- export AWS_SESSION_TOKEN=$(aws sts assume-role --role-arn "arn:aws:iam::284411369985:role/grand-world-development-role" --role-session-name "GitLabSession" --query 'Credentials.SessionToken' --output text)