在调度程序中配置日程安排的死信队列 EventBridge - EventBridge 调度器

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

在调度程序中配置日程安排的死信队列 EventBridge

Amazon EventBridge Scheduler 支持DLQ使用亚马逊简单队列服务的死信队列 ()。当计划无法调用其目标时,调度程序会将包含 EventBridge 调用详细信息以及从目标收到的任何响应的JSON有效负载传送到您指定的 Amazon SQS 标准队列。

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

以下主题介绍如何将 Amazon SQS 队列配置DLQ为日程安排、设置 EventBridge 计划程序向亚马逊SQS传送消息所需的权限以及如何接收来自的死信事件。DLQ

创建亚马逊SQS队列

在DLQ为计划配置之前,您必须创建一个标准的 Amazon SQS 队列。有关使用亚马逊SQS控制台创建队列的说明,请参阅《亚马逊简单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。当你DLQ为日程安排 EventBridge 计划指定ARN时,你将需要。您可以在 Amazon SQS 控制台ARN中找到您的队列,也可以使用get-queue-attributes AWS 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 Scheduler 向 Amazon 传送死信SQS事件,您的计划执行角色需要以下权限策略。有关为计划执行角色附加新权限策略的更多信息,请参阅设置执行角色

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

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

在下一节中,您将使用 EventBridge 日程安排控制台DLQ并为您的日程安排指定。

指定死信队列

要指定DLQ,请使用 EventBridge 日程安排器控制台或更新现有计划,或创建一个新计划。 AWS CLI

Console
DLQ使用控制台指定
  1. 登录 AWS Management Console,然后选择以下链接打开 EventBridge 控制台的 “ EventBridge 日程安排” 部分:主页 https://console.aws.amazon.com/scheduler/

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

  3. “设置” 页面上,对于 Dead-letter 队列 (DLQ),执行以下操作之一:

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

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

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

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

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

    $ 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"}'
要使用创建新计划,DLQ请使用 AWS CLI
  • 要创建计划,请使用 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是可重试的错误,而不是永久性错误,则会出现此属性。MaximumRetryAttempts如果 EventBridge 计划程序在超过您为计划配置的最大重试尝试次数DLQ后将其发送到该属性MaximumEventAgeInSeconds,或者如果事件早于您在计划中配置的最大持续时间但仍无法传送,则该属性可以包含这些值。

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