擷取 Lambda 非同步叫用的記錄 - AWS Lambda

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

擷取 Lambda 非同步叫用的記錄

Lambda 可以將非同步叫用的記錄傳送至下列其中一個項目。 AWS 服務

  • Amazon SQS-一個標準的SQS隊列。

  • Amazon SNS-一個標準的SNS話題。

  • AWS Lambda - Lambda 函數。

  • Amazon EventBridge- EventBridge 事件總線。

調用記錄包含有關JSON格式的請求和響應的詳細信息。您可以為成功處理的事件及所有處理嘗試皆失敗的事件設定個別目標。或者,您可以將標準 Amazon SQS 佇列或標準 Amazon SNS 主題設定為捨棄事件的無效字母佇列。針對無效字母佇列,Lambda 只會傳送事件的內容,而不包含回應的詳細資訊。

如果 Lambda 無法將記錄傳送到您已設定的目的地,則會將DestinationDeliveryFailures指標傳送至 Amazon CloudWatch。如果您的組態包含不受支援的目標類型 (例如 Amazon SQS FIFO 佇列或 Amazon SNS FIFO 主題),就可能會發生這種情況。傳遞錯誤也可能因許可錯誤和大小限制而發生。如需 Lambda 調用指標的詳細資訊,請參閱:呼叫指標

注意

為了防止函數觸發,您可以將函數的預留並行設為零。當您將非同步調用函數的預留並行設定為零時,Lambda 會開始將新事件傳送至設定的無效字母佇列或失敗時的事件目的地,不會進行任何重試。若要處理在預留並行設定為零時傳送的事件,您必須使用來自無效字母佇列或失敗時的事件目的地之事件。

設定非同步調用的目的地

若要保留非同步調用的記錄,請將目的地新增至您的函數。您可以選擇將成功或失敗的調用傳送至目的地。每個函數都可以有多個目的地,因此您可以為成功和失敗的事件配置單獨的目的地。傳送至目的地的每筆記錄都是包含呼叫詳細資訊的JSON文件。與錯誤處理設定相似,您可以設定函數、函數版本或是別名的目標。

以下資料表列出針對非同步調用記錄支援的目的地。若要讓 Lambda 成功將記錄傳送至您選擇的目的地,請確定函數的執行角色也包含相關許可。此表格也說明每個目的地類型如何接收JSON呼叫記錄。

目的地類型 所需的許可 特定於目的地的格式 JSON

Amazon SQS 隊列

平方:SendMessage

Lambda 會將調用記錄做為 Message 傳遞至目的地。

Amazon SNS 主題

sns:Publish

Lambda 會將調用記錄做為 Message 傳遞至目的地。

Lambda 函數

InvokeFunction

Lambda 傳遞調用記錄會以承載形式傳遞給函數。

EventBridge

事件:PutEvents

  • Lambda 通過調用記錄作為detail在 PutEvents 調用。

  • source 事件欄位的值是 lambda

  • detail-type 事件欄位的值是 Lambda Function Invocation Result - Success (Lambda 函數調用結果 - 成功) 或 Lambda Function Invocation Result - Failure (Lambda 函數調用結果 - 失敗)。

  • resource事件字段包含功能和目的地 Amazon 資源名稱(ARNs)。

  • 如需其他事件欄位,請參閱 Amazon EventBridge 事件。

下列範例顯示因函式錯誤而導致處理失敗三次事件的呼叫記錄。呼叫記錄包含事件、回應以及記錄傳送原因的詳細資訊。

{ "version": "1.0", "timestamp": "2019-11-14T18:16:05.568Z", "requestContext": { "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e", "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:$LATEST", "condition": "RetriesExhausted", "approximateInvokeCount": 3 }, "requestPayload": { "ORDER_IDS": [ "9e07af03-ce31-4ff3-xmpl-36dce652cb4f", "637de236-e7b2-464e-xmpl-baf57f86bb53", "a81ddca6-2c35-45c7-xmpl-c3a03a31ed15" ] }, "responseContext": { "statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled" }, "responsePayload": { "errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request" } }

下列步驟說明如何使用 Lambda 主控台設定函數的目的地。

設定非同步調用記錄的目的地
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇一個函數。

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

  4. 針對 來源,選擇 非同步調用

  5. 如為條件,請從下列選項中選擇:

    • On failure (失敗時) - 當事件的所有處理嘗試都失敗,或超過存留期上限時,傳送記錄。

    • 成功時 - 當函數成功處理非同步調用時傳送記錄。

  6. 對於 目的地類型,請選擇接收調用記錄的資源類型。

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

  8. 選擇 Save (儲存)。

當呼叫符合條件時,Lambda 會將含有叫用詳細資訊的JSON文件傳送至目的地。

