Amazon API Gateway
開発者ガイド

API Gateway のカスタムの Lambda 統合をセットアップする

カスタムの Lambda 統合をセットアップする方法を表示するには、GET /greeting?greeter={name} メソッドを公開する API Gateway API を作成して、Lambda 関数を呼び出します。この関数は、"Hello, {name}!" パラメータの値が空白でない文字列の場合は、greeter のメッセージで応答します。"Hello, World!" の値が空の文字列の場合は、greeter のメッセージを返します。着信リクエストで greeter パラメータが設定されていない場合、この関数は "Missing the required greeter parameter." のエラーメッセージを返します。関数名を HelloWorld とします。

参考までに、Lambda 関数の Node.js バージョンは、次のように表示されます。

exports.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); } };

Lambda コンソールで、または AWS CLI を使用して作成できます。このセクションでは、次の ARN を使用してこの関数を参照します。

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

バックエンドに Lambda 関数を設定すると、API のセットアップに進みます。

AWS CLI を使用してカスタムの Lambda 統合を設定するには

  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 }

    このセクションでは、API id が必要です。

  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 を呼び出して、/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 リソース上にメソッドを作成する必要があります。

  4. 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 パラメータはオプションです。

  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 を呼び出して、HelloWorld という名前の Lambda 関数で GET /greeting?greeter={name} メソッドの統合をセットアップします。この関数は、"Hello, {name}!" パラメータが提供されている場合は greeter、クエリ文字列パラメータが設定されていない場合は "Hello, World!" のメッセージでリクエストに応答します。

    aws apigateway put-integration \ --region us-west-2 --rest-api-id vaz7da96z6 \ --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 file://path/to/integration-request-template.json \ --credentials arn:aws:iam::123456789012:role/apigAwsProxyRole

    ここで、request-template パラメータ値、file://path/to/integration-request-template.json は、integration-request-template.json ディレクトリの path/to という名前の JSON ファイルを指します。このファイルには、JSON オブジェクトとしてキーと値のマップが含まれます。キーはリクエストペイロードのメディアタイプであり、値は指定されたコンテンツタイプの本文のマッピングテンプレートです。この例では、JSON ファイルに次の JSON オブジェクトが含まれています。

    {"application/json":"{\"greeter\":\"$input.params('greeter')\"}"}

    ここで指定されたマッピングテンプレートは、greeter クエリ文字列パラメータを JSON ペイロードの greeter プロパティに変換します。Lambda 関数内の Lambda 関数への入力を本文で表現する必要があるため、これが必要になります。"{\"greeter"\: \"'john'\"}" コマンドへの request-template 入力値としてマップの JSON 文字列 (put-integration など) を使用できます。ただし、ファイル入力を使用すると、困難で時には不可能な、JSON オブジェクトを文字列化するのに必要な引用符エスケープを避けることができます。

    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 コンソールはこれらのアクセス許可を追加することができます。

  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
  9. ターミナルで次の 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'

Lambda プロキシ統合のセットアップと比較して、カスタムの Lambda 統合のセットアップは、より複雑になっています。