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

教程:为订阅配置 Amazon SNS 死信队列

死信队列是 Amazon SNS 订阅针对无法成功递送到订阅者的消息设定的目标 Amazon SQS 队列。由于客户端错误或服务器错误而无法递送的消息将保留在死信队列中,以供进一步分析或重新处理。有关更多信息,请参阅 Amazon SNS 死信队列消息传输重试

以下教程说明了如何使用 AWS 管理控制台、AWS SDK for Java、AWS CLI 和 AWS CloudFormation 为 Amazon SNS 订阅配置死信队列。

先决条件

在开始以下任何教程之前,请完成以下先决条件:

  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 管理控制台为 Amazon SNS 订阅配置死信队列

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

  1. 登录 Amazon SQS 控制台

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

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

    当前,您不能将 Amazon SQS FIFO 队列用作 Amazon SNS 订阅的死信队列。

  3. 登录到 Amazon SNS 控制台

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

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

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

    1. 选择 Enabled (已启用)

    2. 指定 Amazon SQS 队列的 ARN。

  7. 选择保存更改

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

使用AWS SDK for Java为 Amazon SNS 订阅配置死信队列

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

  1. 指定您的 AWS 凭证。有关更多信息,请参阅 适用于 Java 的 AWS 开发工具包 2.x 开发人员指南 中的设置用于开发的 AWS 凭证和区域

  2. 编写您的代码。有关更多信息,请参阅使用 适用于 Java 的开发工具包 2.x

    有关创建 Amazon SQS 队列的更多信息,请参阅 Amazon Simple Queue Service 开发人员指南 中的使用 AWS SDK for Java 配置 Amazon SQS 队列

    以下代码摘录使用 Amazon SNS 订阅和 Amazon SQS 队列的 ARN 来设置 RedrivePolicy 请求参数属性。

    // 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. SetSubscriptionAttributesRequest request = new SetSubscriptionAttributesRequest() .withSubscriptionArn(subscriptionArn) .withAttributeName("RedrivePolicy") .withAttributeValue(redrivePolicy); sns.setSubscriptionAttributes(request);
  3. 编译并运行您的代码。

    Amazon SQS 队列设置为指定 Amazon SNS 订阅的死信队列。

使用 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 状态。