在 Lambda 中保留動 DynamoDB 件來源的捨棄記錄 - AWS Lambda

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

在 Lambda 中保留動 DynamoDB 件來源的捨棄記錄

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

  • 叫之前:如果 Lambda 事件來源對應由於節流或其他問題而無法叫用函數,則會重試直到記錄到期或超過事件來源映射 () 上設定的保留天數上限。MaximumRecordAgeInSeconds

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

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

設定失敗呼叫的目的地

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

  • 對於SQS目的地:sqs:SendMessage

  • 對於SNS目的地:SNS: 發佈

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

  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:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525 \ --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": ""}}'

下列範例顯示 DynamoDB 串流的調用記錄。

範例 調用記錄
{ "requestContext": { "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81", "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:13:49.717Z", "DDBStreamBatchInfo": { "shardId": "shardId-00000001573689847184-864758bb", "startSequenceNumber": "800000000003126276362", "endSequenceNumber": "800000000003126276362", "approximateArrivalOfFirstRecord": "2019-11-14T00:13:19Z", "approximateArrivalOfLastRecord": "2019-11-14T00:13:19Z", "batchSize": 1, "streamArn": "arn:aws:dynamodb:us-east-2:123456789012:table/mytable/stream/2019-11-14T00:04:06.388" } }

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