

# 创建通用存储桶
<a name="create-bucket-overview"></a>

要向 Amazon S3 上传数据，您必须首先在其中一个 Amazon Web Services 区域中创建 Amazon S3 通用存储桶。创建存储桶的 Amazon Web Services 账户 拥有该存储桶。创建存储桶时，您必须选择存储桶名称和区域。在创建过程中，您可以选择为存储桶选择其它存储管理选项。

**重要**  
创建存储桶后，无法更改存储桶名称、存储桶拥有者或区域。有关存储桶命名的更多信息，请参阅 [通用存储桶命名规则](bucketnamingrules.md)。

默认情况下，每个 Amazon Web Services 账户可以创建多达 10000 个通用存储桶。要请求增加通用存储桶的配额，请访问[服务配额控制台](https://console.amazonaws.cn/servicequotas/home/services/s3/quotas/)。

一个存储桶中可以存储任意数量的对象。有关与 Amazon S3 通用存储桶相关的限制和局限性的列表，请参阅[通用存储桶配额、限制和局限性](BucketRestrictions.md)。

## 通用存储桶设置
<a name="create-bucket-settings"></a>

创建通用存储桶时，您必须决定是创建全局通用存储桶，还是在账户区域命名空间中创建通用存储桶。此决定以及存储桶名称和区域一经创建，便无法更改。

创建通用存储桶时，可以使用以下设置来控制存储桶行为的各个方面：
+ **S3 存储桶命名空间**：默认情况下，Amazon S3 通用存储桶存在于全局命名空间中。创建通用存储桶时，您可以选择在共享全局命名空间中创建存储桶，也可以选择在您的账户区域命名空间中创建存储桶。您的账户区域命名空间是全局命名空间的细分，只有您的账户才能在其中创建存储桶。在您的账户区域命名空间中创建的新通用存储桶对于您的账户是唯一的，并且始终无法由其它账户重新创建。这些存储桶支持共享全局命名空间中的通用存储桶已经支持的所有 S3 功能和 Amazon 服务，您的应用程序无需更改，即可与账户区域命名空间中的存储桶进行交互。有关存储桶命名空间的更多信息，请参阅[通用存储桶的命名空间](gpbucketnamespaces.md)。
+ **S3 对象所有权**：S3 对象所有权是 Amazon S3 存储桶级别的设置，您可以使用该设置来控制上传到存储桶的对象的所有权，并禁用或启用访问控制列表（ACL）。默认情况下，对象所有权设为强制存储桶拥有者设置，并且所有 ACL 均处于禁用状态。禁用 ACL 后，存储桶拥有者拥有存储桶中的每个对象，并使用策略专门管理对数据的访问权限。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。
+ **​S3 对象锁定**：S3 对象锁定有助于在固定的时间长度内或无限期地阻止删除或覆盖 Amazon S3 对象。对象锁定使用*一次写入多次读取*（WORM）模式存储对象。您可以使用对象锁定来协助满足需要 WORM 存储的法规要求，或用于添加额外的保护层来防止对象被更改和删除。有关更多信息，请参阅 [使用对象锁定以锁定对象](object-lock.md)。
+ **标签**：Amazon 标签是用于保存元数据的键值对。可以向 Amazon S3 资源（例如存储桶）附加标签。可以在创建资源时为其添加标签，也可以管理现有资源上的标签。您可以使用标签进行成本分配，这样就可以在 Amazon 账单与成本管理中按照存储桶标签来跟踪存储成本。您还可以使用标签来实现基于属性的访问权限控制（ABAC），从而根据标签来扩展访问权限以及授予对 S3 资源的访问权限。有关更多信息，请参阅 [将标签与 S3 通用存储桶结合使用](buckets-tagging.md)。

创建通用存储桶后，或者当使用 Amazon S3 控制台创建通用存储桶时，还可以使用以下设置来控制存储桶行为的其它方面：
+ **S3 屏蔽公共访问权限**：S3 屏蔽公共访问权限功能提供接入点、存储桶和账户的设置，有助于您管理对 Amazon S3 资源的公共访问权限。默认情况下，新存储桶、接入点和对象不允许公有访问。但是，用户可以修改存储桶策略、接入点策略或对象权限以允许公有访问。S3 屏蔽公共访问权限设置会覆盖这些策略和权限，以便于您可以限制这些资源的公有访问。有关更多信息，请参阅 [阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。
+ **S3 版本控制**：版本控制是在同一个存储桶中保留对象的多个版本的方法。对于 存储桶中存储的每个对象，您可以使用版本控制功能来保留、检索和还原它们的各个版本。使用版本控制能够轻松从用户意外操作和应用程序故障中恢复数据。默认情况下，对存储桶禁用版本控制。有关更多信息，请参阅 [使用 S3 版本控制保留对象的多个版本](Versioning.md)。
+ **默认加密**：可以为存储桶中的所有对象设置默认加密类型。具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）是 Amazon S3 中每个存储桶的基本加密配置级别。上传到 S3 存储桶的所有新对象都将使用 SSE-S3 作为基本加密级别自动进行加密。如果您要使用不同的默认加密类型，则可以使用具有 Amazon Key Management Service（Amazon KMS）密钥的服务器端加密（SSE-KMS）、具有 Amazon KMS 密钥的双层服务器端加密（DSSE-KMS）或具有客户提供的密钥的服务器端加密（SSE-C）来加密您的数据。有关更多信息，请参阅 [为 Amazon S3 存储桶设置默认服务器端加密行为](bucket-encryption.md)。

可以使用 Amazon S3 控制台、Amazon S3 REST API、Amazon Command Line Interface（Amazon CLI）或 Amazon SDK 来创建通用存储桶。有关创建通用存储桶所需权限的更多信息，请参阅《Amazon Simple Storage Service API Reference》**中的 [CreateBucket](https://docs.amazonaws.cn/AmazonS3/latest/API/API_CreateBucket.html)。

如果您在创建 Amazon S3 存储桶时遇到问题，请参阅 Amazon Web Services re:Post 上的[我如何解决在创建 Amazon S3 存储桶时出现的错误？](https://repost.aws/knowledge-center/s3-create-bucket-errors) 

## 使用 S3 控制台
<a name="create-bucket"></a>

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在页面顶部的导航栏中，选择当前所显示 Amazon Web Services 区域的名称。接下来，选择要在其中创建存储桶的区域。
**注意**  
存储桶创建后，便无法再更改其区域。
要最大程度地减少延迟和成本以及满足法规要求，请选择一个靠近您的区域。在某一区域存储的对象将一直留在该区域，除非您特意将其转移到其他区域。有关 Amazon S3 Amazon Web Services 区域的列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Web Services 服务 端点](https://docs.amazonaws.cn/general/latest/gr/rande.html#s3_region)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 选择**创建存储桶**。此时将打开**创建存储桶**页面。

1. 对于**存储桶名称**，请输入存储桶的名称。

   存储桶名称必须满足以下要求：
   + 在分区中是唯一的。分区是区域的分组。Amazon 目前有三个分区：`aws`（商用区域）、`aws-cn`（中国区域）和 `aws-us-gov`（Amazon GovCloud (US) Regions）。
   + 长度必须介于 3 到 63 个字符之间。
   + 只能由小写字母、数字、句点 (`.`) 和连字符 (`-`) 组成。为了获得最佳兼容性，我们建议您避免在存储桶名称中使用句点 (`.`)，但仅用于静态网站托管的存储桶除外。
   + 以字母或数字开头和结尾。
   + 有关存储桶命名规则的完整列表，请参阅[通用存储桶命名规则](bucketnamingrules.md)。
**重要**  
创建存储桶后，便无法更改其名称。
请勿在存储桶名称中包含敏感信息。存储桶名称会显示在指向存储桶中的对象的 URL 中。

1. （可选）在**常规配置**下，您可以选择将现有存储桶的设置复制到新存储桶。如果您不想复制现有存储桶的设置，请跳到下一步。
**注意**  
此选项：  
在 Amazon CLI 中不可用，仅在 Amazon S3 控制台中可用
不会将存储桶策略从现有存储桶复制到新存储桶

    要复制现有存储桶的设置，请在**从现有存储桶复制设置**下，选择**选择存储桶**。将打开**选择存储桶**窗口。找到包含您要复制的设置的存储桶，然后选择**选择存储桶**。**选择存储桶**窗口关闭，而**创建存储桶**窗口重新打开。

   在**从现有存储桶复制设置**下，您现在将看到您选择的存储桶的名称。新存储桶的设置现在与您选择的存储桶的设置相匹配。如果要移除复制的设置，请选择**恢复默认设置**。在**创建存储桶**页面上查看其余的存储桶设置。如果您不想进行任何更改，可以跳到最后一步。

1. 在 **Object Ownership**（对象所有权）下方，要禁用或启用 ACL，并控制上传到存储桶中的对象的所有权，请选择以下设置之一：

**已禁用 ACL**
   +  **强制存储桶拥有者（默认）**：ACL 已禁用，存储桶拥有者自动拥有并完全控制通用存储桶中的每个对象。ACL 不再影响对 S3 通用存储桶中数据的访问权限。存储桶专门使用策略来定义访问控制。

     默认情况下，ACL 处于禁用状态。Amazon S3 中的大多数现代使用案例不再需要使用 ACL。我们建议您将 ACL 保持为禁用状态，除非有必须单独控制每个对象的访问权限的情况。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

**已启用 ACL**
   + **Bucket owner preferred**（首选存储桶拥有者）— 存储桶拥有者拥有并完全控制其他账户使用 `bucket-owner-full-control` 标准 ACL 写入存储桶的新对象。

     如果应用**首选存储桶拥有者**设置，以要求所有 Amazon S3 上传都包含 `bucket-owner-full-control` 标准 ACL，则可以[添加存储桶策略](ensure-object-ownership.md#ensure-object-ownership-bucket-policy)，该策略只允许使用此 ACL 上传对象。
   + **对象编写者**— 该 Amazon Web Services 账户上传对象拥有该对象，对其拥有完全控制权，并且可以通过 ACL 授予其他用户访问该对象的权限。
**注意**  
默认设置为**强制存储桶拥有者**。要应用默认设置并将 ACL 保持为禁用状态，只需要 `s3:CreateBucket` 权限。要启用 ACL，您必须具有 `s3:PutBucketOwnershipControls` 权限。

1. 在**此存储桶的屏蔽公共访问权限设置**中，请选择要应用于存储桶的屏蔽公共访问权限设置。

   默认情况下，启用所有四个“屏蔽公共访问权限”设置。我们建议您将所有设置保持为启用状态，除非您知道您需要为您的特定使用案例关闭其中一个或多个设置。有关屏蔽公共访问权限的更多信息，请参阅[阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。
**注意**  
要启用所有“屏蔽公共访问权限”设置，只需要 `s3:CreateBucket` 权限。要关闭任何“屏蔽公共访问权限”设置，您必须拥有 `s3:PutBucketPublicAccessBlock` 权限。

1. （可选）默认情况下，**存储桶版本控制**处于禁用状态。版本控制是在相同的存储桶中保留对象的多个变量的方法。对于 存储桶中存储的每个对象，您可以使用版本控制功能来保留、检索和还原它们的各个版本。使用版本控制能够更加轻松地从用户意外操作和应用程序故障中恢复数据。有关版本控制的更多信息，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。

   要在存储桶上启用版本控制，请选择**启用**。

1. （可选）在 **Tags**（标签）下，您可以选择向存储桶添加标签。利用 Amazon 成本分配功能，可以使用存储桶标签来对存储桶的使用计费添加注释。一个标签即为一个键值对，用于表示用户分配给存储桶的标记。有关更多信息，请参阅 [使用成本分配 S3 存储桶标签](CostAllocTagging.md)。

   要添加存储桶标签，请输入 **Key**（键），并（可选）输入 **Value**（值），然后选择 **Add Tag**（添加标签）。

1. 要配置**默认加密**，请在**加密类型**下，选择以下选项之一：
   + **具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）**
   + **具有 Amazon Key Management Service 密钥的服务器端加密（SSE-KMS）**
   + **具有 Amazon Key Management Service（Amazon KMS）密钥的双层服务器端加密（DSSE-KMS）**
**重要**  
如果您将 SSE-KMS 或 DSSE-KMS 选项用于默认加密配置，则您将受到 Amazon KMS 的每秒请求数（RPS）配额限制。有关 Amazon KMS 限额以及如何请求增加限额的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[限额](https://docs.amazonaws.cn/kms/latest/developerguide/limits.html)。

   通过将具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）用作基本加密配置级别，对存储桶和新对象进行加密。有关默认加密的更多信息，请参阅[为 Amazon S3 存储桶设置默认服务器端加密行为](bucket-encryption.md)。有关 SSE-S3 的更多信息，请参阅[使用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）](UsingServerSideEncryption.md)。

   有关使用服务器端加密对数据进行加密的更多信息，请参阅[利用加密来保护数据](UsingEncryption.md)。

1. 如果您选择了**具有 Amazon Key Management Service 密钥的服务器端加密（SSE-KMS）**或**具有 Amazon Key Management Service（Amazon KMS）密钥的双层服务器端加密（DSSE-KMS）**，请执行以下操作：

   1. 在 **Amazon KMS 密钥**下，通过以下方式之一指定您的 KMS 密钥：
      + 要从可用的 KMS 密钥列表中进行选择，请选择**从您的 Amazon KMS keys 密钥中进行选择**，并从可用密钥的列表中选择您的 **KMS 密钥**。

        Amazon 托管式密钥 (`aws/s3`) 和您的客户自主管理型密钥都显示在此列表中。有关客户自主管理型密钥的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[客户密钥和 Amazon 密钥](https://docs.amazonaws.cn//kms/latest/developerguide/concepts.html#key-mgmt)。
      + 要输入 KMS 密钥 ARN，请选择**输入 Amazon KMS key ARN**，然后在显示的字段中输入您的 KMS 密钥 ARN。
      + 要在 Amazon KMS 控制台中创建新的客户自主管理型密钥，请选择**创建 KMS 密钥**。

        有关创建 Amazon KMS key 的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[创建密钥](https://docs.amazonaws.cn//kms/latest/developerguide/create-keys.html)。
**重要**  
您只能使用与存储桶所在相同的 Amazon Web Services 区域中可用的 KMS 密钥。Amazon S3 控制台仅列出与存储桶位于同一区域中的前 100 个 KMS 密钥。要使用未列出的 KMS 密钥，您必须输入 KMS 密钥 ARN。如果您希望使用由其它账户拥有的 KMS 密钥，则必须首先有权使用该密钥，然后必须输入相应的 KMS 密钥 ARN。有关 KMS 密钥的跨账户权限的更多信息，请参阅《Amazon Key Management Service Developer Guide》**中的 [Creating KMS keys that other accounts can use](https://docs.amazonaws.cn//kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console)。有关 SSE-KMS 的更多信息，请参阅 [使用 Amazon KMS (SSE-KMS) 指定服务器端加密](specifying-kms-encryption.md)。有关 DSSE-KMS 的更多信息，请参阅[使用具有 Amazon KMS 密钥的双层服务器端加密（DSSE-KMS）](UsingDSSEncryption.md)。  
在 Amazon S3 中使用 Amazon KMS key 进行服务器端加密时，您必须选择对称加密 KMS 密钥。Amazon S3 仅支持对称加密 KMS 密钥，而不支持非对称 KMS 密钥。有关更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[确定对称和非对称 KMS 密钥](https://docs.amazonaws.cn//kms/latest/developerguide/find-symm-asymm.html)。

   1. 将存储桶配置为使用 SSE-KMS 进行默认加密时，还可以使用 S3 存储桶密钥。S3 存储桶密钥可通过减少从 Amazon S3 到 Amazon KMS 的请求流量，降低加密成本。有关更多信息，请参阅 [使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本](bucket-key.md)。DSSE-KMS 不支持 S3 存储桶密钥。

      默认情况下，S3 存储桶密钥在 Amazon S3 控制台中处于启用状态。我们建议将 S3 存储桶密钥保留为启用状态以降低成本。要为存储桶禁用 S3 存储桶密钥，请在**存储桶密钥**下选择**禁用**。

1. （可选）S3 对象锁定有助于保护新对象不被删除或覆盖。有关更多信息，请参阅 [使用对象锁定以锁定对象](object-lock.md)。如果要启用 S3 对象锁定，请执行以下操作：

   1. 选择**高级设置**。
**重要**  
启用对象锁定会自动为存储桶启用版本控制。启用并成功创建存储桶后，还必须在存储桶的**属性**选项卡上配置对象锁定默认保留设置和法定保留设置。

   1. 如果要启用对象锁定，请选择 **Enable**（启用），阅读出现的警告，并予以确认。
**注意**  
要创建启用了对象锁定的存储桶，您必须具有以下权限：`s3:CreateBucket`、`s3:PutBucketVersioning` 和 `s3:PutBucketObjectLockConfiguration`。

1. 请选择 **Create bucket（创建存储桶）**。

## 使用 Amazon 软件开发工具包
<a name="create-bucket-intro"></a>

使用 Amazon SDK 创建通用存储桶时，您必须先创建一个客户端，然后使用该客户端发送创建存储桶的请求。作为最佳做法，您应在同一 Amazon Web Services 区域 中创建客户端和存储桶。如果您在创建客户端或存储桶时未指定区域，Amazon S3 将使用默认区域，即美国东部（弗吉尼亚州北部）。如果您想将存储桶的创建限制在特定 Amazon Web Services 区域内，则使用 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_CreateBucketConfiguration.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_CreateBucketConfiguration.html) 条件键。

要创建客户端来访问双堆栈端点，则必须指定 Amazon Web Services 区域。有关更多信息，请参阅《Amazon S3 API 参考》**中的 [Using Amazon S3 dual-stack endpoints](https://docs.amazonaws.cn/AmazonS3/latest/API/dual-stack-endpoints.html#dual-stack-endpoints-description)。有关可用 Amazon Web Services 区域的列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Simple Storage Service endpoints and quotas](https://docs.amazonaws.cn/general/latest/gr/s3.html)。

创建客户端时，区域映射到特定于区域的端点。客户端使用此端点与 Amazon S3 进行通信：`s3.region.amazonaws.com`。如果您的区域是在 2019 年 3 月 20 日之后启动的，则您的客户端和存储桶必须位于同一区域。不过，您可以使用美国东部（弗吉尼亚北部）区域中的客户端在 2019 年 3 月 20 日之前启动的任何区域中创建存储桶。有关更多信息，请参阅 [传统终端节点](VirtualHosting.md#s3-legacy-endpoints)。

这些 Amazon SDK 代码示例执行以下任务：
+ **通过显式指定 Amazon Web Services 区域创建客户端** – 在本例中，客户端使用 `s3.us-west-2.amazonaws.com` 端点与 Amazon S3 通信。您可以指定任意。Amazon Web Services 区域有关 Amazon Web Services 区域 的列表，请参阅《*Amazon 一般参考*》中的[区域和端点](https://docs.amazonaws.cn/general/latest/gr/s3.html)。
+ **通过仅指定存储桶名称来发送创建存储桶请求** – 客户端向 Amazon S3 发送请求，请求在您创建客户端的区域中创建存储桶。
+ **检索有关存储桶位置的信息**：Amazon S3 将存储桶位置信息存储在与存储桶关联的*位置*子资源中。

有关其它 Amazon SDK 示例以及其它语言的示例，请参阅《Amazon Simple Storage Service API Reference》**中的 [Use CreateBucket with an Amazon SDK or CLI](https://docs.amazonaws.cn/AmazonS3/latest/API/s3_example_s3_CreateBucket_section.html)。

------
#### [ Java ]

有关如何使用适用于 Java 的 Amazon SDK 创建存储桶的示例，请参阅《Amazon S3 API Reference》**中的 [Create a bucket](https://docs.amazonaws.cn/AmazonS3/latest/API/s3_example_s3_CreateBucket_section.html)。

使用适用于 Java 的 Amazon SDK v2 时，可以创建一个通用存储桶，并在存储桶名称后面附加一个全局唯一标识符（GUID）以确保唯一性。使用 `UUID.randomUUID().toString().replace("-", "")` 生成 GUID 并将其与基本存储桶名称相连接。这种方法有助于避免所有 Amazon 账户间发生存储桶命名冲突。

------
#### [ .NET ]

有关如何创建和测试有效示例的信息，请参阅 [Amazon SDK for .NET Version 3 API Reference](https://docs.amazonaws.cn/sdkfornet/v3/apidocs/Index.html)。

**Example**  

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.S3.Util;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class CreateBucketTest
    {
        private const string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;
        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            CreateBucketAsync().Wait();
        }

        static async Task CreateBucketAsync()
        {
            try
            {
                if (!(await AmazonS3Util.DoesS3BucketExistAsync(s3Client, bucketName)))
                {
                    var putBucketRequest = new PutBucketRequest
                    {
                        BucketName = bucketName,
                        UseClientRegion = true
                    };

                    PutBucketResponse putBucketResponse = await s3Client.PutBucketAsync(putBucketRequest);
                }
                // Retrieve the bucket location.
                string bucketLocation = await FindBucketLocationAsync(s3Client);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
        static async Task<string> FindBucketLocationAsync(IAmazonS3 client)
        {
            string bucketLocation;
            var request = new GetBucketLocationRequest()
            {
                BucketName = bucketName
            };
            GetBucketLocationResponse response = await client.GetBucketLocationAsync(request);
            bucketLocation = response.Location.ToString();
            return bucketLocation;
        }
    }
}
```

------
#### [ Ruby ]

有关如何创建和测试有效示例的信息，请参阅 [Amazon SDK for Ruby - Version 3](https://docs.amazonaws.cn/sdk-for-ruby/v3/api/)。

**Example**  

```
require 'aws-sdk-s3'

# Wraps Amazon S3 bucket actions.
class BucketCreateWrapper
  attr_reader :bucket

  # @param bucket [Aws::S3::Bucket] An Amazon S3 bucket initialized with a name. This is a client-side object until
  #                                 create is called.
  def initialize(bucket)
    @bucket = bucket
  end

  # Creates an Amazon S3 bucket in the specified AWS Region.
  #
  # @param region [String] The Region where the bucket is created.
  # @return [Boolean] True when the bucket is created; otherwise, false.
  def create?(region)
    @bucket.create(create_bucket_configuration: { location_constraint: region })
    true
  rescue Aws::Errors::ServiceError => e
    puts "Couldn't create bucket. Here's why: #{e.message}"
    false
  end

  # Gets the Region where the bucket is located.
  #
  # @return [String] The location of the bucket.
  def location
    if @bucket.nil?
      'None. You must create a bucket before you can get its location!'
    else
      @bucket.client.get_bucket_location(bucket: @bucket.name).location_constraint
    end
  rescue Aws::Errors::ServiceError => e
    "Couldn't get the location of #{@bucket.name}. Here's why: #{e.message}"
  end
end

# Example usage:
def run_demo
  region = "us-west-2"
  wrapper = BucketCreateWrapper.new(Aws::S3::Bucket.new("amzn-s3-demo-bucket-#{Random.uuid}"))
  return unless wrapper.create?(region)

  puts "Created bucket #{wrapper.bucket.name}."
  puts "Your bucket's region is: #{wrapper.location}"
end

run_demo if $PROGRAM_NAME == __FILE__
```

------

## 使用 Amazon CLI
<a name="creating-bucket-cli"></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
```

有关更多信息和其它示例，请参阅《Amazon CLI Command Reference》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-bucket.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-bucket.html)。