

# 创建、配置和使用 Amazon S3 通用存储桶
<a name="creating-buckets-s3"></a>

要将数据存储在 Amazon S3 中，您需要使用称为存储桶和对象的资源。*存储桶*是对象的容器。*对象*指的是一个文件和描述该文件的任何元数据。

要将对象存储在 Amazon S3 中，您需要创建存储桶，然后将该对象上传到存储桶。当对象位于存储桶时，您可以将其打开、下载并移动它。当您不再需要对象或存储桶时，可以清理您的资源。

本节中的主题概述了在 Amazon S3 中使用通用存储桶。它们包括有关命名、创建、访问和删除通用存储桶的信息。有关查看或列出存储桶中对象的更多信息，请参阅 [组织、列出和处理对象](organizing-objects.md)。

Amazon S3 存储桶有几种类型。在创建存储桶之前，请确保选择最适合应用程序和性能要求的存储桶类型。有关各种存储桶类型以及每种类型的相应用例的更多信息，请参阅[桶](Welcome.md#BasicsBucket)。

**注意**  
有关将 Amazon S3 Express One Zone 存储类与目录存储桶配合使用的更多信息，请参阅 [S3 Express One Zone](directory-bucket-high-performance.md#s3-express-one-zone) 和[使用目录存储桶](directory-buckets-overview.md)。

**注意**  
使用 Amazon S3，您只需按实际用量付费。有关 Amazon S3 特征和定价的更多信息，请参阅 [Amazon S3](https://aws.amazon.com/s3)。如果您是 Amazon S3 的新客户，则可以免费开始使用 Amazon S3。有关更多信息，请参阅 [AWS 免费套餐](https://aws.amazon.com/free)。

**Topics**
+ [通用存储桶概述](UsingBucket.md)
+ [通用存储桶的命名空间](gpbucketnamespaces.md)
+ [在 Amazon S3 上构建应用程序的常见通用存储桶模式](common-bucket-patterns.md)
+ [通用存储桶命名规则](bucketnamingrules.md)
+ [通用存储桶配额、限制和局限性](BucketRestrictions.md)
+ [访问 Amazon S3 通用存储桶](access-bucket-intro.md)
+ [创建通用存储桶](create-bucket-overview.md)
+ [查看 S3 通用存储桶的属性](view-bucket-properties.md)
+ [列出 Amazon S3 通用存储桶](list-buckets.md)
+ [清空通用存储桶](empty-bucket.md)
+ [删除通用存储桶](delete-bucket.md)
+ [将 Amazon S3 存储桶挂载为本地文件系统](mountpoint.md)
+ [使用适用于 Amazon S3 的存储浏览器](storage-browser.md)
+ [使用 Amazon S3 Transfer Acceleration 配置快速、安全的文件传输](transfer-acceleration.md)
+ [使用申请方付款通用存储桶进行存储传输和使用](RequesterPaysBuckets.md)

# 通用存储桶概述
<a name="UsingBucket"></a>

要向 Amazon S3 上传数据（照片、视频、文档等），您必须首先在其中一个 AWS 区域 中创建 S3 存储桶。

Amazon S3 存储桶有几种类型。在创建存储桶之前，请确保选择最适合应用程序和性能要求的存储桶类型。有关各种存储桶类型以及每种类型的相应用例的更多信息，请参阅[桶](Welcome.md#BasicsBucket)。

以下各节提供了有关通用存储桶的更多信息，包括存储桶命名规则、配额和存储桶配置详细信息。有关与 Amazon S3 存储桶相关的限制和局限性的列表，请参阅[通用存储桶配额、限制和局限性](BucketRestrictions.md)。

**Topics**
+ [通用存储桶概述](#general-purpose-buckets-overview)
+ [常见通用存储桶模式](#bucket-patterns-overview)
+ [权限](#about-access-permissions-create-bucket)
+ [管理对通用存储桶的公共访问权限](#block-public-access-intro)
+ [管理对通用存储桶的公共访问权限](#bucket-tagging-intro)
+ [通用存储桶配置选项](#bucket-config-options-intro)
+ [通用存储桶操作](#bucket-operations-limits)
+ [通用存储桶性能监控](#bucket-monitoring-use-cases)

## 通用存储桶概述
<a name="general-purpose-buckets-overview"></a>

每个对象都储存在一个存储桶中。例如，如果名为 `photos/puppy.jpg` 的对象存储在美国西部（俄勒冈州）区域的 `amzn-s3-demo-bucket` 通用存储桶中，则可使用 URL `https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/photos/puppy.jpg` 对该对象进行寻址。有关更多信息，请参阅[访问存储桶](access-bucket-intro.md)。
+ 只能从美国东部（弗吉尼亚州北部）查看和管理商业区域的通用存储桶配额。
+ 只能从 AWS GovCloud（美国西部）查看和管理 AWS GovCloud (US) 的通用存储桶配额。

对于实施，存储桶和对象是 AWS 资源，而 Amazon S3 提供 API 供您管理资源。例如，您可以使用 Amazon S3 API 创建存储桶并上传对象。您还可以使用 Amazon S3 控制台执行这些操作。该控制台使用 Amazon S3 API 将请求发送到 Amazon S3。

本节介绍如何使用通用存储桶。有关使用对象的信息，请参阅 [Amazon S3 对象概述](UsingObjects.md)。

默认情况下，通用存储桶存在于全局命名空间中，这意味着每个存储桶名称在分区内的所有 AWS 区域、所有 AWS 账户间都必须是唯一的。分区是区域的分组。AWS 目前有四个分区：`aws`（标准区域）、`aws-cn`（中国区域）、`aws-us-gov`（AWS GovCloud (US)）以及 `aws-eusc`（欧洲主权云）。在共享全局命名空间中创建通用存储桶后，其他任何人均无法在分区内创建该存储桶名称。当存储桶拥有者删除其存储桶时，该存储桶名称将在全局命名空间中再次变为可用，供任何人重新创建。

或者，您可以在您的预留账户区域命名空间中创建存储桶，以便轻松地创建可预测的存储桶名称，同时确保您想要的名称将始终可供您使用。您的账户区域命名空间是全局命名空间的细分，只有您的账户才能使用。通过在您的账户区域命名空间中创建新的存储桶，您可以放心，您所需的存储桶名称将始终可供您使用。有关账户区域命名空间的更多信息，请参阅[通用存储桶的命名空间](gpbucketnamespaces.md)。

在创建通用存储桶之后，该存储桶的名称不能被同一分区中的另一个 AWS 账户使用，直到删除该存储桶。不应依赖特定的存储桶命名约定来实现可用性或安全验证。有关存储桶命名指南，请参阅[通用存储桶命名规则](bucketnamingrules.md)。

Amazon S3 在指定的区域中创建存储桶。为减少延迟、最大限度地降低成本或满足法规要求，请选择地理上靠近您的任何 AWS 区域。例如，如果您位于欧洲，您可能会发现在欧洲（爱尔兰）或欧洲（法兰克福）区域创建存储桶十分有利。有关 Amazon S3 区域的列表，请参阅《*AWS 一般参考*》中的[区域和终端节点](https://docs.aws.amazon.com/general/latest/gr/s3.html)。

**注意**  
属于您在特定 AWS 区域 中创建的存储桶的对象永远不会离开该区域，除非您明确将其传输到另一个区域。例如，在欧洲（爱尔兰）区域存储的对象将一直留在该区域。

## 常见通用存储桶模式
<a name="bucket-patterns-overview"></a>

在 Amazon S3 上构建应用程序时，您可以使用唯一的通用存储桶来分隔不同的数据集或工作负载。根据您的应用场景，使用通用存储桶有不同的设计模式和最佳实践。有关更多信息，请参阅 [在 Amazon S3 上构建应用程序的常见通用存储桶模式按用途划分的存储桶模式](common-bucket-patterns.md)。

## 权限
<a name="about-access-permissions-create-bucket"></a>

可以使用AWS 账户根用户凭证来创建通用存储桶并执行任何其它 Amazon S3 操作。但是，我们建议您不要使用 AWS 账户 的根用户凭证发出请求，例如创建存储桶。而是创建一个 AWS Identity and Access Management (IAM) 用户，并向该用户授予完全访问权限 (用户在默认情况下没有任何权限)。

这些用户称为*管理员*。您可以使用管理员用户凭证而不是您账户的根用户凭证来与 AWS 交互和执行任务，例如创建存储桶，创建用户和授予他们权限。

有关更多信息，请参阅《AWS 一般参考》**中的 [AWS 账户根用户 凭证和 IAM 用户凭证](https://docs.aws.amazon.com/general/latest/gr/root-vs-iam.html)以及《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

创建资源的 AWS 账户 拥有该资源。例如，如果您在 AWS 账户 中创建一个 IAM 用户并向该用户授予创建存储桶的权限，则该用户可以创建存储桶。但该用户不拥有存储桶；该存储桶属于用户所属的 AWS 账户 所有。用户需要资源拥有者提供其他权限来执行任何其他存储桶操作。有关为您的 Amazon S3 资源管理权限的更多信息，请参阅[Amazon S3 的身份和访问管理](security-iam.md)。

## 管理对通用存储桶的公共访问权限
<a name="block-public-access-intro"></a>

通过存储桶策略和/或访问控制列表（ACL）授予对通用存储桶和对象的公共访问权限。为了帮助您管理对 Amazon S3 资源的公有访问，Amazon S3 提供屏蔽公共访问权限的设置。Amazon S3 屏蔽公共访问权限设置可以覆盖 ACL 和存储桶策略，以便您可以对这些资源的公有访问实施统一限制。您可以将屏蔽公共访问权限设置应用于您的账户中的单个存储桶或所有存储桶。

为确保所有 Amazon S3 通用存储桶和对象都屏蔽了公共访问权限，在创建新的存储桶时，默认情况下会启用“屏蔽公共访问权限”的所有四个设置。我们建议也为您的账户启用“屏蔽公共访问权限”的所有四个设置。这些设置阻止所有当前和将来的存储桶的所有公有访问。

在应用这些设置之前，请确认您的应用程序在没有公有访问的情况下能够正常工作。如果您需要对存储桶或对象进行某种级别的公共访问，例如，要按照[使用 Amazon S3 托管静态网站](WebsiteHosting.md)中所述托管静态网站，则可以自定义各个设置以符合您的存储使用案例要求。有关更多信息，请参阅 [阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。

 但是，我们建议将“屏蔽公共访问权限”保留为启用状态。如果要将所有四个“屏蔽公共访问权限”设置保持为启用状态并托管静态网站，则可以使用 Amazon CloudFront 来源访问控制（OAC）。Amazon CloudFront 提供了设置安全静态网站所需的功能。Amazon S3 静态网站仅支持 HTTP 端点。Amazon CloudFront 使用 Amazon S3 的持久存储，同时提供额外的安全标头，如 HTTPS。HTTPS 通过加密正常 HTTP 请求并防范常见的网络攻击来增强安全性。

有关更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的[安全静态网站入门](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/getting-started-secure-static-website-cloudformation-template.html)。

**注意**  
如果您在列出通用存储桶及其公有访问权限设置时看到 `Error`，则您可能不具备所需的权限。确保您已将以下权限添加到您的用户或角色策略：  

```
s3:GetAccountPublicAccessBlock
s3:GetBucketPublicAccessBlock
s3:GetBucketPolicyStatus
s3:GetBucketLocation
s3:GetBucketAcl
s3:ListAccessPoints
s3:ListAllMyBuckets
```
在极少数情况下，请求也可能因 AWS 区域中断而失败。

## 管理对通用存储桶的公共访问权限
<a name="bucket-tagging-intro"></a>

您可以向 Amazon S3 存储桶添加标签，以便分类并跟踪 AWS 成本或者进行访问控制。您可以使用标签作为成本分配标签，在 AWS 账单与成本管理中跟踪存储成本。您还可以使用标签来实现基于属性的访问权限控制（ABAC），从而根据标签来扩展访问权限以及授予对 S3 存储桶的访问权限。

有关更多信息，请参阅 [将标签与 S3 通用存储桶结合使用](buckets-tagging.md)。

## 通用存储桶配置选项
<a name="bucket-config-options-intro"></a>

Amazon S3 支持各种供您用于配置通用存储桶的选项。例如，您可以配置存储桶用于网站托管、添加配置以管理存储桶中对象的生命周期以及配置存储桶以记录对存储桶的所有访问。Amazon S3 支持供您存储和管理存储桶配置信息的子资源。您可以使用 Amazon S3 API 创建和管理这些子资源。但是，还可以使用控制台或 AWS SDK。

**注意**  
还有对象级配置。例如，可以通过特定于该对象的配置访问控制列表 (ACL) 来配置对象级权限。

这些称为子资源，因为它们存在于特定存储桶或对象的上下文中。下表列出使您可以管理特定于存储桶的配置的子资源。


| 子资源 | 描述 | 
| --- | --- | 
|   *cors*（跨源资源共享）   |   您可以配置存储桶以便允许跨源请求。 有关更多信息，请参阅 [使用跨源资源共享 (CORS)](cors.md)。  | 
|   *事件通知*   |  您可以使存储桶向您发送特定存储桶事件的通知。 有关更多信息，请参阅 [Amazon S3 事件通知](EventNotifications.md)。  | 
| 生命周期 |  您可以为存储桶中明确定义了生命周期的对象定义生命周期规则。例如，您可以定义一个规则以在创建一年之后存档对象，或在创建 10 年之后删除对象。 有关更多信息，请参阅 [管理对象的生命周期](object-lifecycle-mgmt.md)。  | 
|   *地点*   |   创建存储桶时，请指定需要 Amazon S3 在其中创建存储桶的 AWS 区域。Amazon S3 将此信息存储在位置子资源中并提供 API 用于检索此信息。  | 
|   *日志记录*   |  日志记录使您可以跟踪针对存储桶的访问请求。每个访问日志记录都提供有关单个访问请求的详细信息，如请求者、存储桶名称、请求时间、请求操作、响应状态和错误代码（如果有）。访问日志信息可能在安全和访问审核方面十分有用。它还可以帮助您了解您的客户群并了解您的 Amazon S3 账单。  有关更多信息，请参阅 [使用服务器访问日志记录来记录请求](ServerLogs.md)。  | 
|   *对象锁定*   |  要使用 S3 对象锁定，您必须为存储桶启用它。您还可以选择配置将应用于存储桶中放置的新对象的默认保留模式和保留期限。 有关更多信息，请参阅 [使用对象锁定以锁定对象](object-lock.md)。  | 
|   *策略* 和 *ACL*（访问控制列表）   |  所有资源（如存储桶和对象）在默认情况下为私有。Amazon S3 支持存储桶策略和访问控制列表（ACL）选项，供您用于授予和管理存储桶级权限。Amazon S3 将权限信息存储在*策略* 和 *acl* 子资源中。 有关更多信息，请参阅 [Amazon S3 的身份和访问管理](security-iam.md)。  | 
|   *复制*   |  复制是在相同或跨不同 AWS 区域 中的存储桶自动、异步地复制对象。有关更多信息，请参阅 [在区域内和跨区域复制对象](replication.md)。  | 
|   *requestPayment*   |  默认情况下，创建存储桶的 AWS 账户（存储桶拥有者）支付从存储桶进行的下载。存储桶拥有者可以使用此子资源指定对请求下载的人员收取下载费用。Amazon S3 提供了一个 API，用于管理此子资源。 有关更多信息，请参阅 [使用申请方付款通用存储桶进行存储传输和使用](RequesterPaysBuckets.md)。  | 
|   *标记*   |  您可以向 Amazon S3 存储桶添加标签，以便分类并跟踪 AWS 成本或者进行访问控制。您可以使用标签作为成本分配标签，在 AWS 账单与成本管理中跟踪存储成本。您还可以使用标签来实现基于属性的访问权限控制（ABAC），从而根据标签来扩展访问权限以及授予对 S3 存储桶的访问权限。 有关更多信息，请参阅 [将标签与 S3 通用存储桶结合使用](buckets-tagging.md)。  | 
|   *传输加速*   |  Transfer Acceleration 可在您的客户端与 S3 存储桶之间实现快速、轻松、安全的远距离文件传输。Transfer Acceleration 利用 Amazon CloudFront 中的全球分布式边缘站点。 有关更多信息，请参阅 [使用 Amazon S3 Transfer Acceleration 配置快速、安全的文件传输](transfer-acceleration.md)。  | 
| 版本控制 |  版本控制可帮助恢复意外覆盖和删除。 我们建议将版本控制作为从错误删除或覆盖恢复对象的最佳实践。 有关更多信息，请参阅 [使用 S3 版本控制保留对象的多个版本](Versioning.md)。  | 
|  网站 |  您可以配置存储桶以便用于静态网站托管。Amazon S3 通过创建*网站* 子资源来存储此配置。 有关更多信息，请参阅 [使用 Amazon S3 托管静态网站](WebsiteHosting.md)。  | 

## 通用存储桶操作
<a name="bucket-operations-limits"></a>

Amazon S3 的高可用性工程专注于*获取*、*放置*、*列出*和*删除*操作。由于通用存储桶操作针对集中的全球资源空间进行，因此我们建议不要在应用程序的高可用性代码路径上创建、删除或配置存储桶。最好是在单独的初始化或设置不常运行的例程时创建、删除或配置存储桶。

## 通用存储桶性能监控
<a name="bucket-monitoring-use-cases"></a>

当您的关键应用程序和业务流程依赖于 AWS 资源时，监控系统并获取其警报非常重要。[监控数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/monitoring-overview.html)有助于维护 Amazon S3 和 AWS 解决方案的可靠性、可用性和性能。可以使用多项 AWS 服务来收集和汇总 S3 存储桶的指标和日志。

根据您的用例，您可以选择最适合贵组织需求的 AWS 服务，来调试问题、监控数据、优化存储成本或解决多点问题。例如：
+ **提高使用 S3 的应用程序的性能：**[设置 CloudWatch 警报](https://docs.aws.amazon.com/AmazonS3/latest/userguide/cloudwatch-monitoring.html)以监控存储数据、复制指标或请求指标。
+ **要规划存储空间使用、优化存储成本或了解整个组织中有多少存储空间：**[使用 Amazon S3 Storage Lens 存储统计管理工具](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-optimize-storage.html)。或者，您可以通过启用高级指标并使用详细的状态代码指标来获取成功或失败请求的计数，[使用 S3 Storage Lens 存储统计管理工具提高数据性能](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-detailed-status-code.html)。
+  **要统一查看运营状况：**[将 S3 Storage Lens 存储统计管理工具使用情况和活动指标发布](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_view_metrics_cloudwatch.html)到 [Amazon CloudWatch 控制面板](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html)。
**注意**  
Amazon CloudWatch 发布选项可用于升级到**高级指标和建议**的 S3 Storage Lens 存储统计管理工具。您可以在 S3 Storage Lens 存储统计管理工具中为新的或现有的仪表板配置启用 CloudWatch 发布选项。
+ **要获取用户、角色或 AWS 服务所执行操作的记录：**设置 [AWS CloudTrail logs](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-working-with-log-files.html)。还可以使用 AWS CloudTrail 日志将 Amazon S3 的 API 调用作为事件进行查看。
+ **要接收有关 S3 存储桶中何时发生特定事件的通知：**[设置 Amazon S3 事件通知](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventNotifications.html)。
+ **要获取向 S3 存储桶发出的请求的详细记录：**[设置 S3 访问日志](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html)。

有关可用于监控数据的所有不同 AWS 服务的列表，请参阅 [Amazon S3 中的日志记录和监控](https://docs.aws.amazon.com/AmazonS3/latest/userguide/monitoring-overview.html)。

# 通用存储桶的命名空间
<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
```

# 在 Amazon S3 上构建应用程序的常见通用存储桶模式
<a name="common-bucket-patterns"></a>

在 Amazon S3 上构建应用程序时，您可以使用唯一的通用存储桶来分隔不同的数据集或工作负载。当您构建为最终用户或不同用户组服务的应用程序时，请使用我们的最佳实践设计模式来构建能够充分利用 Amazon S3 功能和可扩展性的应用程序。

**重要**  
我们建议您创建不可预测的通用存储桶名称。除非您已经创建了存储桶，否则不要编写假定您所选存储桶名称可用的代码。我们建议在您的账户区域命名空间中创建存储桶，以确保只有您的账户才能拥有这些存储桶名称，请参阅[通用存储桶的命名空间](gpbucketnamespaces.md)。有关通用存储桶命名规则的更多信息，请参阅[通用存储桶命名规则](bucketnamingrules.md)。

**Topics**
+ [多租户通用存储桶模式](#multi-tenant-buckets)
+ [按用途划分的存储桶模式](#bucket-per-customer)

## 多租户通用存储桶模式
<a name="multi-tenant-buckets"></a>

使用多租户存储桶，您可以为团队或工作负载创建单个通用存储桶。您可以使用[唯一的 S3 前缀](using-prefixes.md)来组织存储在存储桶中的对象。前缀是对象键名称开头的一串字符串。前缀可以是任意长度，取决于对象键名称的最大长度（1024 个字节）。您可以把前缀视为一种以类似于目录的方式组织数据的方式。但是，前缀不是目录。

例如，要存储关于城市的信息，您可以按大陆、按国家/区域，然后按省份或州来进行组织。因为这些名称通常不包含标点符号，您可以使用斜杠 (/) 作为分隔符。以下示例展示了如何使用斜杠（/）作为分隔符，通过大陆、国家/地区，然后是省份或州来组织城市名称的前缀。
+ Europe/France/NouvelleA-Aquitaine/Bordeaux
+ North America/Canada/Quebec/Montreal
+ North America/USA/Washington/Bellevue
+ North America/USA/Washington/Seattle

当通用存储桶内有数百个唯一的数据集时，这种模式可以很好地扩展。使用前缀，您可以轻松地对这些数据集进行组织和分组。

但是，多租户通用存储桶模式的一个潜在缺点是，许多 S3 存储桶级别的功能（例如[默认存储桶加密](bucket-encryption.md)、[S3 版本控制](versioning-workflows.md)和 [S3 申请方付款](RequesterPaysBuckets.md)）是在存储桶级别而不是在前缀级别设置的。如果多租户存储桶中的不同数据集具有独特的要求，而您无法在前缀级别配置许多 S3 存储桶级别功能，那么您可能很难为每个数据集指定正确的设置。此外，在多租户存储桶中，当您试图了解与特定前缀相关的存储、请求和数据传输时，[成本分配](BucketBilling.md)可能会变得复杂。

## 按用途划分的存储桶模式
<a name="bucket-per-customer"></a>

使用按用途划分的存储桶模式，您可以为每个不同的数据集、最终用户或团队创建一个通用存储桶。由于您可以为每个存储桶配置 S3 存储桶级别的功能，因此您可以使用此模式来配置唯一的存储桶级别设置。例如，您可以按照针对每个存储桶中的数据集自定义的方式，来配置[默认存储桶加密](bucket-encryption.md)、[S3 版本控制](versioning-workflows.md)和 [S3 申请方付款](RequesterPaysBuckets.md)等功能。为每个不同的数据集、最终用户或团队使用一个存储桶，还有助于简化访问管理和成本分配策略。

这种策略的一个潜在缺点是，您可能需要管理数千个存储桶。所有 AWS 账户的默认配额均为 10000 个通用存储桶。可以通过提交增加配额请求来增加账户的存储桶配额。要请求提高通用存储桶的配额，请访问[服务配额控制台](https://console.aws.amazon.com/servicequotas/home/services/s3/quotas/)。

要管理您的按用途划分的存储桶模式，并简化您的基础设施管理，可以使用 [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html#welcome-simplify-infrastructure-management)。您可以为您的模式创建自定义 CloudFormation 模板，该模板已经定义了 S3 通用存储桶所需的所有设置，以便您可以轻松部署和跟踪对基础设施的任何更改。有关更多信息，请参阅《AWS CloudFormation User Guide》**中的 [AWS::S3::Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-bucket.html)。

![\[此图表展示了如何为您的应用程序创建一个自定义的 CloudFormation 模板，该模板定义了您的 S3 存储桶的设置。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/create-stack-diagram.png)


在通过存储桶按用量模式构建工作负载时，我们建议您在账户区域命名空间中创建存储桶。通过在您的账户区域命名空间中创建存储桶，您可以避免与他人争夺存储桶名称，并且可以确保只有您的账户才能按照您选择的命名约定创建存储桶。有关账户区域命名空间的更多信息，请参阅[通用存储桶的命名空间](gpbucketnamespaces.md)。

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

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

有关对象键名称的信息，请参阅[创建对象键名称](https://docs.aws.amazon.com/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)。

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

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

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

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

您的账户区域命名空间中的通用存储桶必须遵循特定的命名约定。这些存储桶由您创建的存储桶名称前缀和一个后缀组成，后缀包含您的 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`。例如，您可以指定创建一个名为 `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>

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

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

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

**将全局唯一标识符（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`。

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

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

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

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

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

以下 AWS 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 的 AWS SDK
<a name="guid-sdk-bucket-name"></a>

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

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

### 使用 AWS CLI
<a name="account-regional-cli-naming"></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
```

# 通用存储桶配额、限制和局限性
<a name="BucketRestrictions"></a>

Amazon S3 通用存储桶归创建它的 AWS 账户所有。存储桶所有权不可转移到其他账户。

## 存储桶配额
<a name="bucket-quota-limits"></a>

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

**重要**  
我们强烈建议仅使用分页 `ListBuckets` 请求。只有设置为默认通用存储桶配额 10000 的 AWS 账户，才支持未分页的 `ListBuckets` 请求。如果您批准的通用存储桶配额超过 10000，则必须发送分页 `ListBuckets` 请求以列出您账户的存储桶。对于通用存储桶配额大于 10000 的 AWS 账户，所有未分页的 `ListBuckets` 请求都将遭拒绝。

**注意**  
必须使用以下 AWS 区域来查看 AWS 账户中的配额、存储桶利用率或者请求增加通用存储桶。  
只能从美国东部（弗吉尼亚州北部）查看和管理商业区域的通用存储桶配额。
只能从 AWS GovCloud（美国西部）查看和管理 AWS GovCloud (US) 的通用存储桶配额。

有关服务配额的信息，请参阅《Amazon Web Services 一般参考》**中的 [AWS service quotas](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)。

## 对象和存储桶限制
<a name="object-bucket-limitations"></a>

没有最大存储桶大小，对存储桶中可存储的项目数也没有限制。您可以在单个存储桶中存储所有对象，也可以在多个存储桶中组织它们。但是，您无法从其他存储桶中创建存储桶。

## 存储桶命名规则
<a name="bucket-naming-limits"></a>

创建存储桶时，您可以选择存储桶名称和要在其中创建存储桶的 AWS 区域。创建存储桶后，便无法再更改其名称或区域。有关存储桶命名的更多信息，请参阅 [通用存储桶命名规则](bucketnamingrules.md)。

# 访问 Amazon S3 通用存储桶
<a name="access-bucket-intro"></a>

您可以使用 Amazon S3 控制台、AWS Command Line Interface、AWS SDK 或 Amazon S3 REST API 访问 Amazon S3 通用存储桶。访问 S3 通用存储桶的每种方法都支持特定的应用场景。有关更多信息，请参阅以下部分。

**Topics**
+ [使用案例](#accessing-use-cases)
+ [Amazon S3 控制台](#accessing-aws-management-console)
+ [AWS CLI](#accessing-aws-cli)
+ [AWS SDK](#accessing-aws-sdks)
+ [Amazon S3 REST API](#AccessingUsingRESTAPI)
+ [通用存储桶的虚拟托管](VirtualHosting.md)

## 使用案例
<a name="accessing-use-cases"></a>

根据您的 Amazon S3 通用存储桶的应用场景，建议使用不同方法来访问存储桶中的底层数据。以下列表包括访问数据的常见应用场景。
+ **静态网站** – 您可以使用 Amazon S3 托管静态网站。在此应用场景中，您可以配置 S3 通用存储桶，使其功能与网站相似。要了解有关在 Amazon S3 上托管网站的步骤的示例，请参阅[教程：在 Amazon S3 上配置静态网站](HostingWebsiteOnS3Setup.md)。

  要托管启用了“屏蔽公共访问权限”等安全设置的静态网站，建议使用带来源访问控制（OAC）的 Amazon CloudFront，并实施其它安全标头，例如 HTTPS。有关更多信息，请参阅[安全静态网站入门](https://docs.aws.amazon.com//AmazonCloudFront/latest/DeveloperGuide/getting-started-secure-static-website-cloudformation-template.html)。
**注意**  
Amazon S3 针对静态网站访问支持[虚拟托管类型](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html#virtual-hosted-style-access)和[路径类型 URL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html#path-style-access)。由于可以使用路径类型和虚拟托管类型 URL 访问存储桶，因此，建议您使用符合 DNS 标准的存储桶名称创建存储桶。有关更多信息，请参阅 [通用存储桶配额、限制和局限性](BucketRestrictions.md)。
+ **共享数据集**：在 Amazon S3 上扩展时，通常会采用多租户模式，即在共享通用存储桶中为不同的最终客户或业务部门分配唯一前缀。通过使用 [Amazon S3 接入点](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html)，您可以将一个大型存储桶策略划分为每个需要访问共享数据集的应用程序的独立接入点策略。这种方法可以更轻松地专注于为一个应用程序构建正确的访问策略，而不中断任何其它应用程序在共享数据集中的操作。有关更多信息，请参阅 [通过接入点管理对共享数据集的访问](access-points.md)。
+ **高吞吐量工作负载**：适用于 Amazon S3 的 Mountpoint 是一款高吞吐量开源文件客户端，用于将 Amazon S3 通用存储桶作为本地文件系统进行挂载。借助 Mountpoint，您的应用程序可以通过文件系统操作（例如打开和读取）访问存储在 Amazon S3 中的对象。Mountpoint 会自动将这些操作转换为 S3 对象 API 调用，让您的应用程序能够通过文件接口访问 Amazon S3 的弹性存储和吞吐量。有关更多信息，请参阅 [将 Amazon S3 存储桶挂载为本地文件系统](mountpoint.md)。
+ **多区域应用程序**：Amazon S3 多区域接入点提供了一个全局端点，应用程序可以使用该端点来满足来自位于多个 AWS 区域中的 S3 通用存储桶的请求。您可以使用多区域接入点通过单个区域中使用的相同架构构建多区域应用程序，然后在世界任何地方运行这些应用程序。多区域接入点不是通过公共互联网发送请求，而是提供内置的网络韧性，加速向 Amazon S3 发送基于互联网的请求。有关更多信息，请参阅 [使用多区域接入点管理多区域流量](MultiRegionAccessPoints.md)。
+ **Secure Shell（SSH）文件传输协议（SFTP）**：如果您尝试通过互联网安全地传输敏感数据，则可以将支持 SFTP 的服务器与 Amazon S3 通用存储桶结合使用。AWS SFTP 是一种网络协议，支持 SSH 的完全安全和身份验证功能。使用此协议，您可以对用户身份、权限和密钥进行精细控制，也可以使用 IAM 策略来管理访问权限。要将支持 SFTP 的服务器与您的 Amazon S3 存储桶相关联，请务必先创建支持 SFTP 的服务器。然后设置用户账户，并将服务器与 Amazon S3 通用存储桶关联。有关此过程的介绍，请参阅 *AWS 博客*中的 [AWS Transfer for SFTP – Fully Managed SFTP Service for Amazon S3](https://aws.amazon.com/blogs/aws/new-aws-transfer-for-sftp-fully-managed-sftp-service-for-amazon-s3/)。

## Amazon S3 控制台
<a name="accessing-aws-management-console"></a>

控制台是基于 Web 的用户界面，用于管理 Amazon S3 和 AWS 资源。使用 Amazon S3 控制台，您可以轻松访问存储桶并修改存储桶属性。您还可以使用控制台 UI 执行大多数存储桶操作，而不必编写任何代码。

如果您已注册 AWS 账户，您可以通过登录 Amazon S3 控制台并从 Amazon S3 控制台主页中选择 **S3** 来访问 Amazon S3 控制台。您也可以使用此链接直接访问 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

## AWS CLI
<a name="accessing-aws-cli"></a>

可以使用 AWS CLI，在系统的命令行中发出命令或构建脚本来执行 AWS（包括 S3）任务。例如，如果您需要访问多个存储桶，则可以使用 AWS CLI 自动执行常见任务和重复任务，从而节省时间。随着组织的扩大，常见操作的可脚本化和可重复性是经常考虑的因素。

[AWS CLI](https://aws.amazon.com/cli/) 针对大量 AWS 服务 提供了相关命令。AWS CLI 在 Windows、macOS 和 Linux 上受支持。要开始使用，请参阅 [https://docs.aws.amazon.com/cli/latest/userguide/](https://docs.aws.amazon.com/cli/latest/userguide/)。有关 Amazon S3 命令的更多信息，请参阅 *AWS CLI 一般参考*中的 [s3api](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/index.html) 和 [s3control](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3control/index.html)。

## AWS SDK
<a name="accessing-aws-sdks"></a>

AWS 提供的 SDK（软件开发工具包）包含各种编程语言和平台（Java、Python、Ruby、.NET、iOS、Android 等）的库和示例代码。AWS SDK 提供便捷的方式来创建对 S3 和 AWS 的编程访问。Amazon S3 是一项 REST 服务。您可以使用 AWS SDK 库向 Amazon S3 发送请求，该库包装了底层 Amazon S3 REST API 并简化了编程任务。例如，SDK 负责计算签名、加密签名请求、管理错误和自动重试请求等任务。有关 AWS SDK 的信息（包括如何下载及安装），请参阅 [适用于 AWS 的工具 ](https://aws.amazon.com/tools/)。

与 Amazon S3 的每一次交互都是经身份验证的或匿名的。如果您使用 AWS SDK，库根据您提供的密钥计算用于身份验证的签名。有关如何向 Amazon S3 发出请求的更多信息，请参阅 [Making requests](https://docs.aws.amazon.com/AmazonS3/latest/API/MakingRequests.html)。

## Amazon S3 REST API
<a name="AccessingUsingRESTAPI"></a>

Amazon S3 架构的设计与编程语言无关，使用 AWS 支持的接口来存储和检索对象。您可以访问 S3 和 AWS 以编程方式使用 Amazon S3 REST API。REST API 是面向 Amazon S3 的 HTTP 接口。借助 REST API，您可以使用标准的 HTTP 请求创建、提取和删除存储桶和对象。

要使用 REST API，您可以借助任何支持 HTTP 的工具包。只要对象是匿名可读的，您甚至可以使用浏览器来提取它们。

REST API 使用标准的 HTTP 标头和状态代码，以使标准的浏览器和工具包按预期工作。在某些区域中，我们向 HTTP 添加了功能 (例如，我们添加了标头来支持访问控制)。在这些情况下，我们已尽最大努力使添加的新功能与标准的 HTTP 使用样式相匹配。

如果您在应用程序中直接调用 REST API，您必须编写代码来计算签名并将它添加到请求中。有关如何向 Amazon S3 发出请求的更多信息，请参阅《Amazon S3 API 参考》**中的 [Making requests](https://docs.aws.amazon.com/AmazonS3/latest/API/MakingRequests.html)。

# 通用存储桶的虚拟托管
<a name="VirtualHosting"></a>

虚拟托管是指从单个 Web 服务器为多个网站提供服务的做法。区分 Amazon S3 REST API 请求中的站点的一种方法是通过使用请求-URI 的显式主机名，而不只是 URI 的路径名称部分。普通的 Amazon S3 REST 请求使用“请求-URI”路径的第一个斜杠分隔部分指定存储桶。相反，您可以通过使用 HTTP `Host` 标头，在 REST API 调用中使用 Amazon S3 虚拟托管对通用存储桶进行寻址。事实上，Amazon S3 会将 `Host` 解释为可在 `https://bucket-name.s3.region-code.amazonaws.com` 上自动访问大多数存储桶（对于有限类型的请求）。有关 Amazon S3 区域和端点的完整列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon S3 端点和限额](https://docs.aws.amazon.com/general/latest/gr/s3.html)。

虚拟托管还有其他好处。通过使用注册域名来命名您的存储桶，并将该名称设为 Amazon S3 的 DNS 别名，您可以完全自定义 Amazon S3 资源的 URL，例如：`http://my.bucket-name.com/`。您还可以发布到存储桶的虚拟服务器的“根目录”。此功能很重要，因为许多现有应用程序在此标准位置搜索文件。例如，`favicon.ico`、`robots.txt` 和 `crossdomain.xml` 都应可在根目录下找到。

**重要**  
当通过 SSL 使用虚拟托管类型通用存储桶时，SSL 通配符证书仅匹配不包含句点 (`.`) 的存储桶。要解决此问题，请使用 HTTP 或编写自己的证书验证逻辑。有关更多信息，请参阅 *AWS 新闻博客* 上的 [Amazon S3 路径弃用计划](https://aws.amazon.com/blogs/aws/amazon-s3-path-deprecation-plan-the-rest-of-the-story/)。

**Topics**
+ [路径类型请求](#path-style-access)
+ [虚拟托管类型请求](#virtual-hosted-style-access)
+ [HTTP `Host` 标头桶规范](#VirtualHostingSpecifyBucket)
+ [示例](#VirtualHostingExamples)
+ [使用 CNAME 记录自定义 Amazon S3 URL](#VirtualHostingCustomURLs)
+ [如何将主机名与 Amazon S3 桶关联](#VirtualHostingCustomURLsHowTo)
+ [限制](#VirtualHostingLimitations)
+ [向后兼容性](#VirtualHostingBackwardsCompatibility)

## 路径类型请求
<a name="path-style-access"></a>

目前，Amazon S3 在所有 AWS 区域中同时支持虚拟托管类型和路径类型 URL 访问。但是，路径类型 URL 将来会停用。有关更多信息，请参阅下面的**重要**提示。

在 Amazon S3 中，路径类型 URL 使用以下格式：

```
https://s3.region-code.amazonaws.com/bucket-name/key-name
```

例如，如果您在美国西部（俄勒冈）区域中创建一个名为 `amzn-s3-demo-bucket1` 的存储桶，并希望访问该存储桶中的 `puppy.jpg` 对象，则可使用以下路径类型 URL：

```
https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket1/puppy.jpg
```

**重要**  
更新（2020 年 9 月 23 日）– 为确保客户有时间转换到虚拟托管类型 URL，我们决定推迟弃用路径类型 URL。有关更多信息，请参阅 *AWS 新闻博客*中的 [Amazon S3 路径弃用计划 – 案例的其余部分](https://aws.amazon.com/blogs/aws/amazon-s3-path-deprecation-plan-the-rest-of-the-story/)。

**警告**  
托管将通过 Web 浏览器访问的网站内容时，请避免使用路径样式 URL，因为这可能会干扰浏览器的同源安全模型。要托管网站内容，我们建议您使用 S3 网站端点或 CloudFront 分配。有关更多信息，请参阅[网站端点](WebsiteEndpoints.md)和《AWS 透视指导模式》**中的[将基于 React 的单页应用程序部署到 Amazon S3 和 CloudFront](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-a-react-based-single-page-application-to-amazon-s3-and-cloudfront.html)。

## 虚拟托管类型请求
<a name="virtual-hosted-style-access"></a>

在虚拟托管类型 URI 中，存储桶名称是 URL 中域名的一部分。

Amazon S3 虚拟托管类型 URL 使用以下格式：

```
https://bucket-name.s3.region-code.amazonaws.com/key-name
```

在此示例中，`amzn-s3-demo-bucket1` 为存储桶名称，美国西部（俄勒冈）为区域，`puppy.png` 为密钥名称：

```
https://amzn-s3-demo-bucket1.s3.us-west-2.amazonaws.com/puppy.png
```

## HTTP `Host` 标头桶规范
<a name="VirtualHostingSpecifyBucket"></a>

只要您的 `GET` 请求不使用 SSL 终端节点，您就可以通过使用 HTTP `Host` 标头为请求指定存储桶。REST 请求中的 `Host` 标头解释如下：
+ 如果 `Host` 标头被省略，或其值为 `s3.region-code.amazonaws.com`，则该请求的存储桶将是请求-URI 的第一个斜杠分隔的部分，而且该请求的键将是请求-URI 的其余部分。这是常用方法，如本部分第一个和第二个示例所示。省略 `Host` 标头仅对于 HTTP 1.0 请求有效。
+ 否则，如果 `Host` 标头的值以 `.s3.region-code.amazonaws.com` 结尾，则存储桶名称是 `Host` 标头值中从开头到 `.s3.region-code.amazonaws.com` 的部分。该请求的键值为“Request-URI”。此解释将存储桶公开为 `.s3.region-code.amazonaws.com` 的子域，如本部分第三和第四个示例所示。
+ 否则，请求的存储桶是 `Host` 标头的小写值，请求的键值是“Request-URI”。如果注册的 DNS 名称与桶名称相同，并且已将该名称配置为 Amazon S3 的规范名称 (CNAME) 别名，则此解释很有用。注册域名和配置 CNAME DNS 记录的过程不在本指南的范围内，但本节中的最后一个示例展示了结果。

## 示例
<a name="VirtualHostingExamples"></a>

本节提供示例 URL 和请求。

**Example – 路径类型 URL 和请求**  
此示例使用以下内容：  
+ 存储桶名称 – `example.com`
+ 区域 – 美国东部（弗吉尼亚北部） 
+ 键名 – `homepage.html`
URL 如下：  

```
1. http://s3.us-east-1.amazonaws.com/example.com/homepage.html
```
请求如下：  

```
1. GET /example.com/homepage.html HTTP/1.1
2. Host: s3.us-east-1.amazonaws.com
```
具有 HTTP 1.0 且省略 `Host` 标头的请求如下：  

```
1. GET /example.com/homepage.html HTTP/1.0
```

有关 DNS 兼容名称的信息，请参阅[限制](#VirtualHostingLimitations)。有关密钥的更多信息，请参阅[密钥](Welcome.md#BasicsKeys)。

**Example – 虚拟托管类型 URL 和请求**  
此示例使用以下内容：  
+ **桶名称** ‐ `amzn-s3-demo-bucket1` 
+ **区域** – 欧洲（爱尔兰） 
+ **键名** ‐ `homepage.html`
URL 如下：  

```
1. http://amzn-s3-demo-bucket1.s3.eu-west-1.amazonaws.com/homepage.html
```
请求如下：  

```
1. GET /homepage.html HTTP/1.1
2. Host: amzn-s3-demo-bucket1.s3.eu-west-1.amazonaws.com
```

**Example – CNAME 别名方法**  
要使用此方法，您必须将 DNS 名称配置为 `bucket-name.s3.us-east-1.amazonaws.com` 的 CNAME 别名。有关更多信息，请参阅 [使用 CNAME 记录自定义 Amazon S3 URL](#VirtualHostingCustomURLs)。  
此示例使用以下内容：  
+ 存储桶名称 – `example.com` 
+ **键名称** ‐ `homepage.html`
URL 如下：  

```
1. http://www.example.com/homepage.html
```
示例如下：  

```
1. GET /homepage.html HTTP/1.1
2. Host: www.example.com
```

## 使用 CNAME 记录自定义 Amazon S3 URL
<a name="VirtualHostingCustomURLs"></a>

根据您的需要，您可能不希望 `s3.region-code.amazonaws.com` 显示在网站或服务中。例如，如果您在 Amazon S3 上托管网站映像，您可能会首选 `http://images.example.com/`，而不是 `http://images.example.com.s3.us-east-1.amazonaws.com/`。具有 DNS 兼容名称的任何存储桶都可按以下方式引用：` http://BucketName.s3.Region.amazonaws.com/[Filename]`，例如 `http://images.example.com.s3.us-east-1.amazonaws.com/mydog.jpg`。通过使用 CNAME，您可以将 `images.example.com` 映射到 Amazon S3 主机名，使上面的 URL 变成 `http://images.example.com/mydog.jpg`。

存储桶名称必须与 CNAME 相同。例如，如果您创建一个 CNAME 以将 `images.example.com` 映射到 `images.example.com.s3.us-east-1.amazonaws.com`，则 `http://images.example.com/filename` 和 `http://images.example.com.s3.us-east-1.amazonaws.com/filename` 两者将相同。

CNAME DNS 记录应将您的域名别名设置为适当的虚拟托管类型主机名。例如，如果存储桶名称和域名是 `images.example.com` 而存储桶位于美国东部（弗吉尼亚北部）区域中，则 CNAME 记录的别名应为 `images.example.com.s3.us-east-1.amazonaws.com`。

```
1. images.example.com CNAME 			images.example.com.s3.us-east-1.amazonaws.com.
```

Amazon S3 使用主机名来确定存储桶名称。所以 CNAME 和存储桶名称必须相同。例如，假定您配置了 `www.example.com` 作为 `www.example.com.s3.us-east-1.amazonaws.com` 的别名记录。当您访问`http://www.example.com`时，Amazon S3 会收到如以下所示的请求：

**Example**  

```
1. GET / HTTP/1.1
2. Host: www.example.com
3. Date: date
4. Authorization: signatureValue
```

Amazon S3 仅查看原始主机名 `www.example.com` 且不知道用于解决请求的 CNAME 映射。

您可以在 CNAME 别名中使用任何 Amazon S3 端点。例如，`s3.ap-southeast-1.amazonaws.com` 可用于 CNAME 别名中。有关端点的更多信息，请参阅《Amazon S3 API Reference》**中的 [Request endpoints](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTAPI.html)。要使用自定义域创建静态网站，请参阅[教程：使用注册到 Route 53 的自定义域配置静态网站](website-hosting-custom-domain-walkthrough.md)。

**重要**  
将自定义 URL 与 CNAME 结合使用时，您需要确保对于您配置的任何 CNAME 或别名记录都存在匹配的桶。例如，如果您为 `www.example.com` 和 `login.example.com` 创建 DNS 条目以使用 S3 发布 Web 内容，将需要同时创建两个桶 `www.example.com` 和 `login.example.com`。  
当 CNAME 或别名记录配置为指向没有匹配桶的 S3 端点时，任何 AWS 用户都可以创建该桶并在配置的别名下发布内容，即使拥有权不同也是如此。  
出于同样的原因，我们建议您在删除桶时更改或移除相应的 CNAME 或别名。

## 如何将主机名与 Amazon S3 桶关联
<a name="VirtualHostingCustomURLsHowTo"></a>

**使用 CNAME 将主机名与 Amazon S3 桶关联**

1. 选择属于您控制的域的主机名。

   本示例使用 `images` 域的 `example.com` 子域。

1. 创建与主机名匹配的存储桶。

   在本示例中，主机名和存储桶名称是 `images.example.com`。存储桶名称必须与主机名*精确* 匹配。

1. 创建一条 CNAME DNS 记录，它将主机名定义为 Amazon S3 桶的别名。

   例如：

   `images.example.com CNAME images.example.com.s3.us-west-2.amazonaws.com`
**重要**  
出于请求路由原因，CNAME DNS 记录必须严格按照上述示例所示进行定义。否则，它可能显示为正常运行，但将最终导致不可预测的行为。

   配置 CNAME DNS 记录的过程取决于您的 DNS 服务器或 DNS 提供商。有关特定信息，请参阅您的服务器文档或与您的供应商联系。

## 限制
<a name="VirtualHostingLimitations"></a>

 Amazon S3 的 SOAP API 不适用于新客户，并将于 2025 年 8 月 31 日接近使用寿命终止（EOL）。我们建议您使用 REST API 或 AWS 开发工具包。

## 向后兼容性
<a name="VirtualHostingBackwardsCompatibility"></a>

以下各节介绍了 Amazon S3 向后兼容性的各个方面，这些方面与路径类型和虚拟托管类型 URL 请求相关。

### 传统终端节点
<a name="s3-legacy-endpoints"></a>

某些区域支持传统终端节点。您可能会在服务器访问日志或 AWS CloudTrail 日志中看到这些端点。有关更多信息，请查看以下信息。有关 Amazon S3 区域和端点的完整列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon S3 端点和限额](https://docs.aws.amazon.com/general/latest/gr/s3.html)。

**重要**  
尽管您可能会在日志中看到传统终端节点，但我们建议您始终使用标准终端节点语法访问存储桶。  
Amazon S3 虚拟托管类型 URL 使用以下格式：  

```
https://bucket-name.s3.region-code.amazonaws.com/key-name
```
在 Amazon S3 中，路径类型 URL 使用以下格式：  

```
https://s3.region-code.amazonaws.com/bucket-name/key-name
```

#### s3‐区域
<a name="s3-dash-region"></a>

一些较旧的 Amazon S3 区域支持在 `s3` 和区域代码之间包含短划线 (`-`) 而不是点（例如 `s3.us-west-2`）的端点（例如 `s3‐us-west-2`）。如果您的存储桶位于这些区域之一，您可能会在服务器访问日志或 CloudTrail 日志中看到以下终端节点格式：

```
https://bucket-name.s3-region-code.amazonaws.com
```

在此示例中，存储桶名称为 amzn-s3-demo-bucket1，区域为美国西部（俄勒冈）：

```
https://amzn-s3-demo-bucket1.s3-us-west-2.amazonaws.com
```

#### 传统全局端点
<a name="deprecated-global-endpoint"></a>

对于某些区域，可以使用传统全局端点来构建未指定特定于区域的端点的请求。传统全局终端节点如下所示：

```
bucket-name.s3.amazonaws.com
```

在服务器访问日志或 CloudTrail 日志中，您可能会看到使用传统全局终端节点的请求。在此示例中，桶名称为 `amzn-s3-demo-bucket1`，传统全局端点为：

```
https://amzn-s3-demo-bucket1.s3.amazonaws.com
```

**美国东部（弗吉尼亚州北部）的虚拟托管类型请求**  
原定设置情况下，使用传统全局端点发出的请求会转到美国东部（弗吉尼亚州北部）。因此，传统全局终端节点有时用于替代美国东部（弗吉尼亚北部）的区域终端节点。如果您在美国东部（弗吉尼亚州北部）创建桶并使用全局端点，则原定设置情况下，Amazon S3 会将您的请求路由到此区域。

**其他区域的虚拟托管类型请求**  
传统全局端点也用于其他受支持的区域中的虚拟托管类型请求。当您在 2019 年 3 月 20 日之前发布的区域中创建桶并使用传统全局端点时，Amazon S3 将更新 DNS 记录以将请求重新路由到正确的位置，这可能会花费一些时间。同时，将应用原定设置规则，您的虚拟托管类型请求将转到美国东部（弗吉尼亚州北部）区域。然后，Amazon S3 将使用 HTTP 307 临时重定向将它重定向到正确的区域。

对于在 2019 年 3 月 20 日之后发布的区域中的 S3 桶，DNS 服务器不会将您的请求直接路由到您的桶所在的 AWS 区域。它而是会返回 HTTP 400 错误请求错误。有关更多信息，请参阅《Amazon S3 API 参考》**中的 [Making requests](https://docs.aws.amazon.com/AmazonS3/latest/API/MakingRequests.html)。

**路径类型请求**  
对于美国东部（弗吉尼亚州北部）区域，可以将传统全局端点用于路径类型请求。

对于所有其他区域，路径类型语法要求您在尝试访问存储桶时使用特定于区域的终端节点。如果您尝试访问具有传统全局端点的存储桶或与存储桶所在区域的端点不同的其它端点，您会收到 HTTP 响应代码“301 永久重定向”错误和一条消息（指示您资源的正确 URI）。例如，如果您将 `https://s3.amazonaws.com/bucket-name` 用于在美国西部（俄勒冈州）区域创建的存储桶，您将收到“HTTP 301 永久重定向”错误。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1. （可选）在**常规配置**下，您可以选择将现有存储桶的设置复制到新存储桶。如果您不想复制现有存储桶的设置，请跳到下一步。
**注意**  
此选项：  
在 AWS 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 上传对象。
   + **对象编写者**— 该 AWS 账户上传对象拥有该对象，对其拥有完全控制权，并且可以通过 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**（标签）下，您可以选择向存储桶添加标签。利用 AWS 成本分配功能，可以使用存储桶标签来对存储桶的使用计费添加注释。一个标签即为一个键值对，用于表示用户分配给存储桶的标记。有关更多信息，请参阅 [使用成本分配 S3 存储桶标签](CostAllocTagging.md)。

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

1. 要配置**默认加密**，请在**加密类型**下，选择以下选项之一：
   + **具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）**
   + **具有 AWS Key Management Service 密钥的服务器端加密（SSE-KMS）**
   + **具有 AWS Key Management Service（AWS KMS）密钥的双层服务器端加密（DSSE-KMS）**
**重要**  
如果您将 SSE-KMS 或 DSSE-KMS 选项用于默认加密配置，则您将受到 AWS KMS 的每秒请求数（RPS）配额限制。有关 AWS KMS 限额以及如何请求增加限额的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[限额](https://docs.aws.amazon.com/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. 如果您选择了**具有 AWS Key Management Service 密钥的服务器端加密（SSE-KMS）**或**具有 AWS Key Management Service（AWS KMS）密钥的双层服务器端加密（DSSE-KMS）**，请执行以下操作：

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

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

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

   1. 将存储桶配置为使用 SSE-KMS 进行默认加密时，还可以使用 S3 存储桶密钥。S3 存储桶密钥可通过减少从 Amazon S3 到 AWS 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（创建存储桶）**。

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

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

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

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

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

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

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

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

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

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

有关如何创建和测试有效示例的信息，请参阅 [AWS SDK for .NET Version 3 API Reference](https://docs.aws.amazon.com/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 ]

有关如何创建和测试有效示例的信息，请参阅 [AWS SDK for Ruby - Version 3](https://docs.aws.amazon.com/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__
```

------

## 使用 AWS CLI
<a name="creating-bucket-cli"></a>

以下 AWS 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
```

有关更多信息和其它示例，请参阅《AWS 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)。

# 查看 S3 通用存储桶的属性
<a name="view-bucket-properties"></a>

您可以查看您拥有的任何 Amazon S3 存储桶的属性。这些设置包括：
+ **存储桶版本控制**：使用版本控制在一个通用存储桶中保留对象的多个版本。默认情况下，将为新存储桶禁用版本控制。有关启用版本控制的信息，请参阅[在存储桶上启用版本控制](manage-versioning-examples.md)。
+ **标签**：AWS 标签是用于保存元数据的键值对。可以向 Amazon S3 资源（例如存储桶）附加标签。可以在创建资源时为其添加标签，也可以管理现有资源上的标签。您可以使用标签进行成本分配，这样就可以在 AWS 账单与成本管理中按照存储桶标签来跟踪存储成本。您还可以使用标签来实现基于属性的访问权限控制（ABAC），从而根据标签来扩展访问权限以及授予对 S3 资源的访问权限。有关更多信息，请参阅 [将标签与 S3 通用存储桶结合使用](buckets-tagging.md)。
+ **Default encryption (默认加密)** – 启用默认加密可为您提供自动服务器端加密。Amazon S3 会在将对象保存到磁盘之前对其进行加密，并在下载对象时对其进行解密。有关更多信息，请参阅 [为 Amazon S3 存储桶设置默认服务器端加密行为](bucket-encryption.md)。
+ **服务器访问日志记录**：使用服务器访问日志记录详细地记录对通用存储桶发出的各种请求。默认情况下，Amazon S3 不会收集服务器访问日志。有关启用服务器访问日志记录的信息，请参阅[启用 Amazon S3 服务器访问日志记录](enable-server-access-logging.md)。
+ **AWS CloudTrail 数据事件** – 使用 CloudTrail 记录数据事件。默认情况下，跟踪不记录数据事件。记录数据事件将收取额外费用。有关更多信息，请参阅《*AWS CloudTrail 用户指南*》中的[记录数据事件以便跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)。
+ **事件通知**：启用特定的 Amazon S3 通用存储桶事件，以便在每次发生这些事件时向目标发送通知消息。有关更多信息，请参阅 [使用 Amazon S3 控制台启用和配置事件通知](enable-event-notifications.md)。
+ **Transfer acceleration（传输加速）**– 在您的客户端与 S3 存储桶之间实现快速、轻松和安全的远距离文件传输。有关启用传输加速的信息，请参阅[启用和使用 S3 Transfer Acceleration](transfer-acceleration-examples.md)。
+ **Object Lock (对象锁定)** – ​使用 S3 对象锁定在固定的时间段内或无限期地阻止删除或覆盖对象。有关更多信息，请参阅 [使用对象锁定以锁定对象](object-lock.md)。
+ **申请方付款**：如果您希望申请方（而不是通用存储桶拥有者）支付请求和数据传输费用，请启用申请方付款。有关更多信息，请参阅 [使用申请方付款通用存储桶进行存储传输和使用](RequesterPaysBuckets.md)。
+ **Static website hosting (静态网站托管)** – 您可以在 Amazon S3 上托管静态网站。有关更多信息，请参阅 [使用 Amazon S3 托管静态网站](WebsiteHosting.md)。

您可以使用 AWS 管理控制台、AWS CLI 或 AWS SDK 查看存储桶属性

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

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

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

1. 在存储桶列表中，选择要查看其属性的存储桶的名称。

1. 选择**属性**选项卡。

1. 在**属性**页面上，您可以为存储桶配置上述属性。

## 使用 AWS CLI
<a name="view-bucket-properties-cli"></a>

**使用 AWS CLI 查看存储桶属性**  
以下命令展示如何使用 AWS CLI 列出不同的通用存储桶属性。

以下命令返回与存储桶 *amzn-s3-demo-bucket1* 关联的标签集。有关存储桶标签的更多信息，请参阅[使用成本分配 S3 存储桶标签](CostAllocTagging.md)。

```
aws s3api get-bucket-tagging --bucket amzn-s3-demo-bucket1
```

有关更多信息和示例，请参阅《AWS CLI 命令参考》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-tagging.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-tagging.html)。

以下命令返回存储桶 *amzn-s3-demo-bucket1* 的版本控制状态。有关存储桶版本控制的信息，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。

```
aws s3api get-bucket-versioning --bucket amzn-s3-demo-bucket1
```

有关更多信息和示例，请参阅《AWS CLI 命令参考》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-versioning.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-versioning.html)。

以下命令返回存储桶 *amzn-s3-demo-bucket1* 的默认加密配置。默认情况下，所有存储桶都有默认加密配置，该配置使用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）。有关存储桶默认加密的信息，请参阅[为 Amazon S3 存储桶设置默认服务器端加密行为](bucket-encryption.md)。

```
aws s3api get-bucket-encryption --bucket amzn-s3-demo-bucket1
```

有关更多信息和示例，请参阅《AWS CLI 命令参考》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-encryption.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-encryption.html)。

以下命令返回存储桶 *amzn-s3-demo-bucket1* 的通知配置。有关存储桶事件通知的信息，请参阅 [Amazon S3 事件通知](EventNotifications.md)。

```
aws s3api get-bucket-notification-configuration --bucket amzn-s3-demo-bucket1
```

有关更多信息和示例，请参阅《AWS CLI 命令参考》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-notification-configuration.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-notification-configuration.html)。

以下命令返回存储桶 *amzn-s3-demo-bucket1* 的日志记录状态。有关存储桶日志记录的信息，请参阅[使用服务器访问日志记录来记录请求](ServerLogs.md)。

```
aws s3api get-bucket-logging --bucket amzn-s3-demo-bucket1
```

有关更多信息和示例，请参阅 *AWS CLI 命令参考*中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-logging.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-logging.html)。

## 使用 AWS SDK
<a name="view-bucket-properties-sdk"></a>

有关如何使用 AWS SDK 返回通用存储桶属性（例如版本控制、标签等）的示例，请参阅《Amazon S3 API Reference》**中的 [Code examples](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_ListBuckets_section.html)。

有关使用不同 AWS SDK 的一般信息，请参阅《Amazon S3 API 参考》**中的 [Developing with Amazon S3 using the AWS SDKs](https://docs.aws.amazon.com/AmazonS3/latest/API/sdk-general-information-section.html)。

# 列出 Amazon S3 通用存储桶
<a name="list-buckets"></a>

要返回您拥有的通用存储桶的列表，可以使用 [ListBuckets](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.htm)。您可以使用 Amazon S3 控制台、AWS Command Line Interface 或 AWS SDK 来列出存储桶。对于使用 AWS CLI、AWS SDK 和 Amazon S3 REST API 发出的 `ListBuckets` 请求，如果 AWS 账户 采用存储桶的默认服务配额（10000 个存储桶），则将同时支持分页和非分页请求。无论您的账户中有多少存储桶，您都可以创建介于 1 到 10000 个存储桶之间的页面大小来列出所有存储桶。对于分页请求，`ListBuckets` 请求会返回存储桶名称，以及每个存储桶的相应 AWS 区域。以下 AWS Command Line Interface 和 AWS SDK 示例向您展示了如何在 `ListBuckets` 请求中使用分页。请注意，有些 AWS SDK 可以协助进行分页。

**权限**  
要列出所有通用存储桶，您必须拥有 `s3:ListAllMyBuckets` 权限。如果遇到 `HTTP Access Denied (403 Forbidden)` 错误，请参阅[排查 Amazon S3 中的拒绝访问（403 Forbidden）错误](troubleshoot-403-errors.md)。

**重要**  
我们强烈建议仅使用分页 `ListBuckets` 请求。只有设置为默认通用存储桶配额 10000 的 AWS 账户，才支持未分页的 `ListBuckets` 请求。如果您批准的通用存储桶配额超过 10000，则必须发送分页 `ListBuckets` 请求以列出您账户的存储桶。对于通用存储桶配额大于 10000 的 AWS 账户，所有未分页的 `ListBuckets` 请求都将遭拒绝。

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

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

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

1. 在**通用存储桶**选项卡上，您可以看到通用存储桶的列表。

1. 要按名称查找存储桶，请在**按名称查找存储桶**字段中输入存储桶名称。

## 使用 AWS CLI
<a name="access-bucket-example-cli"></a>

要使用 AWS CLI 生成通用存储桶的列表，可以使用 `ls` 或 `list-buckets` 命令。以下示例向您展示了如何创建分页 `list-buckets` 请求和未分页的 `ls` 请求。要使用这些示例，请替换*用户输入占位符*。

**Example – 使用 `ls`（未分页）列出您账户中的所有存储桶**  
以下示例命令将在单个非分页调用中列出您账户中的所有通用存储桶。此调用会返回您账户中所有存储桶的列表（最多 10000 个结果）：  

```
$ aws s3 ls
```
有关更多信息和示例，请参阅[列出存储桶和对象](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-listing-buckets)。  


**Example – 使用 `ls`（分页）列出您账户中的所有存储桶**  
以下示例命令会进行一次或多次分页调用，列出您账户中的所有通用存储桶，每页返回 100 个存储桶：  

```
$ aws s3 ls --page-size 100
```
有关更多信息和示例，请参阅[列出存储桶和对象](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-listing-buckets)。  


**Example – 列出您账户中的所有存储桶（分页）**  
以下示例提供了分页 `list-buckets` 命令，用于列出您账户中的所有通用存储桶。`--max-items` 和 `--page-size` 选项将列出的存储桶数量限制为每页 100 个。  

```
$ aws s3api list-buckets /
    --max-items 100 / 
    --page-size 100
```
如果项目输出的数量 (`--max-items`) 少于基础 API 调用所返回的项目总数，则输出将包含 `starting-token` 参数所指定的延续令牌，您可传递到后续命令以检索下一组项目。以下示例展示了如何使用上一示例返回的 `starting-token` 值。您可以指定 `starting-code` 检索接下来的 100 个存储桶。  

```
$ aws s3api list-buckets / 
    --max-items 100 / 
    --page-size 100 /
    --starting-token eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxfQ==
```


**Example – 列出 AWS 区域中的所有存储桶（分页）**  
以下示例命令使用 `--bucket-region` 参数来列出账户中位于 `us-east-2` 区域的最多 100 个存储桶。不支持向与 `--bucket-region` 参数中指定的值不同的区域端点发出请求。例如，如果您想将响应限制在 `us-east-2` 中的存储桶，则必须向 `us-east-2` 中的端点发出请求。  

```
$ aws s3api list-buckets /
    --region us-east-2 /
    --max-items 100 / 
    --page-size 100 /
    --bucket-region us-east-2
```


**Example – 列出所有以特定存储桶名称前缀开头的存储桶（分页）**  
以下示例命令列出了最多 100 个名称以 *amzn-s3-demo-bucket* 前缀开头的存储桶。  

```
$ aws s3api list-buckets /
    --max-items 100 /
    --page-size 100 /
    --prefix amzn-s3-demo-bucket
```

## 使用 AWS SDK
<a name="access-bucket-example-sdk"></a>

以下示例向您展示如何使用 AWS SDK 来列出通用存储桶。

------
#### [ SDK for Python ]

**Example – ListBuckets 请求（分页）**  

```
import boto3

s3 = boto3.client('s3')
response = s3.list_buckets(MaxBuckets=100)
```

**Example – ListBuckets 响应（分页）**  

```
import boto3

s3 = boto3.client('s3')
response = s3.list_buckets(MaxBuckets=1,ContinuationToken="eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxfQ==EXAMPLE--")
```

------
#### [ SDK for Java ]

有关如何使用适用于 Java 的 AWS SDK 列出存储桶的示例，请参阅《Amazon S3 API Reference》**中的 [List buckets](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_ListBuckets_section.html)。

------
#### [ SDK for Go ]

```
package main
import (
 "context"
 "fmt"
 "log"
 "github.com/aws/aws-sdk-go-v2/aws"
 "github.com/aws/aws-sdk-go-v2/config"
 "github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
 cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-east-2"))
 if err != nil {
  log.Fatal(err)
 }
 client := s3.NewFromConfig(cfg)
 maxBuckets := 1000
 resp, err := client.ListBuckets(context.TODO(), management portals3.ListBucketsInput{MaxBuckets: aws.Int32(int32(maxBuckets))})
 if err != nil {
  log.Fatal(err)
 }
 fmt.Println("S3 Buckets:")
 for _, bucket := range resp.Buckets {
     fmt.Println("- Name:", *bucket.Name)
     fmt.Println("-BucketRegion", *bucket.BucketRegion)
 }
 fmt.Println(resp.ContinuationToken == nil)
 fmt.Println(resp.Prefix == nil)
}
```

------

# 清空通用存储桶
<a name="empty-bucket"></a>

您可以使用 Amazon S3 控制台、AWS SDK 或 AWS Command Line Interface（AWS CLI）清空通用存储桶的内容。清空通用存储桶时，您将删除所有对象，但会保留存储桶。清空存储桶的操作无法撤消。当正在执行清空存储桶操作时添加到存储桶的对象可能被删除。必须先删除存储桶中的所有对象（包括所有对象版本和删除标记），然后才能删除存储桶本身。

在清空已启用或暂停 S3 版本控制的通用存储桶时，存储桶中的所有对象的所有版本都将被删除。有关更多信息，请参阅 [使用启用版本控制的存储桶中的对象](manage-objects-versioned-bucket.md)。

清空存储桶时，我们建议您同时移除所有未完成的分段上传。您可以使用分段上传将非常大的对象（最大 50TB）分成多个分段上载，以提高吞吐量并更快地从网络问题中恢复。如果分段上传过程未完成，则未完成的分段将保留在桶中（处于不可用状态）。这些未完成的分段将产生存储成本，直到上载过程完成或删除未完成的分段。有关更多信息，请参阅 [在 Amazon S3 中使用分段上传来上传和复制对象](mpuoverview.md)。

作为最佳实践，我们建议配置生命周期规则，使超过特定天数的对象和未完成分段上传过期。当您创建生命周期规则以使未完成分段上传过期时，我们建议以 7 天作为一个良好的起点。有关更多信息，请参阅 [在存储桶上设置 S3 生命周期配置](how-to-set-lifecycle-configuration-intro.md)。

 生命周期到期是一个异步过程，因此规则可能需要花数天时间运行，然后存储桶才能为空。在 Amazon S3 首次运行该规则后，所有符合过期条件的对象都将被标记为删除。您不再为那些标记为删除的对象付费。有关更多信息，请参阅[如何使用生命周期配置规则清空 Amazon S3 存储桶？](https://repost.aws/knowledge-center/s3-empty-bucket-lifecycle-rule)。

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

您可以使用 Amazon S3 控制台来清空通用存储桶，这将删除存储桶中的所有对象，而不删除存储桶。

**清空 S3 存储桶**

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

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

1. 在存储桶列表中，选择要清空的存储桶的名称旁边的选项，然后选择**清空**。

1. 在 **Empty bucket（清空存储桶）**页面上，通过在文本字段中输入存储桶名称来确认要清空存储桶，然后选择 **Empty（清空）**。

1. 在**清空桶：状态**页面上监控桶清空过程的进度。

## 使用 AWS CLI
<a name="empty-bucket-awscli"></a>

仅在存储桶未启用存储桶版本控制时，才可使用 AWS CLI 清空通用存储桶。如果未启用版本控制，您可以将 `rm`（删除）AWS CLI命令与 `--recursive` 参数结合使用来清空存储桶（或删除部分带特定键名前缀的对象）。

以下 `rm` 命令将删除拥有键名前缀 `doc` 的对象，例如，`doc/doc1` 和 `doc/doc2`。

```
$ aws s3 rm s3://bucket-name/doc --recursive
```

使用以下命令删除所有对象，而无需指定前缀。

```
$ aws s3 rm s3://bucket-name --recursive
```

有关更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[将高级别 S3 命令与 AWS CLI 结合使用](https://docs.aws.amazon.com/cli/latest/userguide/using-s3-commands.html)。

**注意**  
您无法从启用了版本控制的存储桶中删除对象。当您删除一个对象时（此命令将执行的操作），Amazon S3 将添加一个删除标记。有关 S3 存储桶版本控制的更多信息，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。

## 使用 AWS 开发工具包
<a name="empty-bucket-awssdks"></a>

您可以使用 AWS SDK 来清空通用存储桶或移除部分拥有特定键名称前缀的对象。

有关如何使用适用于 Java 的 AWS SDK清空存储桶的示例，请参阅[删除通用存储桶](delete-bucket.md)。该代码将删除所有对象（不论存储桶是否启用了版本控制），然后删除存储桶。要只清空存储桶，请确保删除用来删除存储桶的语句。

有关使用其他 AWS SDK 的更多信息，请参阅[用于 Amazon Web Services 的工具](https://aws.amazon.com/tools/)。

## 使用生命周期配置
<a name="empty-bucket-lifecycle"></a>

要清空大型通用存储桶，我们建议您使用 S3 生命周期配置规则。生命周期到期是一个异步过程，因此规则可能需要花数天时间运行，然后才能清空存储桶。在 Amazon S3 首次运行该规则后，所有符合过期条件的对象都将被标记为删除。您不再为那些标记为删除的对象付费。有关更多信息，请参阅[如何使用生命周期配置规则清空 Amazon S3 存储桶？](https://repost.aws/knowledge-center/s3-empty-bucket-lifecycle-rule)。

如果使用生命周期配置清空存储桶，则配置应包括[当前版本、非当前版本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/versioning-workflows.html)、[删除标记](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html)和[未完成的分段上传](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html)。

您可以添加生命周期配置规则，以使所有对象或部分拥有特定键名前缀的对象过期。例如，要删除存储桶中的所有对象，您可以将生命周期规则设置为使对象在创建一天后过期。

Amazon S3 支持一个存储桶生命周期规则，您可以使用该规则停止未在启动后的指定天数内完成的分段上传。我们建议您配置此生命周期规则以最大限度地降低存储成本。有关更多信息，请参阅 [配置存储桶生命周期配置以删除未完成的分段上传](mpu-abort-incomplete-mpu-lifecycle-config.md)。

有关使用生命周期配置清空存储桶的更多信息，请参阅[在存储桶上设置 S3 生命周期配置](how-to-set-lifecycle-configuration-intro.md)和[即将过期的对象](lifecycle-expire-general-considerations.md)。

## 清空配置了 AWS CloudTrail 的通用存储桶
<a name="empty-bucket-cloudtrail"></a>

AWS CloudTrail 跟踪 Amazon S3 通用存储桶中的对象级数据事件，例如删除对象。如果您使用通用存储桶作为记录 CloudTrail 事件的目标并从同一个存储桶中删除对象，则在清空存储桶的同时可能正在创建新对象。为了防止这种情况，请停止 AWS CloudTrail 跟踪。有关让 CloudTrail 跟踪停止记录事件的更多信息，请参阅《AWS CloudTrail 用户指南》**中的[关闭跟踪的日志记录](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-delete-trails-console.html)。

停止将 CloudTrail 跟踪添加到存储桶中的另一种备选方法是：将 `s3:PutObject` 语句添加到存储桶策略中。如果您想稍后在存储桶中存储新对象，则需要删除此拒绝 `s3:PutObject` 语句。有关更多信息，请参阅《IAM 用户指南》**中的 [对象操作](security_iam_service-with-iam.md#using-with-s3-actions-related-to-objects) 和 [IAM JSON 策略元素：效果](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_effect.html)。

# 删除通用存储桶
<a name="delete-bucket"></a>

您可以删除空的 Amazon S3 通用存储桶。有关清空通用存储桶的信息，请参阅[清空通用存储桶](empty-bucket.md)。

可以使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API 删除存储桶。

**重要**  
在删除通用存储桶之前，请注意以下事项：  
**如果删除了存储桶，AWS 无法将其还原。**在删除存储桶之前，请确保您已备份或复制数据。
通用存储桶名称在全局命名空间中是唯一的。**如果您删除共享全局命名空间中的存储桶，请注意，另一个 AWS 账户可以使用相同的通用存储桶名称来表示新存储桶，因此可能会收到针对已删除的存储桶的请求。**如果需要防止出现这种情况，或者如果您希望继续使用相同的存储桶名称，请不要删除该存储桶。我们建议您清空并保留存储桶，同时根据需要阻止任何存储桶请求。对于不再活跃使用的存储桶，我们建议清空存储桶中的所有对象，以最大限度地降低成本，同时保留存储桶本身。
我们建议在您的账户区域命名空间中创建存储桶，以确保只有您的账户才能拥有这些存储桶名称。有关更多信息，请参阅 [通用存储桶的命名空间](gpbucketnamespaces.md)。
删除通用存储桶时，可能不会立即移除存储桶。相反，Amazon S3 会将存储桶排队以等待删除。由于 Amazon S3 分布在各个 AWS 区域中，因此删除过程需要一些时间，才能在整个系统中完全传播并实现一致性。
如果存储桶托管静态网站，并且您如 [教程：使用注册到 Route 53 的自定义域配置静态网站](website-hosting-custom-domain-walkthrough.md) 中所述创建并配置了 Amazon Route 53 托管区域，则必须清理与该存储桶相关的 Route 53 托管区域设置。有关更多信息，请参阅 [步骤 2：删除 Route 53 托管区域](getting-started-cleanup.md#getting-started-cleanup-route53)。
如果存储桶收到来自弹性负载均衡（ELB）的日志数据，建议您先停止将 ELB 日志传输到该存储桶，然后再删除该存储桶。删除该存储桶后，如果其他用户创建使用相同名称的存储桶，则日志数据可能会传输到此同名存储桶。有关 ELB 访问日志的信息，请参阅《User Guide for Classic Load Balancers》**中的 [Access logs for your Classic Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/access-log-collection.html) 和《User Guide for Application Load Balancers》**中的 [Access logs for your Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html)。

**问题排查**  
如果您无法删除 Amazon S3 通用存储桶，请考虑以下事项：
+ **确保存储桶为空**：仅当存储桶中没有任何对象时，才能删除存储桶。确保存储桶为空。有关清空存储桶的信息，请参阅[清空通用存储桶](empty-bucket.md)。
+ **确保没有附加任何接入点**：只有当存储桶在同一个账户中未附加任何 S3 接入点或多区域接入点时，您才能删除存储桶。在删除存储桶之前，请删除附加到该存储桶的任何同账户接入点。
+ **确保您拥有 `s3:DeleteBucket` 权限**：如果您无法删除存储桶，请与 IAM 管理员协作来确认您拥有 `s3:DeleteBucket` 权限。有关如何查看或更新 IAM 权限的信息，请参阅《IAM 用户指南》**中的[更改 IAM 用户的权限](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html)。有关问题排查信息，请参阅[排查 Amazon S3 中的拒绝访问（403 Forbidden）错误](troubleshoot-403-errors.md)。
+ **检查 AWS Organizations 服务控制策略（SCP）和资源控制策略（RCP）中的 `s3:DeleteBucket Deny` 语句**：SCP 和 RCP 可以拒绝对存储桶的删除权限。有关更多信息，请参阅《AWS Organizations User Guide》**中的 [service control policies](https://docs.aws.amazon.com//organizations/latest/userguide/orgs_manage_policies_scps.html) 和 [resource control policies](https://docs.aws.amazon.com//organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **检查存储桶策略中的 `s3:DeleteBucket Deny` 语句**：如果您在 IAM 用户或角色策略中拥有 `s3:DeleteBucket` 权限，但无法删除存储桶，则存储桶策略可能对于 `s3:DeleteBucket` 包含 `Deny` 语句。默认情况下，由 AWS Elastic Beanstalk 创建的存储桶具有包含此语句的策略。您必须先删除此语句或存储桶策略，然后才能删除存储桶。

**先决条件**  
您必须先清空通用存储桶，然后才能删除该存储桶。有关清空存储桶的信息，请参阅[清空通用存储桶](empty-bucket.md)。

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

**删除 S3 存储桶**

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

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

1. 在存储桶列表中，选择要删除的存储桶名称旁边的选项按钮，然后选择页面顶部的**删除**。

1. 在**删除存储桶**页面上，通过在文本字段中输入存储桶名称来确认要删除存储桶，然后选择**删除存储桶**。
**注意**  
如果存储桶包含任何对象，请在删除存储桶之前清空存储桶，具体操作如下：在**此存储桶不为空**错误提醒中选择**清空存储桶**按钮，然后按照**清空存储桶**页面上的说明操作。然后，返回到 **Delete bucket（删除存储桶）**页面并删除存储桶。

1. 要验证您是否已删除存储桶，请打开**通用存储桶**列表，并输入您删除的存储桶的名称。如果无法找到此存储桶，则表示删除成功。

## 使用适用于 Java 的 AWS SDK
<a name="delete-empty-bucket"></a>

要使用适用于 Java 的 AWS SDK 清空和删除通用存储桶，必须先删除通用存储桶中的所有对象，然后删除该存储桶。

有关其它语言的示例，请参阅《Amazon Simple Storage Service API Reference》**中的 [Use DeleteBucket with an AWS SDK or CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_DeleteBucket_section.html)。有关使用其它 AWS SDK 的信息，请参阅[用于 Amazon Web Services 的工具](https://aws.amazon.com/tools/)。

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

要使用适用于 Java 的 AWS SDK 删除包含对象的存储桶，必须先删除所有对象，然后删除该存储桶。这种方法适用于启用版本控制或未启用版本控制的存储桶。

**注意**  
对于未启用版本控制的存储桶，您可以直接删除所有对象，然后删除存储桶。对于启用了版本控制的存储桶，您必须先删除所有对象版本，然后再删除存储桶。

有关如何使用适用于 Java 的 AWS SDK 删除存储桶的示例，请参阅《Amazon S3 API Reference》**中的 [Delete a bucket](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_DeleteBucket_section.html)。

------

## 使用 AWS CLI
<a name="delete-bucket-awscli"></a>

如果包含对象的通用存储桶没有启用版本控制，则可以使用 AWS CLI 删除该存储桶。当您删除一个包含对象的存储桶时，该存储桶中的所有对象都将被永久删除，包括已转换为 S3 Glacier Flexible Retrieval 存储类的对象。

如果存储桶未启用版本控制，则可将 `rb`（移除存储桶）AWS CLI 命令和 `--force` 参数结合使用，来删除存储桶及其中的所有对象。此命令先删除所有对象，然后再删除存储桶。

如果启用了版本控制，则将 `rb` 命令与 `--force` 参数结合使用不会删除受版本控制的对象，因此存储桶删除失败，因为存储桶不为空。有关删除受版本控制的对象的更多信息，请参阅[删除对象版本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjectVersions.html)。

要使用以下命令，请将 `amzn-s3-demo-bucket` 替换为您要删除的存储桶的名称：

```
$ aws s3 rb s3://amzn-s3-demo-bucket --force  
```

有关更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[将高级别 S3 命令与 AWS Command Line Interface结合使用](https://docs.aws.amazon.com/cli/latest/userguide/using-s3-commands.html)。

# 将 Amazon S3 存储桶挂载为本地文件系统
<a name="mountpoint"></a>

适用于 Amazon S3 的 Mountpoint 是一款高吞吐量的开源文件客户端，用于将 Amazon S3 存储桶作为本地文件系统进行挂载。借助 Mountpoint，您的应用程序可以通过文件系统操作（例如打开和读取）访问存储在 Amazon S3 中的对象。Mountpoint 会自动将这些操作转换为 S3 对象 API 调用，让您的应用程序能够通过文件接口访问 Amazon S3 的弹性存储和吞吐量。

适用于 Amazon S3 的 Mountpoint [可用于大规模读取密集型应用程序上的生产用途](https://aws.amazon.com/blogs/aws/mountpoint-for-amazon-s3-generally-available-and-ready-for-production-workloads/)：数据湖、机器学习训练、图像渲染、自动驾驶汽车模拟以及提取、转换、加载（ETL）等。

Mountpoint 支持基本的文件系统操作，并且可以读取最大 50 TB 的文件。它可以列出和读取现有文件，也可以创建新文件。它无法修改现有文件或删除目录，也不支持符号链接或文件锁定。Mountpoint 非常适合具有下列特征的应用程序：不需要共享文件系统的全部功能和 POSIX 风格的权限，但需要 Amazon S3 的弹性吞吐量来读写大型 S3 数据集。有关更多信息，请参阅 GitHub 上的 [Mountpoint file system behavior](https://github.com/awslabs/mountpoint-s3/blob/main/doc/SEMANTICS.md)。对于需要完整 POSIX 支持的工作负载，我们建议使用[适用于 Lustre 的 Amazon FSx](https://aws.amazon.com/fsx/lustre/) 及其 [support for linking Amazon S3 buckets](https://docs.aws.amazon.com/fsx/latest/LustreGuide/create-dra-linked-data-repo.html)。

适用于 Amazon S3 的 Mountpoint 仅适用于 Linux 操作系统。您可以使用 Mountpoint 访问所有存储类中的 S3 对象，但 S3 Glacier Flexible Retrieval、S3 Glacier Deep Archive、S3 Intelligent-Tiering Archive Access Tier 和 S3 Intelligent-Tiering Deep Archive Access Tier 除外。

**Topics**
+ [安装 Mountpoint](mountpoint-installation.md)
+ [配置和使用 Mountpoint](mountpoint-usage.md)
+ [Mountpoint 故障排除](mountpoint-troubleshooting.md)

# 安装 Mountpoint
<a name="mountpoint-installation"></a>

您可以使用命令行下载和安装适用于 Amazon S3 的 Mountpoint 的预构建程序包。根据您正在使用哪个 Linux 操作系统，下载和安装 Mountpoint 的说明会有所不同。

**Topics**
+ [Amazon Linux 2023（AL2023）](#mountpoint-install-al2023)
+ [其他基于 RPM 的发行版（Amazon Linux 2、Fedora、CentOS、RHEL）](#mountpoint-install-rpm)
+ [基于 DEB 的发行版（Debian、Ubuntu）](#mountpoint.install.deb)
+ [其他 Linux 发行版](#mountpoint-install-other)
+ [验证适用于 Amazon S3 的 Mountpoint 程序包的签名](#mountpoint-install-verify)

## Amazon Linux 2023（AL2023）
<a name="mountpoint-install-al2023"></a>

自 AL2023 版本 2023.9.20251110 起，Mountpoint 直接在 Amazon Linux 2023 存储库中提供。

1. 可输入以下命令进行安装：

   ```
   sudo dnf install mount-s3
   ```

1. 验证适用于 Amazon S3 的 Mountpoint 是否已成功安装：

   ```
   mount-s3 --version
   ```

   您应该可以看到类似于如下所示的输出内容：

   ```
   mount-s3 1.21.0+1.amzn2023
   ```

## 其他基于 RPM 的发行版（Amazon Linux 2、Fedora、CentOS、RHEL）
<a name="mountpoint-install-rpm"></a>

1. 复制您的架构的以下下载网址。

   *x86\$164*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm
   ```

   *ARM64 (Graviton)*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/arm64/mount-s3.rpm
   ```

1. 下载适用于 Amazon S3 的 Mountpoint 程序包。将 `download-link` 替换为上一步中的相应下载 URL。

   ```
   wget download-link
   ```

1. （可选）验证已下载文件的真实性和完整性。首先，复制适用于您的架构的签名 URL。

   *x86\$164*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm.asc
   ```

   *ARM64 (Graviton)*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/arm64/mount-s3.rpm.asc
   ```

   接下来，请参阅[验证适用于 Amazon S3 的 Mountpoint 程序包的签名](#mountpoint-install-verify)。

1. 使用以下命令安装此程序包：

   ```
   sudo yum install ./mount-s3.rpm
   ```

1. 输入以下命令，验证 Mountpoint 是否已成功安装：

   ```
   mount-s3 --version
   ```

   您应该可以看到类似于如下所示的输出内容：

   ```
   mount-s3 1.21.0
   ```

## 基于 DEB 的发行版（Debian、Ubuntu）
<a name="mountpoint.install.deb"></a>

1. 复制您的架构的下载网址。

   *x86\$164*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.deb
   ```

   *ARM64 (Graviton)*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/arm64/mount-s3.deb
   ```

1. 下载适用于 Amazon S3 的 Mountpoint 程序包。将 `download-link` 替换为上一步中的相应下载 URL。

   ```
   wget download-link
   ```

1. （可选）验证已下载文件的真实性和完整性。首先，复制您的架构的签名 URL。

   *x86\$164*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.deb.asc
   ```

   *ARM64 (Graviton)*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/arm64/mount-s3.deb.asc
   ```

   接下来，请参阅[验证适用于 Amazon S3 的 Mountpoint 程序包的签名](#mountpoint-install-verify)。

1. 使用以下命令安装此程序包：

   ```
   sudo apt-get install ./mount-s3.deb
   ```

1. 运行以下命令，验证适用于 Amazon S3 的 Mountpoint 是否已成功安装：

   ```
   mount-s3 --version
   ```

   您应该可以看到类似于如下所示的输出内容：

   ```
   mount-s3 1.21.0
   ```

## 其他 Linux 发行版
<a name="mountpoint-install-other"></a>

1. 请查阅您的操作系统文档以安装必需的 `FUSE` 和 `libfuse2` 程序包。

1. 复制您的架构的下载网址。

   *x86\$164*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.tar.gz
   ```

   *ARM64 (Graviton)*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/arm64/mount-s3.tar.gz
   ```

1. 下载适用于 Amazon S3 的 Mountpoint 程序包。将 `download-link` 替换为上一步中的相应下载 URL。

   ```
   wget download-link
   ```

1. （可选）验证已下载文件的真实性和完整性。首先，复制您的架构的签名 URL。

   *x86\$164*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.tar.gz.asc
   ```

   *ARM64 (Graviton)*:

   ```
   https://s3.amazonaws.com/mountpoint-s3-release/latest/arm64/mount-s3.tar.gz.asc
   ```

   接下来，请参阅[验证适用于 Amazon S3 的 Mountpoint 程序包的签名](#mountpoint-install-verify)。

1. 使用以下命令安装此程序包：

   ```
   sudo mkdir -p /opt/aws/mountpoint-s3 && sudo tar -C /opt/aws/mountpoint-s3 -xzf ./mount-s3.tar.gz
   ```

1. 将 `mount-s3` 二进制文件添加到您的 `PATH` 环境变量。在您的 `$HOME/.profile` 文件中，附加下面一行：

   ```
   export PATH=$PATH:/opt/aws/mountpoint-s3/bin
   ```

   保存 `.profile` 文件，并运行以下命令：

   ```
   source $HOME/.profile
   ```

1. 运行以下命令，验证适用于 Amazon S3 的 Mountpoint 是否已成功安装：

   ```
   mount-s3 --version
   ```

   您应该可以看到类似于如下所示的输出内容：

   ```
   mount-s3 1.21.0
   ```

## 验证适用于 Amazon S3 的 Mountpoint 程序包的签名
<a name="mountpoint-install-verify"></a><a name="verify"></a>

1. 安装 GnuPG（`gpg` 命令）。需要验证所下载的适用于 Amazon S3 的 Mountpoint 程序包的真实性和完整性。默认情况下，GnuPG 安装在 Amazon Linux 亚马逊机器映像（AMI）上。安装 GnuPG 之后，继续执行步骤 2。

1. 通过运行以下命令下载 Mountpoint 公有密钥：

   ```
   wget https://s3.amazonaws.com/mountpoint-s3-release/public_keys/KEYS
   ```

1. 通过运行以下命令将 Mountpoint 公有密钥导入到您的密钥环中：

   ```
   gpg --import KEYS
   ```

1. 通过运行以下命令验证 Mountpoint 公有密钥的指纹：

   ```
   gpg --fingerprint mountpoint-s3@amazon.com
   ```

   确认显示的指纹字符串与以下内容相匹配：

   ```
   673F E406 1506 BB46 9A0E  F857 BE39 7A52 B086 DA5A
   ```

   如果指纹字符串不匹配，请不要完成安装 Mountpoint 并联系 [AWS 支持](https://aws.amazon.com/premiumsupport/)。

1. 下载软件包签名文件。将 `signature-link` 替换为前面各节中的相应签名链接。

   ```
   wget signature-link
   ```

1. 通过运行以下命令验证下载的程序包的签名。将 `signature-filename` 替换为上一步中的文件名。

   ```
   gpg --verify signature-filename
   ```

   例如，在基于 RPM 的发行版（包括 Amazon Linux）上，运行以下命令：

   ```
   gpg --verify mount-s3.rpm.asc
   ```

1. 输出应包含短语 `Good signature`。如果输出包含短语 `BAD signature`，请重新下载 Mountpoint 程序包文件并重复这些步骤。如果问题仍然存在，请不要完成 Mountpoint 的安装并联系 [AWS 支持](https://aws.amazon.com/premiumsupport/)。

   输出可能包括有关可信签名的警告。这并不表示存在问题。这仅表示您尚未独立验证 Mountpoint 公有密钥。

# 配置和使用 Mountpoint
<a name="mountpoint-usage"></a>

要使用适用于 Amazon S3 的 Mountpoint，您的主机需要有效的 AWS 凭证，有权访问您要挂载的一个或多个 Amazon S3 存储桶。有关不同的身份验证方式，请参阅 GitHub 上的 Mountpoint [AWS 凭证](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md#aws-credentials)。

例如，您可以创建一个新的 AWS Identity and Access Management（IAM）用户和角色用于此目的。请确保此角色有权访问您要挂载的一个或多个存储桶。您可以通过实例配置文件[将 IAM 角色传递](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)给您的 Amazon EC2 实例。

**Topics**
+ [使用适用于 Amazon S3 的 Mountpoint](#using-mountpoint)
+ [在 Mountpoint 中配置缓存](#mountpoint-caching)

## 使用适用于 Amazon S3 的 Mountpoint
<a name="using-mountpoint"></a>

使用适用于 Amazon S3 的 Mountpoint 执行以下操作：

1. 挂载 Amazon S3 存储桶。

   1. 您可以使用 `mount-s3` 命令手动挂载 Amazon S3 存储桶。

      在下面的示例中，将 `amzn-s3-demo-bucket` 替换为 S3 存储桶的名称，并将 `~/mnt` 替换为主机上您希望在其中挂载 S3 存储桶的目录。

      ```
      mkdir ~/mnt
      mount-s3 amzn-s3-demo-bucket ~/mnt
      ```

      由于 Mountpoint 客户端默认情况下在后台运行，因此 `~/mnt` 目录现在支持您访问 Amazon S3 存储桶中的对象。

   1. 或者，从 Mountpoint v1.18 起，您可以配置在实例启动或重启时自动挂载 Amazon S3 存储桶。

      对于现有或正在运行的 Amazon EC2 实例，请在 Linux 系统的 `/etc/fstab` 目录中找到 `fstab` 文件。然后，向 `fstab` 文件中添加一行。例如，要使用前缀 `example-prefix/` 将 *amzn-s3-demo-bucket* 挂载到系统路径 `/mnt/mountpoint`，请参阅以下内容。要使用以下示例，请将*用户输入占位符* 替换为您自己的信息。

      ```
      s3://amzn-s3-demo-bucket/example-prefix/ /mnt/mountpoint mount-s3 _netdev,nosuid,nodev,nofail,rw 0 0
      ```

      有关示例中使用的选项的解释，请参阅下表。    
<a name="auto-mount-commands"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/mountpoint-usage.html)

      对于新的 Amazon EC2 实例，您可以修改 Amazon EC2 模板上的用户数据，并按如下方式设置 `fstab` 文件。要使用以下示例，请将*用户输入占位符* 替换为您自己的信息。

      ```
      #!/bin/bash -e
      MP_RPM=$(mktemp --suffix=.rpm)
      curl https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm > $MP_RPM
      yum install -y $MP_RPM
      rm $MP_RPM
      
      MNT_PATH=/mnt/mountpoint
      echo "s3://amzn-s3-demo-bucket/ ${MNT_PATH} mount-s3 _netdev,nosuid,nodev,rw,allow-other,nofail" >> /etc/fstab
      mkdir $MNT_PATH
      
      systemctl daemon-reload
      mount -a
      ```

1. 通过 Mountpoint 访问 Amazon S3 存储桶中的对象。

   在本地挂载存储桶后，您可以使用常用的 Linux 命令（例如 `cat` 或 `ls`）来处理您的 S3 对象。适用于 Amazon S3 的 Mountpoint 通过以正斜杠 (`/`) 字符为界拆分 Amazon S3 存储桶中的密钥，将这些密钥解释为文件系统路径。例如，如果您的存储桶中有对象密钥 `Data/2023-01-01.csv`，那么您的 Mountpoint 文件系统中将有一个名为 `Data` 的目录，其中有一个名称为 `2023-01-01.csv` 的文件。

   适用于 Amazon S3 的 Mountpoint 特意不实现文件系统的完整 [POSIX](https://en.wikipedia.org/wiki/POSIX) 标准规范。Mountpoint 针对以下工作负载进行了优化：此类工作负载需要通过文件系统接口对存储在 Amazon S3 中的数据进行高吞吐量读写访问，但不依赖文件系统功能。有关更多信息，请参阅 GitHub 上的适用于 Amazon S3 的 Mountpoint 的[文件系统行为](https://github.com/awslabs/mountpoint-s3/blob/main/doc/SEMANTICS.md)。需要更丰富的文件系统语义的客户应该考虑其他 AWS 文件服务，例如 [Amazon Elastic File System（Amazon EFS）](https://aws.amazon.com/efs/)或 [Amazon FSx](https://aws.amazon.com/fsx/)。

   

1. 使用 `umount` 命令卸载 Amazon S3 存储桶。此命令卸载您的 S3 存储桶并退出 Mountpoint。

   要使用以下示例命令，请将 `~/mnt` 替换为主机上挂载 S3 存储桶的目录。

   ```
   umount ~/mnt
   ```
**注意**  
要获取此命令的选项列表，请运行 `umount --help`。

有关其它 Mountpoint 配置详细信息，请参阅 GitHub 上的 [Amazon S3 bucket configuration](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md#s3-bucket-configuration) 和 [file system configuration](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md#file-system-configuration)。

## 在 Mountpoint 中配置缓存
<a name="mountpoint-caching"></a>

适用于 Amazon S3 的 Mountpoint 支持不同类型的数据缓存。要加快重复读取请求的速度，您可以选择以下选项：
+ **本地缓存** – 您可以在 Amazon EC2 实例存储或 Amazon Elastic Block Store 卷中使用本地缓存。如果您重复从同一个计算实例读取相同的数据，并且本地实例存储中有未使用的空间用于存放重复读取的数据集，则应该选择使用本地缓存。
+ **共享缓存** – 您可以在 S3 Express One Zone 上使用共享缓存。如果您重复读取多个计算实例中的小对象，或者您不知道重复读取的数据集的大小并希望从弹性缓存大小中受益，则应选择使用共享缓存。选择该选项后，Mountpoint 会在使用 S3 Express One Zone 的目录存储桶中，保留大小不超过一兆字节的对象。
+ **合并本地缓存和共享缓存** – 如果您的本地缓存中有未使用的空间，但又想在多个实例之间共享缓存，则可以选择同时使用本地缓存和共享缓存。

在 Mountpoint 中缓存非常适合重复读取相同数据的使用场景，这些数据在多次读取期间不会发生更改。例如，可以将缓存用于需要多次读取训练数据集的机器学习训练作业，以提高模型精度。

有关如何在 Mountpoint 中配置缓存的更多信息，请参阅以下示例。

**Topics**
+ [本地缓存](#local-cache-example)
+ [共享缓存](#shared-cache-example)
+ [合并本地缓存和共享缓存](#shared-local-cache-example)

### 本地缓存
<a name="local-cache-example"></a>

您可以利用 `--cache CACHE_PATH` 标志选择使用本地缓存。在以下示例中，将 *`CACHE_PATH`* 替换为要在其中缓存数据的目录的文件路径。将 *`amzn-s3-demo-bucket`* 替换为 Amazon S3 存储桶的名称，并将 *`~/mnt`* 替换为主机上您希望在其中挂载 S3 存储桶的目录。

```
mkdir ~/mnt
mount-s3 --cache CACHE_PATH amzn-s3-demo-bucket ~/mnt
```

如果您在挂载 Amazon S3 存储桶时选择使用本地缓存，Mountpoint 会在所配置的缓存位置创建一个空的子目录（如果该子目录尚不存在）。首次挂载存储桶以及卸载存储桶时，Mountpoint 会删除本地缓存的内容。

**重要**  
如果启用本地缓存，Mountpoint 会将挂载的 Amazon S3 存储桶中的未加密对象内容，持久保存在挂载时提供的本地缓存位置。为了保护您的数据，您应使用文件系统访问控制机制，限制对数据缓存位置的访问。

### 共享缓存
<a name="shared-cache-example"></a>

如果您重复读取多个计算实例中的小对象（最大 1 MB），或者重复读取的数据集大小通常超过本地缓存的大小，则应在 [S3 Express One Zone](https://aws.amazon.com/s3/storage-classes/express-one-zone/) 中使用共享缓存。当您从多个实例重复读取相同的数据时，这样可以避免向挂载的 Amazon S3 存储桶发出冗余请求，从而缩短延迟。

选择使用共享缓存后，您需要为缓存在您的 S3 Express One Zone 目录存储桶中的数据付费。您还需要为针对您在 S3 Express One Zone 目录存储桶中存储的数据发出的请求付费。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。Mountpoint 从不删除目录存储桶中的缓存对象。要管理存储成本，您应该[在目录存储桶上设置生命周期策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-lifecycle.html)，以便在您指定的时间段后，Amazon S3 可使 S3 Express One Zone 中的缓存数据过期。有关更多信息，请参阅 GitHub 上的 [Mountpoint for Amazon S3 caching configuration](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md#caching-configuration)。

要在将 Amazon S3 存储桶挂载到计算实例时选择在 S3 Express One Zone 中进行缓存，请使用 `--cache-xz` 标志并将目录存储桶指定为缓存位置。在以下示例中，替换*用户输入占位符*。

```
mount-s3 amzn-s3-demo-bucket ~/mnt --cache-xz amzn-s3-demo-bucket--usw2-az1--x-s3
```

### 合并本地缓存和共享缓存
<a name="shared-local-cache-example"></a>

如果您的实例上有未使用的空间，但又想在多个实例之间使用共享缓存，则可以选择同时使用本地缓存和共享缓存。使用此缓存配置，当所需数据缓存在本地存储中时，您可以避免从同一实例向目录存储桶中的共享缓存发送冗余读取请求。这可以降低请求成本并提高性能。

 要在挂载 Amazon S3 存储桶时同时选择使用本地缓存和共享缓存，请使用 `--cache` 和 `--cache-xz` 标志来指定这两个缓存位置。要利用以下示例来选择同时使用本地缓存和共享缓存，请替换*用户输入占位符*。

```
mount -s3 amzn-s3-demo-bucket ~/mnt --cache /path/to/mountpoint/cache --cache -xz amzn-s3-demo-bucket--usw2-az1--x-s3
```

有关更多信息，请参阅 GitHub 上的 [Mountpoint for Amazon S3 caching configuration](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md#caching-configuration)。

**重要**  
如果您启用共享缓存，Mountpoint 会将对象内容从挂载的 Amazon S3 存储桶复制到您作为共享缓存位置提供的 S3 目录存储桶中，从而使任何有权访问 S3 目录存储桶的调用方都可以访问这些内容。要保护缓存的数据，您应遵循 [Amazon S3 的安全最佳实践](security-best-practices.md)以确保存储桶使用了正确的策略，并且不是公开可访问的。您应该使用专用于 Mountpoint 共享缓存的目录存储桶，并仅向 Mountpoint 客户端授予访问权限。

# Mountpoint 故障排除
<a name="mountpoint-troubleshooting"></a>

适用于 Amazon S3 的 Mountpoint 由 支持 提供支持。如果您需要帮助，请联系 [AWS 支持 中心](https://console.aws.amazon.com/support/home#/)。

您也可以在 GitHub 上查看并提交 Mountpoint [问题](https://github.com/awslabs/mountpoint-s3/issues)。

如果您在该项目中发现潜在的安全问题，我们要求您通过我们的[漏洞报告页面](https://aws.amazon.com/security/vulnerability-reporting/)通知 AWS 安全部门。不要创建公开的 GitHub 问题。

如果您的应用程序在使用 Mountpoint 时出现异常行为，则可以检查日志信息以诊断问题。

**日志记录**

默认情况下，Mountpoint 会将高严重性日志信息发送到 [https://datatracker.ietf.org/doc/html/rfc5424](https://datatracker.ietf.org/doc/html/rfc5424)。

要查看最新的 Linux 发行版（包括 Amazon Linux）上的日志，请运行以下 `journald` 命令：

```
journalctl -e SYSLOG_IDENTIFIER=mount-s3
```

在其他 Linux 系统上，`syslog` 条目很可能写入到文件（例如 `/var/log/syslog`）中。

您可以使用这些日志对应用程序进行故障排除。例如，如果您的应用程序尝试覆盖现有文件，操作将失败，并且您将在日志中看到类似于以下内容的行：

```
[WARN] open{req=12 ino=2}: mountpoint_s3::fuse: open failed: inode error: inode 2 (full key "README.md") is not writable
```

有关更多信息，请参阅 GitHub 上的适用于 Amazon S3 的 Mountpoint 的[日志记录](https://github.com/awslabs/mountpoint-s3/blob/main/doc/LOGGING.md)。

# 使用适用于 Amazon S3 的存储浏览器
<a name="storage-browser"></a>

[适用于 S3 的存储浏览器](https://aws.amazon.com/s3/features/storage-browser/)是一个开源组件，您可以将其添加到 Web 应用程序中，为您的最终用户提供存储在 Amazon S3 中的数据的简单图形界面。借助适用于 S3 的存储浏览器，您可以为经授权的最终用户提供直接从您自己的应用程序浏览、下载、上传、复制和删除 S3 中数据的权限。

适用于 S3 的存储浏览器支持对文件执行以下操作：`LIST`、`GET`、`PUT`、`COPY`、`UPLOAD` 和 `DELETE`。为了提供高吞吐量数据传输，适用于 S3 的存储浏览器仅显示您的最终用户获得授权可访问的数据并优化上传请求。存储浏览器还可以优化性能来缩短加载时间，计算最终用户上传的数据的校验和，并在确认您的数据完整性已通过公共互联网维护（传输中）后接受对象。您可以使用 AWS 安全和身份服务或您自己的托管式服务，根据最终用户的身份控制对数据的访问权限。还可以自定义存储浏览器，使其与现有应用程序的设计和品牌相匹配。

适用于 S3 的存储浏览器仅适用于 React 框架上的 Web 应用程序和内联网应用程序。可以使用存储浏览器访问所有存储类中的 Amazon S3 对象，但 S3 Glacier Flexible Retrieval、S3 Glacier Deep Archive、S3 Intelligent-Tiering Archive Access 层和 S3 Intelligent-Tiering Deep Archive Access 层除外。

适用于 S3 的存储浏览器可与 [AWS Amplify React](https://ui.docs.amplify.aws/) 库中的 Web 应用程序结合使用。有关存储浏览器的更多信息，请参阅[适用于 S3 的存储浏览器](https://aws.amazon.com/s3/features/storage-browser/)。

**Topics**
+ [使用适用于 S3 的存储浏览器](using-storagebrowser.md)
+ [安装适用于 S3 的存储浏览器](installing-storagebrowser.md)
+ [设置适用于 S3 的存储浏览器](setup-storagebrowser.md)
+ [配置适用于 S3 的存储浏览器](s3config-storagebrowser.md)
+ [适用于 S3 的存储浏览器故障排除](troubleshooting-storagebrowser.md)

# 使用适用于 S3 的存储浏览器
<a name="using-storagebrowser"></a>

在适用于 S3 的存储浏览器中，*位置*是 S3 通用存储桶或前缀，您可以使用 [S3 访问权限管控](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants.html)、IAM 策略或您自己的托管式授权服务向最终用户授予访问权限。在您授权最终用户访问特定位置后，他们可以处理该位置内的任何数据。

适用于 S3 的存储浏览器用户界面有四个主要视图：
+ **主页：**主页列出了您的用户可以访问的 S3 位置，以及您对每个位置的权限。这是用户的初始视图，它显示了最终用户有权访问的根级 S3 资源以及对每个 S3 位置的权限（READ/WRITE/READWRITE）。
+ **位置详细信息：**此视图可让用户浏览 S3 中的文件和文件夹，以及上传或下载文件。（请注意，在适用于 S3 的存储浏览器中，*对象* 称为文件，*前缀* 和*存储桶* 称为文件夹。）
+ **位置操作：**用户在存储浏览器中选择操作（例如**上传**）后，它会打开文件位置的另一个视图。
+ **垂直省略号：**垂直省略号图标可打开操作的下拉列表。

使用适用于 S3 的存储浏览器时，请注意以下限制：
+ 不支持以句点（.）开头或结尾的文件夹。
+ 不支持具有仅 WRITE 权限的 S3 访问权限管控。
+ 适用于 S3 的存储浏览器对于大小不超过 160 GB 的文件支持 `PUT` 操作。
+ 适用于 S3 的存储浏览器对于小于 5 GB 的文件仅支持 `COPY` 操作。如果文件大小超过 5 GB，存储浏览器将使请求失败。

# 安装适用于 S3 的存储浏览器
<a name="installing-storagebrowser"></a>

开始使用存储浏览器的最快方法是在 GitHub 上克隆示例项目之一。这些示例项目有助于您部署适用于存储浏览器的生产就绪型 Web 应用程序，其中包含适用于 AWS Identity and Access Management 的 AWS 服务的预设集成，因此您可以快速将获得授权的终端用户连接到 S3 中的数据。

有关更多信息，请参阅《Amplify Dev Center》**中的 [Quick start](https://ui.docs.amplify.aws/react/connected-components/storage/storage-browser#quick-start)。

## 从 GitHub 安装适用于 S3 的存储浏览器
<a name="install-storagebrowser-dependencies"></a>

或者，您可以从 [https://github.com/aws-amplify](https://github.com/aws-amplify) GitHub 存储库中最新版本的 `aws-amplify/ui-react-storage` 和 `aws-amplify` 软件包安装适用于 S3 的存储浏览器，以便开始将存储浏览器集成到现有应用程序中。安装适用于 S3 的存储浏览器时，请务必将以下依赖项添加到您的 `package.json` 文件中：

```
"dependencies": {
    "aws-amplify/ui-react-storage": "latest",
    "aws-amplify": "latest",
  }
```

或者，您可以使用 Node Package Manager（NPM）添加依赖项：

```
npm i --save @aws-amplify/ui-react-storage aws-amplify
```

# 设置适用于 S3 的存储浏览器
<a name="setup-storagebrowser"></a>

要将最终用户与 Amazon S3 *位置* 相连，您必须先设置身份验证和授权方法。使用存储浏览器设置身份验证和授权方法有三种方法：
+ [方法 1：管理客户和第三方合作伙伴的数据访问权限](#setup-storagebrowser-method1)
+ [方法 2：管理您 AWS 账户的 IAM 主体的数据访问权限](#setup-storagebrowser-method2)
+ [方法 3：大规模管理数据访问权限](#setup-storagebrowser-method3)

## 方法 1：管理客户和第三方合作伙伴的数据访问权限
<a name="setup-storagebrowser-method1"></a>

使用此方法，您可以使用 [AWS Amplify Auth](https://docs.amplify.aws/react/build-a-backend/auth/set-up-auth/) 来管理文件的访问控制和安全性。当您想将客户或第三方合作伙伴与 S3 中的数据相连时，此方法非常适合。使用此选项，您的客户可以使用社交或企业身份提供者进行身份验证。

您可以将 AWS Amplify Auth 与配置为使用 Amplify Storage 的 S3 存储桶结合使用，来向最终用户和第三方合作伙伴提供 IAM 凭证。AWS AmplifyAuth 建立在 [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) 的基础上，Amazon Cognito 是一项完全托管式客户身份和访问管理服务，其中，您可以通过内置的用户目录或企业目录或使用者身份提供者对用户进行身份验证和授权。Amplify 授权模型定义了当前经过身份验证的用户可以访问哪些前缀。有关如何为 AWS Amplify 设置授权的更多信息，请参阅 [Set up storage](https://docs.amplify.aws/react/build-a-backend/storage/set-up-storage/)。

要使用 Amplify 身份验证和存储方法初始化组件，请将以下代码段添加到您的 Web 应用程序中：

```
import {
  createAmplifyAuthAdapter,
  createStorageBrowser,
} from '@aws-amplify/ui-react-storage/browser';
import "@aws-amplify/ui-react-storage/styles.css";

import config from './amplify_outputs.json';

Amplify.configure(config);

export const { StorageBrowser } = createStorageBrowser({
  config: createAmplifyAuthAdapter(),
});
```

## 方法 2：管理您 AWS 账户的 IAM 主体的数据访问权限
<a name="setup-storagebrowser-method2"></a>

如果您想直接管理 IAM 主体或您 AWS 账户的访问权限，则可以创建一个有权调用 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetDataAccess.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetDataAccess.html) S3 API 操作的 IAM 角色。要进行此设置，您必须创建一个 S3 访问权限管控实例，来将 S3 通用存储桶和前缀的权限映射到指定的 IAM 身份。然后，存储浏览器组件（必须在获取 IAM 凭证后在客户端上调用此组件）将调用 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListCallerAccessGrants.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListCallerAccessGrants.html) S3 API 操作，来获取对身份请求者的可用授权，并在组件中填充位置。在您获得 `s3:GetDataAccess` 权限后，存储浏览器组件将使用这些凭证来请求对 S3 的数据访问权限。

```
import {
  createManagedAuthAdapter,
  createStorageBrowser,
} from '@aws-amplify/ui-react-storage/browser';
import "@aws-amplify/ui-react-storage/styles.css";

export const { StorageBrowser } = createStorageBrowser({
  config: createManagedAuthAdapter({
    credentialsProvider: async (options?: { forceRefresh?: boolean }) => {
      // return your credentials object
      return {
        credentials: {
          accessKeyId: 'my-access-key-id',
          secretAccessKey: 'my-secret-access-key',
          sessionToken: 'my-session-token',
          expiration: new Date()
        },
      }
    },
    // AWS `region` and `accountId`
    region: '',
    accountId: '',
    // call `onAuthStateChange` when end user auth state changes 
    // to clear sensitive data from the `StorageBrowser` state
    registerAuthListener: (onAuthStateChange) => {},
  })
});
```

## 方法 3：大规模管理数据访问权限
<a name="setup-storagebrowser-method3"></a>

如果您想将 [S3 访问权限管控](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants.html)实例与 IAM Identity Center 关联，以获得更具可扩展性的解决方案（例如向整个公司提供数据访问权限），则可以代表当前经过身份验证的用户从 Amazon S3 请求数据。例如，您可以向公司目录中的用户组授予访问 S3 中数据的权限。这种方法可让您集中管理用户和组的 S3 访问权限管控权限，包括托管在外部提供商（例如 Microsoft Entra、Okta 等）上的用户和组的权限。

使用此方法时，[integration with the IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html) 可让您使用现有的用户目录。IAM Identity Center 可信身份传播的另一个好处是：[Amazon S3 的每个 AWS CloudTrail 数据事件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-cloudtrail-logging-for-s3.html)均包含对访问 S3 数据的最终用户身份的直接引用。

如果您的应用程序支持 OAuth 2.0，并且用户需要从这些应用程序访问 AWS 服务，建议您使用可信身份传播。通过可信身份传播，用户可以登录应用程序，而该应用程序可以在任何旨在访问 AWS 服务中数据的请求中传递用户的身份。此应用程序代表任何经过身份验证的用户与 IAM Identity Center 进行交互。有关更多信息，请参阅 [Using trusted identity propagation with customer managed applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation-using-customermanagedapps-setup.html)。

[Trusted identity propagation](https://docs.aws.amazon.com//singlesignon/latest/userguide/trustedidentitypropagation-overview.html) 是一项 AWS IAM Identity Center 功能，已连接的 AWS 服务的管理员可以使用它来授予和审计对服务数据的访问权限。对这些数据的访问权限基于用户属性，例如组关联。设置可信身份传播要求已连接的 AWS 服务的管理员和 IAM Identity Center 管理员之间进行协作。有关更多信息，请参阅 [Prerequisites and considerations](https://docs.aws.amazon.com//singlesignon/latest/userguide/trustedidentitypropagation-overall-prerequisites.html)。

### 设置
<a name="setup-workflow-storagebrowser-method3"></a>

要在 AWS 管理控制台中使用 [S3 访问权限管控](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants.html)和 [IAM Identity Center trusted identity propagation](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html) 设置存储浏览器身份验证，应用程序必须代表当前经过身份验证的用户从 Amazon S3 请求数据。通过这种方法，您可以为公司目录中的用户或用户组提供对 S3 存储桶、前缀或对象的直接访问权限。这意味着您的应用程序无需将任何用户映射到 IAM 主体。

以下工作流程概述了使用 IAM Identity Center 和 S3 访问权限管控来设置适用于 S3 的存储浏览器的步骤：


| Steps | 说明 | 
| --- | --- | 
| 1 | [为您的 AWS Organizations 启用 IAM Identity Center](#enable-iam-idc-org) | 
| 2 | [配置 AWS Identity and Access Management Identity Center 联合身份验证](#configure-iam-idc)  | 
| 3 | [在 AWS Identity and Access Management Identity Center 控制台中添加可信令牌发布者](#add-trusted-token-issuer-idc) 可信令牌发布者表示您在 IAM Identity Center 中的身份提供者（IdP），同时使其能够识别您的应用程序经过身份验证的用户的身份令牌。  | 
| 4 | [为 `bootstrap` 应用程序和 `identity bearer` 创建 IAM 角色](#create-iam-role-bootstrap)  | 
| 5 | [在 IAM Identity Center 中创建和配置应用程序](#create-app-iam-idc) 此应用程序代表经过身份验证的用户与 IAM Identity Center 进行交互。  | 
| 6 | [将 S3 访问权限管控添加为身份传播的可信应用程序](#add-s3-ag-app) 此步骤将您的应用程序连接到 S3 访问权限管控，以便它可以代表经过身份验证的用户向 S3 访问权限管控提出请求。  | 
| 7 | [创建对用户或组的授权](#create-grant-user-group) 此步骤将 AWS Identity and Access Management Identity Center 中的用户与跨域身份管理系统（SCIM）同步。SCIM 使您的 IAM Identity Center 身份与身份提供者（IdP）的身份保持同步。  | 
| 8 | [创建适用于 S3 的存储浏览器组件](#create-storage-browser-component)  | 

### 为您的 AWS Organizations 启用 IAM Identity Center
<a name="enable-iam-idc-org"></a>

要为您的 AWS Organizations 启用 IAM Identity Center，请执行以下步骤：

1. 使用以下方法之一登录 AWS 管理控制台：

   1. ****AWS 新用户（根用户）**：**通过选择根用户并输入您的 AWS 账户电子邮件地址，以账户所有者身份登录。在下一页，输入您的密码。

   1. ****已经在使用 AWS（IAM 凭证）**：**使用具有管理权限的 IAM 凭证登录。

1. 打开 [IAM Identity Center 控制台](https://console.aws.amazon.com/singlesignon)。

1. 在**启用 IAM Identity Center**下，选择**启用**。
**注意**  
IAM Identity Center 要求设置 AWS Organizations。如果您未设置组织，则可以选择让 AWS 自动为您创建一个组织。选择**创建 AWS 组织**完成此过程。

1. 然后选择**使用 AWS Organizations 启用**。

1. 选择**继续**。

1. （可选）添加要与此组织实例关联的任何标签。

1. （可选）配置委托管理。
**注意**  
如果您正在使用多账户环境，我们建议您配置委托管理。通过委托管理，您可以限制 AWS Organizations 中需要访问管理账户的人数。有关更多信息，请参阅 [Delegated administration](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html)。

1. 选择**保存**。

AWS Organizations 会自动向与管理账户关联的地址发送验证电子邮件。在您接收到验证电子邮件之前可能会有一段延迟。请确保在验证电子邮件到期之前 24 小时内验证电子邮件地址。

### 配置 AWS Identity and Access Management Identity Center 联合身份验证
<a name="configure-iam-idc"></a>

要将适用于 S3 的存储浏览器用于公司目录用户，您必须将 IAM Identity Center 配置为使用外部身份提供者（IdP）。您可以使用您选择的首选身份提供者。但请注意，每个身份提供者使用不同的配置设置。有关使用不同外部身份提供者的教程，请参阅 [IAM Identity Center source tutorials](https://docs.aws.amazon.com/singlesignon/latest/userguide/tutorials.html)。

**注意**  
请务必记录您配置的身份提供者的发布者 URL 和受众属性，因为您需要在后续步骤中引用它。如果您没有配置 IdP 所需的访问权限，则可能需要联系外部 IdP 的管理员来获取访问权限。

### 在 AWS Identity and Access Management Identity Center 控制台中添加可信令牌发布者
<a name="add-trusted-token-issuer-idc"></a>

可信令牌发布者在 AWS Identity and Access Management Identity Center 中表示外部身份提供者，并识别应用程序经过身份验证的用户的令牌。您的 AWS Organizations 中 IAM Identity Center 实例的账户所有者必须执行这些步骤。这些步骤可以在 IAM Identity Center 控制台中完成，也可以通过编程方式完成。

要在 AWS Identity and Access Management Identity Center 控制台中添加可信令牌发布者，请执行以下步骤：

1. 打开 [IAM Identity Center 控制台](https://console.aws.amazon.com/singlesignon)。

1. 选择**设置**。

1. 选择**身份验证**选项卡。

1. 导航至**可信令牌发布者**部分，并填写以下详细信息：

   1. 在**发布者 URL** 下，输入作为可信令牌发布者的外部 IdP 的 URL。您可能需要联系外部 IdP 的管理员以获取此信息。有关更多信息，请参阅 [Using applications with a trusted token issuer](https://docs.aws.amazon.com/singlesignon/latest/userguide/using-apps-with-trusted-token-issuer.html)。

   1. 在**可信令牌发布者名称**下，输入可信令牌发布者的名称。当为身份传播配置应用程序资源时，该名称将出现在您可以在*步骤 8* 中选择的可信令牌发布者列表中。

1. 将**映射属性**更新为首选应用程序属性，其中每个身份提供者属性都映射到一个 IAM Identity Center 属性。例如，您可能希望 [map the application attribute](https://docs.aws.amazon.com/singlesignon/latest/userguide/mapawsssoattributestoapp.html) `email` 到 IAM Identity Center 用户属性 `email`。要查看 IAM Identity Center 中支持的用户属性列表，请参阅 [Attribute mappings for AWS Managed Microsoft AD directory](https://docs.aws.amazon.com/singlesignon/latest/userguide/attributemappingsconcept.html) 中的表。

1. （可选）如果要添加资源标签，请输入键和值对。要添加多个资源标签，请选择**添加新标签**以生成新条目并输入键和值对。

1. 选择**创建可信令牌发布者**。

1. 创建完可信令牌发布者后，请联系应用程序管理员，告知他们可信令牌发布者的名称，以便他们可以确认可信令牌发布者在适用的控制台中可见。

1. 确保应用程序管理员在适用的控制台中选择此可信令牌发布者，才能允许用户从为可信身份传播配置的应用程序中访问该应用程序。

### 为 `bootstrap` 应用程序和 `identity bearer` 创建 IAM 角色
<a name="create-iam-role-bootstrap"></a>

为确保 `bootstrap` 应用程序和 `identity bearer` 用户可以正常相互协作，请务必 [create two IAM roles](https://docs.aws.amazon.com/managedservices/latest/onboardingguide/create-iam-role.html)。`bootstrap` 应用程序需要一个 IAM 角色，而另一个 IAM 角色必须用于身份持有者，或访问通过 S3 访问权限管控请求访问权限的 Web 应用程序的最终用户。`bootstrap` 应用程序接收身份提供者颁发的令牌并调用 `CreateTokenWithIAM` API，同时将此令牌与 Identity Center 发布的令牌交换。

创建具有如下权限的 IAM 角色，例如 `bootstrap-role`。以下示例 IAM 策略向 `bootstrap-role` 授予执行令牌交换的权限：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [{
        "Action": [
            "sso-oauth:CreateTokenWithIAM",
        ],
        "Resource": "arn:${Partition}:sso::${AccountId}:application/${InstanceId}/${ApplicationId}",
        "Effect": "Allow"
    },
    {
        "Action": [
            "sts:AssumeRole",
            "sts:SetContext"
        ],
        "Resource": "arn:aws:iam::${AccountId}:role/identity-bearer-role",
        "Effect": "Allow"
    }]
}
```

然后，创建第二个 IAM 角色（例如 `identity-bearer-role`），身份凭证代理程序使用该角色生成 IAM 凭证。适用于 S3 的存储浏览器组件使用从身份凭证代理程序返回到 Web 应用程序的 IAM 凭证来支持访问 S3 数据：

```
{
    "Action": [
        "s3:GetDataAccess",
        "s3:ListCallerAccessGrants",
    ],
    "Resource": "arn:${Partition}:s3:${Region}:${Account}:access-grants/default",
    "Effect": "Allow"
}
```

此 IAM 角色 (`identity-bearer-role`) 必须使用带有以下语句的信任策略：

```
{
   "Effect": "Allow",
   "Principal": {
      "AWS": "arn:${Partition}:iam::${Account}:role/${RoleNameWithPath}"
   },
   "Action": [
       "sts:AssumeRole",
       "sts:SetContext"
   ]
}
```

### 在 IAM Identity Center 中创建和配置应用程序
<a name="create-app-iam-idc"></a>

**注意**  
开始之前，请确保您已在上一步中创建所需的 IAM 角色。您需要在此步骤中指定其中一个 IAM 角色。

要在 AWS IAM Identity Center 中创建和配置客户托管式应用程序，请执行以下步骤：

1. 打开 [IAM Identity Center 控制台](https://console.aws.amazon.com/singlesignon)。

1. 选择**应用程序**。

1. 选择**客户托管**选项卡。

1. 选择**添加应用程序**。

1. 在**选择应用程序类型**页面，选择**设置首选项**下的**我有想设置的应用程序**。

1. 在**应用程序类型**下，选择 **OAuth 2.0**。

1. 选择**下一步**。将显示**指定应用程序**页面。

1. 在**应用程序名称和描述**部分下，输入应用程序的**显示名称**，如 **storage-browser-oauth**。

1. 输入 **Description**（描述）。应用程序描述显示在 IAM Identity Center 控制台和 API 请求中，但不显示在 AWS 访问门户中。

1. 在**用户和组分配方法**下，选择**不需要分配**。此选项可让所有经授权的 IAM Identity Center 用户和组访问此应用程序。

1. 在 **AWS 访问门户**下，输入用户可以访问应用程序的应用程序 URL。

1. （可选）如果要添加资源标签，请输入键和值对。要添加多个资源标签，请选择**添加新标签**以生成新条目并输入键和值对。

1. 选择**下一步**。将显示**指定身份验证**页面。

1. 在**使用可信令牌发布者进行身份验证**下，使用复选框选择您之前创建的可信令牌发布者。

1. 在**配置选定的可信令牌发布者**下，输入 [Aud 声明](https://docs.aws.amazon.com/singlesignon/latest/userguide/trusted-token-issuer-configuration-settings.html#trusted-token-issuer-aud-claim)。**Aud 声明**标识 JSON Web 令牌（JWT）的受众，它是可信令牌发布者用来标识此应用程序的名称。
**注意**  
您可能需要联系外部 IdP 的管理员以获取此信息。

1. 选择**下一步**。将显示**指定身份验证凭证**页面。

1. 在**配置方法**下，选择**输入一个或多个 IAM 角色**。

1. 在**输入 IAM 角色**下，为身份持有者令牌添加 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)或 Amazon 资源名称（ARN）。您必须输入您在上一步中为身份凭证代理程序应用程序创建的 IAM 角色（例如 **bootstrap-role**）。

1. 选择**下一步**。

1. 在**查看和配置**页面上，检查应用程序配置的详细信息。如果您需要修改任何设置，请对于要编辑和进行更改的部分选择**编辑**。

1. 选择**提交**。将显示您刚添加的应用程序的详细信息页面。

设置应用程序后，您的用户可以基于 [permission sets that you’ve created](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-started-create-a-permission-set.html) 和 [user access that you’ve assigned](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-started-assign-account-access-user.html)，从其 AWS 访问门户中访问您的应用程序。

### 将 S3 访问权限管控添加为身份传播的可信应用程序
<a name="add-s3-ag-app"></a>

设置客户托管式应用程序后，您必须为身份传播指定 S3 访问权限管控。S3 访问权限管控提供凭证供用户访问 Amazon S3 数据。当您登录到客户托管式应用程序时，S3 访问权限管控会将您的用户身份传递给可信应用程序。

 **先决条件：**在执行这些步骤之前，请确保您已设置 S3 访问权限管控（例如[创建 S3 访问权限管控实例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-instance-create.html)和[注册位置](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-location-register.html)）。有关更多信息，请参阅[开始使用 S3 访问权限管控](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-get-started.html)。

要向客户托管式应用程序中添加用于身份传播的 S3 访问权限管控，请执行以下步骤：

1. 打开 [IAM Identity Center 控制台](https://console.aws.amazon.com/singlesignon)。

1. 选择**应用程序**。

1. 选择**客户托管**选项卡。

1. 在**客户托管的应用程序**列表中，选择要对其发起访问请求的 OAuth 2.0 应用程序。这是用户将登录的应用程序。

1. 在**详细信息页面**的**用于身份传播的可信应用程序**下，选择**指定可信应用程序**。

1. 在设置类型下，选择单个应用程序并指定访问权限，然后选择**下一步**。

1. 在**选择服务**页面上，选择 **S3 访问权限管控**。S3 访问权限管控具有的应用程序可供您定义您自己的 Web 应用程序以实现可信身份传播。

1. 选择**下一步**。您将在下一个步骤中选择应用程序。

1. 在**选择应用程序**页面，选择**单个应用程序**，对于每个可以接收访问请求的应用程序选中此复选框，然后选择**下一步**。

1. 在**配置访问权限**页面的**配置方法**下，选择以下任一项：
   + **选择每个应用程序的访问权限** - 选择此选项可为每个应用程序配置不同的访问权限级别。选择要为其配置访问权限级别的应用程序，然后选择**编辑访问权限**。在**要应用的访问权限级别**中，根据需要更改访问权限级别，然后选择**保存更改**。
   + ****对所有应用程序应用相同的访问权限级别**：**如果不需要针对每个应用程序配置访问权限级别，请选择此选项。

1. 选择**下一步**。

1. 在**审查配置**页面中，审查您所做的选择。
**注意**  
您希望确保已向您的用户授予 `s3:access_grants:read_write` 权限。此权限使您的用户能够检索凭证以访问 Amazon S3。请务必使用您之前创建的 IAM 策略或 S3 访问权限管控，来限制对写入操作的访问权限。

1. 要进行更改，请为要更改的配置部分选择**编辑**。然后，进行所需的更改并选择**保存更改**。

1. 选择**可信应用程序**以添加用于身份传播的可信应用程序。

### 创建对用户或组的授权
<a name="create-grant-user-group"></a>

在此步骤中，您将使用 IAM Identity Center 来预置您的用户。您可以使用 SCIM 来 [automated or manual provisioning of users and groups](https://docs.aws.amazon.com/singlesignon/latest/userguide/provision-automatically.html)。SCIM 使您的 IAM Identity Center 身份与身份提供者（IdP）的身份保持同步。这包括 IdP 和 IAM Identity Center 之间的任何用户预置、更新和取消预置。

**注意**  
此步骤是必需的，因为在将 S3 访问权限管控与 IAM Identity Center 结合使用时，不使用本地 IAM Identity Center 用户。相反，用户必须从身份提供者与 IAM Identity Center 同步。

要将来自身份提供者的用户与 IAM Identity Center 同步，请执行以下步骤：

1. [Enable automatic provisioning](https://docs.aws.amazon.com/singlesignon/latest/userguide/how-to-with-scim.html)。

1. [Generate an access token](https://docs.aws.amazon.com/singlesignon/latest/userguide/generate-token.html)。

有关如何针对您的特定应用场景使用 IAM Identity Center 设置身份提供者的示例，请参阅 [IAM Identity Center Identity source tutorials](https://docs.aws.amazon.com/singlesignon/latest/userguide/tutorials.html)。

### 创建适用于 S3 的存储浏览器组件
<a name="create-storage-browser-component"></a>

设置 IAM Identity Center 实例并在 S3 访问权限管控中创建授权后，打开您的 React 应用程序。在 React 应用程序中，使用 `createManagedAuthAdapter` 来设置授权规则。您必须提供凭证提供商，才能返回您从 IAM Identity Center 获得的凭证。然后，您可以调用 `createStorageBrowser` 来初始化适用于 S3 的存储浏览器组件：

```
import {
    createManagedAuthAdapter,
    createStorageBrowser,
} from '@aws-amplify/ui-react-storage/browser';
import '@aws-amplify/ui-react-storage/styles.css';

export const { StorageBrowser } = createStorageBrowser({
   config: createManagedAuthAdapter({
    credentialsProvider: async (options?: { forceRefresh?: boolean }) => {
      // return your credentials object
      return {
        credentials: {
          accessKeyId: 'my-access-key-id',
          secretAccessKey: 'my-secret-access-key',
          sessionToken: 'my-session-token',
          expiration: new Date(),
        },
      }
    },
    // AWS `region` and `accountId` of the S3 Access Grants Instance.
    region: '',
    accountId: '',
    // call `onAuthStateChange` when end user auth state changes 
    // to clear sensitive data from the `StorageBrowser` state
    registerAuthListener: (onAuthStateChange) => {},
  })
});
```



接着，创建一种机制，将 Web 应用程序中的 JSON Web 令牌（JWT）与 IAM Identity Center 中的 IAM 凭证交换。有关如何交换 JWT 的更多信息，请参阅以下资源：
+ *AWS 存储博客* 中的 [How to develop a user-facing data application with IAM Identity Center and S3 Access Grants](https://aws.amazon.com/blogs/storage/how-to-develop-a-user-facing-data-application-with-iam-identity-center-and-s3-access-grants-part-2/) 博文
+ *AWS 存储博客* 中的 [Scaling data access with S3 Access Grants](https://aws.amazon.com/blogs/storage/scaling-data-access-with-amazon-s3-access-grants/) 博文
+ *AWS 讲习会参与平台* 上的 [S3 Access Grants workshop](https://catalog.us-east-1.prod.workshops.aws/workshops/77b0af63-6ad2-4c94-bfc0-270eb9358c7a/en-US)
+ *GitHub* 上的 [S3 Access Grants workshop](https://github.com/aws-samples/s3-access-grants-workshop)

然后，设置 API 端点来处理获取凭证的请求。要验证 JSON Web 令牌（JWT）交换，请执行以下步骤：

1. 从授权标头中检索传入请求的 JSON Web 令牌。

1. 使用指定的 JSON Web 密钥集（JWKS）URL 中的公有密钥验证令牌。

1. 验证令牌的到期时间、发布者、主体和受众声明。

要将身份提供者的 JSON Web 令牌与 AWS IAM 凭证交换，请执行以下步骤：

**提示**  
确保避免记录任何敏感信息。对于缺少授权、令牌过期和其它异常，我们建议您使用错误处理控件。有关更多信息，请参阅 *AWS 计算博客* 中的 [Implementing AWS Lambda error handling patterns](https://aws.amazon.com/blogs/compute/implementing-aws-lambda-error-handling-patterns/) 博文。

1. 验证请求中是否提供了所需的**权限**和**范围**参数。

1. 使用 [https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateTokenWithIAM.html](https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateTokenWithIAM.html) API 将 JSON Web 令牌交换为 IAM Identity Center 令牌。
**注意**  
使用 IdP JSON Web 令牌后，无法再次使用该令牌。必须使用新令牌与 IAM Identity Center 进行交换。

1. 使用 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作通过 IAM Identity Center 令牌代入临时角色。请务必使用身份持有者角色，也称为携带身份上下文的角色（例如 **identity-bearer-role**），来请求凭证。

1. 将 IAM 凭证返回给 Web 应用程序。
**注意**  
确保您已设置了正确的日志记录机制。响应以带有相应 HTTP 状态代码的标准化 JSON 格式返回。

# 配置适用于 S3 的存储浏览器
<a name="s3config-storagebrowser"></a>

为了支持适用于 S3 的存储浏览器访问 S3 存储桶，存储浏览器组件会对 Amazon S3 进行 REST API 调用。默认情况下，S3 存储桶上未启用[跨源资源共享（CORS）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/cors.html)。因此，您必须为存储浏览器从中访问数据的每个 S3 存储桶启用 CORS。

例如，要在 S3 存储桶上启用 CORS，可以按如下方式更新 CORS 策略：

```
[
    {
        "ID": "S3CORSRuleId1",
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "last-modified",
            "content-type",
            "content-length",
            "etag",
            "x-amz-version-id",
            "x-amz-request-id",
            "x-amz-id-2",
            "x-amz-cf-id",
            "x-amz-storage-class",
            "date",
            "access-control-expose-headers"
        ],
        "MaxAgeSeconds": 3000
    }
]
```

# 适用于 S3 的存储浏览器故障排除
<a name="troubleshooting-storagebrowser"></a>

如果您在使用适用于 S3 的存储浏览器时遇到问题，请务必查看以下故障排除提示：
+ 避免尝试对多个请求使用相同的令牌（`idToken` 或 `accessToken`）。无法重用令牌。这将导致请求失败。
+ 确保您提供给存储浏览器组件的 IAM 凭证包含调用 `s3:GetDataAccess` 操作的权限。否则，最终用户将无法访问您的数据。

或者，您可以检查以下资源：
+ 适用于 S3 的存储浏览器由 AWS Support 提供支持。如果您需要帮助，请联系 [AWS Support Center](https://console.aws.amazon.com/support/home#/)。
+ 如果您在使用适用于 S3 的存储浏览器时遇到问题或想提交反馈，请访问 [Amplify GitHub page](https://github.com/aws-amplify/amplify-ui)。
+ 如果您在该项目中发现潜在的安全问题，您可以通过 [AWS 漏洞报告](https://aws.amazon.com/security/vulnerability-reporting/)页面通知 AWS 安全部门。

# 使用 Amazon S3 Transfer Acceleration 配置快速、安全的文件传输
<a name="transfer-acceleration"></a>

Amazon S3 Transfer Acceleration 是一项存储桶级别功能，可在您的客户端和 S3 通用存储桶之间实现快速、轻松、安全的远距离文件传输。Transfer Acceleration 旨在优化从世界各地传入 S3 通用存储桶的传输速度。Transfer Acceleration 利用 Amazon CloudFront 中的全球分布式边缘站点。当数据到达某个边缘站点时，数据会被经过优化的网络路径路由至 Amazon S3。

使用 Transfer Acceleration 时，可能会收取额外的数据传输费用。有关定价的更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

## 为什么要使用 Transfer Acceleration？
<a name="transfer-acceleration-why-use"></a>

您可能出于各种原因需要对通用存储桶使用 Transfer Acceleration：
+ 您位于全球各地的客户需要上传到集中式通用存储桶。
+ 您定期跨大洲传输数 GB 至数 TB 数据。
+ 您在上传到 Amazon S3 时无法充分利用 Internet 上的所有可用带宽。

有关何时使用 Transfer Acceleration 的更多信息，请参阅 [Amazon S3 常见问题解答](https://aws.amazon.com/s3/faqs/#s3ta)。

## 使用 Transfer Acceleration 的要求
<a name="transfer-acceleration-requirements"></a>

在 S3 存储桶上使用 Transfer Acceleration 时，需要执行以下操作：
+ 仅虚拟托管样式请求支持 Transfer Acceleration。有关虚拟托管样式请求的更多信息，请参阅《Amazon S3 API 参考》**中的 [Making requests using the REST API](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTAPI.html)。
+ 用于 Transfer Acceleration 的存储桶的名称必须符合 DNS 标准，且不得包含句点（“.”）。
+ 必须在存储桶上启用 Transfer Acceleration。有关更多信息，请参阅 [启用和使用 S3 Transfer Acceleration](transfer-acceleration-examples.md)。

  在对存储桶启用 Transfer Acceleration 后，可能需要最多 20 分钟的时间才能加快向存储桶传输数据的速度。
**注意**  
位于以下区域的存储桶目前支持 Transfer Acceleration：  
亚太地区（东京）(ap-northeast-1)
亚太地区（首尔）(ap-northeast-2)
亚太地区（孟买）(ap-south-1)
亚太地区（新加坡）(ap-southeast-1)
亚太地区（悉尼）(ap-southeast-2)
加拿大（中部）(ca-central-1)
欧洲地区（法兰克福）(eu-central-1)
欧洲地区（爱尔兰）(eu-west-1)
欧洲地区（伦敦）(eu-west-2)
欧洲地区（巴黎）（eu-west-3）
南美洲（圣保罗）（sa-east-1）
美国东部（弗吉尼亚州北部）（us-east-1）
美国东部（俄亥俄州）(us-east-2)
美国西部（加利福尼亚北部）(us-west-1)
美国西部（俄勒冈州）(us-west-2)
+ 要访问已启用 Transfer Acceleration 的存储桶，您必须使用端点 `bucket-name.s3-accelerate.amazonaws.com`。或者使用双堆栈端点 `bucket-name.s3-accelerate.dualstack.amazonaws.com`，以通过 IPv6 连接至启用的存储桶。您可以继续使用常规端点进行标准数据传输。
+ 您必须是存储桶拥有者才能设置传输加速状态。存储桶拥有者可以向其他用户分配权限，使他们能够对存储桶设置加速状态。`s3:PutAccelerateConfiguration` 权限允许用户对存储桶启用或禁用 Transfer Acceleration。`s3:GetAccelerateConfiguration` 权限允许用户返回存储桶的 Transfer Acceleration 状态，即 `Enabled` 或 `Suspended.`。

以下各节介绍了如何开始使用 Amazon S3 Transfer Acceleration 传输数据。

**Topics**
+ [为什么要使用 Transfer Acceleration？](#transfer-acceleration-why-use)
+ [使用 Transfer Acceleration 的要求](#transfer-acceleration-requirements)
+ [开始使用 Amazon S3 Transfer Acceleration](transfer-acceleration-getting-started.md)
+ [启用和使用 S3 Transfer Acceleration](transfer-acceleration-examples.md)
+ [使用 Amazon S3 Transfer Acceleration 速度比较工具](transfer-acceleration-speed-comparison.md)

# 开始使用 Amazon S3 Transfer Acceleration
<a name="transfer-acceleration-getting-started"></a>

您可以使用 Amazon S3 Transfer Acceleration 在您的客户端和 S3 存储桶之间进行快速、轻松、安全的远距离文件传输。Transfer Acceleration 使用 Amazon CloudFront 中的全球分布式边缘站点。当数据到达某个边缘站点时，数据会被经过优化的网络路径路由至 Amazon S3。

要开始使用 Amazon S3 Transfer Acceleration，请执行以下步骤：

1. **在存储桶上启用 Transfer Acceleration** 

   

   您可以通过以下任一方式对存储桶启用 Transfer Acceleration：
   + 使用 Amazon S3 控制台。
   + 使用 REST API [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTaccelerate.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTaccelerate.html) 操作。
   + 使用 AWS CLI 和 AWS SDK。有关更多信息，请参阅《Amazon S3 API 参考》**中的 [Developing with Amazon S3 using the AWS SDKs](https://docs.aws.amazon.com/AmazonS3/latest/API/sdk-general-information-section.html)。

   有关更多信息，请参阅 [启用和使用 S3 Transfer Acceleration](transfer-acceleration-examples.md)。
**注意**  
对于要使用传输加速的存储桶，存储桶名称必须符合 DNS 命名要求，且不得包含句点 (`.`)。

1. **在启用加速的存储桶之间传输数据**

   使用以下 `s3-accelerate` 端点域名之一：
   + 要访问启用加速的存储桶，请使用 `bucket-name.s3-accelerate.amazonaws.com`。
   + 要通过 IPv6 访问启用了加速的存储桶，请使用`bucket-name.s3-accelerate.dualstack.amazonaws.com`。

     Amazon S3 双堆栈端点支持通过 IPv6 和 IPv4 向 S3 存储桶发出请求。Transfer Acceleration 双堆栈端点仅可使用端点名称的虚拟托管类型。有关更多信息，请参阅《Amazon S3 API 参考》**中的 [Making requests to Amazon S3 over IPv6](https://docs.aws.amazon.com/AmazonS3/latest/API/ipv6-access.html) 和《Amazon S3 API 参考》**中的 [Using Amazon S3 dual-stack endpoints](https://docs.aws.amazon.com/AmazonS3/latest/API/dual-stack-endpoints.html)。
**注意**  
您的数据传输应用程序必须使用以下两种类型的端点之一来访问存储桶以加快数据传输：`.s3-accelerate.amazonaws.com`，或 `.s3-accelerate.dualstack.amazonaws.com` 用于双栈端点。如果您想使用标准数据传输，则可以继续使用常规端点。

   在启用 Transfer Acceleration 后，可以将 Amazon S3 `PUT` 对象和 `GET` 对象请求指向 `s3-accelerate` 端点域名。例如，假设您当前有一个使用 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) 的 REST API 应用程序，该应用程序在 `PUT` 请求中使用主机名 `amzn-s3-demo-bucket.s3.us-east-1.amazonaws.com`。要加速 `PUT`，请将请求中的主机名更改为 `amzn-s3-demo-bucket.s3-accelerate.amazonaws.com`。要重新使用标准上传速度，请将名称更改回 `amzn-s3-demo-bucket.s3.us-east-1.amazonaws.com`。

   启用 Transfer Acceleration 后，最多 20 分钟后即可实现性能提升。但是，一旦启用 Transfer Acceleration，加速端点将随即可用。

   您可以在 AWS CLI、AWS SDK 和其他向 Amazon S3 传入数据和从 Amazon S3 传出数据的工具中使用加速端点。如果您使用 AWS SDK，则某些受支持的语言会使用加速端点客户端配置标记，这样一来，您便无需显式将 Transfer Acceleration 的端点设置为 `bucket-name.s3-accelerate.amazonaws.com`。有关如何使用加速端点客户端配置标记的示例，请参阅[启用和使用 S3 Transfer Acceleration](transfer-acceleration-examples.md)。

您可以通过传输加速端点使用所有的 Amazon S3 操作，*除*以下情况以外：
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceGET.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUT.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUT.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETE.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETE.html)

此外，Amazon S3 Transfer Acceleration 不支持使用 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html) 进行跨区域复制。

# 启用和使用 S3 Transfer Acceleration
<a name="transfer-acceleration-examples"></a>

可以使用 Amazon S3 Transfer Acceleration 在客户端和 S3 通用存储桶之间进行快速、安全的远距离文件传输。您可以使用 S3 控制台、AWS Command Line Interface（AWS CLI）、API 或 AWS SDK 启用 Transfer Acceleration。

本节提供了有关如何对存储桶启用 Amazon S3 Transfer Acceleration 和对启用的存储桶使用加速端点的示例。

有关 Transfer Acceleration 要求的更多信息，请参阅[使用 Amazon S3 Transfer Acceleration 配置快速、安全的文件传输](transfer-acceleration.md)。

## 使用 S3 控制台
<a name="enable-transfer-acceleration"></a>

**注意**  
如果要比较加快的上传速度与未加快的上传速度，请打开 [Amazon S3 Transfer Acceleration 速度比较工具](https://s3-accelerate-speedtest.s3-accelerate.amazonaws.com/en/accelerate-speed-comparsion.html)。  
此速度比较工具使用分段上传来将文件从浏览器传输到各种使用和未使用 Amazon S3 Transfer Acceleration 的 AWS 区域。您可以比较直接上传和按区域传输加速上传的上传速度。

**为 S3 通用存储桶启用传输加速**

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

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

1. 在**通用存储桶**列表中，选择要为其启用加速传输的存储桶的名称。

1. 选择**属性**。

1. 在 **Transfer acceleration (传输加速)** 下，选择 **Edit (编辑)**。

1. 选择 **Enable（启用）**，然后选择 **Save changes（保存更改）**。

**要访问加速数据传输**

1. 在 Amazon S3 为您的存储桶启用传输加速后，查看存储桶的 **Properties**（属性）选项卡。

1. 在 **Transfer acceleration（传输加速）**下，**Accelerated endpoint（加速端点）**显示存储桶的传输加速端点。使用此端点访问与存储桶之间的加速数据传输。

   如果您暂停传输加速，加速端点不再起作用。

## 使用 AWS CLI
<a name="transfer-acceleration-examples-aws-cli"></a>

以下是用于 Transfer Acceleration 的 AWS CLI 命令的示例。有关设置 AWS CLI 的说明，请参阅《Amazon S3 API Reference》**中的 [Developing with Amazon S3 using the AWS CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html)。

### 在存储桶上启用 Transfer Acceleration
<a name="transfer-acceleration-examples-aws-cli-1"></a>

使用 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-accelerate-configuration.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-accelerate-configuration.html) 命令对存储桶启用或暂停 Transfer Acceleration。

以下示例设置 `Status=Enabled`，以便对名为 `amzn-s3-demo-bucket` 的存储桶启用 Transfer Acceleration。要暂停 Transfer Acceleration，请使用 `Status=Suspended`。

**Example**  

```
$ aws s3api put-bucket-accelerate-configuration --bucket amzn-s3-demo-bucket --accelerate-configuration Status=Enabled
```

### 使用 Transfer Acceleration
<a name="transfer-acceleration-examples-aws-cli-2"></a>

您可以将 `s3` 和 `s3api` AWS CLI 命令发出的所有 Amazon S3 请求定向到加速端点：`s3-accelerate.amazonaws.com`。为此，请在 AWS Config 文件的配置文件中将配置值 `use_accelerate_endpoint` 设置为 `true`。必须对存储桶启用 Transfer Acceleration 才能使用加速端点。

所有请求都使用存储桶寻址的虚拟风格发送：`amzn-s3-demo-bucket.s3-accelerate.amazonaws.com`。不会将任何 `ListBuckets`、`CreateBucket` 和 `DeleteBucket` 请求发送到加速端点，因为该端点不支持这些操作。

有关 `use_accelerate_endpoint` 的更多信息，请参阅《AWS CLI 命令参考》**中的 [AWS CLI S3 配置](https://docs.aws.amazon.com/cli/latest/topic/s3-config.html)。

以下示例在默认配置文件中将 `use_accelerate_endpoint` 设置为 `true`。

**Example**  

```
$ aws configure set default.s3.use_accelerate_endpoint true
```

如果您需要对某些 AWS CLI 命令使用加速端点，但不对其他此类命令使用加速端点，则可使用以下两种方法中的任一方法：
+ 通过将 `--endpoint-url` 参数设置为 `https://s3-accelerate.amazonaws.com`，来对任何 `s3` 或 `s3api` 命令使用加速端点。
+ 在 AWS Config 文件中设置单独的配置文件。例如，创建一个将 `use_accelerate_endpoint` 设置为 `true` 的配置文件和一个不设置 `use_accelerate_endpoint` 的配置文件。在运行一条命令时，根据是否需要使用加速端点来指定要使用的配置文件。

### 将对象上传到已启用 Transfer Acceleration 的存储桶
<a name="transfer-acceleration-examples-aws-cli-3"></a>

以下示例通过使用已配置为使用加速端点的默认配置文件，来将文件上传到已启用 Transfer Acceleration 的名为 `amzn-s3-demo-bucket` 的存储桶。

**Example**  

```
$ aws s3 cp file.txt s3://amzn-s3-demo-bucket/key-name --region region
```

以下示例通过使用 `--endpoint-url` 参数指定加速端点来将文件上传到已启用 Transfer Acceleration 的存储桶。

**Example**  

```
$ aws configure set s3.addressing_style virtual
$ aws s3 cp file.txt s3://amzn-s3-demo-bucket/key-name --region region --endpoint-url https://s3-accelerate.amazonaws.com
```

## 使用 AWS 开发工具包
<a name="transfer-acceleration-examples-sdk"></a>

以下是使用 Transfer Acceleration 通过 AWS SDK 将对象上传到 Amazon S3 的示例。AWS SDK 支持的某些语言（例如 Java 和 .NET）使用加速端点客户端配置标志，这样一来，您便无需显式将 Transfer Acceleration 的端点设置为 `bucket-name.s3-accelerate.amazonaws.com`。

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

要使用适用于 Java 的 AWS SDK 通过加速端点将对象上传到 Amazon S3，您可以：
+ 创建配置为使用加速端点的 S3Client。客户端访问的所有存储桶都必须已启用 Transfer Acceleration。
+ 对指定的存储桶启用 Transfer Acceleration。仅当您指定的存储桶尚未启用 Transfer Acceleration 时，此步骤才是必需的。
+ 验证是否为指定的存储桶启用了传输加速。
+ 使用存储桶的加速端点将新对象上传到指定的存储桶。

有关使用 Transfer Acceleration 的更多信息，请参阅[开始使用 Amazon S3 Transfer Acceleration](transfer-acceleration-getting-started.md)。

以下代码示例说明如何使用适用于 Java 的 AWS SDK 配置 Transfer Acceleration。

```
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.BucketAccelerateStatus;
import software.amazon.awssdk.services.s3.model.GetBucketAccelerateConfigurationRequest;
import software.amazon.awssdk.services.s3.model.PutBucketAccelerateConfigurationRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.AccelerateConfiguration;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.core.exception.SdkClientException;

public class TransferAcceleration {
    public static void main(String[] args) {
        Region clientRegion = Region.US_EAST_1;
        String bucketName = "*** Provide bucket name ***";
        String keyName = "*** Provide key name ***";

        try {
            // Create an Amazon S3 client that is configured to use the accelerate endpoint.
            S3Client s3Client = S3Client.builder()
                    .region(clientRegion)
                    .credentialsProvider(ProfileCredentialsProvider.create())
                    .accelerate(true)
                    .build();

            // Enable Transfer Acceleration for the specified bucket.
            s3Client.putBucketAccelerateConfiguration(
                    PutBucketAccelerateConfigurationRequest.builder()
                            .bucket(bucketName)
                            .accelerateConfiguration(AccelerateConfiguration.builder()
                                    .status(BucketAccelerateStatus.ENABLED)
                                    .build())
                            .build());

            // Verify that transfer acceleration is enabled for the bucket.
            String accelerateStatus = s3Client.getBucketAccelerateConfiguration(
                    GetBucketAccelerateConfigurationRequest.builder()
                            .bucket(bucketName)
                            .build())
                    .status().toString();
            System.out.println("Bucket accelerate status: " + accelerateStatus);

            // Upload a new object using the accelerate endpoint.
            s3Client.putObject(PutObjectRequest.builder()
                            .bucket(bucketName)
                            .key(keyName)
                            .build(),
                    RequestBody.fromString("Test object for transfer acceleration"));
            System.out.println("Object \"" + keyName + "\" uploaded with transfer acceleration.");
        } catch (S3Exception e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

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

以下示例说明如何使用 适用于 .NET 的 AWS SDK 对存储桶启用 Transfer Acceleration。有关设置和运行代码示例的信息，请参阅《适用于 .NET 的 AWS SDK 开发人员指南》**中的 [Getting Started with the 适用于 .NET 的 AWS SDK](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。

**Example**  

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

namespace Amazon.DocSamples.S3
{
    class TransferAccelerationTest
    {
        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);
            EnableAccelerationAsync().Wait();
        }

        static async Task EnableAccelerationAsync()
        {
                try
                {
                    var putRequest = new PutBucketAccelerateConfigurationRequest
                    {
                        BucketName = bucketName,
                        AccelerateConfiguration = new AccelerateConfiguration
                        {
                            Status = BucketAccelerateStatus.Enabled
                        }
                    };
                    await s3Client.PutBucketAccelerateConfigurationAsync(putRequest);

                    var getRequest = new GetBucketAccelerateConfigurationRequest
                    {
                        BucketName = bucketName
                    };
                    var response = await s3Client.GetBucketAccelerateConfigurationAsync(getRequest);

                    Console.WriteLine("Acceleration state = '{0}' ", response.Status);
                }
                catch (AmazonS3Exception amazonS3Exception)
                {
                    Console.WriteLine(
                        "Error occurred. Message:'{0}' when setting transfer acceleration",
                        amazonS3Exception.Message);
                }
        }
    }
}
```

在将对象上传到启用了 Transfer Acceleration 的存储桶时，可指定在创建客户端时使用加速端点。



```
var client = new AmazonS3Client(new AmazonS3Config
            {
                RegionEndpoint = TestRegionEndpoint,
                UseAccelerateEndpoint = true
            }
```

------
#### [ JavaScript ]

有关使用适用于 JavaScript 的 AWS SDK 启用 Transfer Acceleration 的示例，请参阅《适用于 JavaScript 的 AWS SDK API Reference》**中的 [PutBucketAccelerateConfiguration command](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/command/PutBucketAccelerateConfigurationCommand/)。

------
#### [ Python（Boto） ]

有关通过使用适用于 Python 的 SDK 启用 Transfer Acceleration 的示例，请参阅《AWS SDK for Python (Boto3) API Reference》**中的 [put\$1bucket\$1accelerate\$1configuration](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.put_bucket_accelerate_configuration)。

------
#### [ Other ]

有关使用其他 AWS SDK 的信息，请参阅[示例代码和库](https://aws.amazon.com/code/)。

------

## 使用 REST API
<a name="transfer-acceleration-examples-api"></a>

使用 REST API `PutBucketAccelerateConfiguration` 操作在现有存储桶上启用加速配置。

有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAccelerateConfiguration.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAccelerateConfiguration.html)。

# 使用 Amazon S3 Transfer Acceleration 速度比较工具
<a name="transfer-acceleration-speed-comparison"></a>

可以使用 [Amazon S3 Transfer Acceleration 速度比较工具](https://s3-accelerate-speedtest.s3-accelerate.amazonaws.com/en/accelerate-speed-comparsion.html)来比较各个 Amazon S3 区域内加快的上传速度和未加快的上传速度。此速度比较工具使用分段上传来将文件从浏览器传输到各种使用和未使用 Transfer Acceleration 的 Amazon S3 区域。

可以使用以下任一方法访问此速度比较工具：
+ 将以下 URL 复制到浏览器窗口中，同时将 `region` 替换为您正在使用的 AWS 区域（例如 `us-west-2`），并将 `amzn-s3-demo-bucket` 替换为您要评估的存储桶的名称：

  `https://s3-accelerate-speedtest.s3-accelerate.amazonaws.com/en/accelerate-speed-comparsion.html?region=region&origBucketName=amzn-s3-demo-bucket` 

  有关 Amazon S3 支持的区域列表，请参阅《AWS 一般参考》**中的 [Amazon S3 端点和限额](https://docs.aws.amazon.com/general/latest/gr/s3.html)。
+ 使用 Amazon S3 控制台。

# 使用申请方付款通用存储桶进行存储传输和使用
<a name="RequesterPaysBuckets"></a>

通常，存储桶拥有者将支付与他们的存储桶相关联的所有 Amazon S3 存储和数据传输费用。但是，您可以将通用存储桶配置为*申请方付款*存储桶。使用申请方付款存储桶时，申请方（而不是存储桶拥有者）将支付请求和从存储桶下载数据的费用。存储桶拥有者将始终支付存储数据的费用。

通常情况下，当您想共享数据，而又不希望产生与访问数据等其他操作相关联的费用时，您可以将存储桶配置为申请方付款存储桶。例如，当提供大型数据集（如邮政编码目录、参考数据、地理空间信息或网络爬取数据）时，您可能会使用申请方付款存储桶。

**重要**  
如果您在通用存储桶上启用了申请方付款，则不支持匿名访问该存储桶。

您必须对涉及申请方付款存储桶的所有请求进行身份验证。请求身份验证使 Amazon S3 能够识别申请方对申请方付款存储桶的使用并对其收费。

当请求者在做出其请求前担任 AWS Identity and Access Management (IAM) 角色时，该角色所属的账户将负责处理此请求。有关 IAM 角色的更多信息，请参阅《IAM 用户指南》**中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

在将桶配置为申请方付款桶后，申请方必须表明他们了解请求和数据下载将产生费用。为了表明他们接受这些费用，申请方必须在 DELETE、GET、HEAD、POST 和 PUT 请求的 API 请求中包含 `x-amz-request-payer` 作为标头，或者在其 REST 请求中添加 `RequestPayer` 参数。对于 CLI 请求，申请方可以使用 `--request-payer` 参数。

**Example – 删除对象时使用申请方付款**  
要使用以下 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html) API 示例，请将 `user input placeholders` 替换为您自己的信息。  

```
DELETE /Key+?versionId=VersionId HTTP/1.1
Host: Bucket.s3.amazonaws.com
x-amz-mfa: MFA
x-amz-request-payer: RequestPayer
x-amz-bypass-governance-retention: BypassGovernanceRetention
x-amz-expected-bucket-owner: ExpectedBucketOwner
```

如果申请方使用 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html) API 还原对象，则只要请求中包含 `x-amz-request-payer` 标头或 `RequestPayer` 参数，就会支持申请方付款；但是，申请方只需支付请求的费用。检索费用由桶拥有者支付。

申请方付款存储桶不支持以下内容：
+ 匿名申请
+ SOAP 请求
+ 将申请方付款存储桶用作最终用户日志记录的目标存储桶，反之亦然。但是，当目标存储桶不是申请方付款存储桶时，您可以在申请方付款存储桶上开启最终用户日志记录。

## 申请方付款的费用支付方式
<a name="ChargeDetails"></a>

成功的申请方付款请求费用简单明了：申请方支付数据传输和请求方面的费用；存储桶拥有者支付数据存储方面的费用。但是，在以下条件下会对存储桶拥有者收取请求费用：
+ 该请求返回 `AccessDenied`（HTTP `403 Forbidden`）错误，并且该请求是在存储桶拥有者的个人 AWS 账户或 AWS 组织内发起的。
+ 请求是 SOAP 请求。

有关申请方付款的更多信息，请参阅以下主题。

**Topics**
+ [申请方付款的费用支付方式](#ChargeDetails)
+ [在存储桶上配置申请方付款](RequesterPaysExamples.md)
+ [使用 REST API 检索 requestPayment 配置](BucketPayerValues.md)
+ [从申请方付款桶中下载对象](ObjectsinRequesterPaysBuckets.md)

# 在存储桶上配置申请方付款
<a name="RequesterPaysExamples"></a>

您可以将 Amazon S3 存储桶配置为*申请方付款*存储桶，以便请求者而不是存储桶拥有者支付请求和数据下载费用。

本节提供了演示如何使用控制台和 REST API 在 Amazon S3 存储桶上配置申请方付款的示例。

## 使用 S3 控制台
<a name="configure-requester-pays-console"></a>

**为 S3 通用存储桶启用申请方付款**

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

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

1. 在**通用存储桶**列表中，选择要为其启用申请方付款的存储桶的名称。

1. 选择**属性**。

1. 在 **Requester pays (申请方付款)** 下，选择 **Edit (编辑)**。

1. 选择 **Enable (启用)**，然后选择 **Save changes (保存更改)**。

   Amazon S3 为存储桶启用申请方付款，并显示 **Bucket overview（存储桶概述）**。在 **Requester pays (申请方付款)** 下，您将看到 **Enabled (已启用)**。

## 使用 REST API
<a name="RequesterPaysBucketConfiguration"></a>

只有存储桶拥有者才能将存储桶的 `RequestPaymentConfiguration.payer` 配置值设置为 `BucketOwner`（默认值）或 `Requester`。设置 `requestPayment` 资源是可选的。默认情况下，存储桶不是申请方付款存储桶。

要将申请方付款存储桶恢复为常规存储桶，请使用值 `BucketOwner`。通常情况下，在将数据上传到 Amazon S3 存储桶时，您将使用 `BucketOwner`，然后将值设置为 `Requester`，才能在该存储桶中发布对象。

**设置 requestPayment 的步骤**
+ 使用 `PUT` 请求在指定存储桶上将 `Payer` 值设置为 `Requester`。

  ```
  1. PUT ?requestPayment HTTP/1.1
  2. Host: [BucketName].s3.amazonaws.com
  3. Content-Length: 173
  4. Date: Wed, 01 Mar 2009 12:00:00 GMT
  5. Authorization: AWS [Signature]
  6. 
  7. <RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  8. <Payer>Requester</Payer>
  9. </RequestPaymentConfiguration>
  ```

如果请求成功，Amazon S3 将返回类似于以下内容的请求。

```
1. HTTP/1.1 200 OK
2. x-amz-id-2: [id]
3. x-amz-request-id: [request_id]
4. Date: Wed, 01 Mar 2009 12:00:00 GMT
5. Content-Length: 0
6. Connection: close
7. Server: AmazonS3
8. x-amz-request-charged:requester
```

您只能在存储桶级别设置申请方付款。您无法为存储桶中的特定对象设置申请方付款。

您可以随时将存储桶配置为 `BucketOwner` 或 `Requester`。但是，新配置值可能需要几分钟才能生效。

**注意**  
在将存储桶配置为申请方付款之前，分发预签名 URL 的存储桶拥有者应当再三考虑，尤其是在 URL 的生命周期非常长时更应如此。在每次申请方使用预签名 URL（使用存储桶拥有者的凭证）时，会向存储桶拥有者收取费用。

# 使用 REST API 检索 requestPayment 配置
<a name="BucketPayerValues"></a>

您可以通过请求资源 `Payer` 来确定在存储桶上设置的 `requestPayment` 值。

**返回 requestPayment 资源的步骤**
+ 使用 GET 请求来获取 `requestPayment` 资源，如以下请求所示。

  ```
  1. GET ?requestPayment HTTP/1.1
  2. Host: [BucketName].s3.amazonaws.com
  3. Date: Wed, 01 Mar 2009 12:00:00 GMT
  4. Authorization: AWS [Signature]
  ```

如果请求成功，Amazon S3 将返回类似于以下内容的请求。

```
 1. HTTP/1.1 200 OK
 2. x-amz-id-2: [id]
 3. x-amz-request-id: [request_id]
 4. Date: Wed, 01 Mar 2009 12:00:00 GMT
 5. Content-Type: [type]
 6. Content-Length: [length]
 7. Connection: close
 8. Server: AmazonS3
 9. 
10. <?xml version="1.0" encoding="UTF-8"?>
11. <RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
12. <Payer>Requester</Payer>
13. </RequestPaymentConfiguration>
```

此响应显示 `payer` 值已设置为 `Requester`。

# 从申请方付款桶中下载对象
<a name="ObjectsinRequesterPaysBuckets"></a>

因为会向申请方收取从申请方付款存储桶下载数据的费用，因此请求必须包含特殊参数 `x-amz-request-payer`，该参数确认申请方了解将向他们收取下载费用。要在申请方付款存储桶中访问对象，请求必须包含以下内容之一。
+ 对于 DELETE、GET、HEAD、POST 和 PUT 请求，在标头中包含 `x-amz-request-payer : requester`
+ 对于已签名的 URL，需在请求中包括 `x-amz-request-payer=requester`

如果请求成功且已向申请方收取费用，则响应将包括标头 `x-amz-request-charged:requester`。如果请求中没有 `x-amz-request-payer`，Amazon S3 将返回 403 错误并向存储桶拥有者收取请求的费用。

**注意**  
存储桶拥有者无需将 `x-amz-request-payer` 添加到他们的请求。  
确保在您的签名计算中包含 `x-amz-request-payer` 及其值。有关更多信息，请参阅《Amazon S3 API 参考》**中的 [Using an Authorization Header](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html)。

## 使用 REST API
<a name="get-requester-pays-rest"></a>

**从申请方付款存储桶下载对象的步骤**
+  使用 `GET` 请求从申请方付款存储桶下载对象，如以下请求所示。

  ```
  1. GET / [destinationObject] HTTP/1.1
  2. Host: [BucketName].s3.amazonaws.com
  3. x-amz-request-payer : requester
  4. Date: Wed, 01 Mar 2009 12:00:00 GMT
  5. Authorization: AWS [Signature]
  ```

如果 GET 请求成功且已向申请方收取费用，则响应将包括 `x-amz-request-charged:requester`。

Amazon S3 可以为尝试从申请方付款存储桶获取对象的请求返回 `Access Denied` 错误。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的[错误响应](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html)。

## 使用 AWS CLI
<a name="get-requester-pays-cli"></a>

要使用 AWS CLI 从申请方付款存储桶下载对象，请指定 `--request-payer requester` 包含在您的 `get-object` 请求中。有关更多信息，请参阅《*AWS CLI 参考*》中的 [get-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-object.html)。