为计划配置死信队列 - EventBridge 调度器

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

为计划配置死信队列

Amazon EventBridge 调度器支持使用 Amazon Simple Queue Service 的死信队列 (DLQ)。当计划无法调用其目标时,EventBridge 调度器会将包含调用详细信息的 JSON 有效负载和从目标收到的任何响应传送到您指定的 Amazon SQS 标准队列。

以下主题将此 JSON 称为死信事件。死信事件可让您对计划或目标的问题进行故障排除。如果您为计划配置了重试策略,则 EventBridge 调度器会传送已耗尽您设置的最大重试次数的死信事件。

以下主题描述了如何将 Amazon SQS 队列配置为计划的 DLQ,如何设置 EventBridge 调度器向 Amazon SQS 发送消息所需的权限以及如何从 DLQ 接收死信事件。

创建 Amazon SQS 队列

在为计划配置 DLQ 之前,您必须创建一个标准的 Amazon SQS 队列。有关使用 Amazon SQS 控制台创建队列的说明,请参阅《Amazon Simple Queue Service 开发人员指南》中的创建 Amazon SQS 队列

注意

EventBridge 调度器不支持使用 FIFO 队列作为计划的 DLQ。

使用下面的 AWS CLI 命令创建标准队列。

$ aws sqs create-queue --queue-name queue-name

如果成功,将会在输出中看到 QueueURL

{
    "QueueUrl": "https://sqs.us-west-2.amazonaws.com/123456789012/scheduler-dlq-test"
}

创建队列后,请记下队列 ARN。当为 EventBridge 调度器计划指定 DLQ 时,需要这个 ARN。您可以在 Amazon SQS 控制台中找到您的队列 ARN,也可以使用 get-queue-attributesAWS CLI 命令来查找。

$ aws sqs get-queue-attributes --queue-url your-dlq-url --attribute-names QueueArn

如果成功,您将在输出中看到队列 ARN。

{
    "Attributes": {
        "QueueArn": "arn:aws:sqs:us-west-2:123456789012:scheduler-dlq-test"
    }
}

在下一节中,您将向您的计划执行角色添加所需的权限,以允许 EventBridge 调度器向 Amazon SQS 传送死信事件。

设置执行角色权限

要让 EventBridge 调度器向 Amazon SQS 传送死信事件,您的计划执行角色需要以下权限策略。有关为计划执行角色附加新权限策略的更多信息,请参阅设置执行角色

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "sqs:SendMessage" ], "Effect": "Allow", "Resource": "*" } ] }
注意

如果您使用 EventBridge 调度器调用 Amazon SQS API 目标,则您的计划执行角色可能已经附加了所需的权限。

在下一节中,您将使用 EventBridge 调度器控制台为您的计划指定一个 DLQ。

指定死信队列

要指定 DLQ,请使用 EventBridge 调度器控制台或 AWS CLI 更新现有计划,或创建新计划。

Console
使用控制台指定 DLQ
  1. 登录 AWS Management Console,然后选择以下链接打开 EventBridge 控制台的 EventBridge 调度器部分:https://console.aws.amazon.com/scheduler/home

  2. 在 EventBridge 调度器控制台上,创建新计划,或从计划列表中选择现有计划进行编辑。

  3. 设置页面上,对于死信队列 (DLQ),请执行以下操作之一:

    • 选择在我的 AWS 账户中选择一个 Amazon SQS 队列作为 DLQ,然后从下拉列表中为您的 DLQ 选择队列 ARN。

    • 选择将其他 AWS 账户中的 Amazon SQS 队列指定为 DLQ,然后输入您 DLQ 的队列 ARN。如果您选择其他 AWS 账户中的队列,则 EventBridge 调度器控制台将无法在下拉列表中显示队列 ARN。

  4. 查看您的选择,然后选择创建计划保存计划以完成 DLQ 的配置。

  5. (可选)要查看计划的 DLQ 详细信息,请从列表中选择计划名称,然后在计划详细信息页面上选择死信队列选项卡。

AWS CLI
要更新现有计划,请使用 AWS CLI
  • 使用 update-schedule 命令更新您的计划。将您之前创建的 Amazon SQS 队列指定为 DLQ。将您对其附加所需 Amazon SQS 权限的 IAM 角色 ARN 指定为执行角色。将占位符的值替换为您自己的信息。

    $ aws scheduler update-schedule --name existing-schedule \ --schedule-expression 'rate(5 minutes)' \ --target '{"DeadLetterConfig": {"Arn": "DLQ_ARN"}, "RoleArn": "ROLE_ARN", "Arn":"QUEUE_ARN", "Input": "Hello world!" }' \ --flexible-time-window '{ "Mode": "OFF"}'
通过 AWS CLI 使用 DLQ 创建新计划
  • 要创建计划,请使用 create-schedule 命令。将占位符值替换为您自己的信息。

    $ aws scheduler create-schedule --name new-schedule \ --schedule-expression 'rate(5 minutes)' \ --target '{"DeadLetterConfig": {"Arn": "DLQ_ARN"}, "RoleArn": "ROLE_ARN", "Arn":"QUEUE_ARN", "Input": "Hello world!" }' \ --flexible-time-window '{ "Mode": "OFF"}'

