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

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

为订阅配置 Amazon SNS 死信队列

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

本页介绍如何使用、 AWS 软件开发工具包 AWS Management Console 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" } } }] }

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

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

  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. 选择保存更改

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

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

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

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

以下代码示例显示了如何使用SetSubscriptionAttributesRedrivePolicy

Java
适用于 Java 1.x 的 SDK
注意

还有更多相关信息 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);

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

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

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

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

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

  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. 选项页面上,选择下一步

  6. Review 页面上,选择 Create

    AWS CloudFormation 开始创建MyDeadLetterQueue堆栈并显示 CREATE_IN_ PROGRESS 状态。该过程完成后, AWS CloudFormation 将显示 “创建_完成” 状态。