为订阅配置 Amazon SNS 死信队列 - Amazon Simple Notification Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

为订阅配置 Amazon SNS 死信队列

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

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

Prerequisites

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

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

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

  3. (对于 Amazon 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 Web Services Management Console 为 Amazon SNS 订阅配置死信队列

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

  1. 登录 Amazon SQS 控制台

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

    arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue
    注意

    对于 FIFO 主题,请将 Amazon SQS FIFO 队列用作 Amazon SNS 订阅的死信队列。

  3. 登录 Amazon SNS 控制台

  4. 在导航面板中,选择订阅

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

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

    1. 选择 Enabled (已启用)

    2. 指定 Amazon SQS 队列的 ARN。

  7. 选择保存更改

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

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

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

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

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

Java
SDK for Java 1.x

// 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);
  • GitHub 中查找说明和更多代码。

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

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

  1. 安装和配置 Amazon CLI。有关更多信息,请参阅《Amazon Command Line Interface 用户指南》https://docs.amazonaws.cn/cli/latest/userguide/

  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 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. 登录到 Amazon 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

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