本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
为计划配置死信队列
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-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 调度器向 Amazon SQS 传送死信事件,您的计划执行角色需要以下权限策略。有关为计划执行角色附加新权限策略的更多信息,请参阅设置执行角色。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "sqs:SendMessage" ], "Effect": "Allow", "Resource": "*" } ] }
注意
如果您使用 EventBridge 调度器调用 Amazon SQS API 目标,则您的计划执行角色可能已经附加了所需的权限。
在下一节中,您将使用 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,采用以下服务 ARN 格式:arn:aws:scheduler:::aws-sdk:
。service
:apiAction
-
EXHAUSTED_RETRY_CONDITION
:表示将事件传送到 DLQ 的原因。如果来自目标 API 的错误是可重试的错误,而不是永久性错误,则会出现此属性。如果 EventBridge 调度器在超过您为计划配置的最大重试尝试次数 (MaximumRetryAttempts
) 后将此属性发送到 DLQ,或者如果事件已超过您在计划中配置的最大持续时间 (MaximumEventAgeInSeconds
) 但仍无法传送,则该属性可以包含这些值。
在前面的示例中,我们可以根据错误代码和错误消息确定为计划指定的目标队列不存在。