

# 创建和配置 Amazon SQS 事件源映射
<a name="services-sqs-configure"></a>

要使用 Lambda 处理 Amazon SQS 消息，请使用适当的设置配置您的队列，然后创建 Lambda 事件源映射。

**Topics**
+ [配置队列以便用于 Lambda](#events-sqs-queueconfig)
+ [设置 Lambda 执行角色权限](#events-sqs-permissions)
+ [创建 SQS 事件源映射](#events-sqs-eventsource)

## 配置队列以便用于 Lambda
<a name="events-sqs-queueconfig"></a>

如果您没有现有的 Amazon SQS 队列，则[创建一个](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-create-queue.html)队列，用作 Lambda 函数的事件源。Lambda 函数和 Amazon SQS 队列必须位于同一 Amazon Web Services 区域，即便二者可能位于[不同的 Amazon Web Services 账户](with-sqs-cross-account-example.md)。

为使函数有时间处理每批记录，请将源队列的[可见性超时](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)设置为函数[配置超时](configuration-timeout.md)的至少六倍。这一额外的时间允许 Lambda 在您的函数处理之前的批次期间遇到限流时进行重试。

**注意**  
函数超时必须小于或等于于队列的可见性超时。当创建或更新事件源映射时，Lambda 会验证此要求，函数超时超过队列的可见性超时则会返回错误。

默认情况下，如果 Lambda 在处理某个批次期间的任何时候遇到错误，则该批次中的所有消息都会返回到队列。[可见性超时](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)后，Lambda 将再次看到这些消息。您可以将事件源映射配置为使用[部分批次响应](services-sqs-errorhandling.md#services-sqs-batchfailurereporting)，以仅使失败的消息返回队列。此外，如果函数多次都未能处理某条消息，则 Amazon SQS 可以将其发送到某个[死信队列](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)。建议将源队列的[重新驱动策略](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html#policies-for-dead-letter-queues)的 `maxReceiveCount` 设置为至少 5。这让 Lambda 在将失败的消息直接发送到死信队列之前有几次重试的机会。

## 设置 Lambda 执行角色权限
<a name="events-sqs-permissions"></a>

[AWSLambdaSQSQueueExecutionRole](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html) Amazon 托管策略包含 Lambda 从您的 Amazon SQS 队列中读取所需的权限。您可以[将此托管策略添加](lambda-intro-execution-role.md)到您的函数的执行角色。

或者，如果您使用的是加密队列，则还需要为执行角色添加以下权限：
+ [kms:Decrypt](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)

## 创建 SQS 事件源映射
<a name="events-sqs-eventsource"></a>

创建事件源映射以指示 Lambda 将队列中的项目发送到 Lambda 函数。您可以创建多个事件源映射，以使用单个函数处理来自多个队列的项目。当 Lambda 调用目标函数时，事件可以包含多个项目（最多为可配置的最大*批处理大小*）。

要将您的函数配置为从 Amazon SQS 中读取，请将 [AWSLambdaSQSQueueExecutionRole](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html) Amazon 托管策略附加到您的执行角色。然后，使用以下步骤从控制台创建 **SQS** 事件源映射。

**要添加权限并创建触发器**

1. 打开 Lamba 控制台的[函数](https://console.amazonaws.cn/lambda/home#/functions)页面。

1. 选择一个函数的名称。

1. 选择 **Configuration**（配置）选项卡，然后选择 **Permissions**（权限）。

1. 在**角色名称**下，选择至执行角色的链接。此角色将在 IAM 控制台中打开角色。  
![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/execution-role.png)

1. 选择**添加权限**，然后选择**附加策略**。  
![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/attach-policies.png)

1. 在搜索字段中输入 `AWSLambdaSQSQueueExecutionRole`。向执行角色添加此策略。这是一项 Amazon 托管策略，其中包含您的函数从 Amazon SQS 队列中读取所需的权限。有关此策略的更多信息，请参阅《Amazon Managed Policy Reference》**中的 [AWSLambdaSQSQueueExecutionRole](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html)。

1. 在 Lambda 控制台中返回您的函数。在 **Function overview**（函数概览）下，选择 **Add trigger**（添加触发器）。  
![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/add-trigger.png)

1. 选择触发器类型。

1. 配置必填选项，然后选择 **Add**（添加）。

Lambda 支持 Amazon SQS 事件源的以下配置选项：

**SQS 队列**  
要从中读取记录的 Amazon SQS 队列。Lambda 函数和 Amazon SQS 队列必须位于同一 Amazon Web Services 区域，即便二者可能位于[不同的 Amazon Web Services 账户](with-sqs-cross-account-example.md)。

**启用触发器**  
事件源映射的状态。**Enable trigger**（启用触发器）默认处于选中状态。

**批次大小**  
每个批次中要发送给函数的最大记录数。对于标准队列，这最高可为 10,000 条记录。对于 FIFO 队列，最大值为 10。对于超过 10 的批处理大小，还必须将批处理时间（`MaximumBatchingWindowInSeconds`）设置为至少 1 秒。  
配置[函数超时](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/configurations#timeouts)，以允许有足够的时间来处理整个批次的项目。如果项目处理需要很长时间，请选择一个较小的批处理大小。大批量处理可以提高非常快速或拥有大量开销的工作负载的效率。如果您在函数上配置了[预留并发](configuration-concurrency.md)，请将最小并发执行数设置为 5，以降低在 Lambda 调用函数时出现节流错误的几率。  
Lambda 通过单个调用将批次中的所有记录传递给函数，前提是事件的总大小未超出同步调用的[调用有效负载大小配额](gettingstarted-limits.md)（6 MB）。Lambda 和 Amazon SQS 都会为每条记录生成元数据。这一额外的元数据将会计入总有效负载大小，并且可能导致批处理中发送的记录总数低于配置的批处理大小。Amazon SQS 发送的元数据字段的长度是可变的。有关 Amazon SQS 元数据字段的更多信息，请参阅*《Amazon Simple Queue Service API 参考》*中的 [ReceiveMessage](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) API 操作文档。

**Batch 时间**  
在调用函数之前收集记录的最长时间（以秒为单位）。它仅适用于标准队列。  
如果您使用的批次时段大于 0 秒，则必须考虑队列[可见性超时](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)中增加的处理时间。我们建议将队列可见性超时设置为[函数超时](configuration-timeout.md)的六倍，加上 `MaximumBatchingWindowInSeconds` 的值。这使 Lambda 函数有时间处理每个批次的事件，并在出现节流错误时重试。  
当消息可用时，Lambda 开始批量处理消息。Lambda 通过五次并发调用您的函数开始一次处理五个批处理。如果仍有消息可用，则 Lambda 最多每分钟添加 300 次并发函数调用，最多为 1250 次并发调用。使用预置模式时，每个事件轮询器能处理最高 1 MB/s 的吞吐量、最多 10 次并发调用，或者每秒最多进行 10 次 Amazon SQS 轮询 API 调用。Lambda 会根据您所配置的最小值和最大值来扩展事件轮询器的数量，能够迅速将并发调用数量提升至最多每分钟 1000 次，从而实现对 Amazon SQS 事件的低延迟处理。您可以通过这些最小和最大事件轮询器数量设置来控制扩展和并发性。要了解函数扩展和并发的更多信息，请参阅 [了解 Lambda 函数扩展](lambda-concurrency.md)。  
要处理更多消息，您可以优化 Lambda 函数以提高吞吐量。有关更多信息，请参阅[了解 Amazon Lambda 如何使用 Amazon SQS 标准队列进行扩展](https://www.amazonaws.cn/blogs/compute/understanding-how-aws-lambda-scales-when-subscribed-to-amazon-sqs-queues/#:~:text=If there are more messages,messages from the SQS queue.)。

**筛选条件**  
添加筛选条件以控制 Lambda 将哪些事件发送给函数进行处理。有关更多信息，请参阅 [控制 Lambda 向您的函数发送的事件](invocation-eventfiltering.md)。

**最大并发数**  
事件源可调用的最大并发函数数量。不能与已启用的预置模式一起使用。有关更多信息，请参阅 [为 Amazon SQS 事件源配置最大并发](services-sqs-scaling.md#events-sqs-max-concurrency)。

**预置模式**  
启用后，将为您的事件源映射分配专用的轮询资源。您可以配置事件轮询器的最小数量（2-200）和最大数量（2-2000）。每个事件轮询器能处理最高 1 MB/秒 的吞吐量、最多 10 次并发调用，或者每秒最多进行 10 次 10 Amazon SQS 轮询调用。  
注意：您不能同时使用预置模式和最大并发性这两种配置。启用预置模式后，使用最大轮询器数量设置来控制并发性。