Amazon S3 的终端节点 - Amazon Virtual Private Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon S3 的终端节点

如果您已设置从 VPC 访问 Amazon S3 资源的权限,则在您设置终端节点后可继续使用 Amazon S3 DNS 名称来访问这些资源。但请注意以下几点:

  • 您的终端节点具有可控制使用终端节点访问 Amazon S3 资源的策略。默认策略允许 VPC 中的任何用户或服务使用来自任何 Amazon Web Services 账户 的凭证访问任何 Amazon S3 资源;包括与 VPC 关联的账户之外的 Amazon Web Services 账户 的 Amazon S3 资源。有关更多信息,请参阅 使用 VPC 终端节点控制对服务的访问权限

  • Amazon S3 从受影响子网的实例收到的源 IPv4 地址将从公有 IPv4 地址变为您的 VPC 中的私有 IPv4 地址。终端节点将切换网络路由,并断开打开的 TCP 连接。以前使用公有 IPv4 地址的连接不会恢复。建议您在创建或修改终端节点时不要运行任何重要任务;或进行测试以确保您的软件在连接中断后可自动重新连接到 Amazon S3。

  • 您不能使用 IAM 策略或存储桶策略允许从 VPC IPv4 CIDR 范围(私有 IPv4 地址范围)进行访问。VPC CIDR 块可能重叠或相同,这可能会导致意外结果。因此,对于通过 VPC 终端节点向 Amazon S3 发出的请求,无法在 IAM 策略中使用 aws:SourceIp 条件。这适用于用户和角色的 IAM 策略以及任何存储桶策略。如果语句包含 aws:SourceIp 条件,则该值不与任何提供的 IP 地址或范围匹配。您可以改而执行以下操作:

    • 使用路由表来控制哪些实例可以通过终端节点访问 Amazon S3 中的资源。

    • 对于存储桶策略,您可以限制对特定终端节点或特定 VPC 的访问。有关更多信息,请参阅 Amazon S3 存储桶策略

  • 终端节点当前不支持跨区域请求 — 确保在您的存储桶所在的区域内创建终端节点。您可以使用 Amazon S3 控制台或 get-bucket-location 命令来查找存储桶的位置。使用区域特定的 Amazon S3 终端节点访问存储桶;例如,mybucket.s3.us-west-2.amazonaws.com。有关 Amazon S3 的特定于区域的终端节点的更多信息,请参阅 Amazon Web Services 一般参考 中的 Amazon Simple Storage Service (S3)。如果您使用 Amazon CLI 向 Amazon S3 发起请求,请将默认区域设置为您的存储桶所在的相同区域,或在请求中使用 --region 参数。

    注意

    将 Amazon S3 的美国标准区域视为映射到该 us-east-1 区域。

  • 终端节点目前只支持 IPv4 流量。

在对 Amazon S3 使用终端节点之前,确保您已阅读下面的一般限制:网关终端节点限制。有关创建和查看 S3 存储桶的信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的如何创建 S3 存储桶如何查看 S3 存储桶的属性

如果您在 VPC 中使用其他 Amazon 服务,它们可能会对特定任务使用 S3 存储桶。确保终端节点策略允许对 Amazon S3 进行完全访问(默认策略),或允许对这些服务所使用的特定存储桶进行访问。或者,仅在未由这些服务中的任一服务使用的子网中创建终端节点,以允许这些服务继续使用公有 IP 地址访问 S3 存储桶。

下表列出了可能受终端节点影响的 Amazon 服务,以及每项服务的任何具体信息。

Amazon服务 注意
Amazon AppStream 2.0 您的终端节点策略必须允许访问 AppStream 2.0 用于存储用户内容的特定存储桶。有关更多信息,请参阅 Amazon AppStream 2.0 管理指南 中的将 Amazon S3 VPC 终端节点用于主文件夹和应用程序设置持久性
Amazon CloudFormation 如果您的 VPC 中的资源必须响应等待条件或自定义资源请求,则您的终端节点策略必须至少允许对这些资源所使用的特定存储桶的访问。有关更多信息,请参阅为 Amazon CloudFormation 设置 VPC 终端节点
CodeDeploy 您的终端节点策略必须允许对 Amazon S3 进行完全访问,或允许对您已为 CodeDeploy 部署创建的任何 S3 存储桶进行访问。
Elastic Beanstalk 您的终端节点策略必须至少允许对用于 Elastic Beanstalk 应用程序的任何 S3 存储桶进行访问。有关更多信息,请参阅 Amazon Elastic Beanstalk 开发人员指南中的将 Elastic Beanstalk 与 Amazon S3 配合使用
Amazon EMR 您的终端节点策略必须允许访问 Amazon Linux 存储库和由 Amazon EMR 使用的其他存储桶。有关更多信息,请参阅 Amazon EMR 管理指南 中的私有子网的最低 Amazon S3 策略
Amazon OpsWorks 您的终端节点策略必须至少允许对 使用的特定存储桶进行访问Amazon OpsWorks 有关更多信息,请参阅 Amazon OpsWorks 用户指南中的在 VPC 中运行堆栈
Amazon Systems Manager

