本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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 函數
代理整合
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/user
—prod
階段中資user
源上的ANY方法。 -
mnh1xmpli7/*/*/*
- 所有階段中所有資源上的任何方法。
如需檢視政策和移除陳述式的詳細資訊,請參閱 在 Lambda 中使用資源型IAM政策。
範例應用程式
具有 Node.js 範例應用程式的API閘道