

# 强制对 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：仅支持使用包含 `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` 标头才能获得成功。使用此标头，仅当存储桶中不存在对象键时，客户才能写入该存储桶。

**注意**  
该策略还设置了 `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：仅支持使用包含 `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` 标头才能获得成功。

**注意**  
该策略还设置了 `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>

如果请求包含 `if-none-match` 或 `if-match` 标头，则此策略支持账户 111122223333（用户 Alice）写入 *amzn-s3-demo-bucket1*。这可让 Alice 在存储桶中不存在键名称的情况下上传对象，或者，如果键名称确实存在，当对象 ETag 与 `PUT` 请求中提供的 ETag 匹配时，Alice 可以覆盖该对象。

**注意**  
该策略还设置了 `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/*"
        }
    ]
}
```

------