在API閘道中設定 Lambda 自訂整合 - Amazon API 网关

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

在API閘道中設定 Lambda 自訂整合

為了展示如何設定 Lambda 自訂整合,我們建立API閘道API來公開呼叫 Lambda 函數的GET /greeting?greeter={name}方法。請為您使用下列其中一個 Lambda 函數範例API。

使用下列其中一個 Lambda 函數範例:

Node.js
export const handler = function(event, context, callback) { var res ={ "statusCode": 200, "headers": { "Content-Type": "*/*" } }; if (event.greeter==null) { callback(new Error('Missing the required greeter parameter.')); } else if (event.greeter === "") { res.body = "Hello, World"; callback(null, res); } else { res.body = "Hello, " + event.greeter +"!"; callback(null, res); } };
Python
import json def lambda_handler(event, context): print(event) res = { "statusCode": 200, "headers": { "Content-Type": "*/*" } } if event['greeter'] == "": res['body'] = "Hello, World" elif (event['greeter']): res['body'] = "Hello, " + event['greeter'] + "!" else: raise Exception('Missing the required greeter parameter.') return res

如果 "Hello, {name}!" 參數值是非空白字串,則該函數會以 greeter 訊息進行回應。如果 "Hello, World!" 值是空白字串,則它會傳回 greeter 訊息。如果未在傳入請求中設定 greeter 參數,則該函數會傳回錯誤訊息 "Missing the required greeter parameter."。我們將函數命名為 HelloWorld

您可以在 Lambda 主控台中或使用 AWS CLI來建立它。在本節中,我們使用以下內容引用此函數ARN:

arn:aws:lambda:us-east-1:123456789012:function:HelloWorld

在後端設定 Lambda 函數後,繼續設定API.

若要使用設定 Lambda 自訂整合 AWS CLI
  1. 呼叫指create-rest-api令來建立API:

    aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)' --region us-west-2

    在響應中注意結果API的id值(te6si5ach7):

    { "name": "HelloWorld (AWS CLI)", "id": "te6si5ach7", "createdDate": 1508461860 }

    您需要APIid整個本節。

  2. 呼叫 get-resources 命令來取得根資源 id

    aws apigateway get-resources --rest-api-id te6si5ach7 --region us-west-2

    成功回應如下:

    { "items": [ { "path": "/", "id": "krznpq9xpg" } ] }

    記下根資源 id 值 (krznpq9xpg)。下一個步驟和之後的步驟都需要它。

  3. 調用create-resource以創建以下內容的API網關資源/greeting

    aws apigateway create-resource --rest-api-id te6si5ach7 \ --region us-west-2 \ --parent-id krznpq9xpg \ --path-part greeting

    成功回應類似如下:

    { "path": "/greeting", "pathPart": "greeting", "id": "2jf6xt", "parentId": "krznpq9xpg" }

    記下所產生 greeting 資源的 id 值 (2jf6xt)。在下一個步驟中,您需要它才能在 /greeting 資源上建立方法。

  4. 調用put-method以創建API方法請求GET /greeting?greeter={name}

    aws apigateway put-method --rest-api-id te6si5ach7 \ --region us-west-2 \ --resource-id 2jf6xt \ --http-method GET \ --authorization-type "NONE" \ --request-parameters method.request.querystring.greeter=false

    成功回應類似如下:

    { "apiKeyRequired": false, "httpMethod": "GET", "authorizationType": "NONE", "requestParameters": { "method.request.querystring.greeter": false } }

    此API方法可讓用戶端在後端接收來自 Lambda 函數的問候語。greeter 是選用參數,因為後端應該處理匿名發起人或自我識別發起人。

  5. 呼叫 put-method-response 來設定 200 OK 方法請求的 GET /greeting?greeter={name} 回應:

    aws apigateway put-method-response \ --region us-west-2 \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200

  6. 呼叫 put-integration 來設定具有 Lambda 函數 (即 GET /greeting?greeter={name}) 之 HelloWorld 方法的整合。如果提供 "Hello, {name}!" 參數,則此函數會以 greeter 訊息來回應請求,如果未設定查詢字串參數,則會以 "Hello, World!" 來回應請求。

    aws apigateway put-integration \ --region us-west-2 \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --type AWS \ --integration-http-method POST \ --uri arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:HelloWorld/invocations \ --request-templates '{"application/json":"{\"greeter\":\"$input.params('greeter')\"}"}' \ --credentials arn:aws:iam::123456789012:role/apigAwsProxyRole

    此處提供的對應範本會將greeter查詢字串參數轉譯為JSON有效負載的greeter屬性。這是必要的,因為 Lambda 函數的輸入必須在內文中表示。

    重要

    對於 Lambda 整合,您必須根據 L ambda 服務動作的規格,POST針對函數叫用使用的HTTP方法來處理整合請求。該uri參數是函數調用操作ARN的。

    成功輸出與下列輸出類似:

    { "passthroughBehavior": "WHEN_NO_MATCH", "cacheKeyParameters": [], "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:HelloWorld/invocations", "httpMethod": "POST", "requestTemplates": { "application/json": "{\"greeter\":\"$input.params('greeter')\"}" }, "cacheNamespace": "krznpq9xpg", "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole", "type": "AWS" }

    的IAM角色apigAwsProxyRole必須具有允許apigateway服務叫用 Lambda 函數的政策。您可以呼叫 add 權限命令來新增以資源為基礎的權限 credentials,而不是提供的IAM角色。這是API閘道主控台新增這些權限的方式。

  7. 呼叫 put-integration-response 來設定整合回應,以將 Lambda 函數輸出當作 200 OK 方法回應傳遞至用戶端。

    aws apigateway put-integration-response \ --region us-west-2 \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200 \ --selection-pattern ""

    透過將選取模式設定為空白字串,200 OK 回應是預設值。

    成功回應應該類似如下:

    { "selectionPattern": "", "statusCode": "200" }
  8. 呼叫create-deployment部署API到test階段:

    aws apigateway create-deployment --rest-api-id te6si5ach7 --stage-name test --region us-west-2
  9. 在終端中API使用以下 c URL 命令進行測試:

    curl -X GET 'https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/greeting?greeter=me' \ -H 'authorization: AWS4-HMAC-SHA256 Credential={access_key}/20171020/us-west-2/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=f327...5751'