

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

# 在 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` 區塊來指定政策何時生效。對於分段上傳，您必須指定 `s3:ObjectCreationOperation` 條件索引鍵來排除 `CreateMultipartUpload`、`UploadPart` 和 `UploadPartCopy` 操作，因為這些 API 不接受條件式標頭。如需在儲存貯體政策中使用條件的詳細資訊，請參閱[使用條件索引鍵的儲存貯體政策範例](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：僅允許使用 `PutObject` 和包含 `if-none-match` 標頭的 `CompleteMultipartUpload` 請求上傳物件](#conditional-writes-enforce-ex1)
+ [範例 2：僅允許使用 `PutObject` 和包含 `if-match` 標頭的 `CompleteMultipartUpload` 請求上傳物件](#conditional-writes-enforce-ex2)
+ [範例 3：僅允許包含 `if-none-match` 或 `if-match` 標頭的物件上傳請求](#conditional-writes-enforce-ex3)

## 範例 1：僅允許使用 `PutObject` 和包含 `if-none-match` 標頭的 `CompleteMultipartUpload` 請求上傳物件
<a name="conditional-writes-enforce-ex1"></a>

如果請求包含 `if-none-match` 標頭，此政策允許帳戶 111122223333 使用者 Alice 寫入 *amzn-s3-demo-bucket1* 儲存貯體，以確保儲存貯體中不存在物件金鑰。對指定儲存貯體提出的所有 `PutObject` 和 `CompleteMultipartUpload` 請求都必須包含 `if-none-match` 標頭才能成功。使用此標頭時，只有在儲存貯體中不存在物件金鑰時，客戶才能寫入此儲存貯體。

**注意**  
此政策也會設定 `s3:ObjectCreationOperation` 條件索引鍵，以允許使用 `CreateMultipartUpload`、`UploadPart` 和 `UploadPartCopy` API 進行分段上傳。

------
#### [ 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：僅允許使用 `PutObject` 和包含 `if-match` 標頭的 `CompleteMultipartUpload` 請求上傳物件
<a name="conditional-writes-enforce-ex2"></a>

此政策允許帳戶 111122223333 使用者 Alice 只有在請求包含 `if-match` 標頭時，才能寫入 *amzn-s3-demo-bucket1*。此標頭會將 S3 中物件的 ETag 值與您在 `WRITE` 操作期間提供的 ETag 值進行比較。如果 ETag 值不相符，操作將會失敗。對指定儲存貯體提出的所有 `PutObject` 和 `CompleteMultipartUpload` 請求都必須包含 `if-match` 標頭才能成功。

**注意**  
此政策也會設定 `s3:ObjectCreationOperation` 條件索引鍵，以允許使用 `CreateMultipartUpload`、`UploadPart` 和 `UploadPartCopy` API 進行分段上傳。

```
{
    "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>

此政策允許帳戶 111122223333 使用者 Alice 在請求包含 `if-none-match` 或 `if-match` 標頭時寫入 *amzn-s3-demo-bucket1*。這可讓 Alice 在儲存貯體中不存在金鑰名稱時上傳物件；或如果金鑰名稱存在，則 Alice 可以在物件 ETag 符合 `PUT` 請求中提供的 ETag 時覆寫物件。

**注意**  
此政策也會設定 `s3:ObjectCreationOperation` 條件索引鍵，以允許使用 `CreateMultipartUpload`、`UploadPart` 和 `UploadPartCopy` API 進行分段上傳。

------
#### [ 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/*"
        }
    ]
}
```

------