我试图在一个docker容器中扮演一个角色,但这个角色似乎并不是固定的。下面是后跟aws sts get-caller-identity的aws sts assume-role的输出
jenkins@0d4794bcdd62:~/.aws$ aws sts get-caller-identity
{
"UserId": "ABCDEFG1234567:i-01234546789abc",
"Arn": "arn:aws:sts::555555555555:assumed-role/jenkins-masterRole/i-01234546789abc",
"Account": "555555555555"
}
jenkins@0d4794bcdd62:~/.aws$ aws sts assume-role --role-arn arn:aws:iam::555555555555:role/ec2/CloudFormationRole --role-session-name "test-session-name"
{
"Credentials": {
"Expiration": "2019-01-28T16:37:04Z",
"SessionToken": "[redacted]",
"AccessKeyId": "[redacted]",
"SecretAccessKey": "[redacted]"
},
"AssumedRoleUser": {
"AssumedRoleId": "[redacted]:test-session-name",
"Arn": "arn:aws:sts::5555555555555:assumed-role/CloudFormationRole/test-session-name"
}
}
jenkins@0d4794bcdd62:~/.aws$ aws sts get-caller-identity
{
"Account": "555555555555",
"UserId": "ABCDEFG1234567:i-01234546789abc",
"Arn": "arn:aws:sts::555555555555:assumed-role/jenkins-masterRole/i-01234546789abc"
}正如您所看到的,aws sts-assume角色正在工作,但它似乎没有被应用。下面是我的~/.aws/config文件的内容
jenkins@0d4794bcdd62:~/.aws$ cat ~/.aws/config
[default]
region = us-east-1除了AWS_CONFIG_FILE=~/.aws/config,我没有设置任何AWS CLI环境变量。这是我最初没有设置的,但我是在测试时设置的。
发布于 2019-01-29 00:19:11
调用assume-role不会更改AWS CLI的配置。AWS CLI使用存储在~/.aws/credentials中的凭据进行调用。assume-role返回的文件不会自动复制到AWS CLI配置文件中,它们只是显示在您的屏幕上。
因此,一种解决问题的简单方法是将访问密钥、密钥和会话id复制/粘贴到~/.aws/credentials中。当然,这既不能扩展,也不方便。有一个更好的方法。
您可以在CLI中配置配置文件以使用所需的角色。假设您的基本身份具有承担该角色的权限(这是根据您在问题中对assume role的调用执行的)
这就是我如何配置我的~/.aws/config文件,以便从我的工作帐户临时访问我的个人帐户。当然,同样的技术也适用于同一个账户。
[default]
region=eu-west-1
[profile perso]
region=eu-west-1
role_arn=arn:aws:iam::[redacted]:role/admin
source_profile=default角色ARN是您希望在目标帐户中承担的角色。
然后,您可以简单地键入:
aws --profile perso s3 ls
来交换角色。
发布于 2019-07-07 06:24:05
您还可以(Ab)使用--query选项为临时角色凭据生成环境变量分配,如下所示:
$ roleSessionName=my-example-session
$ arnOfRoleToAssume=arn:aws:iam::123456789012:role/demo
$ assumeRoleEnv=$(aws sts assume-role \
--role-session-name="$roleSessionName" \
--role-arn="$arnOfRoleToAssume"\
--output text \
--query='Credentials.[
join(`=`, [`AWS_ACCESS_KEY_ID`, AccessKeyId]),
join(`=`, [`AWS_SECRET_ACCESS_KEY`, SecretAccessKey]),
join(`=`, [`AWS_SESSION_TOKEN`, SessionToken])
]')
$ eval "export $assumeRoleEnv"
$ aws sts get-caller-identity # this and further aws calls use the assumed role这样做的一个优点是不必处理共享的配置/凭据。例如,这就是我在awscli-with-assume-role (Docker image)中选择这种方法的原因。
https://stackoverflow.com/questions/54405559
复制相似问题