

# Amazon S3 バケットに条件付き書き込みを強制する
<a name="conditional-writes-enforce"></a>

Amazon S3 バケットポリシーを使用すると、汎用バケット内のオブジェクトアップロードに条件付き書き込みを強制できます。

バケットポリシーは、Amazon S3 バケットとその中のオブジェクトへのアクセス許可を付与できるリソースベースのポリシーです。バケット所有者のみが、ポリシーをバケットに関連付けることができます。バケットポリシーの詳細については、「[Amazon S3 のバケットポリシー](bucket-policies.md)」を参照してください。

条件キー `s3:if-match` または `s3:if-none-match` をオプションの `Condition` 要素または `Condition` ブロックとして使用して、ポリシーが有効になるタイミングを指定できます。これらの API は条件付きヘッダーを受け付けないため、マルチパートアップロードの場合、`CreateMultipartUpload`、`UploadPart`、および `UploadPartCopy` オペレーションを除外するには、`s3:ObjectCreationOperation` 条件キーを指定する必要があります。バケットで条件を使用する方法の詳細については、「[条件キーを使用したバケットポリシーの例](amazon-s3-policy-keys.md)」を参照してください。

**注記**  
バケットポリシーを使用して条件付き書き込みを強制する場合、バケットポリシーで指定されたバケットまたはプレフィックスにコピーオペレーションを実行することはできません。`If-None-Match` または `If-Match` HTTP ヘッダーのない `CopyObject` リクエストは `403 Access Denied` エラーで失敗します。これらの HTTP ヘッダーにより行われた `CopyObject` リクエストは、`501 Not Implemented` レスポンスで失敗します。

次の例は、バケットポリシーで条件を使用して、クライアントに `If-None-Match` または `If-Match` HTTP ヘッダーの使用を強制する方法を示しています。

**Topics**
+ [例 1: `if-none-match` ヘッダーを含む `PutObject` および `CompleteMultipartUpload` リクエストを使用したオブジェクトのアップロードのみを許可する](#conditional-writes-enforce-ex1)
+ [例 2: `if-match` ヘッダーを含む `PutObject` および `CompleteMultipartUpload` リクエストを使用したオブジェクトのアップロードのみを許可する](#conditional-writes-enforce-ex2)
+ [例 3: `if-none-match` または `if-match` ヘッダーを含むオブジェクトのアップロードリクエストのみを許可する](#conditional-writes-enforce-ex3)

## 例 1: `if-none-match` ヘッダーを含む `PutObject` および `CompleteMultipartUpload` リクエストを使用したオブジェクトのアップロードのみを許可する
<a name="conditional-writes-enforce-ex1"></a>

このポリシーでは、リクエストに `if-none-match` ヘッダーが含まれている場合、アカウント 111122223333、ユーザー Alice が *amzn-s3-demo-bucket1* バケットに書き込むことを許可し、オブジェクトキーがバケットにまだ存在しないことを確認します。指定されたバケットへのすべての `PutObject` および `CompleteMultipartUpload` リクエストには、正常に実行するために `if-none-match` ヘッダーが含まれている必要があります。このヘッダーを使用すると、オブジェクトキーがバケットに存在しない場合にのみ、お客様はこのバケットに書き込むことができます。

**注記**  
このポリシーは、`CreateMultipartUpload`、`UploadPart`、および `UploadPartCopy` API を使用したマルチパートアップロードを許可する `s3:ObjectCreationOperation` 条件キーも設定します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowConditionalPut",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-none-match": "false"
                }
            }
        },
        {
            "Sid": "AllowConditionalPutwithMPUs",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Bool": {
                    "s3:ObjectCreationOperation": "false"
                }
            }
        }
    ]
}
```

------

## 例 2: `if-match` ヘッダーを含む `PutObject` および `CompleteMultipartUpload` リクエストを使用したオブジェクトのアップロードのみを許可する
<a name="conditional-writes-enforce-ex2"></a>

このポリシーでは、リクエストに `if-match` ヘッダーが含まれている場合にのみ、アカウント 111122223333、ユーザー Alice が *amzn-s3-demo-bucket1* に書き込むことができます。このヘッダーは、S3 内のオブジェクトの ETag 値を、`WRITE` オペレーション中に指定した値と比較します。ETag 値が一致しない場合、オペレーションは失敗します。指定されたバケットへのすべての `PutObject` および `CompleteMultipartUpload` リクエストには、正常に実行するために `if-match` ヘッダーが含まれている必要があります。

**注記**  
このポリシーは、`CreateMultipartUpload`、`UploadPart`、および `UploadPartCopy` API を使用したマルチパートアップロードを許可する `s3:ObjectCreationOperation` 条件キーも設定します。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowPutObject",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
        },
        {
            "Sid": "BlockNonConditionalObjectCreation",
            "Effect": "Deny",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-match": "true"
                },
                "Bool": {
                    "s3:ObjectCreationOperation": "true"
                }
            }
        },
        {
            "Sid": "AllowGetObjectBecauseConditionalPutIfMatchETag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        }
    ]
}
```

## 例 3: `if-none-match` または `if-match` ヘッダーを含むオブジェクトのアップロードリクエストのみを許可する
<a name="conditional-writes-enforce-ex3"></a>

このポリシーでは、リクエストに `if-none-match` または `if-match` ヘッダーが含まれている場合、アカウント 111122223333、ユーザー Alice が *amzn-s3-demo-bucket1* に書き込むことを許可します。これにより、Alice はバケットにキー名が存在しないオブジェクトをアップロードできます。キー名が存在する場合、オブジェクトの ETag が `PUT` リクエストで指定された ETag と一致すれば、Alice はオブジェクトを上書きできます。

**注記**  
このポリシーは、`CreateMultipartUpload`、`UploadPart`、および `UploadPartCopy` API を使用したマルチパートアップロードを許可する `s3:ObjectCreationOperation` 条件キーも設定します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": " AllowConditionalPutifAbsent",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-none-match": "false"
                }
            }
        },
        {
            "Sid": "AllowConditionalPutIfMatchEtag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-match": "false"
                }
            }
        },
        {
            "Sid": "AllowConditionalObjectCreation",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Bool": {
                    "s3:ObjectCreationOperation": "false"
                }
            }
        },
        {
            "Sid": " AllowGetObjectBecauseConditionalPutIfMatchETag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        }
    ]
}
```

------