API Gateway で Lambda カスタム統合を設定する
カスタムの Lambda 統合をセットアップする方法を表示するには、GET /greeting?greeter={name}
メソッドを公開する API Gateway API を作成して、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 のセットアップに進みます。
AWS CLI を使用して Lambda カスタム統合をセットアップするには
-
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
を呼び出して、GET /greeting?greeter={name}
の API メソッドリクエストを作成します。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
を呼び出して、GET /greeting?greeter={name}
という名前の Lambda 関数で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 サービスアクションの仕様に従って、統合リクエストに
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" }
apigAwsProxyRole
の IAM ロールは、apigateway
サービスが Lambda 関数を呼び出せるようにするポリシーが必要です。credentials
の IAM ロールを指定する代わりに、add-permission コマンドを呼び出して、リソースベースのアクセス許可を追加することができます。これは、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'