问题描述
在EC2实例上想要使用aws cli在另一个账户中创建一些资源,但是不想使用aws_secret_key和aws_access_key。他想知道是否有其他方法实现这个目标。
解决方案
请注意以下操作可能涉及到账户间的访问和权限设置,请确保了解相关的安全性和权限控制。
方案
可以通过在两个账户之间创建角色并使用AssumeRole的方式来实现在EC2实例上访问另一个账户的资源,而不需要直接使用aws_secret_key和aws_access_key。以下是详细步骤:
- 在账户A中创建角色和策略:
- 在账户A中创建一个名为
RoleForB
的角色,该角色将信任账户B。为该角色附加一个允许它在账户A中执行某些读操作的IAM策略,比如ReadOnlyAccess
。 - 配置角色的信任策略,允许账户B的根用户扮演这个角色。以下是一个示例信任策略:
json
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::Account_B_ID:root"},
"Action": "sts:AssumeRole"
}
}
- 在账户B中创建角色和策略:
- 在账户B中创建一个名为
AssumeRoleInA
的角色,附加一个策略,允许它扮演账户A中的RoleForB
角色。 - 配置
AssumeRoleInA
角色的策略,允许它扮演账户A中的RoleForB
角色。以下是一个示例策略:
json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::Account_A_ID:role/RoleForB"
]
}
]
}
- 在账户B中的EC2实例上分配角色:
- 在账户B中,为需要访问账户A资源的EC2实例分配
AssumeRoleInA
角色。 这可以通过为EC2实例关联IAM角色来完成,使得EC2实例能够假扮为
AssumeRoleInA
角色。在账户B中的EC2实例上使用assume-role命令:
- 在EC2实例上,使用
aws sts assume-role
命令来假扮为账户A中的RoleForB
角色,以获取临时凭证。 - 在EC2终端中运行以下命令:
bash
aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"
- 获取临时凭证并设置环境变量:
- 当命令在步骤4中完成后,你会获得访问键ID、秘密访问键和会话令牌。你可以从命令输出(stdout)中获取这些值,然后将它们分配给环境变量。
bash
export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key
export AWS_SESSION_TOKEN=your_session_token
现在,你可以使用这些临时凭证在EC2实例上执行操作,访问账户A中的资源。
请注意,这个解决方案的核心思想是利用角色扮演(AssumeRole)机制来实现跨账户访问,同时避免了直接使用访问密钥。