创建存储桶 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

创建存储桶

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

创建存储桶的 Amazon Web Services 账户 拥有该存储桶。您可以将任何数量的对象上载到该存储桶。默认情况下,您可以在每个 Amazon Web Services 账户中创建多达 100 个存储桶。如果您需要更多存储桶,则可以通过提交服务限制提高请求将账户的存储桶限制提高至最多 1,000 个存储桶。要了解如何提交存储桶限制提升,请参阅《Amazon 一般参考》中的 Amazon Web Service限额。一个存储桶中可以存储任意数量的对象。

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

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

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

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

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

  2. 在左侧导航窗格中,选择存储桶

  3. 选择创建存储桶

    此时将打开创建存储桶页面。

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

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

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

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

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

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

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

    重要

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

  5. 对于区域,选择要放置存储桶的 Amazon Web Services 区域。

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

  6. 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 上传对象。

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

    注意

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

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

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

    注意

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

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

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

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

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

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

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

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

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

      重要

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

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

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

  12. 如果选择了 Amazon Key Management Service 密钥(SSE-KMS),则执行以下操作:

    1. Amazon KMS 密钥下,通过以下方式之一指定您的 KMS 密钥:

      • 要从可用的 KMS 密钥列表中进行选择,请选择从您的 Amazon KMS keys 密钥中进行选择,并从可用密钥的列表中选择您的 KMS 密钥

        Amazon 托管式密钥(aws/s3)和您的客户自主管理型密钥都显示在此列表中。有关客户自主管理型密钥的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的客户密钥和 Amazon 密钥

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

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

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

      重要

      您只能使用与存储桶所在相同的 Amazon Web Services 区域中可用的 KMS 密钥。Amazon S3 控制台仅列出与存储桶位于同一区域中的前 100 个 KMS 密钥。要使用未列出的 KMS 密钥,您必须输入 KMS 密钥 ARN。如果您希望使用其他账户拥有的 KMS 密钥,则必须首先有权使用该密钥,然后必须输入相应的 KMS 密钥 ARN。有关 KMS 密钥的跨账户权限的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的创建其他账户可以使用的 KMS 密钥。有关 SSE-KMS 的更多信息,请参阅使用 Amazon KMS (SSE-KMS) 指定服务器端加密

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

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

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

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

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

    1. 选择高级设置

      重要

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

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

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

    注意

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

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

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

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

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

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

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

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

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

Java

此示例说明如何使用 Amazon SDK for Java 创建 Amazon S3 存储桶。有关创建和测试有效示例的说明,请参阅 测试 Amazon S3 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

有关如何创建和测试有效示例的信息,请参阅 运行 Amazon S3 .NET 代码示例

using Amazon; using Amazon.S3; using Amazon.S3.Model; using Amazon.S3.Util; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class CreateBucketTest { private const string bucketName = "*** bucket name ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { s3Client = new AmazonS3Client(bucketRegion); CreateBucketAsync().Wait(); } static async Task CreateBucketAsync() { try { if (!(await AmazonS3Util.DoesS3BucketExistAsync(s3Client, bucketName))) { var putBucketRequest = new PutBucketRequest { BucketName = bucketName, UseClientRegion = true }; PutBucketResponse putBucketResponse = await s3Client.PutBucketAsync(putBucketRequest); } // Retrieve the bucket location. string bucketLocation = await FindBucketLocationAsync(s3Client); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } static async Task<string> FindBucketLocationAsync(IAmazonS3 client) { string bucketLocation; var request = new GetBucketLocationRequest() { BucketName = bucketName }; GetBucketLocationResponse response = await client.GetBucketLocationAsync(request); bucketLocation = response.Location.ToString(); return bucketLocation; } } }
Ruby

有关如何创建和测试有效示例的信息,请参阅 使用 Amazon SDK for Ruby - 版本 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("doc-example-bucket-#{Random.uuid}")) return unless wrapper.create?(region) puts "Created bucket #{wrapper.bucket.name}." puts "Your bucket's region is: #{wrapper.location}" end run_demo if $PROGRAM_NAME == __FILE__

您也可以使用Amazon Command Line Interface(Amazon CLI)创建 S3 存储桶。有关更多信息,请参阅《Amazon CLI 命令参考》中的 create-bucket

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