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 会提高其读取批处理和调用函数的速率,直至其达到并发限制。有关 Lambda 如何扩展以处理您的 Amazon SQS 队列中的消息的更多信息,请参阅了解扩展行为

当 Lambda 读取队列中的消息时,它将进入队列,但会隐藏起来,直到 Lambda 将其删除。如果您的函数返回错误,或者没有在队列的可见性超时之前完成处理,它会再次变为可见。然后,Lambda 再次将其发送到您的 Lambda 函数。所有批处理失败的消息都会返回队列中,因此您的函数代码必须能够多次处理同一条消息,而不会产生副作用。

配置队列以供 Lambda 使用

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

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

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

将队列配置为事件源

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

为 Amazon SQS 队列添加事件源映射

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

  2. 选择函数。

  3. 添加触发器中,选择 SQS

  4. 配置触发器中,配置事件源。

    • SQS 队列 – 指定源队列。

    • 批处理大小 – 指定在单次调用中可从队列中读取并发送到您的函数的项目的最大数量。

    • 已启用 – 清除此复选框可禁用事件源。

  5. 选择 Add

  6. 选择 Save

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

要配置事件源使用 Lambda API 或 AWS 开发工具包,请使用 CreateEventSourceMappingUpdateEventSourceMapping 操作。

执行角色权限

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

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