您的终端节点策略必须允许访问补丁管理器在您的 Amazon 区域用于补丁基准操作的 Amazon S3 存储桶。这些存储桶包含由补丁基准服务检索并在实例上运行的代码。有关更多信息,请参阅 Amazon Systems Manager 用户指南中的创建 Virtual Private Cloud 终端节点

有关 SSM 代理执行操作所需的 S3 存储桶权限的列表,请参阅 Amazon Systems Manager 用户指南中的 SSM 代理的最低 S3 存储桶权限

Amazon Elastic Container Registry 您的终端节点策略必须允许访问 Amazon ECR 用于存储 Docker 镜像层的 Amazon S3 存储桶。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南 中的适用于 Amazon ECR 的最低 Amazon S3 存储桶权限
Amazon WorkDocs 如果您在 WorkSpaces 或 EC2 实例中使用 Amazon WorkDocs 客户端,则终端节点策略必须允许对 Amazon S3 的完全访问权限。
WorkSpaces WorkSpaces 不直接依赖于 Amazon S3。但如果您向 WorkSpaces 用户提供 Internet 访问权限,则请记住,来自其他公司的网站、HTML 电子邮件和 Internet 服务可能取决于 Amazon S3。确保您的终端节点策略允许对 Amazon S3 进行完全访问,以便这些服务能够继续正常运行。

您的 VPC 和 S3 存储桶之间的流量不会脱离 Amazon 网络。

Amazon S3 终端节点策略

下面是访问 Amazon S3 的终端节点策略示例。有关更多信息,请参阅 使用 VPC 终端节点策略。由用户决定满足其业务需求的策略限制。

重要

所有类型的策略 — IAM 用户策略、终端节点策略、S3 存储桶策略和 Amazon S3 ACL 策略(如果有)— 都必须授予必要权限以便成功访问 Amazon S3。

Amazon建议您在将终端节点的使用限制为特定调用者时,在 VPC 终端节点策略中使用 IAM 条件而不是 IAM Principal 元素。这些条件的示例有 aws:PrincipalArnaws:PrincipalAccountaws:PrincipalOrgId、和 aws:PrincipalOrgPaths。有关条件上下文键的更多信息,请参阅 Amazon Identity and Access Management 用户指南中的 Amazon 全局条件上下文键

例 示例:限制对特定存储桶的访问

您可以创建一个策略来仅允许访问特定 S3 存储桶。如果您的 VPC 中有使用 S3 存储桶的其他 Amazon 服务,这会非常有用。以下是仅允许访问 my_secure_bucket 的策略的示例。

{ "Effect": "Allow", "Action": ["s3:ListBucket","s3:GetObject","s3:PutObject"], "Resource": ["arn:aws:s3:::example-bucket","arn:aws:s3:::example-bucket/*"] }

例 示例:将此 VPC 终端节点的使用限制为账户中的特定 IAM 角色

您可以创建将 VPC 终端节点的使用限制为特定 IAM 角色的策略。以下是限制 SomeRole 账户中 111122223333 访问权限的示例。

{ "Sid": "Restrict-acess-to-specific-IAM-role", "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": "*", "Condition": { "ArnEquals": { "aws:PrincipalArn": "arn:aws:iam::111122223333:role/SomeRole" } } }

例 示例:将此 VPC 终端节点的使用限制为特定账户中的用户

您可以创建将 VPC 终端节点的使用限制为特定账户的策略。以下是限制 111122223333 账户中用户访问权限的示例。

{ "Sid": "AllowCallersFromAccount111122223333", "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": "*", "Condition": { "StringEquals": { "aws:PrincipalAccount": "111122223333" } } }

例 示例:允许对 Amazon Linux AMI 存储库的访问

每个区域中的 Amazon Linux AMI 存储库都是 Amazon S3 存储桶。如果您希望 VPC 中的实例通过终端节点访问该存储库,请创建终端节点策略以允许对这些存储桶进行访问。

以下策略授予对 Amazon Linux 存储库的访问权限。

您需要将 region 替换为您的 Amazon 区域,例如 us-east-1

