

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon SNS 主题标记
<a name="sns-tags"></a>

Amazon SNS 支持为 Amazon SNS 主题添加标签。这可以帮助您跟踪和管理与主题相关的费用，增强 Amazon 身份和访问管理 (IAM) 策略的安全性，并允许您轻松搜索或筛选成千上万个主题。通过添加标签，您可以使用 Resource G Amazon roups 管理您的 Amazon SNS 主题。有关资源组的更多信息，请参阅[Amazon 资源组用户指南](https://docs.amazonaws.cn/ARG/latest/userguide/resource-groups.html)。

## 成本分配标签
<a name="tagging-for-cost-allocation"></a>

要整理并标识您的 Amazon SNS 主题以进行成本分配，您可以添加用于标识主题目标的标签。这在您拥有许多主题时尤其有用。您可以使用成本分配标签来整理 Amazon 账单，以反映您自己的成本结构。为此，请注册以获取包含标签密钥和值的 Amazon 账户账单。有关更多信息，请参阅 [Amazon 账单和成本管理用户指南](https://docs.amazonaws.cn/awsaccountbilling/latest/aboutv2/billing-what-is.html)中的[设置月度成本分配报告](https://docs.amazonaws.cn/awsaccountbilling/latest/aboutv2/configurecostallocreport.html#allocation-report)。

例如，您可以添加表示 Amazon SNS 主题的成本中心和用途的标签，如下所示：

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sns/latest/dg/sns-tags.html)

此标记方案可让您将执行相关任务的两个主题分组到同一成本中心，并使用不同的成本分配标签来标记不相关的活动。

## 访问控制标签
<a name="sns-tagging-for-access-control"></a>

Amazon Identity and Access Management 支持根据标签控制对资源的访问权限。在标记资源之后，请在 IAM 策略的条件元素中提供与资源标签相关的信息，以管理基于标签的访问。有关如何使用 [Amazon SNS 控制台](sns-tags-configuring.md#list-add-update-remove-tags-for-topic-aws-console)或 [Amazon SDK](sns-tags-configuring.md#tag-resource-aws-sdks) 标记资源的信息，请参阅[配置标签](sns-tags-configuring.md)。

您可以限制 IAM 身份的访问。例如，您可以限制对包含键 `environment` 和值 `production` 的标签的所有 Amazon SNS 主题的 `Publish` 和 `PublishBatch` 访问，同时允许访问所有其他 Amazon SNS 主题。在下面的示例中，该策略限制了向标记为 `production` 的主题发布消息的能力，同时允许向标记为 `development` 的主题发布消息。有关更多信息，请参阅《IAM 用户指南》中的[使用标签控制访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html)。

**注意**  
为 `Publish` 和 `PublishBatch` 设置 `Publish` 集权限的 IAM 权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Deny",
    "Action": [
	"sns:Publish"
    ],
    "Resource": "arn:aws:sns:*:*:*",
    "Condition": {
      "StringEquals": {
        "aws:ResourceTag/environment": "production"
      }
    }
  },
  {
    "Effect": "Allow",
    "Action": [
      "sns:Publish"
    ],
    "Resource": "arn:aws:sns:*:*:*",
    "Condition": {
      "StringEquals": {
        "aws:ResourceTag/environment": "development"
      }
    }
  }]
}
```

------

## 添加标签以便进行资源搜索和筛选
<a name="sns-tagging-for-searching-filtering"></a>

一个 Amazon 账户可以有成千上万个亚马逊 SNS 主题（详情请参阅[亚马逊 SNS](https://docs.amazonaws.cn/general/latest/gr/sns.html) 配额）。通过标记主题，您可以简化搜索或筛选主题的过程。

例如，您可以拥有数百个与您的生产环境相关的主题。您可以通过给定标签查询所有主题，而不必手动搜索这些主题：

```
import com.amazonaws.services.resourcegroups.AWSResourceGroups;
import com.amazonaws.services.resourcegroups.AWSResourceGroupsClientBuilder;
import com.amazonaws.services.resourcegroups.model.QueryType;
import com.amazonaws.services.resourcegroups.model.ResourceQuery;
import com.amazonaws.services.resourcegroups.model.SearchResourcesRequest;
import com.amazonaws.services.resourcegroups.model.SearchResourcesResult;

public class Example {
    public static void main(String[] args) {
        // Query Amazon SNS Topics with tag "keyA" as "valueA"
        final String QUERY = "{\"ResourceTypeFilters\":[\"AWS::SNS::Topic\"],\"TagFilters\":[{\"Key\":\"keyA\", \"Values\":[\"valueA\"]}]}";

        // Initialize ResourceGroup client
        AWSResourceGroups awsResourceGroups = AWSResourceGroupsClientBuilder
            .standard()
            .build();

        // Query all resources with certain tags from ResourceGroups 
        SearchResourcesResult result = awsResourceGroups.searchResources(
            new SearchResourcesRequest().withResourceQuery(
                new ResourceQuery()
                .withType(QueryType.TAG_FILTERS_1_0)
                .withQuery(QUERY)
            ));
        System.out.println("SNS Topics with certain tags are " + result.getResourceIdentifiers());
    }
}
```