通用存储桶的命名空间 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

通用存储桶的命名空间

默认情况下,通用存储桶存在于全局命名空间中。这意味着,每个存储桶名称在分区内的所有 Amazon 区域中的所有 Amazon 账户间必须是唯一的。分区是区域的分组。Amazon 目前有四个分区:aws(标准区域)、aws-cn(中国区域)、aws-us-gov [Amazon GovCloud(美国)] 以及 aws-eusc(欧洲主权云)。创建通用存储桶时,您可以选择在共享全局命名空间中创建存储桶。还可以选择在您的账户区域命名空间中创建存储桶。您的账户区域命名空间是全局命名空间的细分,只有您的账户才能在其中创建存储桶。

全局通用存储桶

默认情况下,您在共享全局命名空间中创建全局通用存储桶。在共享全局命名空间中创建通用存储桶后,其他任何人均无法在分区内创建该存储桶名称。当您删除全局通用存储桶时,该存储桶名称将在全局命名空间中再次变为可用,供任何人重新创建。

创建全局通用存储桶时,您可以请求任何符合存储桶命名规则的名称。这些规则包括指定长度介于 3(最少)到 63(最多)个字符之间的名称。名称只能由小写字母、数字、句点(.)和连字符(-)组成。存储桶名称必须以字母或数字开头和结尾,并且不能包含两个相邻的句点。有关存储桶命名规则的更多信息,请参阅通用存储桶命名规则

指定全局通用存储桶名称时,必须选择一个尚未用于该分区的唯一名称。如果您尝试创建已经存在但归他人拥有的存储桶,则会收到 HTTP 409 BucketAlreadyExists 错误。如果您尝试创建已经存在但归您拥有的存储桶,则会收到 HTTP 409 BucketAlreadyOwnedByYou 错误。

您可以创建全局通用存储桶,以便在选择所请求的存储桶名称时具有最大的灵活性。由于它是共享全局命名空间,因此其它账户可以创建类似的存储桶名称。其它账户也可以重新创建您之前删除的存储桶名称。不应依赖特定的存储桶命名约定来实现可用性或安全验证。除非您已经创建了存储桶,否则不要编写假定您所选存储桶名称可用的代码。创建不可预测的存储桶名称的一种方法是,在存储桶名称后附加一个全局唯一标识符(GUID)。例如 amzn-s3-demo-bucket-a1b2c3d4-5678-90ab-cdef-example11111。有关更多信息,请参阅 创建在存储桶名称中使用 GUID 的存储桶

账户区域命名空间通用存储桶

尽管 Amazon S3 通用存储桶存在于共享全局命名空间中,但您可以选择在账户区域命名空间中创建存储桶。账户区域命名空间是全局存储桶命名空间的保留细分。只有您的账户才能在此命名空间中创建通用存储桶。在您的账户区域命名空间中创建的新通用存储桶对于您的账户是唯一的。其它账户将始终无法重新创建这些存储桶。这些存储桶支持共享全局命名空间中的通用存储桶已经支持的所有 S3 功能和 Amazon 服务。您的应用程序无需进行任何更改,即可与账户区域命名空间中的存储桶进行交互。

注意

您可以在除中东(巴林)和中东(阿联酋)之外的所有 Amazon 区域内的账户区域命名空间中创建存储桶。

在您的账户区域命名空间中创建存储桶是一种最佳安全实践。这些存储桶名称只能由您的账户使用。您可以在账户区域命名空间中创建存储桶,以便轻松地对跨多个 Amazon 区域的通用存储桶名称进行模板化。您可以放心,任何其它账户都无法在您的命名空间中创建存储桶名称。如果其它账户尝试使用您的账户区域后缀创建存储桶,CreateBucket 请求将被拒绝。

账户区域命名空间命名约定

您的账户区域命名空间中的通用存储桶必须遵循特定的命名约定。这些存储桶由您创建的存储桶名称前缀和一个后缀组成,后缀包含您的 12 位 Amazon 账户 ID、Amazon 区域代码且结尾为 -an

bucket-name-prefix-accountId-region-an

例如,以下通用存储桶存在于 us-west-2 区域中 Amazon 账户 111122223333 的账户区域命名空间中:

amzn-s3-demo-bucket-111122223333-us-west-2-an

要在账户区域命名空间中创建存储桶,您应发出 CreateBucket 请求。指定 x-amz-bucket-namespace 请求标头,其值设置为 account-regional。还要指定账户区域命名空间格式的存储桶名称:<customer-chosen-name>-<AWS-Account-ID>-<AWS-Region>-an

注意

当您使用控制台在账户区域命名空间中创建通用存储桶时,系统会自动向您提供的存储桶名称前缀添加一个后缀。此后缀包括您的 Amazon 账户 ID 和您选择在其中创建存储桶的 Amazon 区域。当您使用 CreateBucket API 在账户区域命名空间中创建通用存储桶时,必须提供完整的后缀。这包括您的 Amazon 账户 ID 和请求中的 Amazon 区域。有关 Amazon 区域代码的列表,请参阅 Amazon 区域代码格式

将账户区域命名空间集成到您的 Amazon CloudFormation 模板中

您可以更新基础设施即代码工具(例如 Amazon CloudFormation),以简化在账户区域命名空间中创建存储桶的过程。Amazon CloudFormation 提供伪参数 AWS::AccountIdAWS::Region。通过这些参数,可以轻松地构建用于创建账户区域命名空间存储桶的 CloudFormation 模板。有关更多信息,请参阅使用伪参数获取 Amazon 值

