如何授予我的 Amazon EC2 实例访问另一个 AWS 账户中的 Amazon S3 存储桶的权限?

上次更新时间:2018 年 12 月 21 日

我希望我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例能够访问另一个 AWS 账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶。我如何在不将凭证存储在实例上的情况下授予此访问权?

解决方法

注意:虽然这是访问 Amazon S3 存储桶的特定示例,但步骤与为您的实例授予另一个账户中其他 AWS 资源的访问权类似。

按照以下步骤授予一个账户(账户 A)中的 Amazon EC2 实例访问另一个账户(账户 B)中 Amazon S3 存储桶的权限。

从账户 B 创建一个 IAM 角色

1.    使用账户 B 登录 AWS 管理控制台

2.    打开 AWS Identity and Access Management (IAM) 控制台

3.    在导航窗格中,选择角色

4.    选择创建角色

5.    对于选择受信任实体的类型,选择另一个 AWS 账户

6.    对于账户 ID,输入账户 A 的账户 ID。

7.    选择下一步:权限

8.    向角色附加策略,以委派对 Amazon S3 的访问权。例如,此策略为特定存储桶和该存储桶中存储的对象授予至所有操作的访问权:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::awsexamplebucket",
                "arn:aws:s3:::awsexamplebucket/*"
            ]
        }
    ]
}

9.    选择下一步:添加标签

10.    您可以向角色添加可选标签。或者也可以将字段留为空白,然后选择下一步:查看

11.    在角色名称字段中输入角色的名称。

12.    选择创建角色

从账户 B 中,获取角色的 ARN

1.    从 IAM 控制台的导航窗格中,选择角色

2.    选择您创建的 IAM 角色。

3.    请注意为角色 ARN 列出的值。

从账户 A 中创建另一个角色(实例配置文件)并将其附加到实例中

1.    使用账户 A 登录 AWS 管理控制台

2.    打开 IAM 控制台

3.    从导航窗格中,选择角色

4.    选择创建角色

5.    对于选择受信任实体的类型,选择 AWS 服务

6.    对于选择将使用此角色的服务,选择 EC2

7.    选择下一步:权限

8.    选择下一步:标签

9.    您可以向角色添加可选标签。或者也可以将字段留为空白,然后选择下一步:查看

10.    在角色名称字段中输入角色的名称。

11.    选择创建角色

12.    从角色列表中,选择您刚刚创建的角色。

13.    选择添加内联策略,然后选择 JSON 视图。

14.    输入以下策略。将 arn:aws:iam::111111111111:role/ROLENAME 替换为您在账户 B 中创建的 IAM 角色的 Amazon 资源名称 (ARN)。

{ 
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::111111111111:role/ROLENAME"
        }
    ]
}

15.    选择查看策略

16.    在名称中为策略输入一个名称。

17.    选择创建策略

18.    将 IAM 角色(实例配置文件)附加到您将用于访问 Amazon S3 存储桶的 Amazon EC2 实例。

从 Amazon EC2 实例中,用您的凭证配置角色

1.    连接到 Amazon EC2 实例。有关更多信息,请参阅连接到您的 Linux 实例连接到您的 Windows 实例

2.    在您连接到实例后,请验证目录是否已包含名为 ~/.aws 的文件夹。要查找此文件夹,您可以运行列出目录的命令,类似于以下内容:

ls -l ~/.aws

3.    如果您找到了 ~/.aws 文件夹,请继续下一步。如果目录尚未包含 ~/.aws 文件夹,请通过运行类似于以下内容的命令创建文件夹:

mkdir ~/.aws/

4.    在 ~/.aws 文件夹内,使用文本编辑器创建文件。将文件命名为 config

5.    在文件中,输入以下文本。将 enterprofilename 替换为您附加到实例的角色的名称。然后,将 arn:aws:iam::111111111111:role/ROLENAME 替换为您在账户 B 中创建的角色的 ARN。

[profile profilename]

role_arn = arn:aws:iam::111111111111:role/ROLENAME

credential_source = Ec2InstanceMetadata

6.    保存文件。

验证实例配置文件

要验证您的实例的角色(实例配置文件)是否可以代入账户 B 中的角色,请在连接到实例时运行以下命令。将 profilename 替换为您附加到实例的角色的名称。

$aws sts get-caller-identity --profile profilename

该命令会返回类似以下内容的响应:

 "Account": "11111111111",

 "UserId": "AROAEXAMPLEID:sessionName",

 "Arn": "arn:aws:sts::111111111111:assumed-role/ROLENAME/sessionName"

确认 "Arn" 的值与您在账户 B 中创建的角色的 ARN 相匹配。

验证至 Amazon S3 存储桶的访问权

要验证您的实例是否可以访问 Amazon S3 存储桶,请在连接到实例时运行此列表命令。将 profilename 替换为您附加到实例的角色的名称。

aws s3 ls s3://awsexamplebucket --profile profilename

如果您的实例能够成功访问存储桶,您将收到一个响应,其中列出了存储桶的内容,与以下内容类似:

PRE Hello/
2018-08-15 16:16:51 89 index.html

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助吗?