使用 Amazon API 閘道端點叫用 Lambda 函數 - AWS Lambda

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

使用 Amazon API 閘道端點叫用 Lambda 函數

您可以使用 Amazon API 閘道建立API具有 Lambda 函數HTTP端點的網頁。API閘道提供工具APIs,可用來建立和記錄網路,以將HTTP請求路由到 Lambda 函數。您可以使API用身份驗證和授權控制來保護對您的訪問。您APIs可以通過互聯網提供流量,也可以只在您的訪問VPC。

API定義一個或多個方法中的資源,例如GET或POST。方法具有將請求路由到 Lambda 函數或其他整合類型的整合。您可以個別定義每個資源和方法,或使用特殊資源和方法類型來比對所有符合某模式的請求。代理資源會擷取資源下的所有路徑。該ANY方法捕獲所有HTTP方法。

選擇類API型

API閘道支援三種APIs叫用 Lambda 函數的類型:

  • HTTPAPI:輕量級,低延遲RESTfulAPI。

  • RESTAPI:可定制的,功能豐富RESTfulAPI。

  • WebSocket API:與用戶端維持持續連線以進行全雙工通訊的 Web API。

HTTPAPIs並且RESTAPIs是處RESTfulAPIs理HTTP請求和返回響應。HTTPAPIs更新,並使用API網關版本 2 構建API。以下是新功能 HTTPAPIs:

HTTPAPI功能
  • 自動部署 - 當您修改路由或整合時,變更會自動部署至已啟用自動部署的階段。

  • 預設階段 — 您可以建立預設階段 ($default),以便在您API的根路徑處處理要求URL。對於具名階段,您必須在路徑的開頭加入階段名稱。

  • CORS配置-您可以配置API為向傳出響應添加CORS標題,而不是在函數代碼中手動添加它們。

RESTAPIs是 API Gateway 自推出以來支援的傳統版RESTfulAPIs本。RESTAPIs目前有更多的自訂、整合和管理功能。

RESTAPI功能
  • 整合類型 — REST APIs 支援自訂 Lambda 整合。您可以使用自訂整合,只將請求的本文傳送到函數,或者在將請求本文傳送到函數之前套用轉換範本。

  • 存取控制 — REST APIs 支援更多驗證和授權選項。

  • 監視和追蹤 — REST APIs 支援 AWS X-Ray 追蹤和其他記錄選項。

如需詳細比較,請參閱《API閘道開發人員指南》RESTAPIs中的選擇HTTPAPIs和

WebSocket APIs同時使用API閘道版本 2,API並支援類似的功能集。適用 WebSocket API於受益於用戶端與之間持續連線的應用程式API。 WebSocket APIs提供全雙工通信,這意味著客戶端和API可以連續發送消息,而無需等待響應。

HTTPAPIs支援簡化的事件格式 (2.0 版)。下列範例顯示來自的事件HTTPAPI。

範例 API閘道代理伺服器事件 (HTTPAPI)
{ "version": "2.0", "routeKey": "ANY /nodejs-apig-function-1G3XMPLZXVXYI", "rawPath": "/default/nodejs-apig-function-1G3XMPLZXVXYI", "rawQueryString": "", "cookies": [ "s_fid=7AABXMPL1AFD9BBF-0643XMPL09956DE2", "regStatus=pre-register" ], "headers": { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "accept-encoding": "gzip, deflate, br", ... }, "requestContext": { "accountId": "123456789012", "apiId": "r3pmxmplak", "domainName": "r3pmxmplak.execute-api.us-east-2.amazonaws.com", "domainPrefix": "r3pmxmplak", "http": { "method": "GET", "path": "/default/nodejs-apig-function-1G3XMPLZXVXYI", "protocol": "HTTP/1.1", "sourceIp": "205.255.255.176", "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" }, "requestId": "JKJaXmPLvHcESHA=", "routeKey": "ANY /nodejs-apig-function-1G3XMPLZXVXYI", "stage": "default", "time": "10/Mar/2020:05:16:23 +0000", "timeEpoch": 1583817383220 }, "isBase64Encoded": true }

如需詳細資訊,請參閱HTTPAPIs在API閘道中建立 AWS Lambda Proxy 整合

將端點新增至您的 Lambda 函數

若要將公有端點新增至您的 Lambda 函數
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇一個函數。

  3. 函式概觀 下,選擇 新增觸發條件

  4. 選取 [API閘道]。

  5. 選擇「創建」API 或「使用現有」API。

    1. 新API:對於API類型,選擇HTTPAPI。如需詳細資訊,請參閱選擇類API型

    2. 現有API:API從下拉式清單中選取或輸入API識別碼 (例如,r3pmxmplak)。

  6. Security (安全性) 中,選擇 Open (開啟)。

  7. 選擇 Add (新增)。

代理整合

API閘道APIs由階段、資源、方法和整合組成。階段和資源決定端點的路徑:

API路徑格式
  • /prod/ - prod 階段和根資源。

  • /prod/user - prod 階段和 user 資源。

  • /dev/{proxy+} - dev 階段中的任何路由。

  • /— (HTTPAPIs) 預設階段和根資源。

