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

创建存储桶

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

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

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

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

  1. 登录到 Amazon Web Services 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 (区域),请选择要放置存储桶的 Amazon Web Services 区域。

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

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

    已禁用 ACL

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

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

    已启用 ACL

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

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

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

    注意

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

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

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

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

    1. 请选择 Advanced settings (高级设置),然后阅读显示的消息。

      重要

      您只能在创建存储桶时为其启用 S3 对象锁定。如果您为存储桶启用了对象锁定,则以后无法禁用它。启用对象锁定还会启用存储桶的版本控制。为存储桶启用对象锁定后,必须配置对象锁定原定设置保留和法律保留设置,以保护新对象不被删除或覆盖。有关更多信息,请参阅使用控制台配置 S3 对象锁定

    2. 如果要启用对象锁定,请在文本框中输入 enable 并选择 Confirm(确认)。

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

    注意

    要创建启用对象锁定的存储桶,您必须具有以下权限:s3:CreateBucket、s3:PutBucketVersioning 和 S3:PutBucketObjectLockConfiguration。

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

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

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

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

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

  • 通过明确指定 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 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__

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

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