示例 1,使用带有 Sub 的 BucketName:

BucketName: !Sub "amzn-s3-demo-bucket-${AWS::AccountId}-${AWS::Region}-an" BucketNamespace: "account-regional"

示例 2,使用 BucketNamePrefix:

BucketNamePrefix: 'amzn-s3-demo-bucket' BucketNamespace: "account-regional"

或者,也可以使用 BucketNamePrefix 属性来更新您的 CloudFormation 模板。BucketNamePrefix 可让您只需提供存储桶名称中客户定义的部分即可。然后,它会根据发出请求的 Amazon 账户和指定的 Amazon 区域自动添加账户区域命名空间后缀。

使用这些选项,您可以构建自定义 CloudFormation 模板,以便在您的账户区域命名空间中轻松创建通用存储桶。有关更多信息,请参阅《Amazon CloudFormation 用户指南》中的 Amazon::S3::Bucket

限制和注意事项

在共享全局命名空间中创建存储桶时,请注意以下事项:

  • 共享全局命名空间中的存储桶名称不能被同一分区中的另一个 Amazon 账户使用,直到该存储桶被删除。如果您删除共享全局命名空间中的存储桶,请注意,同一分区中的另一个 Amazon 账户可以使用相同的存储桶名称来表示新的存储桶,因此可能会收到针对已删除的存储桶的请求。

  • 在构建将在共享全局命名空间中创建存储桶的应用程序时,请务必考虑您所需的存储桶名称可能已被其它账户使用,并且其它账户具有的存储桶名称可能与您的存储桶名称相似。

  • 由于 Amazon S3 会根据存储桶的名称识别存储桶,因此在请求中使用错误存储桶名称的应用程序可能会无意中对非预期存储桶执行操作。为了帮助避免此类情况下的意外存储桶交互,您可以使用存储桶拥有者条件。有关更多信息,请参阅 使用存储桶拥有者条件验证存储桶所有权

在您的账户区域命名空间中创建存储桶时,需要遵守以下限制和注意事项:

  • 尝试重新创建您已经在任何 Amazon 区域中拥有的账户区域命名空间存储桶时,都将返回 HTTP 409 BucketAlreadyOwnedByYou 错误。

  • 您应该使用 S3 区域端点在您的账户区域命名空间中创建存储桶。为了实现向后兼容性,您可以使用传统全局端点,在美国东部(弗吉尼亚州北部)区域中您的账户区域命名空间中创建存储桶。

  • 您的账户区域后缀计入通用存储桶名称中支持的最大 63 个字符数。因此,如果您的账户区域后缀为 -012345678910-us-east-1-an,则您的存储桶名称前缀有 37 个字符可用。

Amazon 区域代码格式

要在您的账户区域命名空间中创建存储桶,您必须在要在其中创建通用存储桶的后缀中包含 Amazon 区域。必须在后缀中指定完整的 Amazon 区域代码(例如 us-west-2)。有关 Amazon 区域代码的完整列表,请参阅 Amazon 区域。以下存储桶名称显示了在账户区域命名空间中创建存储桶时必须使用的 Amazon 区域代码格式的两个示例:

  • amzn-s3-demo-bucket-012345678910-ap-southeast-1-an

  • amzn-s3-demo-bucket-987654321012-eu-north-1-an

要求在您的账户区域命名空间中创建存储桶

您可以强制您的 IAM 主体仅在您的账户区域命名空间中创建存储桶。使用 s3:x-amz-bucket-namespace 条件键。以下示例显示了如何在 IAM 策略、资源控制策略或服务控制策略中强制创建账户区域存储桶。

IAM 策略

如果请求不包含设置为 account-regional 的 x-amz-bucket-namespace 标头,则以下 IAM 策略将拒绝 IAM 主体获得 s3:CreateBucket 权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireAccountRegionalBucketCreation", "Effect": "Deny", "Action": "s3:CreateBucket", "Resource": "*", "Condition": { "StringNotEquals": { "s3:x-amz-bucket-namespace": "account-regional" } } } ] }

资源控制策略

如果请求不包含设置为 account-regional 的 x-amz-bucket-namespace 标头,则以下资源控制策略会拒绝任何人获得 s3:CreateBucket 权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "OnlyCreateBucketsInAccountRegionalNamespace", "Effect": "Deny", "Principal": "*", "Action": "s3:CreateBucket", "Resource": "*", "Condition": { "StringNotEquals": { "s3:x-amz-bucket-namespace": "account-regional" } } } ] }

服务控制策略

如果请求不包含设置为 account-regional 的 x-amz-bucket-namespace 标头,则以下服务控制策略会拒绝任何人获得 s3:CreateBucket 权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireAccountRegionalBucketCreation", "Effect": "Deny", "Action": "s3:CreateBucket", "Resource": "*", "Condition": { "StringNotEquals": { "s3:x-amz-bucket-namespace": "account-regional" } } } ] }

在您的账户区域命名空间中创建存储桶

以下示例说明了如何在您的账户区域命名空间中创建通用存储桶。

使用 Amazon CLI

以下 Amazon CLI 示例在美国西部(北加利福尼亚)区域(us-west-1)中 Amazon 账户 012345678910 的账户区域命名空间中创建通用存储桶。要使用此示例命令,请将 user input placeholders 替换为您自己的信息。

aws s3api create-bucket \ --bucket amzn-s3-demo-bucket-012345678910-us-west-1-an \ --bucket-namespace account-regional --region us-west-1 \ --create-bucket-configuration LocationConstraint=us-west-1