

# 通用存储桶命名规则
<a name="bucketnamingrules"></a>

创建通用存储桶时，请务必考虑存储桶名称的长度、有效字符、格式和唯一性。以下各节提供有关通用存储桶命名的信息，包括命名规则、最佳实践，以及如何在账户区域命名空间中创建存储桶的示例。用于创建名称包含全局唯一标识符（GUID）的通用存储桶的示例。

有关对象键名称的信息，请参阅[创建对象键名称](https://docs.amazonaws.cn/en_us/AmazonS3/latest/userguide/object-keys.html)。

要创建通用存储桶，请参阅[创建通用存储桶](create-bucket-overview.md)。

**Topics**
+ [通用存储桶命名规则](#general-purpose-bucket-names)
+ [账户区域命名空间命名规则](#account-regional-naming-rules)
+ [通用存储桶名称示例](#bucket-names)
+ [最佳实践](#automatically-created-buckets)
+ [创建在存储桶名称中使用 GUID 的存储桶](#create-bucket-name-guid)
+ [在您的账户区域命名空间中创建存储桶](#create-account-regional-naming)

## 通用存储桶命名规则
<a name="general-purpose-bucket-names"></a>

以下命名规则适用于通用存储桶。
+ 存储桶名称必须介于 3（最少）到 63（最多）个字符之间。
+ 存储桶名称只能由小写字母、数字、句点 (`.`) 和连字符 (`-`) 组成。
+ 存储桶名称必须以字母或数字开头和结尾。
+ 存储桶名称不得包含两个相邻的句点。
+ 存储桶名称不得采用 IP 地址格式（例如 `192.168.5.4`）。
+ 存储桶名称不得以前缀 `xn--` 开头。
+ 存储桶名称不得以前缀 `sthree-` 开头。
+ 存储桶名称不得以前缀 `amzn-s3-demo-` 开头。
+ 存储桶名称不得以后缀 `-s3alias` 结尾。此后缀是为接入点别名预留的。有关更多信息，请参阅 [接入点别名](access-points-naming.md#access-points-alias)。
+ 存储桶名称不得以后缀 `--ol-s3` 结尾。此后缀是为对象 Lambda 接入点别名预留的。有关更多信息，请参阅 [如何为您的 S3 存储桶对象 Lambda 接入点使用存储桶式别名](olap-use.md#ol-access-points-alias)。
+ 存储桶名称不得以后缀 `.mrap` 结尾。此后缀预留用于多区域接入点名称。有关更多信息，请参阅 [命名 Amazon S3 多区域接入点的规则](multi-region-access-point-naming.md)。
+ 存储桶名称不得以后缀 `--x-s3` 结尾。此后缀预留用于目录存储桶。有关更多信息，请参阅 [目录存储桶命名规则](directory-bucket-naming-rules.md)。
+ 存储桶名称不得以后缀 `--table-s3` 结尾。此后缀预留用于 S3 表类数据存储服务存储桶。有关更多信息，请参阅 [Amazon S3 表存储桶、表和命名空间命名规则](s3-tables-buckets-naming.md)。
+ 当您在账户区域命名空间中创建存储桶时，存储桶名称只能以后缀 `-an` 结尾。有关更多信息，请参阅 [通用存储桶的命名空间](gpbucketnamespaces.md)。
+ 与 Amazon S3 Transfer Acceleration 一起使用的存储桶在其名称中不能有句点 (`.`)。有关 Transfer Acceleration 的更多信息，请参阅[使用 Amazon S3 Transfer Acceleration 配置快速、安全的文件传输](transfer-acceleration.md)。

**重要**  
通用存储桶存在于全局命名空间中，这意味着每个存储桶名称在分区内的所有 Amazon Web Services 区域、所有 Amazon Web Services 账户间都必须是唯一的。分区是区域的分组。Amazon 目前有四个分区：`aws`（标准区域）、`aws-cn`（中国区域）、`aws-us-gov`（Amazon GovCloud (US)）以及 `aws-eusc`（欧洲主权云）。在共享全局命名空间中创建通用存储桶后，其他任何人均无法在分区内创建该存储桶名称。当存储桶拥有者删除其存储桶时，该存储桶名称将在全局命名空间中再次变为可用，供任何人重新创建。
共享全局命名空间中的存储桶名称不能被同一分区中的另一个 Amazon Web Services 账户使用，直到该存储桶被删除。**如果您删除共享全局命名空间中的存储桶，请注意，同一分区中的另一个 Amazon Web Services 账户可以使用相同的存储桶名称来表示新的存储桶，因此可能会收到针对已删除的存储桶的请求。**如果需要防止出现这种情况，或者如果您希望继续使用相同的存储桶名称，请不要删除该存储桶。我们建议您清空并保留存储桶，同时根据需要阻止任何存储桶请求。对于不再活跃使用的存储桶，我们建议清空存储桶中的所有对象，以最大限度地降低成本，同时保留存储桶本身。
我们建议在您的账户区域命名空间中创建存储桶，以确保只有您的账户才能拥有这些存储桶名称。
创建通用存储桶时，您可以选择存储桶名称和要在其中创建存储桶的 Amazon Web Services 区域。在创建通用存储桶后，将无法再更改其名称或区域。
请勿在存储桶名称中包含敏感信息。存储桶名称会显示在指向存储桶中的对象的 URL 中。

**注意**  
2018 年 3 月 1 日之前，在美国东部（弗吉尼亚北部）区域中创建的存储桶的名称最多可包含 255 个字符，并且包括大写字母和下划线。自 2018 年 3 月 1 日起，美国东部（弗吉尼亚北部）中的新存储桶必须符合在所有其他区域中应用的相同规则。

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

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

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

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

例如，以下通用存储桶存在于 us-west-2 区域中 Amazon Web Services 账户 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`。例如，您可以指定创建一个名为 `amzn-s3-demo-bucket-111122223333-us-east-1-an` 的存储桶，其中您的账户区域后缀为 `-111122223333-us-east-1-an`。有关账户区域命名空间的更多信息，请参阅[通用存储桶的命名空间](gpbucketnamespaces.md)。

## 通用存储桶名称示例
<a name="bucket-names"></a>

以下存储桶名称显示了在通用存储桶名称中支持使用哪些字符的示例：a-z、0-9 和连字符 (`-`)。此处使用 `amzn-s3-demo-` 保留前缀仅用于说明目的。由于它是保留前缀，因此您无法创建以 `amzn-s3-demo-` 开头的存储桶名称。
+ `amzn-s3-demo-bucket1-a1b2c3d4-5678-90ab-cdef-example11111`
+ `amzn-s3-demo-bucket`

以下示例显示了您的账户区域命名空间中的存储桶名称。这些存储桶必须遵守特定的账户区域命名空间命名约定：`customer-chosen-name-AWS-Account-ID-AWS-Region-an`
+ `amzn-s3-demo-bucket-111122223333-us-west-2-an`
+ `amzn-s3-demo-bucket-012345678910-ap-southeast-2-an`

以下示例存储桶名称是有效的，但不推荐用于除静态网站托管以外的其它用途，因为它们包含句点 (`.`)：
+ `example.com`
+ `www.example.com`
+ `my.example.s3.bucket`

以下示例存储桶名称*无效*：
+ `amzn_s3_demo_bucket`（包含下划线）
+ `AmznS3DemoBucket`（包含大写字母）
+ `amzn-s3-demo-bucket-`（以 `amzn-s3-demo-` 前缀开头，并以连字符结尾）
+ `example..com`（连续包含两个句点）
+ `192.168.5.4`（与 IP 地址的格式相匹配）

## 最佳实践
<a name="automatically-created-buckets"></a>

命名通用存储桶时，请考虑以下存储桶命名最佳实践。

**在您的账户区域命名空间中创建存储桶**  
我们建议在您的账户区域命名空间中创建存储桶，以确保只有您的账户才能拥有这些存储桶名称。使用账户区域命名空间，您可以跨多个 Amazon Web Services 区域创建可预测的存储桶名称，同时确保其它账户无法在您的命名空间中创建存储桶名称。

**选择不可能导致命名冲突的存储桶命名方案**  
如果应用程序自动创建了存储桶，请选择不可能导致命名冲突的存储桶命名方案。确保存储桶名称已被使用时，您的应用程序逻辑会选择其他存储桶名称。

**将全局唯一标识符（GUID）附加到存储桶名称**  
我们建议您创建不可预测的存储桶名称。除非您已经创建了存储桶，否则不要编写假定您所选存储桶名称可用的代码。创建不可预测的存储桶名称的一种方法是，在存储桶名称后附加一个全局唯一标识符（GUID），例如 `amzn-s3-demo-bucket-a1b2c3d4-5678-90ab-cdef-example11111`。有关更多信息，请参阅 [创建在存储桶名称中使用 GUID 的存储桶](#create-bucket-name-guid)。

**避免在存储桶名称中使用句点 (`.`)**  
为了获得最佳兼容性，我们建议您避免在存储桶名称中使用句点 (`.`)，但仅用于静态网站托管的存储桶除外。如果您在存储桶名称中包含句点，则无法通过 HTTPS 使用虚拟托管类型寻址，除非您执行自己的证书验证。用于存储桶虚拟托管的安全证书不适用于其名称中带有句点的存储桶。

此限制不会影响用于静态网站托管的存储桶，因为静态网站托管只能通过 HTTP 提供。有关虚拟主机式寻址的更多信息，请参阅[通用存储桶的虚拟托管](VirtualHosting.md)。有关静态网站托管的更多信息，请参阅[使用 Amazon S3 托管静态网站](WebsiteHosting.md)。

**选择一个相关的名称**  
为存储桶命名时，我们建议您选择与您或您的业务相关的名称。避免使用与其他人关联的名称。例如，避免在存储桶名称中使用 `AWS` 或 `Amazon`。

**不要为了重新使用存储桶名称而删除存储桶**  
如果存储桶为空，您可以将其删除。删除存储桶后，该名称可供重复使用。但是，不能保证您能够立即重新使用该名称或完全可以重新使用该名称。删除共享全局命名空间中的存储桶后，可能需要一段时间才能重新使用该名称。此外，在您重新使用此名称之前，其它 Amazon Web Services 账户可能会创建具有相同名称的存储桶。

**删除共享全局命名空间中的通用存储桶后，请注意，同一分区中的另一个 Amazon Web Services 账户可以使用相同的通用存储桶名称来表示新存储桶，因此可能会收到针对已删除的通用存储桶的请求。**如果需要防止出现这种情况，或者如果您希望继续使用相同的通用存储桶名称，请不要删除该通用存储桶。我们建议您清空并保留存储桶，同时根据需要阻止任何存储桶请求。

## 创建在存储桶名称中使用 GUID 的存储桶
<a name="create-bucket-name-guid"></a>

以下示例向您展示了如何创建在存储桶名称末尾使用 GUID 的通用存储桶。

### 使用 Amazon CLI
<a name="guid-cli-bucket-name"></a>

以下 Amazon CLI 示例在美国西部（北加利福尼亚）区域 (`us-west-1`) 中创建一个通用存储桶，示例存储桶名称使用了全局唯一标识符（GUID）。要使用此示例命令，请将 `user input placeholders` 替换为您自己的信息。

```
aws s3api create-bucket \
    --bucket amzn-s3-demo-bucket1$(uuidgen | tr -d - | tr '[:upper:]' '[:lower:]' ) \
    --region us-west-1 \
    --create-bucket-configuration LocationConstraint=us-west-1
```

### 使用适用于 Java 的 Amazon SDK
<a name="guid-sdk-bucket-name"></a>

以下示例向您展示了如何使用适用于 Java 的 Amazon SDK，在美国东部（弗吉尼亚州北部）区域 (`us-east-1`) 中创建在存储桶名称末尾使用 GUID 的存储桶。要使用此示例，请将 `user input placeholders` 替换为您自己的信息。有关其他 Amazon SDK 的信息，请参阅[在 Amazon 上构建的工具](https://www.amazonaws.cn/developer/tools/)。

```
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.CreateBucketRequest;

import java.util.List;
import java.util.UUID;

public class CreateBucketWithUUID {
    public static void main(String[] args) {
        final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
        String bucketName = "amzn-s3-demo-bucket" +  UUID.randomUUID().toString().replace("-", "");
        CreateBucketRequest createRequest = new CreateBucketRequest(bucketName);
        System.out.println(bucketName);
        s3.createBucket(createRequest);
    }
}
```

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

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

### 使用 Amazon CLI
<a name="account-regional-cli-naming"></a>

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