調用 Lambda 函數 URLs - AWS Lambda

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

調用 Lambda 函數 URLs

函數URL是 Lambda 函數的專用 HTTP (S) 端點。您可以透URL過 Lambda 主控台或 Lambda 建立和設定函數API。當您建立函數時URL,Lambda 會自動為您產生唯一的URL端點。一旦你創建一個函數URL,它的URL端點永遠不會改變。函數URL端點具有以下格式:

https://<url-id>.lambda-url.<region>.on.aws
注意

以下不支援函數 URLs AWS 區域:亞太區域 (海德拉巴) (ap-south-2)、亞太區域 (墨爾本) (ap-southeast-4)、亞太區域 (馬來西亞ap-southeast-5) ()、加拿大西部 (卡加利ca-west-1) ()、歐洲 (西班牙eu-south-2) ()、歐洲 (蘇黎世eu-central-2) ()、以色列 (特拉維夫il-central-1) () 和中東 (UAE) (me-central-1)。

功能URLs是雙堆棧啟用,支持IPv4和IPv6。配置函數後URL,您可以通過 Web 瀏覽器,curl,郵差或任何HTTP客戶端通過其HTTP(S)端點調用函數。若要叫用函數URL,您必須擁有lambda:InvokeFunctionUrl權限。如需詳細資訊,請參閱存取控制

函數URL調用基礎知識

如果您的函數URL使用 AWS_IAM auth 類型,則必須使用AWS 簽名版本 4(SIGv4)對每個HTTP請求進行簽名。awscurlPostmanAWS SigV4 Proxy 等工具均提供使用 SigV4 簽署請求的內建功能。

如果您不使用工具向函數簽署HTTP請求URL,則必須使用 Sigv4 手動簽署每個請求。當您的函數URL收到請求時,Lambda 也會計算 SIGv4 簽名。唯有簽章相符,Lambda 才會處理請求。有關如何使用 Sigv4 手動簽署請求的說明,請參閱Amazon Web Services 一般參考 指南中的使用簽名版本 4 簽署 AWS 請求

如果您的函數URL使用 NONE auth 類型,則不必使用 Sigv4 對請求進行簽名。您可以使用 Web 瀏覽器,捲曲,郵遞員或任何HTTP客戶端調用您的函數。

如要測試函數的簡易 GET 請求,請使用 Web 瀏覽器。例如,如果你的函數URL是https://abcdefg.lambda-url.us-east-1.on.aws,並且它接受一個字符串參數message,你的請求URL可能如下所示:

https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld

若要測試其他要HTTP求,例如POST要求,您可以使用 curl 等工具。例如,如果您想在函數的POST請求中包含一些JSON數據URL,則可以使用以下 curl 命令:

curl -v 'https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld' \ -H 'content-type: application/json' \ -d '{ "example": "test" }'

請求和回應承載

當客戶端調用您的函數時URL,Lambda 會將請求映射到事件對象,然後再將其傳遞給您的函數。然後,您函數的回應會對HTTP應至 Lambda 透過函數傳回給用戶端的回應URL。

請求和回應事件格式遵循與 Amazon API 閘道承載資料格式 2.0 版相同的結構描述。

請求承載格式

請求承載的結構如下:

{ "version": "2.0", "routeKey": "$default", "rawPath": "/my/path", "rawQueryString": "parameter1=value1&parameter1=value2&parameter2=value", "cookies": [ "cookie1", "cookie2" ], "headers": { "header1": "value1", "header2": "value1,value2" }, "queryStringParameters": { "parameter1": "value1,value2", "parameter2": "value" }, "requestContext": { "accountId": "123456789012", "apiId": "<urlid>", "authentication": null, "authorizer": { "iam": { "accessKey": "AKIA...", "accountId": "111122223333", "callerId": "AIDA...", "cognitoIdentity": null, "principalOrgId": null, "userArn": "arn:aws:iam::111122223333:user/example-user", "userId": "AIDA..." } }, "domainName": "<url-id>.lambda-url.us-west-2.on.aws", "domainPrefix": "<url-id>", "http": { "method": "POST", "path": "/my/path", "protocol": "HTTP/1.1", "sourceIp": "123.123.123.123", "userAgent": "agent" }, "requestId": "id", "routeKey": "$default", "stage": "$default", "time": "12/Mar/2020:19:03:58 +0000", "timeEpoch": 1583348638390 }, "body": "Hello from client!", "pathParameters": null, "isBase64Encoded": false, "stageVariables": null }
參數 描述 範例

