

# 将标签与 S3 通用存储桶结合使用
<a name="buckets-tagging"></a>

Amazon 标签是保存有关资源的元数据的键值对，在本例中为 Amazon S3 通用存储桶。您可以在创建 S3 存储桶时为其添加标签，也可以管理现有存储桶上的标签。有关标签的一般信息，请参阅[添加标签以进行成本分配或基于属性的访问权限控制（ABAC）](tagging.md)。

**注意**  
在存储桶上使用标签时，除了标准 S3 API 请求费率之外，没有任何其他费用。有关更多信息，请参阅 [Amazon S3 定价](https://www.amazonaws.cn/s3/pricing/)。

## 将标签与存储桶结合使用的常用方法
<a name="common-ways-to-use-tags-bucket"></a>

在 S3 存储桶上使用标签来执行以下操作：

1. **成本分配**：在 Amazon 账单与成本管理中按存储桶标签跟踪存储成本。有关更多信息，请参阅 [Using tags for cost allocation](https://docs.amazonaws.cn/AmazonS3/latest/userguide/tagging.html#using-tags-for-cost-allocation)。

1. **基于属性的访问权限控制（ABAC）**：根据标签扩展访问权限并授予对 S3 存储桶的访问权限。有关更多信息，请参阅 [Using tags for ABAC](https://docs.amazonaws.cn/AmazonS3/latest/userguide/tagging.html#using-tags-for-abac)。
**注意**  
对于通用存储桶，ABAC 在默认情况下未启用。要为通用存储桶启用 ABAC，请参阅[在通用存储桶中启用 ABAC](buckets-tagging-enable-abac.md)。对于接入点和目录存储桶等 Amazon S3 资源，ABAC 在默认情况下启用。您可以将相同的标签同时用于成本分配和访问权限控制。

### S3 通用存储桶的 ABAC
<a name="abac-for-buckets"></a>

Amazon S3 通用存储桶支持使用标签进行基于属性的访问权限控制（ABAC）。在您的 Amazon 组织、IAM 和 S3 存储桶策略中使用基于标签的条件键。对于企业，Amazon S3 中的 ABAC 支持跨多个 Amazon 账户进行授权。

在 IAM 策略中，您可以使用以下[全局条件键](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys)，根据存储桶的标签来控制对 S3 存储桶的访问权限：
+ `aws:ResourceTag/key-name`
  + 使用此条件键可将您在策略中指定的标签键值对与附加到资源的键值对进行比较。只有在存储桶上启用 ABAC 后，S3 才会评估此条件键。例如，您可能会要求只有在资源具有附加的标签键 `Dept` 和值 `Marketing` 时才允许访问该资源。有关更多信息，请参阅[控制对 Amazon 资源的访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html#access_tags_control-resources)。
+ `aws:RequestTag/key-name`
  + 使用此条件键可将请求中传递的标签键值对与您在策略中指定的标签对进行比较。例如，您可以检查请求是否包含标签键 `Dept` 并具有 `Accounting` 值。有关更多信息，请参阅[在 Amazon 请求期间控制访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html#access_tags_control-requests)。您可以使用此条件键来限制可以在 `TagResource` 和 `CreateBucket` API 操作期间传递哪些标签键值对。
+ `aws:TagKeys`
  + 使用此条件键可将请求中的标签键与您在策略中指定的键进行比较。我们建议当使用策略来通过标签控制访问时，请使用 `aws:TagKeys` 条件键来定义允许的标签键。有关示例策略和更多信息，请参阅[根据标签键控制访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html#access_tags_control-tag-keys)。
+ `s3:BucketTag/tag-key`
  + 使用此条件键，可通过标签授予对存储桶中特定数据的权限。此条件键仅在存储桶上启用 ABAC 后才适用。使用接入点访问存储桶时，在针对接入点以及存储桶进行授权时，`aws:ResourceTag/tag-key` 条件键引用存储桶上的标签。`s3:BucketTag/tag-key` 仅引用已获得授权的存储桶上的标签。

**注意**  
创建带有标签的存储桶时，请注意，仅当您在存储桶上启用 ABAC 后，才可以使用 aws:ResourceTag 和 s3:BucketTag 条件键对存储桶进行基于标签的有条件访问。要了解更多信息，请参阅[在通用存储桶中启用 ABAC](buckets-tagging-enable-abac.md)。

### 存储桶的 ABAC 策略示例
<a name="example-buckets-abac-policies"></a>

请参阅以下 Amazon S3 存储桶的 ABAC 策略示例。

#### 1.1 - 用于创建或修改具有特定标签的存储桶的 IAM 策略
<a name="example-user-policy-request-tag"></a>

在此 IAM 策略中，具有此策略的用户或角色必须在存储桶创建请求中使用标签键 `project` 和标签值 `Trinity ` 来为存储桶添加标签，才能创建 S3 存储桶。他们还可以在现有 S3 存储桶上添加或修改标签，前提是 `TagResource` 请求包含标签键值对 `project:Trinity`。此策略不授予对存储桶或其对象的读取、写入或删除权限。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CreateBucketWithTags",
      "Effect": "Allow",
      "Action": [
        "s3:CreateBucket",
        "s3:TagResource"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/project": [
            "Trinity"
          ]
        }
      }
    }
  ]
}
```

#### 1.2 - 限制操作的存储桶策略
<a name="example-user-policy-resource-tag"></a>

在此存储桶策略中，只有当存储桶上 `project ` 标签的值与主体上 `project` 标签的值匹配时，才会拒绝 IAM 主体（用户和角色）在存储桶的上执行 `s3:ListBucket`、`s3:GetObject` 和 `s3:PutObject` 操作。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DenyObjectOperations",
            "Effect": "Deny",
            "Principal": "*",
            "Action": ["s3:ListBucket",
                       "s3:GetObject",
                       "s3:PutObject"],
            "Resource": "arn:aws:s3:::aws-s3-demo/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
                }
            }
        }
    ]
}
```

#### 1.3 - 修改现有资源上标签的 IAM 策略
<a name="example-user-policy-tag-keys"></a>

在此 IAM 策略中，IAM 主体（用户或角色）只有在存储桶的 `project` 标签的值与主体的 `project` 标签的值匹配时，才会修改存储桶上的标签。这些存储桶只允许使用在 `aws:TagKeys` 条件键中指定的四个标签 `project`、`environment`、`owner` 和 `cost-center`。这有助于强制执行标签治理，防止未经授权修改标签，并使标签架构跨存储桶保持一致。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EnforceTaggingRulesOnModification",
      "Effect": "Allow",
      "Action": [
        "s3:TagResource",
        "s3:CreateBucket"
      ],
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
          "aws:TagKeys": [
            "project",
            "environment",
            "owner",
            "cost-center"
          ]
        }
      }
    }
  ]
}
```

#### 1.4 - 使用 s3:BucketTag 条件键
<a name="example-policy-bucket-tag"></a>

在此 IAM 策略中，条件语句仅在存储桶具有标签键 `Environment` 和标签值 `Production` 时，才允许访问 `aws-s3-demo` 存储桶的数据。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowAccessViaSpecificBucket",
      "Effect": "Allow",
      "Action": "*",
      "Resource": ["arn:aws:s3:::aws-s3-demo","arn:aws:s3:::aws-s3-demo/*"],
      "Condition": {
        "StringEquals": {
          "s3:BucketTag/Environment": "Production"
        }
      }
    }
  ]
}
```

## 管理通用存储桶的标签
<a name="managing-tags-general-buckets"></a>

您可以使用 Amazon S3 控制台、Amazon 命令行界面（CLI）、Amazon SDK 或以下 S3 API 为 S3 存储桶添加或管理标签：[TagResource](https://docs.amazonaws.cn/AmazonS3/latest/API/API_control_TagResource.html)、[UntagResource](https://docs.amazonaws.cn/AmazonS3/latest/API/API_control_UntagResource.html) 和 [ListTagsForResource](https://docs.amazonaws.cn/AmazonS3/latest/API/API_control_ListTagsForResource.html)。有关更多信息，请参阅：

**Topics**