创建桶 - Amazon Simple Storage Service

创建桶

要向 Amazon S3 上传数据,您必须首先在其中一个 AWS 区域 中创建 Amazon S3 存储桶。创建存储桶时,您必须选择存储桶名称和区域。您可以选择为存储桶选择其他存储管理选项。创建存储桶后,无法更改存储桶名称或区域。有关如何命名存储桶的信息,请参阅存储桶命名规则

创建存储桶的 AWS 账户 拥有该存储桶。您可以将任何数量的对象上传到该存储桶。默认情况下,您可以在每个 AWS 账户中创建多达 100 个存储桶。如果您需要更多存储桶,则可以为您的账户提交增加配额请求。要了解如何提交增加配额请求,请参阅《AWS 一般参考》中的 AWS 服务 配额

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

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

有关更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。

具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)是 Amazon S3 中每个存储桶的基本加密配置级别。上传到 S3 存储桶的所有新对象都将使用 SSE-S3 作为基本加密级别设置自动进行加密。如果您想使用其他类型的默认加密,也可以指定具有 AWS Key Management Service(AWS KMS)密钥(SSE-KMS)或客户提供的密钥(SSE-C)的服务器端加密来加密数据。有关更多信息,请参阅 为 Amazon S3 存储桶设置默认服务器端加密行为

您可以使用 Amazon S3 控制台、Amazon S3 API、AWS CLI 或 AWS SDK 创建存储桶。有关创建存储桶所需权限的更多信息,请参阅 Amazon Simple Storage Service API 参考中的 CreateBucket

  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 区域。

  6. 存储桶类型下,选择通用

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

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

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

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

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

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

    创建存储桶后,便无法再更改其名称。创建存储桶的 AWS 账户 拥有该存储桶。有关给存储桶命名的更多信息,请参阅存储桶命名规则

    重要

    避免在存储桶名称中包含敏感信息,如账号。存储桶名称会显示在指向存储桶中的对象的 URL 中。

  8. AWS Management Console可让您将现有存储桶的设置复制到新存储桶。如果您不想复制现有存储桶的设置,请跳到下一步。

    注意

    此选项:

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

    • 不可用于目录存储桶

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

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

    从现有存储桶复制设置下,您现在将看到所选存储桶的名称。您还将看到还原默认值选项,您可以使用该选项移除复制的存储桶设置。在创建存储桶页面上查看其余存储桶设置。您将看到它们现在与您选择的存储桶的设置相匹配。您可以跳到最后一步。

  9. 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 权限。

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

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

    注意

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

  11. (可选)在 Bucket Versioning(存储桶版本控制)下,您可以选择是否要在存储桶中保留对象的变体。有关版本控制的更多信息,请参阅使用 S3 版本控制保留对象的多个版本

    要在存储桶上禁用或启用版本控制,请选择 Disable(禁用)或 Enable(启用)。

  12. (可选)在 Tags(标签)下,您可以选择向存储桶添加标签。标签是用于对存储进行分类的键/值对。

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

  13. 默认加密下,请选择编辑

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

    • Amazon S3 托管密钥(SSE-S3)

    • AWS Key Management Service 密钥(SSE-KMS)

      重要

      如果您将 SSE-KMS 选项用于默认加密配置,则您将受到 AWS KMS 的每秒请求数(RPS)限额限制。有关 AWS KMS 限额以及如何请求增加限额的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的限额

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

    有关使用 Amazon S3 服务器端加密对数据进行加密的更多信息,请参阅使用具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3)

  15. 如果选择了 AWS Key Management Service 密钥(SSE-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 开发人员指南》中的创建其他账户可以使用的 KMS 密钥。有关 SSE-KMS 的更多信息,请参阅使用 AWS KMS (SSE-KMS) 指定服务器端加密

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

      有关创建 AWS KMS key 的更多信息,请参阅 AWS Key Management Service 开发人员指南中的创建密钥。有关将 AWS KMS 与 Amazon S3 结合使用的更多信息,请参阅使用具有 AWS KMS 密钥的服务器端加密(SSE-KMS)

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

      要使用 S3 存储桶密钥,请在 Bucket Key(存储桶密钥)下,选择 Enable(启用)。

  16. (可选)如果要启用 S3 对象锁定,请执行以下操作:

    1. 选择高级设置

      重要

      启用对象锁定还会启用存储桶的版本控制。启用后,必须配置对象锁定默认保留和法律保留设置,以保护新对象不被删除或覆盖。

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

    有关更多信息,请参阅 使用对象锁定以锁定对象

    注意

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

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

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

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

创建客户端时,区域映射到特定于区域的端点。客户端使用此端点与 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 将存储桶位置信息存储在与存储桶关联的位置子资源中。

Java

此示例说明如何使用 AWS SDK for Java 创建 Amazon S3 存储桶。有关创建和测试有效示例的说明,请参阅《AWS SDK for Java 开发人员指南》中的入门

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 Command Line Interface(AWS CLI)创建 S3 存储桶。有关更多信息,请参阅《AWS CLI 命令参考》中的 create-bucket

有关 AWS CLI 的更多信息,请参阅《AWS Command Line Interface 用户指南》中的什么是 AWS Command Line Interface?