version

此事件的承載格式版本。Lambda 函數URLs目前支援有效載荷格式 2.0 版

2.0

routeKey

函數URLs不使用此參數。Lambda 將此設為 $default 作為預留位置使用。

$default

rawPath

請求路徑。例如,如果請求URL是https://{url-id}.lambda-url.{region}.on.aws/example/test/demo,則原始路徑值為/example/test/demo

/example/test/demo

rawQueryString

內含請求查詢字串參數的原始字串。支援的字元包含 a-zA-Z0-9._-%&=,以及 +

"?parameter1=value1&parameter2=value2"

cookies

內含隨請求一併傳送之所有 Cookie 的陣列。

["Cookie_1=Value_1", "Cookie_2=Value_2"]

headers

以鍵值對形式呈現的請求標頭清單。

{"header1": "value1", "header2": "value2"}

queryStringParameters

請求的查詢參數。例如,如果請求URL是https://{url-id}.lambda-url.{region}.on.aws/example?name=Jane,則該queryStringParameters值是具有鍵name且值為的JSON對象Jane

{"name": "Jane"}

requestContext

包含有關請求的其他信息的對象,例如requestId,請求的時間以及調用者的身份(如果通過 AWS Identity and Access Management (IAM)授權。

requestContext.accountId

函數擁有者的 AWS 帳戶 識別碼。

"123456789012"

requestContext.apiId

函數的識別碼URL。

"33anwqw8fj"

requestContext.authentication

函數URLs不使用此參數。Lambda 將此設為 null

null

requestContext.authorizer

如果函數使用 AWS_IAM auth 類型,則包含有關調URL用者身份信息的對象。否則 Lambda 會將此設為 null

requestContext.authorizer.iam.accessKey

呼叫者身分的存取金鑰。

"AKIAIOSFODNN7EXAMPLE"

requestContext.authorizer.iam.accountId

來電者識別 AWS 帳戶 碼。

"111122223333"

requestContext.authorizer.iam.callerId

呼叫者的 ID (使用者 ID)。

"AIDACKCEVSQ6C2EXAMPLE"

requestContext.authorizer.iam.cognitoIdentity

函數URLs不使用此參數。Lambda 會將其設定為null或將其排除在JSON.

null

requestContext.authorizer.iam.principalOrgId

與呼叫者身分相關聯的委託人組織 ID。

"AIDACKCEVSQORGEXAMPLE"

requestContext.authorizer.iam.userArn

呼叫者身分的使用者 Amazon 資源名稱 (ARN)。

"arn:aws:iam::111122223333:user/example-user"

requestContext.authorizer.iam.userId

呼叫者身分的使用者 ID。

"AIDACOSFODNN7EXAMPLE2"

requestContext.domainName

函數的網域名稱URL。

"<url-id>.lambda-url.us-west-2.on.aws"

requestContext.domainPrefix

函數的域前綴URL。

"<url-id>"

requestContext.http

包含有關HTTP請求詳細資訊的物件。

requestContext.http.method

此要求中使用的HTTP方法。有效值包括 GETPOSTPUTHEADOPTIONSPATCHDELETE

GET

requestContext.http.path

請求路徑。例如,如果請求URL是https://{url-id}.lambda-url.{region}.on.aws/example/test/demo,則路徑值為/example/test/demo

/example/test/demo

requestContext.http.protocol

請求的通訊協定。

HTTP/1.1

requestContext.http.sourceIp

提出要求之立即TCP連線的來源 IP 位址。

123.123.123.123

requestContext.http.userAgent

使用者代理程式請求標頭的值。

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Gecko/20100101 Firefox/42.0

requestContext.requestId

呼叫請求的 ID。您可以使用此 ID 追蹤與函數相關的呼叫日誌。

e1506fd5-9e7b-434f-bd42-4f8fa224b599

requestContext.routeKey

函數URLs不使用此參數。Lambda 將此設為 $default 作為預留位置使用。

$default

requestContext.stage

函數URLs不使用此參數。Lambda 將此設為 $default 作為預留位置使用。

$default

requestContext.time

請求的時間戳記。

"07/Sep/2021:22:50:22 +0000"

requestContext.timeEpoch

Unix epoch 時間格式的請求時間戳記。

"1631055022677"

body

請求的本文。如果請求的內容屬於二進位類型,則本文會採用 base64 編碼。

{"key1": "value1", "key2": "value2"}

pathParameters

函數URLs不使用此參數。Lambda 會將其設定為null或將其排除在JSON.

null

isBase64Encoded

如果本文為二進位承載並採用 base64 編碼,此值為 TRUE,否則為 FALSE

FALSE

stageVariables

函數URLs不使用此參數。Lambda 會將其設定為null或將其排除在JSON.

null

回應承載格式

當函數傳回回應時,Lambda 會剖析回應並將其轉換為回HTTP應。函數回應承載的格式如下:

{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": "{ \"message\": \"Hello, world!\" }", "cookies": [ "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT", "Cookie_2=Value2; Max-Age=78000" ], "isBase64Encoded": false }

Lambda 會為您推斷回應格式。如果您的函數返回有效JSON且未返回 astatusCode,Lambda 會假設以下內容:

  • statusCode200

  • content-typeapplication/json

  • body 是函數的回應。

  • isBase64Encodedfalse

下列範例顯示 Lambda 函數的輸出如何對應至回應裝載,以及回應裝載如何對應至最終HTTP回應。當客戶端調用您的函數時URL,他們會看到HTTP響應。

字符串響應的示例輸出

Lambda 函數輸出 轉譯後的回應輸出 HTTP響應(客戶看到的內容)
"Hello, world!"
{ "statusCode": 200, "body": "Hello, world!", "headers": { "content-type": "application/json" }, "isBase64Encoded": false }
HTTP/2 200 date: Wed, 08 Sep 2021 18:02:24 GMT content-type: application/json content-length: 15 "Hello, world!"

JSON回應的範例輸出

Lambda 函數輸出 轉譯後的回應輸出 HTTP響應(客戶看到的內容)
{ "message": "Hello, world!" }
{ "statusCode": 200, "body": { "message": "Hello, world!" }, "headers": { "content-type": "application/json" }, "isBase64Encoded": false }
HTTP/2 200 date: Wed, 08 Sep 2021 18:02:24 GMT content-type: application/json content-length: 34 { "message": "Hello, world!" }

自訂回應的範例輸出

Lambda 函數輸出 轉譯後的回應輸出 HTTP響應(客戶看到的內容)
{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": JSON.stringify({ "message": "Hello, world!" }), "isBase64Encoded": false }
{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": JSON.stringify({ "message": "Hello, world!" }), "isBase64Encoded": false }
HTTP/2 201 date: Wed, 08 Sep 2021 18:02:24 GMT content-type: application/json content-length: 27 my-custom-header: Custom Value { "message": "Hello, world!" }

Cookie

如要從函數傳回 Cookie,請勿手動新增 set-cookie 標頭。您應將 Cookie 加入回應承載物件中。Lambda 會自動解譯這個問題,並將它們新增為HTTP回應中的set-cookie標頭,如下列範例所示。

Lambda 函數輸出 HTTP響應(客戶看到的內容)
{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": JSON.stringify({ "message": "Hello, world!" }), "cookies": [ "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT", "Cookie_2=Value2; Max-Age=78000" ], "isBase64Encoded": false }
HTTP/2 201 date: Wed, 08 Sep 2021 18:02:24 GMT content-type: application/json content-length: 27 my-custom-header: Custom Value set-cookie: Cookie_1=Value2; Expires=21 Oct 2021 07:48 GMT set-cookie: Cookie_2=Value2; Max-Age=78000 { "message": "Hello, world!" }