Lambda 整合會將路徑和HTTP方法組合對應至 Lambda 函數。您可以設定 API Gateway 以原樣傳遞要HTTP求主體 (自訂整合),或將要求主體封裝在包含所有要求資訊 (包括標頭、資源、路徑和方法) 的文件中。

如需詳細資訊,請參閱API閘道中的 Lambda 代理整合

事件格式

Amazon API Gateway 會與包含請求JSON表示法的事件同步叫用您的函數。HTTP對於自訂整合,事件是請求的本文。對於代理整合,事件具有已定義的結構。下列範例顯示來自API閘道的 Proxy 事件RESTAPI。

範例 API閘道代理伺服器事件 (RESTAPI)
{ "resource": "/", "path": "/", "httpMethod": "GET", "requestContext": { "resourcePath": "/", "httpMethod": "GET", "path": "/Prod/", ... }, "headers": { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "accept-encoding": "gzip, deflate, br", "Host": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "X-Amzn-Trace-Id": "Root=1-5e66d96f-7491f09xmpl79d18acf3d050", ... }, "multiValueHeaders": { "accept": [ "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" ], "accept-encoding": [ "gzip, deflate, br" ], ... }, "queryStringParameters": null, "multiValueQueryStringParameters": null, "pathParameters": null, "stageVariables": null, "body": null, "isBase64Encoded": false }

回應格式

APIGateway 會等待函數的回應,並將結果轉送給呼叫者。對於自訂整合,您可以定義整合回應和方法回應,以將函數的輸出轉換為HTTP回應。對於代理整合,函數必須以特定格式的回應表示作出回應。

下列範例顯示來自 Node.js 函數的回應物件。響應對象表示包含一個JSON文檔的成功HTTP響應。

範例 index.mjs - 代理整合回應物件 (Node.js)
var response = { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "isBase64Encoded": false, "multiValueHeaders": { "X-Custom-Header": ["My value", "My other value"], }, "body": "{\n \"TotalCodeSize\": 104330022,\n \"FunctionCount\": 26\n}" }

Lambda 執行階段會將回應物件序列化,JSON並將其傳送至. API API解析響應並使用它來創建一個HTTP響應,然後將其發送到提出原始請求的客戶端。

範例 HTTP回應
< HTTP/1.1 200 OK < Content-Type: application/json < Content-Length: 55 < Connection: keep-alive < x-amzn-RequestId: 32998fea-xmpl-4268-8c72-16138d629356 < X-Custom-Header: My value < X-Custom-Header: My other value < X-Amzn-Trace-Id: Root=1-5e6aa925-ccecxmplbae116148e52f036 < { "TotalCodeSize": 104330022, "FunctionCount": 26 }

許可

Amazon API Gateway 取得從函數以資源為基礎的政策叫用函數的許可。您可以將調用權限授與整個API,或授與階段、資源或方法的有限存取權。

當您使用 Lambda 主控台、API閘道主控台或在 AWS SAM 範本中新增API至函數時,函數的資源型政策會自動更新。範例函數政策範例如下。

範例 函數政策
{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "nodejs-apig-functiongetEndpointPermissionProd-BWDBXMPLXE2F", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:nodejs-apig-function-1G3MXMPLXVXYI", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" }, "ArnLike": { "aws:SourceArn": "arn:aws:execute-api:us-east-2:111122223333:ktyvxmpls1/*/GET/" } } } ] }

您可以透過下列API作業手動管理函數原則權限:

若要授與現有的叫用權限API,請使用指add-permission令。範例:

aws lambda add-permission \ --function-name my-function \ --statement-id apigateway-get --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:us-east-2:123456789012:mnh1xmpli7/default/GET/"

您應該會看到下列輸出:

{ "Statement": "{\"Sid\":\"apigateway-test-2\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-2:123456789012:function:my-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:us-east-2:123456789012:mnh1xmpli7/default/GET\"}}}" }
注意

如果您的函數與API位於不同 AWS 區域,則來源中的 Region 識別碼ARN必須與函數的「區域」相符,而不是「區域」(Region) API。當 API Gateway 叫用函數時,它會使用基於ARNARN的資源API,但經過修改以符合函數的 Region。

此範例ARN中的來源會授予對具有 ID 之預設階段中根資源GET方法之整API合的權限mnh1xmpli7。您可以在來源中使用星號,ARN將權限授與多個階段、方法或資源。

資源模式
  • mnh1xmpli7/*/GET/*— 所有階段中所有資源的GET方法。

  • mnh1xmpli7/prod/ANY/userprod 階段中資user源上的ANY方法。

  • mnh1xmpli7/*/*/* - 所有階段中所有資源上的任何方法。

如需檢視政策和移除陳述式的詳細資訊,請參閱 在 Lambda 中使用資源型IAM政策

範例應用程式

具有 Node.js 範例應用程式的API閘道包含具有 AWS SAM 範本的函數,該函數會建立RESTAPI已啟用 AWS X-Ray 追蹤的範本。它還包括用於部署,調用函數,測試和清理的API腳本。