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

存储桶所有者条件

Amazon S3 bucketowner条件确保您在S3操作中使用的bucket属于 AWS 预期的客户。

大多数S3操作从特定S3bucket读取或写入。这些操作包括上传、复制和下载对象、检索或修改存储桶配置以及检索或修改对象配置。执行这些操作时,通过将名称与请求一起添加来指定要使用的存储桶。例如,要从S3检索对象,您可以发出一个请求,指定要从该存储桶检索的存储桶名称和对象密钥。

因为 Amazon S3 基于其名称识别存储桶,在请求中使用错误存储桶名称的应用程序可能会无意中针对与预期不同的存储桶执行操作。为了避免在此类情况下无意间发生桶内交互,您可以使用 bucket所有者条件. 存储桶所有者条件允许您验证目标存储桶是否由预期 AWS 账户,为S3操作带来您预期的效果提供额外的保证层。

何时使用桶所有者条件

我们建议您在执行支持的S3操作时使用bucketowner条件,并了解预期bucketowner的帐户ID。存储桶所有者条件适用于所有S3对象操作和大多数S3存储桶操作。有关不支持存储桶所有者条件的S3操作列表,请参阅 限制和局限性.

要查看使用bucketowner条件的好处,请考虑以下涉及 AWS 客户Bea:

  1. Bea开发使用 Amazon S3. 在开发过程中,Bea只使用她的测试 AWS 账户创建名为 bea-data-test,并配置她的应用程序以向 bea-data-test.

  2. Bea部署了她的应用程序,但忘记重新配置应用程序以在生产中使用存储桶 AWS 帐户。

  3. 在生产中,Bea的应用程序向 bea-data-test,成功了。这会导致生产数据写入Bea的测试帐户中。

Bea可以通过使用桶所有者条件来帮助防止此类情况。在桶所有者条件下,Bea可包括 AWS 预期bucket所有者的帐户ID。 Amazon S3 然后检查bucket所有者的帐户ID,然后再处理每个请求。如果实际bucket所有者与预期bucket所有者不匹配,则请求失败。

如果Bea使用bucketowner条件,上述场景不会导致Bea的应用无意中写入测试桶。相反,她的应用程序在步骤3中提出的请求将失败,并显示一条描述性错误消息。通过使用桶所有者条件,Bea有助于消除意外与桶发生错误相互作用的风险 AWS 帐户。

验证存储桶所有者

要使用bucketowner条件,请在请求中添加一个参数,指定预期的bucketowner。大多数S3操作仅涉及单个存储桶,只需要此单个参数即可使用存储桶所有者条件。为 CopyObject 操作,此第一个参数指定目标存储桶的预期所有者,并且您包括第二个参数以指定源存储桶的预期所有者。

当您发出包含bucket所有者条件参数的请求时,S3在处理请求之前对照指定参数检查bucket所有者的帐户ID。如果参数与bucket所有者的账户ID匹配,S3会处理请求。如果参数与bucket所有者的帐户ID不匹配,请求将失败,并显示一条描述性错误消息。

您可以使用bucketowner条件 AWS Command Line Interface (AWS CLI), AWS SDK,以及 Amazon S3 RESTAPI。使用桶所有者条件时, AWS CLI 和 Amazon S3 RESTAPI,请使用以下参数名称。

访问方法 非复制操作的参数 复制操作源参数 复制操作目标参数
AWS CLI --expected-bucket-owner --expected-source-bucket-owner --expected-bucket-owner
Amazon S3 REST API x-amz-expected-bucket-owner 标题 x-amz-source-expected-bucket-owner 标题 x-amz-expected-bucket-owner 标题

使用bucket所有者条件所需的参数名称 AWS SDK取决于语言。要确定所需参数,请参阅所需语言的SDK文档。您可以在以下位置找到SDK文档: 在AWS上构建的工具.

Examples

以下示例显示了如何在中实施bucketowner条件 Amazon S3 使用 AWS CLI 或 适用于 Java 的 AWS 开发工具包 2.x.

示例 上传对象

以下示例将对象上传到S3bucket ,使用桶所有者条件以确保 归 AWS 账户 111122223333.

AWS CLI
aws s3api put-object \ --bucket --key exampleobject --body example_file.txt \ --expected-bucket-owner 111122223333
适用于 Java 的 AWS 开发工具包 2.x
public void putObjectExample() { S3Client s3Client = S3Client.create();; PutObjectRequest request = PutObjectRequest.builder() .bucket("") .key("exampleobject") .expectedBucketOwner("111122223333") .build(); Path path = Paths.get("example_file.txt"); s3Client.putObject(request, path); }

示例 复制对象

以下示例复制了对象 object1 来自S3桶 至S3桶 。它使用bucketowner条件来确保bucket由预期帐户根据下表拥有。

Bucket 预期所有者
111122223333
444455556666
AWS CLI
aws s3api copy-object --copy-source /object1 \ --bucket --key object1copy \ --expected-source-bucket-owner 111122223333 --expected-bucket-owner 444455556666
适用于 Java 的 AWS 开发工具包 2.x
public void copyObjectExample() { S3Client s3Client = S3Client.create(); CopyObjectRequest request = CopyObjectRequest.builder() .copySource("/object1") .destinationBucket("") .destinationKey("object1copy") .expectedSourceBucketOwner("111122223333") .expectedBucketOwner("444455556666") .build(); s3Client.copyObject(request); }

示例 检索存储桶策略

以下示例检索S3bucket的访问策略 ,使用桶所有者条件以确保 归 AWS 账户 111122223333.

AWS CLI
aws s3api get-bucket-policy --bucket --expected-bucket-owner 111122223333
适用于 Java 的 AWS 开发工具包 2.x
public void getBucketPolicyExample() { S3Client s3Client = S3Client.create(); GetBucketPolicyRequest request = GetBucketPolicyRequest.builder() .bucket("") .expectedBucketOwner("111122223333") .build(); try { GetBucketPolicyResponse response = s3Client.getBucketPolicy(request); } catch (S3Exception e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } }

限制和局限性

Amazon S3 bucketowner条件具有以下限制和限制:

  • bucket所有者条件参数的值必须是 AWS 帐户ID(12位字母数字字符串)。不支持服务主体。

  • 存储桶所有者条件不适用于 CreateBucket宴会厅, ListBuckets(列表框)或中包含的任何操作 AWS S3对照。 Amazon S3 忽略向这些操作的请求中包含的任何存储桶所有者条件参数。

  • 存储桶所有者条件仅验证验证参数中指定的帐户拥有存储桶。存储桶所有者条件不检查存储桶的配置。它还不保证存储桶的配置满足任何特定条件或匹配任何过去的状态。