本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 API Gateway 中設定 Lambda 自訂整合
為了示範如何設定 Lambda 自訂整合,我們建立 API Gateway API 來公開 GET /greeting?greeter={name}
方法以呼叫 Lambda 函數。請為您的 API 使用下列其中一個 Lambda 函數範例。
使用下列其中一個 Lambda 函數範例:
如果 "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
-
呼叫
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 }
在本節中,您需要 API
id
。 -
呼叫
get-resources
命令來取得根資源id
:aws apigateway get-resources --rest-api-id te6si5ach7 --region us-west-2
成功回應如下:
{ "items": [ { "path": "/", "id": "krznpq9xpg" } ] }
記下根資源
id
值 (krznpq9xpg
)。下一個步驟和之後的步驟都需要它。 -
呼叫
create-resource
以建立/greeting
的 API Gateway 資源: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
資源上建立方法。 -
呼叫
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
是選用參數,因為後端應該處理匿名發起人或自我識別發起人。 -
呼叫
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
-
呼叫
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 整合,您必須根據進行函數叫用之 Lambda 服務動作的規格,使用 HTTP 方法
POST
進行整合請求。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-permission 命令來新增資源型許可,而不提供credentials
的 IAM 角色。這是 API Gateway 主控台新增這些許可的方式。 -
呼叫
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" }
-
呼叫
create-deployment
來將 API 部署至test
階段:aws apigateway create-deployment --rest-api-id te6si5ach7 --stage-name test --region us-west-2
-
在終端機中使用下列 cURL 命令,以測試 API:
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'