创建访问点 - Amazon Simple Storage Service

创建访问点

Amazon S3 提供了创建和管理访问点的功能。默认情况下,您可为每个 AWS 账户在每个区域创建最多 1,000 个访问点。如果您需要在单个区域为一个账户使用超过 1,000 个访问点,则可以请求增加服务配额。有关服务配额和请求增加的更多信息,请参阅 AWS General Reference 中的 AWS 服务配额

您可以使用 AWS 管理控制台、AWS Command Line Interface (AWS CLI)、AWS 开发工具包或 Amazon S3 REST API 创建 S3 访问点。以下示例演示如何使用适用于 Java 的 AWS CLI 和 AWS 开发工具包创建访问点。

有关如何使用 AWS 管理控制台 创建访问点的信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的 Amazon S3 访问点简介。有关如何使用 REST API 创建访问点的详细信息,请参阅 Amazon Simple Storage Service API Reference 中的 CreateAccessPoint

注意

由于您可能希望公布您的访问点名称以允许用户使用访问点,因此我们建议您避免在访问点名称中包含敏感信息。

命名 Amazon S3 访问点的规则

访问点名称必须符合以下条件:

  • 在单个 AWS 账户和区域内必须是唯一的

  • 必须遵守 DNS 命名限制

  • 必须以数字或小写字母开头

  • 长度必须介于 3-50 个字符之间

  • 不能以短划线开头或结尾

  • 不能包含下划线、大写字母或句点

示例:创建访问点

以下示例说明了如何为账户 123456789012 中的存储桶 example-bucket 创建名为 example-ap 的访问点。要创建访问点,您需要将请求发送到 Amazon S3,指定访问点名称、要与访问点关联的存储桶的名称以及拥有该存储桶的 AWS 账户的账户 ID。有关命名规则的信息,请参阅命名 Amazon S3 访问点的规则

AWS CLI
aws s3control create-access-point --name example-ap --account-id 123456789012 --bucket example-bucket

创建限制到 Virtual Private Cloud 的访问点

创建访问点时,您可以选择让访问点可从 Internet 访问,也可以指定通过该访问点发出的所有请求都必须来自特定 Virtual Private Cloud (VPC)。可从 Internet 访问的访问点被认为是具有 Internet 网络起源。它可以在 Internet 上的任何位置使用,但受到访问点、底层存储桶和相关资源(如请求的对象)的任何其他访问限制的约束。只能从指定 VPC 访问的访问点的网络起源为 VPC,并且 Amazon S3 会拒绝从该 VPC 之外的来源向访问点发出的任何请求。

重要

您只能在创建访问点时指定访问点的网络起源。创建访问点后,无法更改其网络起源。

要将访问点限制为仅限于 VPC 访问,请在创建访问点的请求中包括 VpcConfiguration 参数。在 VpcConfiguration 参数中,您可以指定您希望能够使用访问点的 VPC ID。然后 Amazon S3 会拒绝通过访问点发出的请求,除非这些请求来自该 VPC。

您可以使用 AWS CLI、AWS 开发工具包或 REST API 检索访问点的网络起源。如果访问点指定了 VPC 配置,则其网络起源为 VPC。否则,访问点的网络起源为 Internet

示例:创建仅限 VPC 访问的访问点

以下示例为账户 123456789012 中的存储桶 example-bucket 创建一个名为 example-vpc-ap 的访问点,该访问点仅允许从 VPC vpc-1a2b3c 访问。然后,该示例验证新访问点是否具有 VPC 网络起源。

AWS CLI
aws s3control create-access-point --name example-vpc-ap --account-id 123456789012 --bucket example-bucket --vpc-configuration VpcId=vpc-1a2b3c
aws s3control get-access-point --name example-vpc-ap --account-id 123456789012 { "Name": "example-vpc-ap", "Bucket": "example-bucket", "NetworkOrigin": "VPC", "VpcConfiguration": { "VpcId": "vpc-1a2b3c" }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "IgnorePublicAcls": true, "BlockPublicPolicy": true, "RestrictPublicBuckets": true }, "CreationDate": "2019-11-27T00:00:00Z" }