在下一个部分中,您将使用 AWS CLI 接收来自 DLQ 的死信事件。

检索死信事件

使用 receive-message 命令从 DLQ 中检索死信事件,如下所示。您可以使用 --max-number-of-messages 属性设置要检索的消息数量。

$ aws sqs receive-message --queue-url your-dlq-url --attribute-names All --message-attribute-names All --max-number-of-messages 1

如果成功,您将看到与以下内容类似的输出。

{
    "Messages": [
        {
            "MessageId": "2aeg3510-fe3a-4f5a-ab6a-6906560eaf7e",
            "ReceiptHandle": "AQEBkNKTdOMrWgHKPoITRBwrPoK3eCSZIcZwVqCY0BZ+FfTcORFpopJbtCqj36VbBTlHreM8+qM/m5jcwqSlAlGmIJO/hYmMgn/+dwIty9izE7HnpvRhhEyHxbeTZ5V05RbeasYaBdNyi9WLcnAHviDh6MebLXXNWoFyYNsxdwJuG0f/w3htX6r3dxpXvvFNPGoQb8ihY37+u0gtsbuIwhLtUSmE8rbldEEwiUfi3IJ1zEZpUS77n/k1GWrMrnYg0Gx/BuaLzOrFi2F738XI/Hnh45uv3ca6OYwS1ojPQ1LtX2URg1haV5884FYlaRvY8jRlpCZabTkYRTZKSXG5KNgYZnHpmsspii6JNkjitYVFKPo0H91w5zkHlSx3REAuWk7m3r7PmOMvTNPMhctbD3CkTw==",
            "MD5OfBody": "07adc3fc889d6107d8bb8fda42fe0573",
            "Body": "{\"MessageBody\":\"Hello, world!",\"QueueUrl\":\"https://sqs.us-west-2.amazonaws.com/123456789012/does-not-exist\"}",
            "Attributes": {
                "SenderId": "AROA2DZE3W4CTL5ZR7EIN:ff00212d8c453aaaae644bc6846d4723",
                "ApproximateFirstReceiveTimestamp": "1652499058144",
                "ApproximateReceiveCount": "2",
                "SentTimestamp": "1652490733042"
            },
            "MD5OfMessageAttributes": "f72c1d78100860e00403d849831d4895",
            "MessageAttributes": {
                "ERROR_CODE": {
                    "StringValue": "AWS.SimpleQueueService.NonExistentQueue",
                    "DataType": "String"
                },
                "ERROR_MESSAGE": {
                    "StringValue": "The specified queue does not exist for this wsdl version.",
                    "DataType": "String"
                },
                "EXECUTION_ID": {
                    "StringValue": "ad06616e51cdf74a",
                    "DataType": "String"
                },
                "EXHAUSTED_RETRY_CONDITION": {
                    "StringValue": "MaximumEventAgeInSeconds",
                    "DataType": "String"
                }
                "IS_PAYLOAD_TRUNCATED": {
                    "StringValue": "false",
                    "DataType": "String"
                },
                "RETRY_ATTEMPTS": {
                    "StringValue": "0",
                    "DataType": "String"
                },
                "SCHEDULED_TIME": {
                    "StringValue": "2022-05-14T01:12:00Z",
                    "DataType": "String"
                },
                "SCHEDULE_ARN": {
                    "StringValue": "arn:aws:scheduler:us-west-2:123456789012:schedule/DLQ-test",
                    "DataType": "String"
                },
                "TARGET_ARN": {
                    "StringValue": "arn:aws:scheduler:::aws-sdk:sqs:sendMessage",
                    "DataType": "String"
                }
            }
        }
    ]
}

请注意死信事件中的以下属性,以帮助您确定目标调用失败的可能原因并对其进行故障排除。

  • ERROR_CODE:包含 EventBridge 调度器从目标的服务 API 收到的错误代码。在前面的示例中,Amazon SQS 返回的错误代码是 AWS.SimpleQueueService.NonExistentQueue。如果由于 EventBridge 调度器出现问题而导致计划无法调用目标,则会看到以下错误代码:AWS.Scheduler.InternalServerError

  • ERROR_MESSAGE:包含 EventBridge 调度器从目标的服务 API 收到的错误消息。在前面的示例中,Amazon SQS 返回的错误信息是 The specified queue does not exist for this wsdl version。如果由于 EventBridge 调度器出现问题而导致计划失败,您将看到以下错误消息:Unexpected error occurred while processing the request

  • TARGET_ARN:您的计划调用的目标的 ARN,采用以下服务 ARN 格式:arn:aws:scheduler:::aws-sdk:service:apiAction

  • EXHAUSTED_RETRY_CONDITION:表示将事件传送到 DLQ 的原因。如果来自目标 API 的错误是可重试的错误,而不是永久性错误,则会出现此属性。如果 EventBridge 调度器在超过您为计划配置的最大重试尝试次数 (MaximumRetryAttempts) 后将此属性发送到 DLQ,或者如果事件已超过您在计划中配置的最大持续时间 (MaximumEventAgeInSeconds) 但仍无法传送,则该属性可以包含这些值。

在前面的示例中,我们可以根据错误代码和错误消息确定为计划指定的目标队列不存在。