Amazon web services 假定AWS角色不用于将来的CLI命令
我正试图在docker容器中扮演一个角色,但这个角色似乎没有坚持下去。下面是Amazon web services 假定AWS角色不用于将来的CLI命令,amazon-web-services,aws-cli,Amazon Web Services,Aws Cli,我正试图在docker容器中扮演一个角色,但这个角色似乎没有坚持下去。下面是aws sts承担角色的输出,后面是aws sts获取呼叫方身份 jenkins@0d4794bcdd62:~/.aws$ aws sts get-caller-identity { "UserId": "ABCDEFG1234567:i-01234546789abc", "Arn": "arn:aws:sts::555555555555:assumed-role/jenkins-masterRole/i
aws sts承担角色的输出
,后面是aws sts获取呼叫方身份
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假定角色正在工作,但它似乎没有被应用。下面是我的~/.aws/config文件的内容
jenkins@0d4794bcdd62:~/.aws$ cat ~/.aws/config
[default]
region = us-east-1
除了
AWS\u CONFIG\u FILE=~/.AWS/CONFIG
之外,我没有设置任何AWS CLI环境变量。我最初没有设置,但我在测试时设置了 调用假定角色
不会更改AWS CLI的配置。AWS CLI正在使用存储在~/.AWS/credentials
中的凭据进行调用。假定角色返回的文件不会自动复制到AWS CLI配置文件中,它们只是显示在屏幕上
因此,解决问题的一个简单方法是将访问密钥、密钥和会话id复制/粘贴到~/.aws/credentials
。当然,这既不可扩展,也不方便。有更好的办法
您可以在CLI中配置配置文件以使用所需的角色。假设您的基本身份拥有担任该角色的权限(根据您在问题中担任该角色的要求执行此操作)
这就是我如何配置我的~/.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——个人资料s3 ls
切换角色。您还可以(ab)使用--query
选项为临时角色凭据生成环境变量分配,如下所示:
$roleSessionName=我的示例会话
$ARNOFROLETOASUME=arn:aws:iam::123456789012:角色/演示
$assumeRoleEnv=$(aws sts承担角色\
--角色会话名称=“$roleSessionName”\
--角色arn=“$arnofroletoasume”\
--输出文本\
--查询凭证[
join(`=`,[`AWS\u ACCESS\u KEY\u ID`,AccessKeyId]),
join(`=`,[`AWS\u SECRET\u ACCESS\u KEY`,SecretAccessKey]),
join(`=`,[`AWS\U会话\U令牌`,SessionToken])
]')
$eval“出口$assumeRoleEnv”
$aws sts获取呼叫方标识#此aws呼叫和其他aws呼叫使用假定角色
这样做的一个优点是不必弄乱共享的配置/凭据。例如,这就是我在中选择此方法的原因。Ahh,那么Boto3是否会更改您的凭据文件?我觉得我已经在Python中完成了假定角色,而且我什么都不用做else@Loaf不,boto3不会更改您的凭据文件。如果您使用boto3编写Python代码,并且在代码中显式调用了ASSUBE_role(),那么该调用将返回一组凭据,您可以使用这些凭据进行后续API调用。我们所有的SDK在其AWSCredentialProviderObject中都有一些智能,由全局AWS对象共享。服务对象知道如何从那里获取访问密钥/密钥。例如,CognitoCredentialsProviders与CognitoSSO交互。您可以阅读有关Boto3 CredentialsProvider的更多信息,请注意,Boto3可以阅读上述~/.aws/config中的角色\u arn构造。您可以依赖aws\u
环境变量来承担角色,而无需触摸配置文件,例如,请查看bash my aws
项目,以获取一个示例-恐怕情况并非总是如此:这取决于代码运行的位置。这些环境变量不会神奇地出现。如果这些在运行时可用,则必须对其进行设置(可能是您在~/.profile
中配置的),但这不是EC2、ECS或Lambda中的默认设置。我们不建议在环境变量中传递敏感信息。