Amazon web services 假定AWS角色不用于将来的CLI命令

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

我正试图在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-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中的默认设置。我们不建议在环境变量中传递敏感信息。