创建通用存储桶 - Amazon Simple Storage Service

创建通用存储桶

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

重要

创建存储桶后,无法更改存储桶名称、存储桶拥有者或区域。有关存储桶命名的更多信息,请参阅 通用存储桶命名规则

默认情况下,每个 AWS 账户可以创建多达 10000 个通用存储桶。要请求增加通用存储桶的配额,请访问服务配额控制台

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

通用存储桶设置

创建通用存储桶时,可以使用以下设置来控制存储桶行为的各个方面:

  • S3 对象所有权:S3 对象所有权是 Amazon S3 存储桶级别的设置,您可以使用该设置来控制上传到存储桶的对象的所有权,并禁用或启用访问控制列表(ACL)。默认情况下,对象所有权设为强制存储桶拥有者设置,并且所有 ACL 均处于禁用状态。禁用 ACL 后,存储桶拥有者拥有存储桶中的每个对象,并使用策略专门管理对数据的访问权限。有关更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。

  • ​S3 对象锁定:S3 对象锁定有助于在固定的时间长度内或无限期地阻止删除或覆盖 Amazon S3 对象。对象锁定使用一次写入多次读取(WORM)模式存储对象。您可以使用对象锁定来协助满足需要 WORM 存储的法规要求,或用于添加额外的保护层来防止对象被更改和删除。有关更多信息,请参阅 使用对象锁定以锁定对象

创建通用存储桶后,或者当使用 Amazon S3 控制台创建通用存储桶时,还可以使用以下设置来控制存储桶行为的其它方面:

  • S3 屏蔽公共访问权限:S3 屏蔽公共访问权限功能提供接入点、存储桶和账户的设置,有助于您管理对 Amazon S3 资源的公共访问权限。默认情况下,新存储桶、接入点和对象不允许公有访问。但是,用户可以修改存储桶策略、接入点策略或对象权限以允许公有访问。S3 屏蔽公共访问权限设置会覆盖这些策略和权限,以便于您可以限制这些资源的公有访问。有关更多信息,请参阅 阻止对您的 Amazon S3 存储的公有访问

  • S3 版本控制:版本控制是在同一个存储桶中保留对象的多个版本的方法。对于 存储桶中存储的每个对象,您可以使用版本控制功能来保留、检索和还原它们的各个版本。使用版本控制能够轻松从用户意外操作和应用程序故障中恢复数据。默认情况下,对存储桶禁用版本控制。有关更多信息,请参阅 使用 S3 版本控制保留对象的多个版本

  • 默认加密:可以为存储桶中的所有对象设置默认加密类型。具有 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 存储桶设置默认服务器端加密行为

可以使用 Amazon S3 控制台、Amazon S3 REST API、AWS Command Line Interface(AWS CLI)或 AWS SDK 来创建通用存储桶。有关创建通用存储桶所需权限的更多信息,请参阅《Amazon Simple Storage Service API Reference》中的 CreateBucket

