适用于 Amazon S3 的 Amazon PrivateLink - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

适用于 Amazon S3 的 Amazon PrivateLink

借助适用于 Amazon S3 的 Amazon PrivateLink ,您可以在 Virtual Private Cloud (VPC) 中预置接口 VPC 终端节点(接口终端节点)。这些终端节点可从本地(通过 VPN 及 Amazon Direct Connect)或其他 Amazon Web Services 区域 (通过 VPC 对等连接)中的应用程序直接访问。

接口终端节点由一个或多个弹性网络接口 (ENI) 代表,这些接口是从 VPC 中的子网分配的私有 IP 地址。向适用于 Amazon S3 的接口终端节点发出的请求将自动路由到 Amazon 网络上的 Amazon S3。您还可以通过 Amazon Direct Connect 或 Amazon Virtual Private Network (Amazon VPN) 从本地应用程序访问 VPC 中的接口终端节点。有关如何将 VPC 与本地网络连接的更多信息,请参阅《Amazon Direct Connect 用户指南》和《Amazon Site-to-Site VPN 用户指南》。

有关接口终端节点的一般信息,请参阅《 Amazon PrivateLink 指南》中的接口 VPC 终端节点 ( Amazon PrivateLink )

适用于 Amazon S3 的 VPC 终端节点类型

您可以使用两种类型的 VPC 终端节点访问 Amazon S3:网关终端节点接口终端节点网关终端节点是您在路由表中指定的网关,用于通过 Amazon 网络从 VPC 访问 Amazon S3。接口终端节点通过私有 IP 地址将请求从您的 VPC 内部、本地或其他 Amazon Web Services 区域 中的 VPC 使用 VPC 对等连接或 Amazon Transit Gateway 路由到 Amazon S3,从而扩展网关终端节点的功能。有关更多信息,请参阅什么是 VPC 对等连接Transit Gateway 与 VPC 对等连接

接口终端节点与网关终端节点兼容。如果您在 VPC 中有现有网关终端节点,则可以在同一 VPC 中使用这两种类型的终端节点。

适用于 Amazon S3 的网关终端节点

适用于 Amazon S3 的接口终端节点

在这两种情况下,您的网络流量仍保留在 Amazon 网络中。

使用 Amazon S3 公有 IP 地址

使用 VPC 中的私有 IP 地址访问 Amazon S3

不允许从本地访问

允许从本地访问

不允许从其他 Amazon Web Services 区域 访问

允许从另一个 Amazon Web Services 区域 使用 VPC 对等连接或 Amazon Transit Gateway 进行访问

不计费

已计费

有关网关终端节点的更多信息,请参阅《 Amazon PrivateLink 指南》中的网关 VPC 终端节点

VPC 限制应用于适用于 Amazon S3 的 Amazon PrivateLink 。有关更多信息,请参阅《 Amazon PrivateLink 指南》中的接口终端节点属性和限制以及 Amazon PrivateLink 配额。此外,以下限制将适用:

适用于 Amazon S3 的 Amazon PrivateLink 不支持以下各项:

访问 Amazon S3 接口终端节点

重要

要使用 Amazon PrivateLink 访问 Amazon S3,您必须更新应用程序以使用特定于终端节点的 DNS 名称。

创建接口终端节点时,Amazon S3 会生成两种特定于终端节点的 S3 DNS 名称:区域地区

  • 区域 DNS 名称包括唯一的 VPC 终端节点 ID、服务标识符、 Amazon Web Services 区域 和以其命名的 vpce.amazonaws.com。例如,对于 VPC 终端节点 ID vpce-1a2b3c4d,生成的 DNS 名称可能类似于 vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com

  • 地区 DNS 名称包括可用区 – 例如 vpce-1a2b3c4d-5e6f-us-east-1a.s3.us-east-1.vpce.amazonaws.com。如果您的架构隔离了可用区,则可以使用此选项。例如,您可以将其用于故障控制或降低区域数据传输成本。

可以从 S3 公有 DNS 域解析特定于终端节点的 S3 DNS 名称。

注意

Amazon S3 接口终端节点支持接口终端节点的私有 DNS 功能。有关用于接口终端节点的私有 DNS 的更多信息,请参阅《 Amazon PrivateLink 指南》。

从 S3 接口终端节点访问存储桶和 S3 接入点

您可以使用 Amazon CLI 或 Amazon 开发工具包通过 S3 接口终端节点访问存储桶、S3 接入点和 S3 控制 API。

下图显示了 VPC 控制台详细信息选项卡,您可以在其中找到 VPC 终端节点的 DNS 名称。在此示例中,VPC 终端节点 ID (vpce-id)vpce-0e25b8cdd720f900eDNS 名称vpce-0e25b8cdd720f900e-argc85vg.s3.us-east-1.vpce.amazonaws.com


        VPC 控制台的详细信息选项卡屏幕截图。

