

# 通用存储桶的命名空间
<a name="gpbucketnamespaces"></a>

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

**Topics**
+ [全局通用存储桶](#global-gp-buckets)
+ [账户区域命名空间通用存储桶](#account-regional-gp-buckets)
+ [限制和注意事项](#namespace-restrictions)
+ [AWS 区域代码格式](#region-code-format)
+ [要求在您的账户区域命名空间中创建存储桶](#require-account-regional)
+ [在您的账户区域命名空间中创建存储桶](#create-account-regional-bucket)

## 全局通用存储桶
<a name="global-gp-buckets"></a>

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

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

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

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

## 账户区域命名空间通用存储桶
<a name="account-regional-gp-buckets"></a>

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

**注意**  
您可以在除中东（巴林）和中东（阿联酋）之外的所有 AWS 区域内的账户区域命名空间中创建存储桶。

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

### 账户区域命名空间命名约定
<a name="account-regional-naming"></a>

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

```
bucket-name-prefix-accountId-region-an
```

例如，以下通用存储桶存在于 us-west-2 区域中 AWS 账户 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`。

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

### 将账户区域命名空间集成到您的 CloudFormation 模板中
<a name="cfn-integration"></a>

您可以更新基础设施即代码工具（例如 CloudFormation），以简化在账户区域命名空间中创建存储桶的过程。CloudFormation 提供伪参数 `AWS::AccountId` 和 `AWS::Region`。通过这些参数，可以轻松地构建用于创建账户区域命名空间存储桶的 CloudFormation 模板。有关更多信息，请参阅[使用伪参数获取 AWS 值](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html#available-pseudo-parameters)。

**示例 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 可让您只需提供存储桶名称中客户定义的部分即可。然后，它会根据发出请求的 AWS 账户和指定的 AWS 区域自动添加账户区域命名空间后缀。

使用这些选项，您可以构建自定义 CloudFormation 模板，以便在您的账户区域命名空间中轻松创建通用存储桶。有关更多信息，请参阅《CloudFormation 用户指南》中的 [AWS::S3::Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-bucket.html)。

## 限制和注意事项
<a name="namespace-restrictions"></a>

在共享全局命名空间中创建存储桶时，请注意以下事项：
+ 共享全局命名空间中的存储桶名称不能被同一分区中的另一个 AWS 账户使用，直到该存储桶被删除。如果您删除共享全局命名空间中的存储桶，请注意，同一分区中的另一个 AWS 账户可以使用相同的存储桶名称来表示新的存储桶，因此可能会收到针对已删除的存储桶的请求。
+ 在构建将在共享全局命名空间中创建存储桶的应用程序时，请务必考虑您所需的存储桶名称可能已被其它账户使用，并且其它账户具有的存储桶名称可能与您的存储桶名称相似。
+ 由于 Amazon S3 会根据存储桶的名称识别存储桶，因此在请求中使用错误存储桶名称的应用程序可能会无意中对非预期存储桶执行操作。为了帮助避免此类情况下的意外存储桶交互，您可以使用存储桶拥有者条件。有关更多信息，请参阅 [使用存储桶拥有者条件验证存储桶所有权](bucket-owner-condition.md)。

在您的账户区域命名空间中创建存储桶时，需要遵守以下限制和注意事项：
+ 尝试重新创建您已经在任何 AWS 区域中拥有的账户区域命名空间存储桶时，都将返回 HTTP 409 BucketAlreadyOwnedByYou 错误。
+ 您应该使用 S3 区域端点在您的账户区域命名空间中创建存储桶。为了实现[向后兼容性](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html#VirtualHostingBackwardsCompatibility)，您可以使用传统全局端点，在美国东部（弗吉尼亚州北部）区域中您的账户区域命名空间中创建存储桶。
+ 您的账户区域后缀计入通用存储桶名称中支持的最大 63 个字符数。因此，如果您的账户区域后缀为 `-012345678910-us-east-1-an`，则您的存储桶名称前缀有 37 个字符可用。

## AWS 区域代码格式
<a name="region-code-format"></a>

要在您的账户区域命名空间中创建存储桶，您必须在要在其中创建通用存储桶的后缀中包含 AWS 区域。必须在后缀中指定完整的 AWS 区域代码（例如 `us-west-2`）。有关 AWS 区域代码的完整列表，请参阅 [AWS 区域](https://docs.aws.amazon.com/global-infrastructure/latest/regions/aws-regions.html#available-regions)。以下存储桶名称显示了在账户区域命名空间中创建存储桶时必须使用的 AWS 区域代码格式的两个示例：
+ `amzn-s3-demo-bucket-012345678910-ap-southeast-1-an`
+ `amzn-s3-demo-bucket-987654321012-eu-north-1-an`

## 要求在您的账户区域命名空间中创建存储桶
<a name="require-account-regional"></a>

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

### IAM 策略
<a name="require-iam-policy"></a>

如果请求不包含设置为 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"
        }
      }
    }
  ]
}
```

### 资源控制策略
<a name="require-rcp"></a>

如果请求不包含设置为 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"
                }
            }
        }
    ]
}
```

### 服务控制策略
<a name="require-scp"></a>

如果请求不包含设置为 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"
                }
            }
        }
    ]
}
```

## 在您的账户区域命名空间中创建存储桶
<a name="create-account-regional-bucket"></a>

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

### 使用 AWS CLI
<a name="create-account-regional-cli"></a>

以下 AWS CLI 示例在美国西部（北加利福尼亚）区域（us-west-1）中 AWS 账户 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
```