如果您在创建 Amazon S3 存储桶时遇到问题,请参阅 AWS re:Post 上的我如何解决在创建 Amazon S3 存储桶时出现的错误?

  1. 登录到 AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在页面顶部的导航栏中,选择当前所显示 AWS 区域的名称。接下来,选择要在其中创建存储桶的区域。

    注意
    • 存储桶创建后,便无法再更改其区域。

    • 要最大程度地减少延迟和成本以及满足法规要求,请选择一个靠近您的区域。在某一区域存储的对象将一直留在该区域,除非您特意将其转移到其他区域。有关 Amazon S3 AWS 区域的列表,请参阅《Amazon Web Services 一般参考》中的 AWS 服务 端点

  3. 在左侧导航窗格中,选择通用存储桶

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

  5. 对于存储桶名称,请输入存储桶的名称。

    存储桶名称必须满足以下要求:

    • 在分区中是唯一的。分区是区域的分组。AWS 目前有三个分区:aws(商用区域)、aws-cn(中国区域)和 aws-us-gov(AWS GovCloud (US) Regions)。

    • 长度必须介于 3 到 63 个字符之间。

    • 只能由小写字母、数字、句点 (.) 和连字符 (-) 组成。为了获得最佳兼容性,我们建议您避免在存储桶名称中使用句点 (.),但仅用于静态网站托管的存储桶除外。

    • 以字母或数字开头和结尾。

    • 有关存储桶命名规则的完整列表,请参阅通用存储桶命名规则

    重要
    • 创建存储桶后,便无法更改其名称。

    • 请勿在存储桶名称中包含敏感信息。存储桶名称会显示在指向存储桶中的对象的 URL 中。

  6. (可选)在常规配置下,您可以选择将现有存储桶的设置复制到新存储桶。如果您不想复制现有存储桶的设置,请跳到下一步。

    注意

    此选项:

    • 在 AWS CLI 中不可用,仅在 Amazon S3 控制台中可用

    • 不会将存储桶策略从现有存储桶复制到新存储桶

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

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

  7. Object Ownership(对象所有权)下方,要禁用或启用 ACL,并控制上传到存储桶中的对象的所有权,请选择以下设置之一:

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

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

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

      如果应用首选存储桶拥有者设置,以要求所有 Amazon S3 上传都包含 bucket-owner-full-control 标准 ACL,则可以添加存储桶策略,该策略只允许使用此 ACL 上传对象。

    • 对象编写者— 该 AWS 账户上传对象拥有该对象,对其拥有完全控制权,并且可以通过 ACL 授予其他用户访问该对象的权限。

    注意

    默认设置为强制存储桶拥有者。要应用默认设置并将 ACL 保持为禁用状态,只需要 s3:CreateBucket 权限。要启用 ACL,您必须具有 s3:PutBucketOwnershipControls 权限。

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

    默认情况下,启用所有四个“屏蔽公共访问权限”设置。我们建议您将所有设置保持为启用状态,除非您知道您需要为您的特定使用案例关闭其中一个或多个设置。有关屏蔽公共访问权限的更多信息,请参阅阻止对您的 Amazon S3 存储的公有访问

    注意

    要启用所有“屏蔽公共访问权限”设置,只需要 s3:CreateBucket 权限。要关闭任何“屏蔽公共访问权限”设置,您必须拥有 s3:PutBucketPublicAccessBlock 权限。

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

    要在存储桶上启用版本控制,请选择启用

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

    要添加存储桶标签,请输入 Key(键),并(可选)输入 Value(值),然后选择 Add Tag(添加标签)。

  11. 要配置默认加密,请在加密类型下,选择以下选项之一:

    • 具有 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 开发人员指南》中的限额

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

    有关使用服务器端加密对数据进行加密的更多信息,请参阅利用加密来保护数据

  12. 如果您选择具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3)具有 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 密钥

      • 要输入 KMS 密钥 ARN,请选择输入 AWS KMS key ARN,然后在显示的字段中输入您的 KMS 密钥 ARN。

      • 要在 AWS KMS 控制台中创建新的客户自主管理型密钥,请选择创建 KMS 密钥

        有关创建 AWS KMS key 的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的创建密钥

      重要

      您只能使用与存储桶所在相同的 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。有关 SSE-KMS 的更多信息,请参阅 使用 AWS KMS (SSE-KMS) 指定服务器端加密。有关 DSSE-KMS 的更多信息,请参阅使用具有 AWS KMS 密钥的双层服务器端加密(DSSE-KMS)

      在 Amazon S3 中使用 AWS KMS key 进行服务器端加密时,您必须选择对称加密 KMS 密钥。Amazon S3 仅支持对称加密 KMS 密钥,而不支持非对称 KMS 密钥。有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的确定对称和非对称 KMS 密钥

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

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

  13. (可选)S3 对象锁定有助于保护新对象不被删除或覆盖。有关更多信息,请参阅 使用对象锁定以锁定对象。如果要启用 S3 对象锁定,请执行以下操作:

    1. 选择高级设置

      重要

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

    2. 如果要启用对象锁定,请选择 Enable(启用),阅读出现的警告,并予以确认。

    注意

    要创建启用了对象锁定的存储桶,您必须具有以下权限:s3:CreateBuckets3:PutBucketVersionings3:PutBucketObjectLockConfiguration

  14. 请选择 Create bucket(创建存储桶)

使用 AWS SDK 创建通用存储桶时,您必须先创建一个客户端,然后使用该客户端发送创建存储桶的请求。作为最佳做法,您应在同一 AWS 区域 中创建客户端和存储桶。如果您在创建客户端或存储桶时未指定区域,Amazon S3 将使用默认区域,即美国东部(弗吉尼亚州北部)。如果您想将存储桶的创建限制在特定 AWS 区域内,则使用 LocationConstraint 条件键。

要创建客户端来访问双堆栈端点,则必须指定 AWS 区域。有关更多信息,请参阅《Amazon S3 API 参考》中的 Using Amazon S3 dual-stack endpoints。有关可用 AWS 区域的列表,请参阅《AWS 一般参考》中的 Amazon Simple Storage Service endpoints and quotas

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

这些 AWS SDK 代码示例执行以下任务:

  • 通过显式指定 AWS 区域创建客户端 – 在本例中,客户端使用 s3.us-west-2.amazonaws.com 端点与 Amazon S3 通信。您可以指定任意 AWS 区域。有关 AWS 区域 的列表,请参阅《AWS 一般参考》中的区域和端点

  • 通过仅指定存储桶名称来发送创建存储桶请求 – 客户端向 Amazon S3 发送请求,请求在您创建客户端的区域中创建存储桶。

  • 检索有关存储桶位置的信息:Amazon S3 将存储桶位置信息存储在与存储桶关联的位置子资源中。

有关其它 AWS SDK 示例以及其它语言的示例,请参阅《Amazon Simple Storage Service API Reference》中的 Use CreateBucket with an AWS SDK or CLI

Java
例 创建存储桶名称中使用全局唯一标识符(GUID)的存储桶

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

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); } }
例 创建通用存储桶

此示例向您展示如何通过使用适用于 Java 的 AWS SDK 来创建 Amazon S3 存储桶。有关创建和测试有效示例的说明,请参阅 AWS SDK for Java 2.x Developer Guide

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.CreateBucketRequest; import com.amazonaws.services.s3.model.GetBucketLocationRequest; import java.io.IOException; public class CreateBucket2 { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); if (!s3Client.doesBucketExistV2(bucketName)) { // Because the CreateBucketRequest object doesn't specify a region, the // bucket is created in the region specified in the client. s3Client.createBucket(new CreateBucketRequest(bucketName)); // Verify that the bucket was created by retrieving it and checking its // location. String bucketLocation = s3Client.getBucketLocation(new GetBucketLocationRequest(bucketName)); System.out.println("Bucket location: " + bucketLocation); } } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it and 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

有关如何创建和测试有效示例的信息,请参阅 AWS SDK for .NET Version 3 API Reference

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

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 示例在美国西部(北加利福尼亚)区域 (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》中的 create-bucket