

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用儲存貯體擁有者條件驗證儲存貯體擁有權
<a name="bucket-owner-condition"></a>

Amazon S3 儲存貯體擁有者條件可確保您在 S3 操作中使用的儲存貯體屬於 AWS 帳戶 您預期的 。

大多數 S3 操作從特定 S3 儲存貯體讀取或寫入。這些操作包含上傳、複製和下載物件、擷取或修改儲存貯體組態，以及擷取或修改物件組態。當您執行這些操作時，您可以在請求中加入其名稱來指定要使用的儲存貯體。例如，若要從 S3 擷取物件，您可以提出請求，指定儲存貯體的名稱和要從該儲存貯體擷取的物件金鑰。

由於 Amazon S3 會根據儲存貯體的名稱識別儲存貯體，因此在請求中使用錯誤儲存貯體名稱的應用程式可能會無意中針對與預期不同的儲存貯體執行操作。為了避免在這種情況下意外的儲存貯體互動，您可以使用*儲存貯體擁有者條件*。儲存貯體擁有者條件可讓您驗證目標儲存貯體是否由預期的 AWS 帳戶所擁有，提供額外的保證，讓您的 S3 操作具有您想要的效果。

**Topics**
+ [何時使用儲存貯體擁有者條件](#bucket-owner-condition-when-to-use)
+ [驗證儲存貯體擁有者](#bucket-owner-condition-use)
+ [範例](#bucket-owner-condition-examples)
+ [法規與限制](#bucket-owner-condition-restrictions-limitations)

## 何時使用儲存貯體擁有者條件
<a name="bucket-owner-condition-when-to-use"></a>

每當您執行支援的 S3 操作並知道預期儲存貯體擁有者的帳戶 ID時，建議您使用儲存貯體擁有者條件。儲存貯體擁有者條件適用於所有 S3 物件操作和大多數 S3 儲存貯體操作。如需不支援儲存貯體擁有者條件的 S3 操作清單，請參閱 [法規與限制](#bucket-owner-condition-restrictions-limitations)。

若要查看使用儲存貯體擁有者條件的好處，請考慮下列涉及 AWS 客戶 Bea 的案例：

1. Bea 開發使用 Amazon S3 的應用程式。在開發期間，Bea 僅使用她的測試 AWS 帳戶 來建立名為 的儲存貯體`bea-data-test`，並設定她的應用程式向 提出請求`bea-data-test`。

1. Bea 部署了她的應用程式，但忘記重新配置應用程式以在生產 AWS 帳戶中使用儲存貯體。

1. 在生產中，BEA 的應用程式提出請求至 `bea-data-test` 並且已成功。這會導致生產資料寫入 BEA 測試帳戶中的儲存貯體。

BEA 可以透過使用儲存貯體擁有者條件來幫助防止這種情況。使用儲存貯體擁有者條件，Bea 可以在請求中包含預期儲存貯體擁有者的 AWS 帳戶 ID。然後，Amazon S3 會在處理每個請求之前檢查儲存貯體擁有者的帳戶 ID。如果實際的儲存貯體擁有者與預期的儲存貯體擁有者不符，請求就會失敗。

如果 BEA 使用儲存貯體擁有者條件，則先前描述的案例不會導致 BEA 的應用程式不小心寫入測試時段。相反地，她的應用程式在步驟 3 所做的請求將會失敗，並顯示 `Access Denied` 錯誤訊息。透過使用儲存貯體擁有者條件，BEA 有助於消除在錯誤 AWS 帳戶中意外與儲存貯體互動的風險。

## 驗證儲存貯體擁有者
<a name="bucket-owner-condition-use"></a>

若要使用儲存貯體擁有者條件，請求包含參數，指定預期的儲存貯體擁有者。大多數 S3 操作只涉及一個儲存貯體，並且只需要此單一參數才能使用儲存貯體擁有者條件。對於 `CopyObject` 操作，此第一個參數指定目的地儲存貯體的預期擁有者，而且您可以包含第二個參數來指定來源儲存貯體的預期擁有者。

當您提出包含儲存貯體擁有者條件參數的請求時，S3 會針對指定的參數檢查儲存貯體擁有者的帳戶 ID，然後再處理請求。如果參數符合儲存貯體擁有者的帳戶 ID，S3 會處理請求。如果參數不符合儲存貯體擁有者的帳戶 ID，請求會失敗並顯示 `Access Denied` 錯誤訊息。

您可以搭配 AWS Command Line Interface (AWS CLI)、 AWS SDKs和 Amazon S3 REST APIs 使用儲存貯體擁有者條件。搭配 AWS CLI 和 Amazon S3 REST APIs 使用儲存貯體擁有者條件時，請使用下列參數名稱。


****  

| 存取方法 | 非複製操作的參數 | 複製操作來源參數 | 複製操作目的地參數 | 
| --- | --- | --- | --- | 
| 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 標頭 | 

使用儲存貯體擁有者條件搭配 AWS SDK 所需的參數名稱會視語言而有所不同。若要判斷必要的參數，請參閱您所需語言的 SDK 說明文件。您可以在 AWS[ 上建置的工具](https://aws.amazon.com/tools/)中找到 SDK 說明文件。

## 範例
<a name="bucket-owner-condition-examples"></a>

下列範例示範如何使用 AWS CLI 或 在 Amazon S3 中實作儲存貯體擁有者條件 AWS SDK for Java 2.x。

**Example**  
***範例：上傳物件***  
下列範例會使用儲存貯體擁有者條件將物件上傳至 S3 儲存貯體 `{{amzn-s3-demo-bucket1}}`，以確保 `{{amzn-s3-demo-bucket1}}` 為 AWS 帳戶 `111122223333` 所擁有。  

```
aws s3api put-object \
                 --bucket {{{{amzn-s3-demo-bucket1}}}} --key {{exampleobject}} --body {{example_file.txt}} \
                 --expected-bucket-owner {{111122223333}}
```

```
public void putObjectExample() {
    S3Client s3Client = S3Client.create();;
    PutObjectRequest request = PutObjectRequest.builder()
            .bucket("{{{{amzn-s3-demo-bucket1}}}}")
            .key("{{exampleobject}}")
            .expectedBucketOwner("{{111122223333}}")
            .build();
    Path path = Paths.get("{{example_file.txt}}");
    s3Client.putObject(request, path);
}
```

**Example**  
***範例：複製物件***  
下列範例會將物件 `object1` 從 S3 儲存貯體 `{{amzn-s3-demo-bucket1}}` 複製到 S3 儲存貯體 `{{amzn-s3-demo-bucket2}}`。它會使用儲存貯體擁有者條件，以確保儲存貯體是由預期帳戶根據下表所擁有。  


****  

| 儲存貯體 | 預期的擁有者 | 
| --- | --- | 
| {{amzn-s3-demo-bucket1}} | 111122223333 | 
| {{amzn-s3-demo-bucket2}} | 444455556666 | 

```
aws s3api copy-object --copy-source {{{{amzn-s3-demo-bucket1}}/object1}} \
                            --bucket {{{{amzn-s3-demo-bucket2}}}} --key {{object1copy}} \
                            --expected-source-bucket-owner {{111122223333}} --expected-bucket-owner {{444455556666}}
```

```
public void copyObjectExample() {
        S3Client s3Client = S3Client.create();
        CopyObjectRequest request = CopyObjectRequest.builder()
                .copySource("{{{{amzn-s3-demo-bucket1}}/object1}}")
                .destinationBucket("{{{{amzn-s3-demo-bucket2}}}}")
                .destinationKey("{{object1copy}}")
                .expectedSourceBucketOwner("{{111122223333}}")
                .expectedBucketOwner("{{444455556666}}")
                .build();
        s3Client.copyObject(request);
    }
```

**Example**  
***範例：擷取儲存貯體策略***  
下列範例會使用儲存貯體擁有者條件擷取 S3 儲存貯體的存取政策 `{{amzn-s3-demo-bucket1}}`，以確保 `{{amzn-s3-demo-bucket1}}` 為 AWS 帳戶 `111122223333` 所擁有。  

```
aws s3api get-bucket-policy --bucket {{{{amzn-s3-demo-bucket1}}}} --expected-bucket-owner {{111122223333}}
```

```
public void getBucketPolicyExample() {
    S3Client s3Client = S3Client.create();
    GetBucketPolicyRequest request = GetBucketPolicyRequest.builder()
            .bucket("{{{{amzn-s3-demo-bucket1}}}}")
            .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();
    }
}
```

## 法規與限制
<a name="bucket-owner-condition-restrictions-limitations"></a>

Amazon S3 儲存貯體擁有者條件具有下列限制和限制：
+ 儲存貯體擁有者條件參數的值必須是 AWS 帳戶 ID (12 位數數值）。不支援服務委託人。
+ 儲存貯體擁有者條件不適用於 [CreateBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)、[ListBuckets](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html) 或 [AWS S3 控制](https://docs.aws.amazon.com/AmazonS3/latest/API/API_Operations_AWS_S3_Control.html)中包含的任何操作。Amazon S3 會忽略對這些操作請求所包含的任何儲存貯體擁有者條件參數。
+ 儲存貯體擁有者條件只會驗證驗證參數中指定的帳戶是否擁有該時段。儲存貯體擁有者條件不會檢查儲存貯體的組態。它也不保證儲存貯體的組態符合任何特定條件或匹配任何過去的狀態。