在 Lambda 中保留 Kinesis Data Streams 事件來源的捨棄批次記錄 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Lambda 中保留 Kinesis Data Streams 事件來源的捨棄批次記錄

Kinesis 事件來源映射的錯誤處理取決於錯誤是在叫用函數之前還是在叫用函數期間發生:

  • 調用前:如果 Lambda 事件來源映射因為限流或其他問題而無法調用函數,則會重試,直到記錄過期或超過事件來源映射上設定的最長使用期限 (MaximumRecordAgeInSeconds)。

  • 調用期間:如果叫用函數但傳回錯誤,Lambda 會重試直到記錄過期、超過最長使用期限 (MaximumRecordAgeInSeconds),或達到設定的重試配額 ()MaximumRetryAttempts。對於函數錯誤,您也可以設定 BisectBatchOnFunctionError,將失敗的批次分割為兩個較小的批次,隔離不良記錄並避免逾時。分割批次不會消耗重試配額。

如果錯誤處理措施失敗,Lambda 會捨棄相應記錄,並繼續處理串流中的批次。使用預設設定時,這表示不良的記錄可能會封鎖受影響碎片上的處理長達一週。若要避免此情況,在設定函數的事件來源映射時,請使用合理的重試次數和符合您使用案例的記錄最大保留期。

設定失敗調用的目標

若要保留失敗的事件來源映射調用記錄,請將目標地新增到函數的事件來源映射中。傳送至目的地的每個記錄都是一份JSON文件,其中包含有關失敗調用的中繼資料。您可以將任何 Amazon SNS主題或 Amazon SQS佇列設定為目的地。您的執行角色必須具有目的地的許可:

若要使用主控台設定失敗時的目的地,請依照下列步驟執行:

  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇一個函數。

  3. 函數概觀 下,選擇 新增目的地

  4. 針對來源,請選擇事件來源映射調用

  5. 對於事件來源映射,請選擇針對此函數設定的事件來源。

  6. 對於條件,選取失敗時。對於事件來源映射調用,這是唯一可接受的條件。

  7. 對於目標類型,請選擇 Lambda 將調用記錄傳送至的目標類型。

  8. 對於 目的地,請選擇一個資源。

  9. 選擇 Save (儲存)。

您也可以使用 AWS Command Line Interface () 來設定故障中目的地AWS CLI。例如,下列create-event-source-mapping命令會將具有SQS故障中目的地的事件來源映射新增至 MyFunction

aws lambda create-event-source-mapping \ --function-name "MyFunction" \ --event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream \ --destination-config '{"OnFailure": {"Destination": "arn:aws:sqs:us-east-1:123456789012:dest-queue"}}'

下列update-event-source-mapping命令會更新事件來源映射,以在兩次重試嘗試後或記錄超過一小時時,將失敗的調用記錄傳送至SNS目的地。

aws lambda update-event-source-mapping \ --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \ --maximum-retry-attempts 2 \ --maximum-record-age-in-seconds 3600 \ --destination-config '{"OnFailure": {"Destination": "arn:aws:sns:us-east-1:123456789012:dest-topic"}}'

系統會以非同步的方式套用更新的設定,在處理完成之前不會反映在輸出中。使用 get-event-source-mapping命令來檢視目前的狀態。

若要移除目的地,請提供空白字串作為 destination-config 參數的引數:

aws lambda update-event-source-mapping \ --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \ --destination-config '{"OnFailure": {"Destination": ""}}'

下列範例顯示 Lambda 傳送至失敗 Kinesis 事件來源調用SQS佇列或SNS主題的內容。由於 Lambda 只會傳送這些目的地類型的中繼資料,因此請使用 streamArnstartSequenceNumbershardIdendSequenceNumber 欄位來取得完整的原始記錄。KinesisBatchInfo 屬性中顯示的所有欄位一律都會存在。

{ "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" } }

您可以使用此資訊來從串流擷取受影響的記錄,以進行疑難排解。實際的記錄不包含在內,因此您必須處理此記錄,並在因過期而遺失之前從資料串流中擷取它們。