为订阅配置 Amazon SNS 死信队列 - Amazon Simple Notification Service

为订阅配置 Amazon SNS 死信队列

死信队列是 Amazon SNS 订阅针对无法成功传输给订阅者的消息可以将其视为目标的一个 Amazon SQS 队列。由于客户端错误或服务器错误而无法传输的消息将保留在死信队列中,以进行进一步分析或重新处理。有关更多信息,请参阅 Amazon SNS 死信队列 (DLQ)Amazon SNS 消息传输重试

本页显示如何使用 AWS Management Console、AWS 开发工具包、AWS CLI 和 AWS CloudFormation 为 Amazon SNS 订阅配置死信队列。

注意

对于 FIFO 主题,您可以将 Amazon SQS 队列用作 Amazon SNS 订阅的死信队列。FIFO 主题订阅使用 FIFO 队列,而标准主题订阅使用标准队列。

先决条件

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

  1. 创建名为 MyTopic 的 Amazon SNS 主题

  2. 创建名为 MyEndpoint 的 Amazon SQS 队列,以用作 Amazon SNS 订阅的终端节点。

  3. (对于 AWS CloudFormation 跳过) 为队列订阅主题

  4. 创建另一个名为 MyDeadLetterQueue 的 Amazon SQS 队列,以用作 Amazon SNS 订阅的死信队列。

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

    { "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" } } }] }

使用 AWS Management Console 为 Amazon SNS 订阅配置死信队列

在开始本教程之前,请确保完成先决条件

  1. 登录 Amazon SQS 控制台

  2. 创建 Amazon SQS 队列或使用现有队列,并在队列的 Details(详细信息)选项卡上记下队列的 ARN,例如:

    arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue
  3. 登录 Amazon SNS 控制台

  4. 在导航面板中,选择 Subscriptions(订阅)。

  5. Subscriptions (订阅) 页面上,选择现有订阅,然后选择 Edit (编辑)

  6. 编辑 1234a567-bc89-012d-3e45-6fg7h890123i 页面上,展开 Redrive policy (dead-letter queue)(重新驱动策略(死信队列))部分,然后执行以下操作:

    1. 选择 Enabled (已启用)

    2. 指定 Amazon SQS 队列的 ARN。

  7. 选择 Save changes(保存更改)。

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

要使用 AWS 开发工具包为 Amazon SNS 订阅配置死信队列

在您运行此示例之前,请确保完成先决条件

要使用 AWS 开发工具包,您必须使用您的凭证对其进行配置。有关更多信息,请参阅 AWS 开发工具包和工具参考指南中的共享配置和凭证文件

以下代码示例演示如何将 Amazon SQS 队列设置为 Amazon SNS 订阅的死信队列。

Java
SDK for Java 1.x
注意

在 GitHub 上查看更多内容。在 AWS 代码示例存储库 中查找完整示例,了解如何进行设置和运行。

// 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);

使用 AWS CLI 为 Amazon SNS 订阅配置死信队列

在开始本教程之前,请确保完成先决条件

  1. 安装和配置 AWS CLI。有关更多信息,请参阅 AWS Command Line Interface 用户指南

  2. 使用以下命令。

    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\"}"

要使用 AWS CloudFormation 为 Amazon SNS 订阅配置死信队列

在开始本教程之前,请确保完成先决条件

  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" } } } } }
  2. 登录到 AWS CloudFormation 控制台

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

  4. Specify Details(指定详细信息)页面上,为 Stack Name(堆栈名称)输入 MyDeadLetterQueue,然后选择 Next(下一步)。

  5. Options (选项) 页面上,选择 Next (下一步)

  6. Review 页面上,选择 Create

    AWS CloudFormation 开始创建 MyDeadLetterQueue 堆栈,并显示 CREATE_IN_PROGRESS 状态。在此过程完成后,AWS CloudFormation 将显示 CREATE_COMPLETE 状态。