创建和配置 Amazon SQS 事件源映射 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

创建和配置 Amazon SQS 事件源映射

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

配置队列以便用于 Lambda

如果您没有现有的 Amazon SQS 队列,则创建一个队列,用作 Lambda 函数的事件源。然后配置队列,让 Lambda 函数有足够的时间处理每批事件。

为使函数有时间处理每批记录,请将源队列的可见性超时设置为函数配置超时的至少六倍。这一额外的时间允许 Lambda 在您的函数处理之前的批次期间遇到限流时进行重试。

默认情况下,如果 Lambda 在处理某个批次期间的任何时候遇到错误,则该批次中的所有消息都会返回到队列。可见性超时后,Lambda 将再次看到这些消息。您可以将事件源映射配置为使用部分批次响应,以仅使失败的消息返回队列。此外,如果函数多次都未能处理某条消息,则 Amazon SQS 可以将其发送到某个死信队列。建议将源队列的重新驱动策略maxReceiveCount 设置为至少 5。这让 Lambda 在将失败的消息直接发送到死信队列之前有几次重试的机会。

设置 Lambda 执行角色权限

AWSLambdaSQSQueueExecutionRole Amazon 托管策略包含 Lambda 从您的 Amazon SQS 队列中读取所需的权限。您可以将此托管策略添加到您的函数的执行角色。

或者,如果您使用的是加密队列,则还需要为执行角色添加以下权限:

创建 SQS 事件源映射

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

要将您的函数配置为从 Amazon SQS 中读取,请将 AWSLambdaSQSQueueExecutionRole Amazon 托管策略附加到您的执行角色。然后,使用以下步骤从控制台创建 SQS 事件源映射。

要添加权限并创建触发器
  1. 打开 Lamba 控制台的函数页面

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

  3. 选择 Configuration(配置)选项卡,然后选择 Permissions(权限)。

  4. 角色名称下,选择至执行角色的链接。此角色将在 IAM 控制台中打开角色。

    至执行角色的链接
  5. 选择添加权限,然后选择附加策略

    在 IAM 控制台中附加策略
  6. 在搜索字段中输入 AWSLambdaSQSQueueExecutionRole。向执行角色添加此策略。这是一项 Amazon 托管策略,其中包含您的函数从 Amazon SQS 队列中读取所需的权限。有关此策略的更多信息,请参阅《Amazon Managed Policy Reference》中的 AWSLambdaSQSQueueExecutionRole

  7. 在 Lambda 控制台中返回您的函数。在 Function overview(函数概览)下,选择 Add trigger(添加触发器)。

    Lambda 控制台的函数概述部分
  8. 选择触发器类型。

  9. 配置必填选项,然后选择 Add(添加)。

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

SQS 队列

要从中读取记录的 Amazon SQS 队列。

启用触发器

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

批次大小

每个批次中要发送给函数的最大记录数。对于标准队列,这最高可为 10,000 条记录。对于 FIFO 队列,最大值为 10。对于超过 10 的批处理大小,还必须将批处理时间(MaximumBatchingWindowInSeconds)设置为至少 1 秒。

配置函数超时,以允许有足够的时间来处理整个批次的项目。如果项目处理需要很长时间,请选择一个较小的批处理大小。大批量处理可以提高非常快速或拥有大量开销的工作负载的效率。如果您在函数上配置了预留并发,请将最小并发执行数设置为 5,以降低在 Lambda 调用函数时出现节流错误的几率。

Lambda 通过单个调用将批次中的所有记录传递给函数,前提是事件的总大小未超出同步调用的调用有效负载大小配额(6 MB)。Lambda 和 Amazon SQS 都会为每条记录生成元数据。这一额外的元数据将会计入总有效负载大小,并且可能导致批处理中发送的记录总数低于配置的批处理大小。Amazon SQS 发送的元数据字段的长度是可变的。有关 Amazon SQS 元数据字段的更多信息,请参阅《Amazon Simple Queue Service API 参考》中的 ReceiveMessage API 操作文档。

Batch 时间

在调用函数之前收集记录的最长时间(以秒为单位)。它仅适用于标准队列。

如果您使用的批次时段大于 0 秒,则必须考虑队列可见性超时中增加的处理时间。我们建议将队列可见性超时设置为函数超时的六倍,加上 MaximumBatchingWindowInSeconds 的值。这使 Lambda 函数有时间处理每个批次的事件,并在出现节流错误时重试。

当消息可用时,Lambda 开始批量处理消息。Lambda 通过五次并发调用您的函数开始一次处理五个批处理。如果仍有消息可用,则 Lambda 最多每分钟添加 300 个函数实例,最多为 1000 个函数实例。要了解函数扩展和并发的更多信息,请参阅 Lambda 函数扩展

要处理更多消息,您可以优化 Lambda 函数以提高吞吐量。有关更多信息,请参阅了解 Amazon Lambda 如何使用 Amazon SQS 标准队列进行扩展

最大并发数量

事件源可调用的最大并发函数数量。有关更多信息,请参阅 为 Amazon SQS 事件源配置最大并发

筛选条件

添加筛选条件以控制 Lambda 将哪些事件发送给函数进行处理。有关更多信息,请参阅 Lambda 事件筛选