如何授予我的 Amazon EC2 实例对另一个 AWS 账户中的 Amazon S3 存储桶的访问权限?
我想使用 Amazon Elastic Compute Cloud (Amazon EC2) 实例访问我在另一个 AWS 账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶。
解决方法
要向 EC2 实例授予对 S3 存储桶的跨账户访问权限,请在两个 AWS 账户之间建立信任关系。使用 AWS Identity and Access Management (IAM) 角色来创建关系。在存储桶所有者账户中,创建一个授予 S3 权限的角色。在 EC2 实例所有者账户中,创建一个可以代入存储桶所有者的角色来访问存储桶的角色。
在存储桶所有者账户中创建角色
要在存储桶所有者账户中创建 Identity and Access Management (IAM) 角色,请完成以下步骤:
-
使用存储桶所有者账户登录 AWS 管理控制台。
-
打开 IAM 控制台。
-
在导航窗格中,选择 Roles(角色),然后选择 Create role(创建角色)。
-
对于 Trusted entity type(可信实体类型),选择 AWS account(AWS 账户)。
-
选择 Another AWS account(另一个 AWS 账户),然后输入 EC2 实例所有者账户的账户 ID。
**注意:**除非您的安全要求强制规定使用这些选项,否则请勿勾选 Require external ID(需要外部 ID)或 Require MFA(需要 MFA)。 -
选择 Next(下一步)。
-
将 IAM 策略附加到委托 Amazon S3 访问权限的角色,然后选择 Next(下一步)。例如,以下 IAM 策略授予对存储桶中对象的 s3:GetObject 权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ] } ] }**注意:**请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。同时,根据您的使用案例所需的 Amazon S3 存储桶级别和对象级别权限修改 IAM 策略。
-
对于 Role name(角色名称),输入角色的名称。
-
(可选)为角色添加标签。
-
选择 Create role(创建角色)。
在存储桶所有者账户中,查找 IAM 角色的 Amazon 资源名称 (ARN)
要查找 IAM 角色的 ARN,请完成以下步骤:
- 在 IAM 控制台的导航窗格中,选择 Roles(角色)。
- 选择您创建的 IAM 角色。
- 记下为 Role ARN(角色 ARN)列出的值。
在 EC2 实例所有者账户中,创建另一个角色并将其附加到实例
要在 EC2 实例所有者账户中创建另一个实例配置文件并将其附加到实例,请完成以下步骤:
- 使用 EC2 实例所有者账户登录 AWS 管理控制台。
- 打开 IAM 控制台。
- 从导航窗格中,选择 Roles(角色),然后选择 Create role(创建角色)。
- 对于 Trusted entity type(可信实体类型),选择 AWS Service(AWS 服务)。
- 对于 Service or use case(服务或使用案例),选择 EC2,然后选择您的使用案例。
- 选择 Next(下一步)。
- 在 Add permissions(添加权限)页面上,选择 Next(下一步)。
- 对于 Role name(角色名称),输入角色的名称。
- (可选)为角色添加标签。
- 选择 Create role(创建角色)。
- 从角色列表中,选择您创建的角色。
- 对于 Add permissions(添加权限),选择 Create inline policy(创建内联策略)。
- 对于 Policy editor(策略编辑器),选择 JSON,然后输入以下策略:
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::111111111111:role/ROLENAME" }] }
**注意:**请将 arn:aws:iam::111111111111:role/ROLENAME 替换为您在存储桶所有者账户中创建的 IAM 角色的 ARN。
- 选择 Next(下一步)。
- 对于 Name(名称),输入策略的名称,然后选择 Create policy(创建策略)。
- 将 IAM 角色附加到您用于访问 Amazon S3 存储桶的实例。
在 Amazon EC2 实例中,在 CLI 配置文件中为角色创建配置文件
**注意:**如果您使用 SSH 和会话管理器连接到实例,则必须为 ec2-user 和 ssm-user 执行这些步骤。会话管理器是 AWS Systems Manager 中的一个工具。
要在实例的 CLI 配置文件中为角色创建配置文件,请完成以下步骤:
-
连接到该实例。有关更多信息,请参阅使用 SSH 连接到 Linux 实例或使用 RDP 连接到 Windows 实例。
-
要确定该目录是否已经有名为 ~/.aws 的文件夹,请运行以下 ls 命令列出实例目录:
ls -l ~/.aws -
如果找到 ~/.aws 文件夹,请继续执行下一步。如果找不到 ~/.aws 文件夹,请运行以下 mkdir 命令来创建该文件夹:
mkdir ~/.aws/ -
在 ~/.aws 文件夹中,使用文本编辑器创建一个文件。将该文件命名为 config。
-
在文件中,输入以下文本以定义角色的配置文件:
[profile enterprofilename] role_arn = arn:aws:iam::111111111111:role/ROLENAME credential_source = Ec2InstanceMetadata**注意:**请将 enterprofilename 替换为您的值。将 arn:aws:iam::111111111111:role/ROLENAME 替换为您在存储桶所有者账户中创建的角色的 ARN。
-
保存文件。
验证实例配置文件是否可以代入该角色
要验证您的实例的角色是否可以代入存储桶所有者账户中的角色,请连接到该实例,然后运行以下命令:
aws sts get-caller-identity --profile profilename
**注意:**请将 profilename 替换为您附加到实例的角色的名称。
该命令返回的响应类似于以下内容:
"Account": "11111111111", "UserId": "AROAEXAMPLEID:sessionName", "Arn": "arn:aws:sts::111111111111:assumed-role/ROLENAME/sessionName"
确认 "Arn" 的值与您在存储桶所有者账户中创建的角色的 ARN 相匹配。
验证对 Amazon S3 存储桶的访问权限
要验证您的实例能否访问 S3 存储桶,请连接到该实例,然后运行以下列表命令:
aws s3 ls s3://DOC-EXAMPLE-BUCKET --profile profilename
**注意:**请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称,并将 profilename 替换为您在配置文件中配置的名称。
如果您的实例可以成功访问存储桶,则您会收到与以下内容类似的响应:
PRE Hello/ 2018-08-15 16:16:51 89 index.html
