Lambda 事件來源映射 - AWS Lambda

Lambda 事件來源映射

事件來源映射是一種 Lambda 資源,它可從事件來源中讀取,並叫用 Lambda 函數。您可以使用事件來源映射,以在不會直接叫用 Lambda 函數的服務中處理串流或佇列中的項目。Lambda 會提供下列服務的事件來源映射。

事件來源映射會使用函式的執行角色許可來讀取和管理事件來源中的項目。許可、事件結構、設定和輪詢行為因事件來源而異。如需詳細資訊,請參閱您做為事件來源使用之服務的連結主題。

若要使用 AWS Command Line Interface (AWS CLI)AWS SDK 來管理事件來源,可以使用下列 API 操作:

以下範例使用 AWS CLI,將名為 my-function 的函數映射至其 Amazon Resource Name (ARN) 指定的 DynamoDB 串流,批次大小為 500。

aws lambda create-event-source-mapping --function-name my-function --batch-size 500 --maximum-batching-window-in-seconds 5 --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": 5, "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 }

批次處理行為

事件來源映射從目標事件來源讀取項目。根據預設,事件來源映射會將記錄批次處理到 Lambda 傳送給函數的單個承載中。要微調批次處理行為,您可以設定一個批次間隔 (MaximumBatchingWindowInSeconds) 和批次大小 (BatchSize)。批次間隔是將記錄收集到單一承載的最長時間。批次大小是單一批次中記錄的最大數目。當下列三個條件之一成立時,Lambda 會叫用您的函數:

  • 批次間隔達到其最大值。批次間隔行為會有所不同,這取決於特定的事件來源。

    • 對於 Kinesis、DynamoDB 和 Amazon SQS 事件來源:預設批次間隔為 0 秒。這意味著 Lambda 會儘快向您的函數傳送批次。如果設定 MaximumBatchingWindowInSeconds,則在上一個函數叫用完成時開始下一個批次間隔。

    • 對於 Amazon MSK、自我管理的 Apache Kafka 以及 Amazon MQ 事件來源:預設批次間隔為 500 毫秒。您可以將 MaximumBatchingWindowInSeconds 設定為從 0 秒到 300 秒之間的任意值,增量為秒。一旦第一條記錄到達,批次間隔就會開始。

      注意

      因為您只能變更以秒為增量的 MaximumBatchingWindowInSeconds,所以在變更之後無法恢復到 500 毫秒的預設批次間隔。要恢復預設批次間隔,必須建立新的事件來源映射。

  • 已滿足批次大小。批次大小下限為 1。預設和最大批次大小取決於事件來源。如需這些值的詳細資訊,請參閲 CreateEventSourceMapping API 操作的 BatchSize 規格。

  • 承載大小達到 6 MB您無法修改此限制。

下圖說明了這三種情況。假設批次間隔從第 t = 7 秒開始。在第一種情況下,批次間隔在累積 5 條記錄後在第 t = 47 秒達到其最大值 40 秒。在第二種情況下,批次大小在批次間隔到期之前達到 10,因此批次間隔提前結束。在第三種情況下,承載大小在批次間隔到期之前達到最大值,因此批次間隔提前結束。


        當滿足以下三個條件之一時,批次間隔將過期:批次間隔達到其最大值、滿足批次大小或承載大小達到 6 MB。

以下範例顯示從 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 會在成功處理項目後,從佇列中刪除它們。您可以設定來源佇列,以將項目傳送至 Lambda 無法處理的無效字母佇列。

如需有關直接叫用 Lambda 函數的服務詳細資訊,請參閱 搭配其他服務使用 AWS Lambda