

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

# Amazon SNS 中的资源管理和优化
<a name="sns-resource-management-optimization"></a>

本主题提供指导，说明如何通过确保最佳性能、减少不必要的成本和维护井井有条的资源来充分利用 Amazon SNS 的潜力。

**Topics**
+ [标签](sns-tags.md)

# 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());
    }
}
```

# 配置 Amazon SNS 主题标签
<a name="sns-tags-configuring"></a>

本主题介绍如何使用 Amazon Web Services 管理控制台、软件开发工具包或，为 [Amazon Amazon SNS 主题](sns-tags.md)配置标签。 Amazon CLI

**重要**  
请勿在标签中添加个人身份信息（PII）或其他机密或敏感信息。标签可供许多其他亚马逊云科技访问，包括计费。标签的用途并非用于私人或敏感数据。

## 使用 Amazon SNS 主题列出、添加和移除标签 Amazon Web Services 管理控制台
<a name="list-add-update-remove-tags-for-topic-aws-console"></a>

1. 登录 [Amazon SNS 控制台](https://console.amazonaws.cn/sns/home)。

1. 在导航面板上，选择**主题**。

1. 在**主题**页面上，选择一个主题，然后选择**编辑**。

1. 展开**标签**部分。

   系统将列出添加到主题的标签。

1. 修改主题标签：
   + 要添加标签，请选择 **Add tag**（添加标签），然后输入 **Key**（键）和 **Value**（值）（可选）。
   + 要删除标签，请选择键值对旁边的**删除标签**。

1. 选择**保存更改**。

## 使用 Amazon SDK 为主题添加标签
<a name="tag-resource-aws-sdks"></a>

要使用 S Amazon DK，必须使用您的凭据对其进行配置。有关更多信息，请参阅[《工具参考指南》和《*工具参考指南》中的共享配置Amazon SDKs 和*凭据文件](https://docs.amazonaws.cn/sdkref/latest/guide/creds-config-files.html)。

以下代码示例演示如何使用 `TagResource`。

------
#### [ CLI ]

**Amazon CLI**  
**为主题添加标签**  
以下 `tag-resource` 示例将元数据标签添加到指定 Amazon SNS 主题。  

```
aws sns tag-resource \
    --resource-arn arn:aws:sns:us-west-2:123456789012:MyTopic \
    --tags Key=Team,Value=Alpha
