

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

# 为订阅配置 Amazon SNS 死信队列
<a name="sns-configure-dead-letter-queue"></a>

死信队列是一个 Amazon SQS 队列，Amazon SNS 订阅可以将其视为目标，用于存放无法成功传输给订阅用户的消息。由于客户端错误或服务器错误而无法传输的消息将保留在死信队列中，以进行进一步分析或重新处理。有关更多信息，请参阅[Amazon SNS 死信队列](sns-dead-letter-queues.md)和[Amazon SNS 消息传输重试](sns-message-delivery-retries.md)。

本页介绍如何使用、 Amazon 软件开发工具包 Amazon Web Services 管理控制台 Amazon CLI、和 Amazon CloudFormation 为 Amazon SNS 订阅配置死信队列。

**注意**  
对于 [FIFO 主题](sns-fifo-topics.md)，您可以将 Amazon SQS 队列用作 Amazon SNS 订阅的死信队列。FIFO 主题订阅使用 FIFO 队列，而标准主题订阅使用标准队列。

## 先决条件
<a name="dead-letter-queue-prerequisites"></a>

在配置死信队列之前，请完成以下先决条件：

1. [创建名为 `MyTopic` 的 Amazon SNS 主题](sns-create-topic.md)。

1. [创建名为 `MyEndpoint` 的 Amazon SQS 队列](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html)，以用作 Amazon SNS 订阅的终端节点。

1. （跳过 Amazon CloudFormation）[在队列中订阅主题](sns-sqs-as-subscriber.md)。

1. [创建另一个名为 `MyDeadLetterQueue` 的 Amazon SQS 队列](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html)，以用作 Amazon SNS 订阅的死信队列。

1. 要向 Amazon SNS 委托人授予对 Amazon SQS API 操作的访问权限，请为 `MyDeadLetterQueue` 设置以下队列策略。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "sns.amazonaws.com"
         },
         "Action": "SQS:SendMessage",
         "Resource": "arn:aws:sqs:{{us-east-2}}:{{123456789012}}:{{MyDeadLetterQueue}}",
         "Condition": {
           "ArnEquals": {
             "aws:SourceArn": "arn:aws:sns:{{us-east-2}}:{{123456789012}}:{{MyTopic}}"
           }
         }
       }
     ]
   }
   ```

------

## 要为 Amazon SNS 订阅配置死信队列，请使用 Amazon Web Services 管理控制台
<a name="configure-dead-letter-queue-aws-console"></a>

在开始本教程之前，请确保完成[先决条件](#dead-letter-queue-prerequisites)。

1. 登录 [Amazon SQS 控制台](https://console.amazonaws.cn/sqs/)。

1. [创建 Amazon SQS 队列](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html)或使用现有队列，并在队列的 **Details**（详细信息）选项卡上记下队列的 ARN，例如：

   ```
   arn:aws:sqs:{{us-east-2}}:{{123456789012}}:{{MyDeadLetterQueue}}
   ```

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

1. 在导航面板中，选择**订阅**。

1. 在 **Subscriptions (订阅)** 页面上，选择现有订阅，然后选择 **Edit (编辑)**。

1. 在 **Edit {{1234a567-bc89-012d-3e45-6fg7h890123i}}** (编辑) 页面上，展开 **Redrive policy (dead-letter queue) (重新驱动策略（死信队列）)** 部分，然后执行以下操作：

   1. 选择 **Enabled (已启用)**。

   1. 指定 Amazon SQS 队列的 ARN。

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

   您的订阅将配置为使用死信队列。

## 使用软件开发工具包为 Amazon SNS 订阅配置死信队列 Amazon
<a name="configure-dead-letter-queue-aws-sdk"></a>

在您运行此示例之前，请确保完成[先决条件](#dead-letter-queue-prerequisites)。

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

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

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

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

```
// Specify the ARN of the Amazon SNS subscription.
String subscriptionArn =
    "arn:aws:sns:us-east-2:123456789012:MyEndpoint:1234a567-bc89-012d-3e45-6fg7h890123i";

// Specify the ARN of the Amazon SQS queue to use as a dead-letter queue.
String redrivePolicy =
    "{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue\"}";

// Set the specified Amazon SQS queue as a dead-letter queue
// of the specified Amazon SNS subscription by setting the RedrivePolicy attribute.
SetSubscriptionAttributesRequest request = new SetSubscriptionAttributesRequest()
    .withSubscriptionArn(subscriptionArn)
    .withAttributeName("RedrivePolicy")
    .withAttributeValue(redrivePolicy);
sns.setSubscriptionAttributes(request);
```

------

## 要为 Amazon SNS 订阅配置死信队列，请使用 Amazon CLI
<a name="configure-dead-letter-queue-aws-cli"></a>

在开始本教程之前，请确保完成[先决条件](#dead-letter-queue-prerequisites)。

1. 安装和配置 Amazon CLI。有关更多信息，请参阅 [https://docs.amazonaws.cn/cli/latest/userguide/](https://docs.amazonaws.cn/cli/latest/userguide/)。

1. 使用以下命令。

   ```
   aws sns set-subscription-attributes \
   --subscription-arn arn:aws:sns:{{us-east-2}}:{{123456789012}}:{{MyEndpoint}}:{{1234a567-bc89-012d-3e45-6fg7h890123i}}
   --attribute-name RedrivePolicy
   --attribute-value "{\"deadLetterTargetArn\": \"arn:aws:sqs:{{us-east-2}}:{{123456789012}}:{{MyDeadLetterQueue}}\"}"
   ```

## 使用为 Amazon SNS 订阅配置死信队列 Amazon CloudFormation
<a name="configure-dead-letter-queue-aws-cloudformation"></a>

在开始本教程之前，请确保完成[先决条件](#dead-letter-queue-prerequisites)。

1. 将以下 JSON 代码复制到名为 `MyDeadLetterQueue.json` 的文件中。

   ```
   {
     "Resources": {
       "mySubscription": {
         "Type" : "AWS::SNS::Subscription",
         "Properties" : {
           "Protocol": "sqs",
           "Endpoint": "arn:aws:sqs:{{us-east-2}}:{{123456789012}}:{{MyEndpoint}}",
           "TopicArn": "arn:aws:sns:{{us-east-2}}:{{123456789012}}:{{MyTopic}}",
           "RedrivePolicy": {
             "deadLetterTargetArn":
               "arn:aws:sqs:{{us-east-2}}:{{123456789012}}:{{MyDeadLetterQueue}}"
           }
         }
       }
     }
   }
   ```

1. 登录 [Amazon CloudFormation 控制台](https://console.amazonaws.cn/cloudformation/)。

1. 在 **Select Template (选择模板)** 页面上，选择 **Upload a template to Amazon S3 (将模板上传到 Amazon S3)**，再选择您的 `MyDeadLetterQueue.json` 文件，然后选择 **Next (下一步)**。

1. 在 **Specify Details**（指定详细信息）页面上，为 **Stack Name**（堆栈名称）输入 `MyDeadLetterQueue`，然后选择 **Next**（下一步）。

1. 在**选项**页面上，选择**下一步**。

1. 在 **Review** 页面上，选择 **Create **。

   Amazon CloudFormation 开始创建`MyDeadLetterQueue`堆栈并显示 **CREATE\_IN\_** PROGRESS 状态。该过程完成后， Amazon CloudFormation 将显示 “**创建\_完成**” 状态。