如何对多个账户使用AWS CLI

时间:2019-06-19 16:12:44

标签: amazon-web-services aws-cli

我的根帐户是1234(帐户ID),并且已启用MFA身份验证,我的用户名是myuser12。我可以使用帐户ID和用户名以及密码登录。它将要求提供MFA令牌代码。一旦我输入了令牌代码。我可以在根帐户下看到特定位置的实例。

我可以使用我的角色(在我的情况下,所有帐户中的角色都相同)以及任何别名来将角色切换到新帐户(​​5678)。切换角色完成后,我可以在特定位置查看新帐户下的所有实例。

通过Web控制台,一切都很好。当我尝试通过CLI访问它们时,无法获得新帐户的结果(5678)。但它适用于1234帐户位置。

Account ID - Location   - No. of instances

1234       - us-east-1  - 5 instances

1234       - eu-west-3   - 2 instances

5678       - eu-north-1  - 5 instances

5678       - eu-west-1   - 5 instances

以此类推。

我最初的.aws/config内容

[profile default]
region = us-east-1
output = json

.aws/credentials内容,

[default]
aws_access_key_id = accesskeyIdFromDownloadedCSV
aws_secrect_access_key = secrectAccessKeyFromDownloadedCSV

现在,如果我尝试查询任何实例,由于未使用MFA生成访问密钥令牌,因此会出现错误。

aws rds describe-db-instances --query 'DBInstances[?DBInstanceClass==`db.m3.large`]' --profile default --no-verify-ssl

因此,我必须获取我的MFA arn URL,并获取即时访问密钥ID,秘密访问密钥和会话令牌。

aws iam list-mfa-devices --user-name myuser12

我从上面的命令中获得了“ SerialNumber”(MFA网址),以后需要它来生成会话令牌。

现在,

aws sts get-session-token --serial-number arn:aws:iam::1234:mfa/myuser12 --token-code 123456

注意:从我的虚拟MFA设备生成的123456(令牌代码)

现在,我从上述命令中获得了SessionToken(aws_session_token),SecrectAccessKey(aws_secret_access_key),AccessKeyId(aws_access_key_id)以及到期时间戳记。

因此,我已根据新凭据更新了.aws/config.aws/credential文件。

.aws/config文件内容

[profile default]
region = us-east-1
output = json

[profile newacc]
region = eu-west-1
role_arn = arn:aws:iam::5678:role/myRole   
source_profile default                     
output = json

.aws/credentials内容,

[default]
aws_access_key_id = NewIdFromMFACommand
aws_secrect_access_key = NewKeyFromMFACommand
aws_aws_session_token = TokenFromMFACommand      

[newacc]
region = eu-west-1
role_arn = arn:aws:iam::5678:role/myRole   
source_profile default                     
output = json

现在,我可以执行我的初始命令

aws rds describe-db-instances --query 'DBInstances[?DBInstanceClass==`db.m3.large`]' --profile default --no-verify-ssl

然后,获取db.m3.large类型实例的列表。

但是,当我尝试使用--profile newacc时,我什么也没得到。我真的很困惑要更改什么以及在哪里更改?

2 个答案:

答案 0 :(得分:0)

此配置块:

[profile newacc]
region = eu-west-1
role_arn = arn:aws:iam::5678:role/myRole   
source_profile default                     
output = json

表示您希望承担myRole。但是,假设角色只能由被授权承担该角色的IAM用户完成。因此,需要一些常规的IAM凭据来证明您的身份。这是通过source_profile完成的。

source_profile default行意味着default个人资料中的凭据将用于呼叫AssumeRole

我建议您保留默认凭据作为常规IAM凭据。调用aws sts get-session-token时,将结果存储在其他配置文件中(不是default,不是newacc)。您可以使用aws configure --profile sts来做到这一点(例如)。

当您希望使用myRole时,可以使用--profile newacc。这将使用您的default凭据来呼叫AssumeRole,并将使用角色的凭据来进行呼叫。

结果是三个配置文件:

  • default用于呼叫get-session-tokenAssumeRole
  • sts用于证明您拥有MFA
  • newacc使用角色

答案 1 :(得分:0)

终于可以了!看来,我需要为每个帐户在命令下运行。

aws sts assume-role --role-arn "arn:aws:iam::5678:role/MyRoleForThisAccount" --role-session-name AWSCLI-Session

注意:在IAM中分配分配给您的用户的相应角色(MyRoleForThisAccount),并确保您的用户有权调用AssumeRole

并更新~/.aws/credentials文件中每个块的结果(凭证)。因此,凭证文件看起来像

[default]
aws_access_key_id = NewIdFromMFACommand
aws_secrect_access_key = NewKeyFromMFACommand
aws_aws_session_token = TokenFromMFACommand      

[newacc]
aws_access_key_id = NewIdFromAssumeRoleCommandForThisAccount
aws_secrect_access_key = NewKeyFromAssumeRoleCommandForThisAccount
aws_aws_session_token = NewTokenFromAssumeRoleCommandForThisAccount

~/.aws/config文件将是

[profile default]
region = us-east-1
output = json

[profile newacc]
region = eu-west-1