

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

# 在调度器中配置日程安排的死信队列 EventBridge
<a name="configuring-schedule-dlq"></a>

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

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

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

**Topics**
+ [创建 Amazon SQS 队列](#configuring-schedule-dlq-create-queue)
+ [设置执行角色权限](#configuring-schedule-dlq-permissions)
+ [指定死信队列](#configuring-schedule-dlq-console)
+ [检索死信事件](#configuring-schedule-dlq-dead-letter-event)

## 创建 Amazon SQS 队列
<a name="configuring-schedule-dlq-create-queue"></a>

 在为计划配置 DLQ 之前，您必须创建一个标准的 Amazon SQS 队列。有关使用 Amazon SQS 控制台创建队列的说明，请参阅《Amazon Simple Queue Service 开发人员指南》**中的[创建 Amazon SQS 队列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/step-create-queue.html)。

**注意**  
 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 时，你需要 ARN。 EventBridge 您可以在 Amazon SQS 控制台中找到您的队列 ARN，也可以使用命令来查找。[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/get-queue-attributes.html#get-queue-attributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/get-queue-attributes.html#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 传送死信事件。

## 设置执行角色权限
<a name="configuring-schedule-dlq-permissions"></a>

 要让 S EventBridge cheduler 向 Amazon SQS 传送死信事件，您的计划执行角色需要以下权限策略。有关为计划执行角色附加新权限策略的更多信息，请参阅[设置执行角色](setting-up.md#setting-up-execution-role)。

------
#### [ JSON ]

****  

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

------

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

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

## 指定死信队列
<a name="configuring-schedule-dlq-console"></a>

 要指定 DLQ，请使用 EventBridge 调度程序控制台或更新现有计划，或者创建一个新的计划。 AWS CLI 

------
#### [ Console ]

**使用控制台指定 DLQ**

1. [登录 AWS 管理控制台，然后选择以下链接打开 EventBridge 控制台的 “ EventBridge 日程安排” 部分：主页 https://console.aws.amazon.com/scheduler/](https://console.aws.amazon.com/scheduler/home) 

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

1.  在**设置**页面上，对于**死信队列 (DLQ)**，请执行以下操作之一：
   +  选择**在我的 AWS 账户中选择一个 Amazon SQS 队列作为 DLQ**，然后从下拉列表中为你的 DLQ 选择队列 ARN。
   +  选择将**其他 AWS 账户中的 Amazon SQS 队列指定为 DLQ**，然后输入您的 DLQ 队列 ARN。如果您选择其他 AWS 账户中的队列，则 EventBridge 日程安排器控制台将无法在下拉列表 ARNs 中显示该队列。

1.  查看您的选择，然后选择**创建计划**或**保存计划**以完成 DLQ 的配置。

1.  （可选）要查看计划的 DLQ 详细信息，请从列表中选择计划名称，然后在**计划详细信息**页面上选择**死信队列**选项卡。

------
#### [ AWS CLI ]

**要更新现有时间表，请使用 AWS CLI**
+  使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/scheduler/update-schedule.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/scheduler/update-schedule.html) 命令更新您的计划。将您之前创建的 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"}'
  ```

**要使用 DLQ 创建新计划，请使用 AWS CLI**
+  要创建计划，请使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/scheduler/create-schedule.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/scheduler/create-schedule.html) 命令。将占位符值替换为您自己的信息。

  ```
  $ 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 的死信事件。

## 检索死信事件
<a name="configuring-schedule-dlq-dead-letter-event"></a>

 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/receive-message.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/receive-message.html) 命令从 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`，或者事件已超过您在计划中配置的最大持续时间但仍无法传送，则该属性可以包含这些值。

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

**注意**  
如果您使用[通用目标](managing-targets-universal.md)，请注意 EventBridge 调度器不会在创建计划时验证`Input`字段的内容。带有无效输入参数的计划将成功创建，但每次调用都会失败。DLQ 消息将包含来自目标服务的错误代码和消息，这可以帮助您识别无效的参数。有关更多信息，请参阅[通用目标输入配置无效](troubleshooting.md#troubleshooting-usi-target-input)。