{ "Statement": [ { "Sid": "AmazonLinuxAMIRepositoryAccess", "Principal": "*", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::packages.region.amazonaws.com/*", "arn:aws:s3:::repo.region.amazonaws.com/*" ] } ] }

以下策略授予对 Amazon Linux 2 存储库的访问权限。

您需要将 region 替换为您的 Amazon 区域,例如 us-east-1

{ "Statement": [ { "Sid": "AmazonLinux2AMIRepositoryAccess", "Principal": "*", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::amazonlinux.region.amazonaws.com/*" "arn:aws:s3:::amazonlinux-2-repos-region/*" ] } ] }

Amazon S3 存储桶策略

您可以使用存储桶策略来控制从特定终端节点、VPC、IP 地址或 Amazon Web Services 账户 对存储桶的访问。

对于通过 VPC 终端节点向 Amazon S3 发出的请求,无法在存储桶策略中使用 aws:SourceIp 条件。此条件未匹配任何指定的 IP 地址或 IP 地址范围,如果您向 Amazon S3 存储桶发出请求,可能不会有预期的效果。例如:

  • 您的存储桶策略具有 Deny 效果和 NotIpAddress 条件,即仅从单个 IP 地址或有限 IP 地址范围获得访问权。对于通过终端节点向存储桶发出的请求,始终匹配 NotIpAddress 条件,并且语句的效果适用 (假定策略中的其他限制匹配)。对存储桶的访问被拒绝。

  • 您的存储桶策略具有 Deny 效果和 IpAddress 条件,即仅拒绝对单个 IP 地址或有限 IP 地址范围的访问。对于通过终端节点向存储桶发出的请求,条件不匹配,并且语句不适用。假定有其他语句允许在无 IpAddress 条件时访问,则允许对存储桶的访问。

反之,请使用 aws:VpcSourceIp 控制从特定 IP 地址范围的访问。

要使 IAM 用户能够使用存储桶策略,您必须向他们授予使用 s3:GetBucketPolicys3:PutBucketPolicy 操作的权限。

有关 Amazon S3 的存储桶策略的更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的使用存储桶策略和用户策略

例 示例:限制对特定终端节点的访问

您可以使用 aws:sourceVpce 条件来创建用于限制对特定终端节点的访问的存储桶策略。下面是一个 S3 存储桶策略示例,该存储桶仅允许从终端节点 vpce-1a2b3c4d 访问存储桶 my_secure_bucket。如果未使用指定的终端节点,则该策略拒绝对存储桶的所有访问。aws:sourceVpce 条件不需要 VPC 终端节点资源的 ARN,而只需要终端节点 ID。

{ "Version": "2012-10-17", "Id": "Policy1415115909152", "Statement": [ { "Sid": "Access-to-specific-VPCE-only", "Principal": "*", "Action": "s3:*", "Effect": "Deny", "Resource": ["arn:aws:s3:::my_secure_bucket", "arn:aws:s3:::my_secure_bucket/*"], "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1a2b3c4d" } } } ] }

例 示例:限制对特定 VPC 的访问

您可以使用 aws:sourceVpc 条件来创建存储桶策略,用于限制对特定 VPC 的访问。如果您在同一 VPC 中配置了多个终端节点,并且您希望管理对所有终端节点的 S3 存储桶的访问,这会非常有用。下面是允许 VPC vpc-111bbb22 访问 my_secure_bucket 及其对象的策略的示例。如果未使用指定的 VPC,则该策略拒绝对存储桶的所有访问。aws:sourceVpc 条件不需要 VPC 资源的 ARN,而只需要 VPC ID。

{ "Version": "2012-10-17", "Id": "Policy1415115909152", "Statement": [ { "Sid": "Access-to-specific-VPC-only", "Principal": "*", "Action": "s3:*", "Effect": "Deny", "Resource": ["arn:aws:s3:::my_secure_bucket", "arn:aws:s3:::my_secure_bucket/*"], "Condition": { "StringNotEquals": { "aws:sourceVpc": "vpc-111bbb22" } } } ] }

例 示例:限制对特定 IP 地址范围的访问

您可以使用 aws:VpcSourceIp 条件来创建策略,用于限制对特定 IP 地址范围的访问。下面是允许 172.31.0.0/16 访问 my_secure_bucket 及其对象的策略的示例。该策略拒绝从其他 IP 地址范围访问存储桶。

{ "Version": "2012-10-17", "Id": "Policy1415115909152", "Statement": [ { "Sid": "Access-to-specific-VPC-CIDR-only", "Principal": "*", "Action": "s3:*", "Effect": "Deny", "Resource": ["arn:aws:s3:::my_secure_bucket", "arn:aws:s3:::my_secure_bucket/*"], "Condition": { "NotIpAddress": { "aws:VpcSourceIp": "172.31.0.0/16" } } } ] }

例 示例:限制对特定 Amazon Web Services 账户 中存储桶的访问

您可以使用 s3:ResourceAccount 条件来创建策略,用于限制对特定 Amazon Web Services 账户 中 S3 存储桶的访问。如果您希望限制 VPC 内的客户端访问您不拥有的存储桶,这将非常有用。以下是一个策略示例,该策略限制对单个 Amazon Web Services 账户 (账户 ID 为 111122223333)所拥有的资源的访问。

{ "Version": "2012-10-17", "Id": "Policy1415115909152", "Statement": [ { "Sid": "Access-to-bucket-in-specific-account-only", "Principal": "*", "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Deny", "Resource": "arn:aws:s3:::*", "Condition": { "StringNotEquals": { "s3:ResourceAccount": "111122223333" } } } ] }