本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在调度程序中配置日程安排的死信队列 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 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
在下一节中,您将使用 AWS CLI 接收来自的死信事件。DLQ
检索死信事件
如下所示,使用receive-message
--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格式:。ARNarn:aws:scheduler:::aws-sdk:
service
:apiAction
-
EXHAUSTED_RETRY_CONDITION
— 表示为何将事件传送到DLQ。如果来自目标的错误API是可重试的错误,而不是永久性错误,则会出现此属性。MaximumRetryAttempts
如果 EventBridge 计划程序在超过您为计划配置的最大重试尝试次数DLQ后将其发送到该属性MaximumEventAgeInSeconds
,或者如果事件早于您在计划中配置的最大持续时间但仍无法传送,则该属性可以包含这些值。
在前面的示例中,我们可以根据错误代码和错误消息确定为计划指定的目标队列不存在。