有关如何查看终端节点特定 DNS 名称的更多信息,请参阅 VPC 用户指南中的查看终端节点服务私有 DNS 名称配置

使用 --region--endpoint-url 参数通过 S3 接口终端节点访问 S3 存储桶、S3 接入点或 S3 控制 API。

示例:使用终端节点 URL 列出存储桶中的对象

在以下示例中,将区域 us-east-1、VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com、和存储桶名称 my-bucket 替换为相应的信息。

aws s3 --region us-east-1 --endpoint-url https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com ls s3://my-bucket/

示例:使用终端节点 URL 列出来自访问点的对象

在以下示例中,将 ARN us-east-1:123456789012:accesspoint/test、区域 us-east-1、和 VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com替换为相应的信息。

aws s3api list-objects-v2 --bucket arn:aws:s3:us-east-1:123456789012:accesspoint/test --region us-east-1 --endpoint-url https://accesspoint.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com

示例:使用终端节点 URL 列出具有 S3 控制的作业

在以下示例中,将区域 us-east-1、VPC 终端节点 IDvpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com、和账户 ID12345678 替换为相应的信息。

aws s3control --region us-east-1 --endpoint-url https://control.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com list-jobs --account-id 12345678

将开发工具包更新到最新版本,然后将客户端配置为使用终端节点 URL 通过 S3 接口终端节点访问存储桶、接入点或 S3 控制 API。

SDK for Python (Boto3)

示例:使用终端节点 URL 访问 S3 存储桶

在以下示例中,将区域 us-east-1 和 VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com 替换为相应的信息。

s3_client = session.client( service_name='s3', region_name='us-east-1', endpoint_url='https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com' )

示例:使用终端节点 URL 访问 S3 接入点

在以下示例中,将区域 us-east-1 和 VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com 替换为相应的信息。

ap_client = session.client( service_name='s3', region_name='us-east-1', endpoint_url='https://accesspoint.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com' )

示例:使用终端节点 URL 访问 S3 控制 API

在以下示例中,将区域 us-east-1 和 VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com 替换为相应的信息。

control_client = session.client( service_name='s3control', region_name='us-east-1', endpoint_url='https://control.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com' )
SDK for Java 1.x

示例:使用终端节点 URL 访问 S3 存储桶

在以下示例中,将 VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com 替换为相应的信息。

// bucket client final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withEndpointConfiguration( new AwsClientBuilder.EndpointConfiguration( "https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com", Regions.DEFAULT_REGION.getName() ) ).build(); List<Bucket> buckets = s3.listBuckets();

示例:使用终端节点 URL 访问 S3 接入点

在以下示例中,将 VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com 和 ARN us-east-1:123456789012:accesspoint/prod 替换为相应的信息。

// accesspoint client final AmazonS3 s3accesspoint = AmazonS3ClientBuilder.standard().withEndpointConfiguration( new AwsClientBuilder.EndpointConfiguration( "https://accesspoint.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com", Regions.DEFAULT_REGION.getName() ) ).build(); ObjectListing objects = s3accesspoint.listObjects("arn:aws:s3:us-east-1:123456789012:accesspoint/prod");

示例:使用终端节点 URL 访问 S3 控制 API

在以下示例中,将 VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com 替换为相应的信息。

// control client final AWSS3Control s3control = AWSS3ControlClient.builder().withEndpointConfiguration( new AwsClientBuilder.EndpointConfiguration( "https://control.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com", Regions.DEFAULT_REGION.getName() ) ).build(); final ListJobsResult jobs = s3control.listJobs(new ListJobsRequest());
SDK for Java 2.x

示例:使用终端节点 URL 访问 S3 存储桶

在以下示例中,将 VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com 和区域 Region.US_EAST_1 替换为相应的信息。

// bucket client Region region = Region.US_EAST_1; s3Client = S3Client.builder().region(region) .endpointOverride(URI.create("https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com")) .build()

示例:使用终端节点 URL 访问 S3 接入点

在以下示例中,将 VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com 和区域 Region.US_EAST_1 替换为相应的信息。

// accesspoint client Region region = Region.US_EAST_1; s3Client = S3Client.builder().region(region) .endpointOverride(URI.create("https://accesspoint.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com")) .build()

示例:使用终端节点 URL 访问 S3 控制 API

在以下示例中,将 VPC 终端节点 ID vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com 和区域 Region.US_EAST_1 替换为相应的信息。

// control client Region region = Region.US_EAST_1; s3ControlClient = S3ControlClient.builder().region(region) .endpointOverride(URI.create("https://control.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com")) .build()

更新本地 DNS 配置