特定於目的地的格式 JSON
  • 對於 Amazon SQS 和 AmazonSNS(SnsDestinationSqsDestination),調用記錄作為目的Message地傳遞。

  • 對於 Lambda(LambdaDestination),調用記錄會以承載形式傳遞給函數。

  • For EventBridge (EventBridgeDestination),PutEvents呼叫記錄會以呼叫detail中的方式傳遞。source 事件欄位的值是 lambdadetail-type 事件欄位的值是 Lambda Function Invocation Result – Success (Lambda 函數調用結果 – 成功) 或 Lambda Function Invocation Result – Failure (Lambda 函數調用結果 – 失敗)。resource事件字段包含功能和目的地 Amazon 資源名稱(ARNs)。如需其他事件欄位,請參閱 Amazon EventBridge 事件。

下列範例顯示因函式錯誤而導致處理失敗三次事件的呼叫記錄。

範例 呼叫記錄
{ "version": "1.0", "timestamp": "2019-11-14T18:16:05.568Z", "requestContext": { "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e", "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:$LATEST", "condition": "RetriesExhausted", "approximateInvokeCount": 3 }, "requestPayload": { "ORDER_IDS": [ "9e07af03-ce31-4ff3-xmpl-36dce652cb4f", "637de236-e7b2-464e-xmpl-baf57f86bb53", "a81ddca6-2c35-45c7-xmpl-c3a03a31ed15" ] }, "responseContext": { "statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled" }, "responsePayload": { "errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request" } }

呼叫記錄包含事件、回應以及記錄傳送原因的詳細資訊。

追蹤傳至目的地的請求

您可以使用 AWS X-Ray 查看每個請求排入佇列、由 Lambda 函數處理並傳遞至目的地服務的連接檢視。為調用函數的函數或服務啟用 X-Ray 追蹤時,Lambda 會將 X-Ray 標頭新增至請求,並將標頭傳送至目的地服務。來自上游服務的追蹤會自動連結至來自下游 Lambda 函數和目標服務的追蹤,以建立整個應用程式的 end-to-end 檢視。如需追蹤的詳細資訊,請參閱:使用視覺化 Lambda 函數叫用 AWS X-Ray

無效字母佇列

做為失敗目標的替代項目,您可以設定您的函數,使其具備一個無效字母佇列來儲存捨棄的事件,以供後續處理。無效字母佇列的運作方式與失敗目標相同,會在事件的所有處理嘗試失敗,或是在沒有處理的情況下過期時使用。但是,您只能在函數級別添加或刪除無效字母隊列。函數版本使用與未發佈版本 ($) 相同的無效字母佇列設定。LATEST失敗目標也支援其他目標,並會在呼叫記錄中包含函數回應的詳細資訊。

若要重新處理無效字母佇列中的事件,請將它設定為 Lambda 函數的事件來源。或者,您可以手動擷取事件。

您可以為無效信件佇列選擇 Amazon SNS 標SQS準佇列或 Amazon 標準主題。FIFO不支援佇列和 Amazon SNS FIFO 主題。如果您沒有佇列或主題,請加以建立。選擇符合您的使用案例的目標類型。

若要將事件傳送到佇列或主題,您的函式需要額外許可。將具有所需許可的政策新增到您函式的執行角色

如果目標佇列或主題使用客戶受管金鑰加密,則執行角色也必須是金鑰以資源為基礎政策中的使用者。

在建立目標及更新函式的執行角色之後,將無效字母佇列新增到您的函式。您可以設定多個函式來將事件傳送到相同的目標。

設定無效字母佇列
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇一個函數。

  3. 選擇 組態,然後選擇 非同步調用

  4. 非同步調用 下方,選擇 編輯

  5. DLQ資源設置為 Amazon SQSAmazon SNS

  6. 選擇目標佇列或主題。

  7. 選擇 Save (儲存)。

若要使用配置無效字母佇列 AWS CLI,請使用指update-function-configuration令。

aws lambda update-function-configuration --function-name my-function \ --dead-letter-config TargetArn=arn:aws:sns:us-east-2:123456789012:my-topic

Lambda 會依現狀將事件傳送到無效字母佇列,其屬性中有額外資訊。您可以使用此資訊來識別該函式所傳回的錯誤,或建立事件與日誌或 AWS X-Ray 追蹤的關聯性。

無效字母佇列訊息屬性
  • RequestID (字串) - 調用請求的 ID。請求IDs出現在函數日誌中。您也可以使用 X-Ray SDK 在追蹤中的屬性上記錄要求識別碼。然後,您可以在 X-Ray 主控台中依請求 ID 搜尋追蹤。

  • ErrorCode(數字) — 狀HTTP態碼。

  • ErrorMessage(字串) — 錯誤訊息的前 1 KB。

如果 Lambda 無法將訊息傳送至無效字母佇列,則會刪除事件並發出指標。DeadLetterErrors這可能由於缺乏許可,或訊息總大小超過目標佇列或主題的限制,而發生此狀況。例如,假設內文大小接近 256 KB 的 Amazon SNS 通知會觸發導致錯誤的函數。在這種情況下,Amazon SNS 新增的事件資料與 Lambda 新增的屬性相結合,可能會導致訊息超出無效字母佇列中允許的大小上限。

如果您使用 Amazon SQS 作為事件源,請在 Amazon 隊列本身而不是 Lambda 函數上配置無效字母SQS隊列。如需詳細資訊,請參閱使用 Lambda 與 Amazon SQS