创建桶 - Amazon Simple Storage Service

创建桶

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

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

S3 Object Ownership 是 Amazon S3 桶级设置,您可以使用它禁用访问控制列表(ACL)并获取桶中每个对象的所有权,从而简化了对存储在 Amazon S3 中的数据的访问管理。默认情况下,当另一个 AWS 账户将对象上载到您的 Amazon S3 桶时,该账户(对象写入器)拥有该对象的所有权,可以访问该对象,并且可以授予其他用户通过 ACL 访问该对象的权限。当您创建一个桶时,您可以应用桶所有者对 Object Ownership 的强制设置来更改此原定设置行为,以便禁用 ACL,而您作为桶所有者,自动拥有桶中的每个对象。因此,数据的访问控制基于策略。有关更多信息,请参阅为您的桶控制对象所有权和禁用 ACL。

重要

从 2023 年 4 月开始,Amazon S3 将更改所有新 S3 桶的 S3 阻止公有访问和对象所有权(禁用 ACL)的原定设置。对于在此更新之后创建的新桶,所有 S3 阻止公有访问设置都将启用,S3 访问控制列表(ACL)将被禁用。这些原定设置是在 Amazon S3 中保护数据的推荐最佳实践。您可以在创建桶后调整这些设置。有关更多信息,请参阅 新 S3 桶的原定设置常见问题解答AWS 新闻博客中的 Heads-Up: Amazon S3 Security Changes Are Coming in April of 2023(提醒:Amazon S3 安全更改将于 2023 年 4 月发布)。

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

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

  2. 请选择 Create bucket(创建桶)

    此时将打开 Create bucket(创建桶)向导。

  3. Bucket name(桶名称)中,输入符合 DNS 标准的桶名称。

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

    • 在所有 Amazon S3 中是唯一的。

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

    • 不包含大写字符。

    • 以小写字母或数字开头。

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

    重要

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

  4. 对于 Region(区域),请选择要放置桶的 AWS 区域。

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

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

    已禁用 ACL
    • Bucket owner enforced(强制桶所有者)— ACL 被禁用,桶拥有者自动拥有并完全控制桶中的每个对象。ACL 不再影响 S3 桶中对数据的权限。桶使用策略来定义访问控制。

      要通过使用 IAM 或 AWS Organizations 策略借助禁用的 ACL 要求创建所有新的桶,请参阅 禁用所有新桶的 ACL(强制执行桶拥有者)

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

      如果应用桶所有者首选设置,以要求所有的 Amazon S3 上载都包含 bucket-owner-full-control 存储的 ACL,可以 add a bucket policy(添加桶策略),该策略只允许对象使用此 ACL 上载。

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

    注意

    若要应用 Bucket owner enforced(桶所有者强制)设置或 Bucket owner preferred(桶所有者首选)设置,必须有以下权限:s3:CreateBuckets3:PutBucketOwnershipControls

  6. Bucket settings for Block Public Access(阻止公有访问的桶设置)中,请选择要应用于桶的 Block Public Access(阻止公有访问)设置。

    我们建议您将所有设置保持为启用状态,除非您知道您需要为您的使用案例关闭其中一个或多个设置,例如托管公共网站。您为桶启用的阻止公有访问设置也将为您在桶上创建的所有接入点启用。有关阻止公有访问的更多信息,请参阅 阻止对您的 Amazon S3 存储的公有访问

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

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

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

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

  9. (可选)在 Default encryption(原定设置加密)下,您可以选择将桶配置为使用以下加密方式:具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3),或具有存储于 AWS Key Management Service(AWS KMS)中的 AWS KMS keys 的服务器端加密(SSE-KMS)。有关更多信息,请参阅为 Amazon S3 Bucket 设置默认服务器端加密行为

    要禁用或启用加密,请选择 Disable(禁用)或 Enable(启用)。

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

    1. 选择 Advanced Settings(高级设置)。

      重要

      您只能在创建桶时为其启用对象锁定,且之后无法禁用它。启用对象锁定还会启用桶的版本控制。启用后,必须配置对象锁定原定设置保留和法律保留设置,以保护新对象不被删除或覆盖。

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

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

    注意

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

  11. 请选择 Create bucket(创建桶)

使用 AWS 软件开发工具包创建桶时,您必须先创建一个客户端,然后使用该客户端发送创建桶的请求。作为最佳做法,您应在同一 AWS 区域 中创建客户端和桶。如果您在创建客户端或桶时未指定区域,Amazon S3 将使用默认区域美国东部(弗吉尼亚北部)。

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

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

这些 AWS 软件开发工具包代码示例执行以下任务:

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

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

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

Java

此示例说明如何使用 AWS 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

有关如何创建和测试有效示例的信息,请参阅 使用 AWS 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 it's 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 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__

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

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