

# バケット所有者条件によるバケット所有者の確認
<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>

正しいバケット所有者のアカウント ID がわかっていて、サポートされている S3 オペレーションを実行する場合は、バケット所有者条件を使用することをお勧めします。バケット所有者条件は、すべての 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 オペレーションに含まれるバケットは 1 つだけであり、バケット所有者条件を使用するために必要になるのは、この 1 つのパラメータのみです。`CopyObject` オペレーションの場合、この最初のパラメータでは宛先バケットの正しい所有者を指定します。ソースバケットの正しい所有者を指定するには、2 番目のパラメータを含めます。

バケット所有者条件パラメータを含むリクエストを行うと、S3 はリクエストを処理する前に、指定されたパラメータに対してバケット所有者のアカウント ID をチェックします。パラメータがバケット所有者のアカウント ID と一致すると、S3 がリクエストを処理します。パラメータがバケット所有者のアカウント ID と一致しない場合、リクエストは失敗し、`Access Denied` エラーメッセージが表示されます。

バケット所有者条件は、AWS Command Line Interface (AWS CLI)、AWS SDK、および Amazon S3 REST API で使用できます。AWS CLI および Amazon S3 REST API でバケット所有者条件を使用する場合は、次のパラメータ名を使用します。


****  

| アクセス方法 | コピーオペレーション以外のパラメータ | コピーオペレーションのソースパラメータ | コピーオペレーションの宛先パラメータ | 
| --- | --- | --- | --- | 
| 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 ドキュメント を参照してください。SDK ドキュメントには、[AWS での構築ツール](https://aws.amazon.com/tools/)からアクセスできます。

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

以下の例は、AWS CLI または AWS SDK for Java 2.x を使用してバケット所有者条件を Amazon S3 に実装する方法を示しています。

**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**  
***例: オブジェクトのコピー***  
次の例では、S3 バケット `object1` から S3 バケット `amzn-s3-demo-bucket1` にオブジェクト `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 では、これらのオペレーションに対するリクエストに含まれるバケット所有者条件パラメータがすべて無視されます。
+ バケット所有者条件は、検証パラメータで指定されたアカウントがバケットを所有しているかどうかのみを検証します。バケット所有者条件で、バケットの設定はチェックされません。また、バケットの設定が特定の条件を満たしていること、または過去の状態と一致することを保証するものではありません。