使用特定于终端节点的 DNS 名称访问适用于 Amazon S3 的接口终端节点时,您无需更新本地 DNS 解析程序。您可以使用来自公有 Amazon S3 DNS 域的接口终端节点的私有 IP 地址解析特定于终端节点的 DNS 名称。

使用接口终端节点访问 Amazon S3,无需 VPC 中的网关终端节点和互联网网关

VPC 中的接口终端节点可以通过 Amazon 网络将 VPC 内的应用程序和本地应用程序路由到 Amazon S3,如下图所示。


          数据流程图显示了使用接口终端节点和 
				Amazon PrivateLink
			 从本地和 VPC 内的应用程序对 S3 的访问。

该图阐释了以下内容:

  • 您的本地网络使用 Amazon Direct Connect 或者 Amazon VPN 连接到 VPC A。

  • 本地和 VPC A 中的应用程序使用特定于终端节点的 DNS 名称通过 S3 接口终端节点访问 Amazon S3。

  • 本地应用程序通过 Amazon Direct Connect(或 Amazon VPN)将数据发送到 VPC 中的接口终端节点。 Amazon PrivateLink 通过 Amazon 网络将数据从接口终端节点移动到 Amazon S3。

  • VPC 中的应用程序还向接口终端节点发送通信。 Amazon PrivateLink 通过 Amazon 网络将数据从接口端点移动到 Amazon S3。

在同一 VPC 中同时使用网关终端节点和接口终端节点来访问 Amazon S3

您可以创建接口终端节点并将现有网关终端节点保留在同一 VPC 中,如下图所示。这样,您就可以允许 VPC 内应用程序继续通过网关终端节点访问 Amazon S3,而无需付费。然后,只有您的本地应用程序才会使用接口终端节点访问 Amazon S3。要通过这种方式访问 S3,您必须更新本地应用程序,以使用适用于 Amazon S3 的特定于终端节点的 DNS 名称。


            数据流程图显示了同时使用网关终端节点和接口终端节点访问 S3 的情况。

该图阐释了以下内容:

  • 本地应用程序使用特定于终端节点的 DNS 名称通过 Amazon Direct Connect(或 Amazon VPN)将数据发送到 VPC 中的接口终端节点。 Amazon PrivateLink 通过 Amazon 网络将数据从接口终端节点移动到 Amazon S3。

  • 使用默认的区域 Amazon S3 名称,VPC 内应用程序会将数据发送到通过 Amazon 网络连接到 Amazon S3 的网关终端节点。

有关网关终端节点的更多信息,请参阅 VPC 用户指南中的网关 VPC 终端节点

为 Amazon S3 创建 VPC 终端节点策略

您可以为 VPC 终端节点附加控制对 Amazon S3 的访问的终端节点策略。该策略指定以下信息:

  • 可执行操作的 Amazon Identity and Access Management (IAM) 委托人。

  • 可执行的操作

  • 可对其执行操作的资源

您还可以使用 Amazon S3 存储桶策略,使用存储桶策略中的 aws:sourceVpce 条件限制从特定 VPC 终端节点访问特定存储桶。以下示例显示了限制对存储桶或终端节点的访问的策略。

重要

您可以创建一个终端节点策略来仅允许访问特定 Amazon S3 存储桶。如果您的 VPC 中有使用存储桶的其他 Amazon 服务,这会非常有用。以下存储桶策略将限制为仅访问 DOC-EXAMPLE-BUCKET1。将 DOC-EXAMPLE-BUCKET1 替换为您的存储桶的名称。

{ "Version": "2012-10-17", "Id": "Policy1415115909151", "Statement": [ { "Sid": "Access-to-specific-bucket-only", "Principal": "*", "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET1", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*"] } ] }

您可以创建一个策略,限制仅访问特定 Amazon Web Services 账户 中的 S3 存储桶。使用此选项可防止 VPC 内的客户端访问不属于您的存储桶。以下示例创建了限制对由单个 Amazon Web Services 账户 ID 111122223333 拥有的资源访问权限的策略。

{ "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" } } } ] }

示例:限制对 S3 存储桶策略中特定 VPC 终端节点的访问

以下 Amazon S3 存储桶策略仅允许从终端节点 DOC-EXAMPLE-BUCKET2 访问特定存储桶 vpce-1a2b3c4d。如果未使用指定的终端节点,则该策略拒绝对存储桶的所有访问。aws:sourceVpce 条件用于指定终端节点,不需要 VPC 终端节点资源的 Amazon Resource Name (ARN),而只需要终端节点 ID。将 DOC-EXAMPLE-BUCKET2vpce-1a2b3c4d 替换为真实的存储桶名称和终端节点。

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

有关更多策略示例,请参阅 VPC 用户指南中的 Amazon S3 终端节点

有关 VPC 连接的更多信息,请参阅 Amazon 白皮书 Amazon Virtual Private Cloud 连接选项中网络到 VPC 的连接选项