AWS Lambda 事件源映射 - AWS Lambda

AWS Lambda 事件源映射

事件源映射是一个从事件源读取并调用 Lambda 函数的 AWS Lambda 资源。您可以使用事件源映射来处理未直接调用 Lambda 函数的服务中的流或队列中的项。Lambda 为以下服务提供事件源映射。

事件源映射使用函数执行角色中的权限来读取和管理事件源中的项。权限、事件结构、设置和轮询行为因事件源而异。有关更多信息,请参阅用作事件源的服务的链接主题。

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

以下示例使用 AWS CLI 将名为 my-function 的函数映射到由 Amazon 资源名称 (ARN) 指定的 DynamoDB 流(批处理大小为 500)。

$ aws lambda create-event-source-mapping --function-name my-function --batch-size 500 --starting-position LATEST \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2019-06-10T19:26:16.525 { "UUID": "14e0db71-5d35-4eb5-b481-8945cf9d10c2", "BatchSize": 500, "MaximumBatchingWindowInSeconds": 0, "ParallelizationFactor": 1, "EventSourceArn": "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2019-06-10T19:26:16.525", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "LastModified": 1560209851.963, "LastProcessingResult": "No records processed", "State": "Creating", "StateTransitionReason": "User action", "DestinationConfig": {}, "MaximumRecordAgeInSeconds": 604800, "BisectBatchOnFunctionError": false, "MaximumRetryAttempts": 10000 }

事件源映射从流或队列中批量读取项目。它们包括您的函数收到的事件中的多个项目。您可以配置事件源映射发送到函数的批次大小,最大值因服务而异。如果没有足够可用的项,或者批次太大而无法在一个事件中发送并且必须拆分,则事件中的项数可能小于批次大小。

以下示例显示了从 Kinesis 流读取的事件源映射。如果一批事件的所有处理尝试失败,则事件源映射将有关该批次的详细信息发送到 SQS 队列。


      事件源映射从 Kinesis 流读取。它在本地将记录排队后才将记录发送给函数。

事件批次是 Lambda 发送到函数的事件。它是一批记录或消息,编译自事件源映射从流或队列读取的项目。批大小和其他设置仅适用于该事件批次。

对于流,事件源映射为流中的每个分片创建迭代器,并按顺序处理每个分片中的项。您可以将事件源映射配置为只读取流中显示的新项,或者从较旧的项开始。已处理的项不会从流中删除,并且可由其他函数或使用者处理。

默认情况下,如果您的函数返回错误,则重新处理整个批次,直到函数成功,或直到批次中的项目到期。为确保按顺序处理,将暂停对受影响的分片的处理,直到解决错误为止。您可以将事件源映射配置为放弃旧事件、限制重试次数或并行处理多个批次。如果并行处理多个批次,仍然保证每个分区键按顺序处理,但同一分片中的多个分区键会同时处理。

您还可以将事件源映射配置为在放弃某个事件批次时向其他服务发送调用记录。Lambda 支持以下事件源映射的目标

  • Amazon SQS – SQS 队列。

  • Amazon SNS – SNS 主题。

调用记录包含 JSON 格式的失败事件批次的详细信息。

以下示例显示了 Kinesis 流的调用记录。

例 调用记录

{ "requestContext": { "requestId": "c9b8fa9f-5a7f-xmpl-af9c-0c604cde93a5", "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction", "condition": "RetryAttemptsExhausted", "approximateInvokeCount": 1 }, "responseContext": { "statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled" }, "version": "1.0", "timestamp": "2019-11-14T00:38:06.021Z", "KinesisBatchInfo": { "shardId": "shardId-000000000001", "startSequenceNumber": "49601189658422359378836298521827638475320189012309704722", "endSequenceNumber": "49601189658422359378836298522902373528957594348623495186", "approximateArrivalOfFirstRecord": "2019-11-14T00:38:04.835Z", "approximateArrivalOfLastRecord": "2019-11-14T00:38:05.580Z", "batchSize": 500, "streamArn": "arn:aws:kinesis:us-east-2:123456789012:stream/mystream" } }

Lambda 还支持 FIFO(先进先出)队列的有序处理,可向上扩展到活动消息组的数量。对于标准队列,项目不一定按顺序处理。Lambda 向上扩展以尽可能快地处理标准队列。出现错误时,失败的批次作为单个项返回到队列,并且可在与原始批次不同的分组中处理。有时,即使没有发生任何函数错误,事件源映射也可能会从队列中接收相同的项两次。Lambda 在成功处理后会删除队列中的项。如果无法处理项目,您可以配置源队列以将项目发送到死信队列。

有关直接调用 Lambda 函数的服务的信息,请参阅 将 AWS Lambda 与其他服务一起使用