要将访问点与 VPC 搭配使用,您必须修改 VPC 终端节点的访问策略。VPC 终端节点允许流量从您的 VPC 流向 Amazon S3。它们具有访问控制策略,用于控制如何允许 VPC 内的资源与 S3 交互。仅当 VPC 终端节点策略同时对访问点和底层存储桶授予访问权限时,从 VPC 通过访问点到 S3 的请求才会成功。

以下示例策略语句配置 VPC 终端节点,以允许对名为 awsexamplebucket1 的存储桶和名为 example-vpc-ap 的访问点执行 GetObject 调用。

{ "Version": "2012-10-17", "Statement": [ { "Principal": "*", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::awsexamplebucket1/*", "arn:aws:s3:us-west-2:123456789012:accesspoint/example-vpc-ap/object/*" ] }] }
注意

此示例中的 "Resource" 声明使用 Amazon 资源名称 (ARN) 指定访问点。有关访问点 ARN 的更多信息,请参阅使用访问点

有关 VPC 终端节点策略的更多信息,请参阅 Amazon Virtual Private Cloud 用户指南中的使用 Amazon S3 的终端节点策略

管理访问点的公有访问

Amazon S3 访问点支持每个访问点的独立阻止公有访问设置。创建访问点时,可以指定应用于该访问点的阻止公有访问设置。对于通过访问点发出的任何请求,Amazon S3 会评估该访问点、底层存储桶和存储桶拥有者账户的阻止公有访问设置。如果这些设置中的任何一个指示应阻止请求,则 Amazon S3 会拒绝请求。

有关 S3 阻止公有访问功能的更多信息,请参阅使用 Amazon S3 阻止公有访问

重要
  • 默认情况下为访问点启用所有阻止公有访问设置。您必须明确禁用不希望应用于访问点的任何设置。

  • Amazon S3 当前不支持在创建访问点之后更改访问点的阻止公有访问设置。

示例:创建具有自定义阻止公有访问设置的访问点

此示例为账户 123456789012 中的存储桶 example-bucket 创建名为 example-ap 且具有非默认阻止公有访问设置的访问点。然后,该示例检索新访问点的配置,以验证其“阻止公有访问”设置。

AWS CLI
aws s3control create-access-point --name example-ap --account-id 123456789012 --bucket example-bucket --public-access-block-configuration BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=true,RestrictPublicBuckets=true
aws s3control get-access-point --name example-ap --account-id 123456789012 { "Name": "example-ap", "Bucket": "example-bucket", "NetworkOrigin": "Internet", "PublicAccessBlockConfiguration": { "BlockPublicAcls": false, "IgnorePublicAcls": false, "BlockPublicPolicy": true, "RestrictPublicBuckets": true }, "CreationDate": "2019-11-27T00:00:00Z" }

配置使用访问点的 IAM 策略

Amazon S3 访问点支持 AWS Identity and Access Management (IAM) 资源策略,这些策略允许您按资源、用户或其他条件控制访问点的使用。要使应用程序或用户能够通过访问点访问对象,访问点和底层存储桶都必须允许请求。

重要

向存储桶添加 S3 访问点不会更改存储桶在通过现有存储桶名称或 ARN 访问时的行为。针对存储桶的所有现有操作将继续像以前一样运行。您在访问点策略中包括的限制仅适用于通过该访问点发出的请求。

条件键

S3 访问点引入了三个新的条件键,这些键可在 IAM 策略用来控制对资源的访问:

s3:DataAccessPointArn

这是一个您可以用来匹配访问点 ARN 的字符串。以下示例匹配区域 us-west-2 中的 AWS 账户 123456789012 的所有访问点:

"Condition" : { "StringLike": { "s3:DataAccessPointArn": "arn:aws:s3:us-west-2:123456789012:accesspoint/*" } }
s3:DataAccessPointAccount

这是一个字符串运算符,您可以使用它匹配访问点拥有者的账户 ID。以下示例匹配 AWS 账户 123456789012 拥有的所有访问点。

"Condition" : { "StringEquals": { "s3:DataAccessPointAccount": "123456789012" } }
s3:AccessPointNetworkOrigin

这是一个字符串运算符,您可以使用它来匹配网络起源(InternetVPC)。以下示例仅匹配起源为 VPC 的访问点。

"Condition" : { "StringEquals": { "s3:AccessPointNetworkOrigin": "VPC" } }

有关将条件键与 Amazon S3 结合使用的更多信息,请参阅 Amazon S3 的操作、资源和条件键

将访问控制委派到访问点

您可以将存储桶的访问控制委托给存储桶的访问点。以下示例存储桶策略允许对存储桶拥有者账户所拥有的所有访问点进行完全访问。因此,对此存储桶的所有访问都由附加到其访问点的策略控制。我们建议您以这种方式为所有不需要直接访问存储桶的使用案例配置存储桶。

例 将访问控制委派给访问点的存储桶策略

{ "Version": "2012-10-17", "Statement" : [ { "Effect": "Allow", "Principal" : { "AWS": "*" }, "Action" : "*", "Resource" : [ "Bucket ARN", "Bucket ARN/*"], "Condition": { "StringEquals" : { "s3:DataAccessPointAccount" : "Bucket owner's account ID" } } }] }

访问点策略示例

以下示例说明了如何创建 IAM 策略来控制通过访问点发出的请求。

注意

在访问点策略中授予的权限仅在底层存储桶也允许相同的访问时才有效。您可以通过两种方式实现这一点:

  1. (推荐)将存储桶的访问控制委派到访问点,如将访问控制委派到访问点中所述。

  2. 将访问点策略中包含的权限添加到底层存储桶的策略中。第一个访问点策略示例说明了如何修改底层存储桶策略以允许必要的访问。

例 访问点策略授予

以下访问点策略通过账户 123456789012 中的访问点 my-access-point 向账户 123456789012 中的 IAM 用户 Alice 授予对具有前缀 Alice/GETPUT 对象的权限。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Alice" }, "Action": ["s3:GetObject", "s3:PutObject"], "Resource": "arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/Alice/*" }] }
注意

要使访问点策略有效地向 Alice 授予访问权限,底层存储桶也必须对 Alice 允许相同的访问权限。可以将存储桶的访问控制委派到访问点,如将访问控制委派到访问点中所述。或者,您也可以将以下策略添加到底层存储桶中,以便向 Alice 授予必要的权限。请注意,访问点策略和存储桶策略的 Resource 条目不同。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Alice" }, "Action": ["s3:GetObject", "s3:PutObject"], "Resource": "arn:aws:s3:::awsexamplebucket1/Alice/*" }] }

例 带标签条件的访问点策略

以下访问点策略通过账户 123456789012 中的访问点 my-access-point 向账户 123456789012 中的 IAM 用户 Bob 授予对 GET 对象的权限,这些权限具有值设为 finance 的标签键 data

{ "Version":"2012-10-17", "Statement": [ { "Effect":"Allow", "Principal" : { "AWS": "arn:aws:iam::123456789012:user/Bob" }, "Action":"s3:GetObject", "Resource" : "arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/*", "Condition" : { "StringEquals": { "s3:ExistingObjectTag/data": "finance" } } }] }

例 允许查看存储桶列示内容的访问点策略

以下访问点策略通过账户 123456789012 中的访问点 my-access-point 授予账户 123456789012 中的 IAM 用户 Charles 查看底层存储桶中包含的对象的权限。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Charles" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point" }] }

例 服务控制策略

以下服务控制策略要求使用 VPC 网络起源创建所有新访问点。实施此策略时,组织中的用户无法创建可从 Internet 访问的新访问点。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "s3:CreateAccessPoint", "Resource": "*", "Condition": { "StringNotEquals": { "s3:AccessPointNetworkOrigin": "VPC" } } }] }

例 将 S3 操作限制为 VPC 网络起源的存储桶策略

以下存储桶策略限制为只能通过具有 VPC 网络起源的访问点来访问存储桶 examplebucket 的所有 S3 对象操作。

重要

在使用类似此示例的语句之前,请确保您不需要使用访问点不支持的功能,例如跨区域复制。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": [ "s3:AbortMultipartUpload", "s3:BypassGovernanceRetention", "s3:DeleteObject", "s3:DeleteObjectTagging", "s3:DeleteObjectVersion", "s3:DeleteObjectVersionTagging", "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectLegalHold", "s3:GetObjectRetention", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging", "s3:ListMultipartUploadParts", "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectLegalHold", "s3:PutObjectRetention", "s3:PutObjectTagging", "s3:PutObjectVersionAcl", "s3:PutObjectVersionTagging", "s3:RestoreObject" ], "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "StringNotEquals": { "s3:AccessPointNetworkOrigin": "VPC" } } } ] }