在aws client端如何assume IAM role

以下是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


assume role之后这个命令的输出应该是:

这里能看到已经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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容