同步調用 - AWS Lambda

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

同步調用

當您以同步方式調用函數時,Lambda 會執行函數並等候回應。當函數執行完成時,Lambda 會從函數的程式碼傳回回應,其中包含調用的函數版本等額外資料。若要透過 AWS CLI 以同步方式調用函式,請使用 invoke 命令。

aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{ "key": "value" }' response.json

如果您使用 AWS CLI 第 2 版,則需要 cli-binary-format 選項。若要讓此成為預設的設定,請執行 aws configure set cli-binary-format raw-in-base64-out。若要取得更多資訊,請參閱《AWS Command Line Interface 使用者指南第 2 版》AWS CLI 支援的全域命令列選項

您應該會看到下列輸出:

{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }

下圖顯示以同步方式調用 Lambda 函數的用戶端。Lambda 會將事件直接傳送到函數,並將函數的回應傳送回調用者。

用戶端同步調用函式,並等待回應。

payload 是包含 JSON 格式事件的字串。AWS CLI 從該函數寫入回覆的檔案名稱是 response.json。如果函數返回一個對象或錯誤,響應主體是 JSON 格式的對象或錯誤。如果函數沒有錯誤地退出,則響應主體是null

注意

在傳送回應之前,Lambda 不會等待外部擴充功能完成。外部延伸項目會在執行環境中做為獨立的處理序執行,並在函數調用完成之後繼續執行。如需詳細資訊,請參閱 使用 Lambda 擴充功能擴充功能擴充

命令的輸出會顯示於終端機,包括來自 Lambda 的回應中標頭中的資訊。這包括處理事件的版本 (當您使用別名時很實用),以及 Lambda 傳回的狀態碼。如果 Lambda 能夠執行函數,則狀態碼為 200,即使函數傳回了錯誤。

注意

對於逾時很久的函式,您的用戶端可能在等待回應的同時,在同步調用期間中斷連線。設定您的 HTTP 用戶端、SDK、防火牆、Proxy 或作業系統,以透過逾時或持續作用設定允許長時間連線。

如果 Lambda 無法執行函數,錯誤則會顯示在輸出中。

aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload value response.json

您應該會看到下列輸出:

An error occurred (InvalidRequestContentException) when calling the Invoke operation: Could not parse request body into json: Unrecognized token 'value': was expecting ('true', 'false' or 'null') at [Source: (byte[])"value"; line: 1, column: 11]

AWS CLI 是開放原始碼工具,可讓您在命令列 shell 中使用命令來與 AWS 服務互動。若要完成本節中的步驟,您必須執行下列各項:

您可以透過 AWS CLI,使用 --log-type 命令選項來擷取要調用的日誌。其回應將包含 LogResult 欄位,內含該次調用的 base64 編碼日誌 (最大達 4 KB)。

範例 擷取日誌 ID

下列範例顯示如何從名稱為 my-function 的函數的 LogResult 欄位來擷取日誌 ID

aws lambda invoke --function-name my-function out --log-type Tail

您應該會看到下列輸出:

{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
範例 解碼日誌

在相同的命令提示中,使用 base64 公用程式來解碼日誌。下列範例顯示如何擷取 my-function 的 base64 編碼日誌。

aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode

如果您使用 AWS CLI 第 2 版,則需要 cli-binary-format 選項。若要讓此成為預設的設定,請執行 aws configure set cli-binary-format raw-in-base64-out。若要取得更多資訊,請參閱《AWS Command Line Interface 使用者指南第 2 版》AWS CLI 支援的全域命令列選項

您應該會看到下列輸出:

START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB

base64 公用程式可在 Linux、macOS 和 Ubuntu on Windows 上使用。macOS 使用者可能需要使用 base64 -D

如需有關 Invoke API 的詳細資訊 (包括參數、標頭和錯誤的完整清單),請參閱調用

當您直接調用函式時,您可以檢查回應中是否有錯誤並重試。AWS CLI 和 AWS SDK 也會在用戶端逾時、調節和服務錯誤時自動重試。如需更多詳細資訊,請參閱 了解 Lambda 中的重試行為