```
此命令不生成任何输出。  
+  有关 API 的详细信息，请参阅*Amazon CLI 命令参考[TagResource](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/tag-resource.html)*中的。

------
#### [ Java ]

**适用于 Java 的 SDK 2.x**  
 还有更多相关信息 GitHub。在 [Amazon 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SnsException;
import software.amazon.awssdk.services.sns.model.Tag;
import software.amazon.awssdk.services.sns.model.TagResourceRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class AddTags {
    public static void main(String[] args) {
        final String usage = """

                Usage:    <topicArn>

                Where:
                   topicArn - The ARN of the topic to which tags are added.

                """;

        if (args.length != 1) {
            System.out.println(usage);
            System.exit(1);
        }

        String topicArn = args[0];
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        addTopicTags(snsClient, topicArn);
        snsClient.close();
    }

    public static void addTopicTags(SnsClient snsClient, String topicArn) {
        try {
            Tag tag = Tag.builder()
                    .key("Team")
                    .value("Development")
                    .build();

            Tag tag2 = Tag.builder()
                    .key("Environment")
                    .value("Gamma")
                    .build();

            List<Tag> tagList = new ArrayList<>();
            tagList.add(tag);
            tagList.add(tag2);

            TagResourceRequest tagResourceRequest = TagResourceRequest.builder()
                    .resourceArn(topicArn)
                    .tags(tagList)
                    .build();

            snsClient.tagResource(tagResourceRequest);
            System.out.println("Tags have been added to " + topicArn);

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  有关 API 的详细信息，请参阅 *Amazon SDK for Java 2.x API 参考[TagResource](https://docs.amazonaws.cn/goto/SdkForJavaV2/sns-2010-03-31/TagResource)*中的。

------
#### [ Kotlin ]

**适用于 Kotlin 的 SDK**  
 还有更多相关信息 GitHub。在 [Amazon 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin/services/sns#code-examples)中查找完整示例，了解如何进行设置和运行。

```
suspend fun addTopicTags(topicArn: String) {
    val tag =
        Tag {
            key = "Team"
            value = "Development"
        }

    val tag2 =
        Tag {
            key = "Environment"
            value = "Gamma"
        }

    val tagList = mutableListOf<Tag>()
    tagList.add(tag)
    tagList.add(tag2)

    val request =
        TagResourceRequest {
            resourceArn = topicArn
            tags = tagList
        }

    SnsClient.fromEnvironment { region = "us-east-1" }.use { snsClient ->
        snsClient.tagResource(request)
        println("Tags have been added to $topicArn")
    }
}
```
+  有关 API 的详细信息，请参阅适用[TagResource](https://sdk.amazonaws.com/kotlin/api/latest/index.html)于 K *otlin 的Amazon SDK API 参考*。

------

## 使用 Amazon SNS API 操作管理标签
<a name="manage-tags-with-sns-api-actions"></a>

要使用 Amazon SNS API 管理标签，请使用以下 API 操作：
+ [https://docs.amazonaws.cn/sns/latest/api/API_ListTagsForResource.html](https://docs.amazonaws.cn/sns/latest/api/API_ListTagsForResource.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_TagResource.html](https://docs.amazonaws.cn/sns/latest/api/API_TagResource.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_UntagResource.html](https://docs.amazonaws.cn/sns/latest/api/API_UntagResource.html)

## 支持 ABAC 的 API 操作
<a name="api-actions-that-support-abac"></a>

以下是支持基于属性的访问权限控制（ABAC）的 API 操作列表。有关 ABAC 的更多详细信息，请参阅 [ABAC 有什么](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)用？ Amazon在 *IAM 用户指南*中。
+ [https://docs.amazonaws.cn/sns/latest/api/API_AddPermission.html](https://docs.amazonaws.cn/sns/latest/api/API_AddPermission.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_ConfirmSubscription.html](https://docs.amazonaws.cn/sns/latest/api/API_ConfirmSubscription.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_DeleteTopic.html](https://docs.amazonaws.cn/sns/latest/api/API_DeleteTopic.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_GetDataProtectionPolicy.html](https://docs.amazonaws.cn/sns/latest/api/API_GetDataProtectionPolicy.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_GetSubscriptionAttributes.html](https://docs.amazonaws.cn/sns/latest/api/API_GetSubscriptionAttributes.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_GetTopicAttributes.html](https://docs.amazonaws.cn/sns/latest/api/API_GetTopicAttributes.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_ListSubscriptionsByTopic.html](https://docs.amazonaws.cn/sns/latest/api/API_ListSubscriptionsByTopic.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_ListTagsForResource.html](https://docs.amazonaws.cn/sns/latest/api/API_ListTagsForResource.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_Publish.html](https://docs.amazonaws.cn/sns/latest/api/API_Publish.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_PublishBatch.html](https://docs.amazonaws.cn/sns/latest/api/API_PublishBatch.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_PutDataProtectionPolicy.html](https://docs.amazonaws.cn/sns/latest/api/API_PutDataProtectionPolicy.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_RemovePermission.html](https://docs.amazonaws.cn/sns/latest/api/API_RemovePermission.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.amazonaws.cn/sns/latest/api/API_SetSubscriptionAttributes.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_SetTopicAttributes.html](https://docs.amazonaws.cn/sns/latest/api/API_SetTopicAttributes.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_Subscribe.html](https://docs.amazonaws.cn/sns/latest/api/API_Subscribe.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_TagResource.html](https://docs.amazonaws.cn/sns/latest/api/API_TagResource.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_Unsubscribe.html](https://docs.amazonaws.cn/sns/latest/api/API_Unsubscribe.html)
+ [https://docs.amazonaws.cn/sns/latest/api/API_UntagResource.html](https://docs.amazonaws.cn/sns/latest/api/API_UntagResource.html)