AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

配合使用 AWS Lambda 和 Amazon SQS

您可以使用 AWS Lambda 函数来处理标准 Amazon Simple Queue Service (Amazon SQS) 队列中的消息。在 Amazon SQS 中,您可以通过将来自一个应用程序组件的任务发送到一个队列中并异步处理它们来进行分载。

Lambda 轮询该队列,并通过一个包含队列消息的事件来同步调用您的函数。Lambda 读取批次中的消息,并为每个批次调用一次函数。当您的函数成功处理一个批次后,Lambda 就会将其消息从队列中删除。

例 Amazon SQS 消息事件

{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "test", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" }, { "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", "body": "test", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082650636", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082650649" }, "messageAttributes": {}, "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }

Lambda 使用长轮询来轮询一个队列,直到它变为活动状态。当消息可用时,Lambda 最多可读取 5 个批次并将其发送到您的函数。如果仍有消息可用,则 Lambda 每分钟最多可增加 60 个实例,从而增加读取批次的进程数。事件源映射可以同时处理的最大批次数为 1000。

当 Lambda 读取批次时,消息将保留在队列中,但会在队列可见性超时的长度内隐藏。如果您的函数成功处理一个批次,Lambda 会将其消息从队列中删除。如果您的函数受到限制、返回错误或没有响应,则消息将再次可见。所有批处理失败的消息都会返回队列中,因此您的函数代码必须能够多次处理同一条消息,而不会产生副作用。

配置队列以便与 Lambda 一起使用

创建一个标准 Amazon SQS 队列,用作您的 Lambda 函数的事件源。然后将队列配置为可使您的 Lambda 函数有时间处理每批事件 — 并使 Lambda 在扩展时出现限制错误时能够重试。

为使您的函数有时间处理每批记录,请将源队列的可见性超时至少设置为是您在函数上配置的超时的 6 倍。额外时间可以使 Lambda 在您的函数处理前一批次时,如果您的函数执行受到限制,它可以重试。

如果消息多次处理失败,则 Amazon SQS 可以将其发送到死信队列。在您的源队列中配置一个死信队列来保留处理失败的消息,以用于故障排除。在队列的重新驱动策略上的 maxReceiveCount 至少设置为 5,以避免因限制将消息发送到死信队列。

注意

确保在源队列上配置死信队列,而不是在 Lambda 函数上配置。您在函数上配置的死信队列用于函数的异步调用队列,而不是用于事件源队列。

执行角色权限

Lambda 需要以下权限来管理您的 Amazon SQS 队列中的消息。将这些权限添加到您的函数的执行角色中。

有关更多信息,请参阅 AWS Lambda 执行角色

将队列配置为事件源

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

要在 Lambda 控制台中将您的函数配置为从 Amazon SQS 读取,请创建 SQS 触发器。

创建触发器

  1. 打开 Lambda 控制台 函数页面

  2. 选择函数。

  3. Designer 下方,选择 Add trigger (添加触发器)

  4. 选择触发器类型。

  5. 配置所需选项,然后选择 Add (添加)

Lambda 支持 Amazon SQS 事件源的以下选项。

事件源选项

  • SQS 队列 – 要从其读取记录的 Amazon SQS 队列。

  • 批处理大小 – 从队列中读取的每个批次的项目数,最多 10 个。如果 Lambda 从队列读取的批次具有较少的项目,则事件可能包含较少的项目。

  • 已启用 – 禁用事件源以停止处理项目。

之后,要管理事件源配置,请在设计器中选择触发器。

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

事件源映射 API

要使用 AWS CLI 或 AWS 开发工具包管理事件源映射,请使用以下 API。

以下示例使用 AWS Command Line Interface 将名为 my-function 的函数映射到由 Amazon 资源名称 (ARN) 指定的 Amazon SQS 队列(批处理大小为 5)。

$ aws lambda create-event-source-mapping --function-name my-function --batch-size 5 \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue { "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "BatchSize": 5, "EventSourceArn": "arn:aws:sqs:us-east-2:123456789012:my-queue", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "LastModified": 1541139209.351, "State": "Creating", "StateTransitionReason": "USER_INITIATED" }