メニュー
Amazon API Gateway
開発者ガイド

レスポンスペイロードをマッピングする

この演習では、API Gateway でモデルとマッピングテンプレートを使用して API 呼び出しに対する出力スキーマを別のものに変換する方法を学びます。この演習は、「Lambda 関数を公開するための API を作成する」および「リクエストパラメーターをマッピングする」の手順と概念に基づいています。これらの演習を完了していない場合は、先に完了することを推奨します。

この演習では API Gateway を使用し、一般にアクセス可能な HTTP エンドポイントと今回作成する AWS Lambda 関数からサンプルデータを取得します。HTTP エンドポイントと Lambda 関数は同じサンプルデータを返します。

Copy
[ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]

モデルとマッピングテンプレートを使用し、このデータの出力形式を 1 回以上変換します。API Gateway では、モデルが一部のデータの形式(スキーマ、シェイプとも呼ばれます)を定義します。 API Gateway では、一部のデータの形式を変換する目的でマッピングテンプレートが使用されます。 詳細については、「リクエストおよびレスポンスペイロードのモデルおよびマッピングテンプレートを作成する」を参照してください。

最初のモデルとマッピングテンプレートは、次のように id から numbertype から class、および price から salesPrice に名前変更する目的で使用されます。

Copy
[ { "number": 1, "class": "dog", "salesPrice": 249.99 }, { "number": 2, "class": "cat", "salesPrice": 124.99 }, { "number": 3, "class": "fish", "salesPrice": 0.99 } ]

2 番目のモデルとマッピングテンプレートは、次のように idtypedescription に結合し、priceaskingPrice に名前変更する目的で使用されます。

Copy
[ { "description": "Item 1 is a dog.", "askingPrice": 249.99 }, { "description": "Item 2 is a cat.", "askingPrice": 124.99 }, { "description": "Item 3 is a fish.", "askingPrice": 0.99 } ]

3 番目のモデルとマッピングテンプレートは、次のように idtype、および pricelistings のセットに結合する目的で使用されます。

Copy
{ "listings": [ "Item 1 is a dog. The asking price is 249.99.", "Item 2 is a cat. The asking price is 124.99.", "Item 3 is a fish. The asking price is 0.99." ] }

前提条件

この演習を開始する前に、以下の操作を完了している必要があります。

  1. API Gateway を使用する準備を整える のステップ (API Gateway アクセス権限の IAM ユーザーへの割り当てなど) を完了します。

  2. API Gateway コンソールを開きMyDemoAPI という名前で新しい API を作成します。詳細については、「HTTP エンドポイントを公開するための API Gateway API を作成する」を参照してください。

  3. 2 つのリソース、petstorewalkthroughpets を作成します。詳細については、リクエストパラメーターをマッピングする の「リソースの作成」を参照してください。

  4. この演習の Lambda 部分を使用するには、Lambda を使用するためのフルアクセスを IAM ユーザーに付与する必要があります。IAM コンソールを使用して、AWSLambdaFullAccess AWS 管理ポリシーを IAM ユーザーにアタッチできます。

  5. IAM でポリシーとロールを作成するためのアクセス権限が IAM ユーザーに付与されていることを確認します。まだ行っていない場合は、 IAM で、APIGatewayLambdaExecRole という名前の Lambda 実行ロールを作成します。詳細については、Lambda 関数を公開するための API を作成する の「Lambda 関数を作成する」を参照してください。

ステップ1: モデルを作成する

このステップでは、4 つのモデルを作成します。最初の 3 つのモデルは、HTTP エンドポイントと Lambda 関数で使用するデータ出力形式を表します。最後のモデルは、Lambda 関数で使用するデータ入力スキーマを表します。

最初の出力モデルを作成する

  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. [MyDemoAPI] が表示される場合は、[Models] を選択します。

  3. [Create] を選択します。

  4. [Model name] に「PetsModelNoFlatten」を入力します。

  5. [Content type] に「application/json」と入力します。

  6. [Model description] に「ID を番号に、タイプをクラスに、価格を販売価格に変更。」と入力します。

  7. [Model schema] に、次の JSON スキーマ互換定義を入力します。

    Copy
    { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PetsModelNoFlatten", "type": "array", "items": { "type": "object", "properties": { "number": { "type": "integer" }, "class": { "type": "string" }, "salesPrice": { "type": "number" } } } }
  8. [Create model] を選択します。

2 番目の出力モデルを作成する

  1. [Create] を選択します。

  2. [Model name] に「PetsModelFlattenSome」を入力します。

  3. [Content type] に「application/json」と入力します。

  4. [Model description] に「ID とタイプを説明に結合し、価格を希望価格に変更」と入力します。

  5. [Model schema] に、以下を入力します。

    Copy
    { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PetsModelFlattenSome", "type": "array", "items": { "type": "object", "properties": { "description": { "type": "string" }, "askingPrice": { "type": "number" } } } }
  6. [Create model] を選択します。

3 番目の出力モデルを作成する

  1. [Create] を選択します。

  2. [Model name] に「PetsModelFlattenAll」を入力します。

  3. [Content type] に「application/json」と入力します。

  4. [Model description] に、「ID、タイプ、価格をリストのセットに結合」と入力します。

  5. [Model schema] に、以下を入力します。

    Copy
    { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PetsModelFlattenAll", "type": "object", "properties": { "listings": { "type": "array", "items": { "type": "string" } } } }
  6. [Create model] を選択します。

入力モデルを作成する

  1. [Create] を選択します。

  2. [Model name] に「PetsLambdaModel」を入力します。

  3. [Content type] に「application/json」と入力します。

  4. [Model description] に、「GetPetsInfo モデル」を入力します。

  5. [Model schema] に、以下を入力します。

    Copy
    { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PetsLambdaModel", "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "type": { "type": "string" }, "price": { "type": "number" } } } }
  6. [Create model] を選択します。

ステップ 2: リソースを作成する

このステップでは、4 つのリソースを作成します。最初の 3 つのリソースは、HTTP エンドポイントから 3 つの出力形式でサンプルデータを取得するためのものです。最後のリソースは、idtypedescription に結合して priceaskingPrice に名前変更する出力スキーマで Lambda 関数からサンプルデータを取得するためのものです。

最初のリソースを作成する

  1. リンク リストで [Resources] を選択します。

  2. [Resources] ペインで、[/petstorewalkthrough] を選択してから [Create Resource] を選択します。

  3. [Resource Name] に「NoFlatten」を入力します。

  4. [Resource Path] でデフォルトの [/petstorewalkthrough/noflatten] を選択した後、[Create Resource] を選択します。

2 番目のリソースを作成する

  1. [Resources] ペインで、再度 [/petstorewalkthrough] を選択してから [Create Resource] を選択します。

  2. [Resource Name] に「FlattenSome」を入力します。

  3. [Resource Path] でデフォルトの [/petstorewalkthrough/flattensome] を選択した後、[Create Resource] を選択します。

3 番目のリソースを作成する

  1. [Resources] ペインで、再度 [/petstorewalkthrough] を選択してから [Create Resource] を選択します。

  2. [Resource Name] に「FlattenAll」を入力します。

  3. [Resource Path] でデフォルトの [/petstorewalkthrough/flattenall] を選択した後、[Create Resource] を選択します。

4 番目のリソースを作成する

  1. [Resources] ペインで、再度 [/petstorewalkthrough] を選択してから [Create Resource] を選択します。

  2. [Resource Name] に「LambdaFlattenSome」を入力します。

  3. [Resource Path] でデフォルトの [/petstorewalkthrough/lambdaflattensome] を選択した後、[Create Resource] を選択します。

ステップ 3: GET メソッドを作成する

このステップでは、前のステップで作成した各リソース用に GET メソッドを作成します。

最初の GET メソッドを作成する

  1. [Resources] リストで、[/petstorewalkthrough/flattenall] を選択してから [Create Method] を選択します。

  2. ドロップダウンリストから [GET] を選択し、チェックマークアイコンを選択して選択内容を保存します。

  3. 設定ペインで、[Integration type] として [HTTP]、[HTTP method] として [GET] を選択し、[Endpoint URL] に「http://petstore-demo-endpoint.execute-api.com/petstore/pets」と入力して [Save] を選択します。

2 番目の GET メソッドを作成する

  1. [Resources] リストで、[/petstorewalkthrough/lambdaflattensome] を選択してから [Create Method] を選択します。

  2. ドロップダウンリストから [GET] を選択し、チェックマークを選択して選択内容を保存します。

  3. 設定ペインで、[Integration type] として [Lambda Function] を選択し、[Lambda Region] ドロップダウンリストから GetPetsInfoLambda 関数を作成したリージョンを選択します。次に、[Lambda Function] として [GetPetsInfo] を選択して [Save] を選択します。Lambda 関数にアクセス権限を追加するよう求められたら、[OK] を選択します。

3 番目の GET メソッドを作成する

  1. [Resources] リストで、[/petstorewalkthrough/flattensome] を選択してから [Create Method] を選択します。

  2. ドロップダウンリストから [GET] を選択し、チェックマークアイコンを選択して選択内容を保存します。

  3. 設定ペインで、[Integration type] として [HTTP]、[HTTP method] として [GET] を選択し、[Endpoint URL] に「http://petstore-demo-endpoint.execute-api.com/petstore/pets」と入力して [Save] を選択します。

4 番目の GET メソッドを作成する

  1. [Resources] リストで、[/petstorewalkthrough/noflatten] を選択してから [Actions]、[Create Method] の順に選択します。

  2. ドロップダウンリストから [GET] を選択し、チェックマークアイコンを選択して選択内容を保存します。

  3. 設定ペインで、[Integration type] として [HTTP]、[HTTP method] として [GET] を選択し、[Endpoint URL] に「http://petstore-demo-endpoint.execute-api.com/petstore/pets」と入力して [Save] を選択します。

ステップ 4: Lambda 関数を作成する

このステップでは、サンプルデータを返す Lambda 関数を作成します。

Lambda 関数を作成する

  1. https://console.aws.amazon.com/lambda/ にある AWS Lambda コンソールを開きます。

  2. 次のいずれかを行ってください。

    • ウェルカムページが表示される場合は、[Get Started Now] を選択します。

    • [Lambda: Function list] ページが表示される場合は、[Create a Lambda function] を選択します。

  3. [Name] に、「GetPetsInfo」を入力します。

  4. [Description] に「ペット情報を取得。」と入力します。

  5. [Code template] で、[None] を選択します。

  6. 次のコードを入力します。

    Copy
    console.log('Loading event'); exports.handler = function(event, context, callback) { callback(null, [{"id": 1, "type": "dog", "price": 249.99}, {"id": 2, "type": "cat", "price": 124.99}, {"id": 3, "type": "fish", "price": 0.99}]); // SUCCESS with message };

    ヒント

    Node.js で書かれた前述のコードで、console.log が Amazon CloudWatch ログに情報を書き込みます。event には、Lambda 関数への入力が含まれています。context には、呼び出しコンテキストが含まれています。callback は、結果を返します (node.js 4.3 以降の場合)。Lambda 関数コードを書き込む方法の詳細については、AWS Lambda: How it Works の「モデルのプログラミング」とAWS Lambda 開発者ガイド のサンプル演習を参照してください。

  7. [Handler name] でデフォルトの index.handler を選択します。

  8. [Role] で、Lambda 関数を公開するための API を作成する で作成した Lambda 実行ロールの APIGatewayLambdaExecRole を選択します。

  9. [Create Lambda function] を選択します。

  10. 関数リストで、[GetPetsInfo] を選択して関数の詳細を表示します。

  11. この関数を作成した AWS リージョンをメモしておきます。これは、後で必要になります。

  12. ポップアップリストで、[Edit or test function] を選択します。

  13. [Sample event] で、表示されたコードを次のように置換します。

    Copy
    { }

    ヒント

    空の中括弧は、この Lambda 関数に入力値が存在しないことを意味しています。この関数は、ペット情報を含む JSON オブジェクトを返すのみであるため、ここではこれらのキー/値のペアは必要ありません。

  14. [Invoke] を選択します。[Execution result] に、[{"id":1,"type":"dog","price":249.99},{"id":2,"type":"cat","price":124.99},{"id":3,"type":"fish","price":0.99}] が表示されます。同じ内容が CloudWatch ログにも書き込まれます。

  15. [Go to function list] を選択します。

ステップ 5: メソッドをセットアップし、テストする

このステップでは、メソッドレスポンス、統合リクエスト、統合レスポンスを設定して、HTTP エンドポイントと Lambda 関数に関連付けられている GET メソッドの入出力データスキーマ (またはモデル) を指定します。API Gateway コンソールでこれらのメソッドを呼び出してテストする方法についても説明します。

最初の GET メソッドの統合を設定してテストするには

  1. API の [Resources] ツリーで、[/petstorewalkthrough/flattenall] ノードの下にある [GET] を選択します。

  2. [Method Execution] ペインで、[Method Response] を選択してから [200] の横の矢印を選択します。

  3. [Response Models for 200] エリアで、[application/json] の鉛筆アイコンを選択し、メソッド出力のモデルの設定を開始します。[Models] で [PetsModelFlattenAll] を選択し、チェックマークアイコンを選択して設定を保存します。

  4. [Method Execution]、[Integration Response] の順に選択してから、[200] の横の矢印を選択します。

  5. [本文マッピングテンプレート] セクションを展開し、[Content-Type] の [application/json] を選択します。

  6. [Generate template from model] で [PetsModelFlattenAll] を選択し、開始点として PetsModelFlattenAll モデルの後にマッピングテンプレートを表示します。

  7. マッピングテンプレートコードを次のように変更します。

    Copy
    #set($inputRoot = $input.path('$')) { "listings" : [ #foreach($elem in $inputRoot) "Item number $elem.id is a $elem.type. The asking price is $elem.price."#if($foreach.hasNext),#end #end ] }
  8. [Save] を選択します。

  9. [Method Execution] を選択し、[Client] ボックスで [TEST]、[Test] の順に選択します。成功すると、[Response Body] に次の内容が表示されます。

    Copy
    { "listings" : [ "Item number 1 is a dog. The asking price is 249.99.", "Item number 2 is a cat. The asking price is 124.99.", "Item number 3 is a fish. The asking price is 0.99." ] }

2 番目の GET メソッドの統合を設定してテストするには

  1. API の [Resources] ツリーで、[/petstorewalkthrough/lambdaflattensome] ノードの下にある [GET] を選択します。

  2. [Method Execution] で、[Method Response] を選択します。次に [200] の横にある矢印を選択してセクションを展開します。

  3. [Response Models for 200] エリアで、[application/json] のコンテンツタイプの行にある鉛筆アイコンを選択します。[Models] で [PetsModelFlattenSome] を選択し、チェックマークアイコンを選択して選択内容を保存します。

  4. [Method Execution] に戻ります。[Integration Response] を選択し、[200] の横にある矢印を選択します。

  5. [Body Mapping Templates] セクションで、[Content-Type] の [application/json] を選択します。

  6. [Generate template] で [PetsModelFlattenSome] を選択して、このメソッドの出力のマッピングスクリプトテンプレートを表示します。

  7. コードを次のように変更して、[Save] を選択します。

    Copy
    #set($inputRoot = $input.path('$')) [ #foreach($elem in $inputRoot) { "description" : "Item $elem.id is a $elem.type.", "askingPrice" : $elem.price }#if($foreach.hasNext),#end #end ]
  8. [Method Execution] を選択し、[Client] ボックスで [TEST]、[Test] の順に選択します。成功すると、[Response Body] に次の内容が表示されます。

    Copy
    [ { "description" : "Item 1 is a dog.", "askingPrice" : 249.99 }, { "description" : "Item 2 is a cat.", "askingPrice" : 124.99 }, { "description" : "Item 3 is a fish.", "askingPrice" : 0.99 } ]

3 番目の GET メソッドの統合を設定してテストするには

  1. API の [Resources] ツリーで、[/petstorewalkthrough/flattensome] ノードの下にある [GET] を選択します。

  2. [Method Execution] ペインで、[Method Response] を選択します。

  3. [200] の横にある矢印を選択します。

  4. [Response Models for 200] エリアで、[application/json] の鉛筆アイコンを選択します。[Models] で [PetsModelFlattenSome] を選択し、チェックマークアイコンを選択して選択内容を保存します。

  5. [Method Execution] に戻って、[Integration Response] を選択します。

  6. [200] の横にある矢印を選択してセクションを展開します。

  7. [本文マッピングテンプレート] エリアを展開します。[Content type] の [application/json] を選択します。[Generate template] で [PetsModelFlattenSome] を選択して、このメソッドの出力のマッピングスクリプトテンプレートを表示します。

  8. 次のようにコードを変更します。

    Copy
    #set($inputRoot = $input.path('$')) [ #foreach($elem in $inputRoot) { "description": "Item $elem.id is a $elem.type.", "askingPrice": $elem.price }#if($foreach.hasNext),#end #end ]
  9. [Save] を選択します。

  10. [Method Execution] に戻って、[Client] ボックスの [TEST] を選択します。次に [Test] を選択します。成功すると、[Response Body] に次の内容が表示されます。

    Copy
    [ { "description": "Item 1 is a dog.", "askingPrice": 249.99 }, { "description": "Item 2 is a cat.", "askingPrice": 124.99 }, { "description": "Item 3 is a fish.", "askingPrice": 0.99 } ]

4 番目の GET メソッドの統合を設定してテストするには

  1. API の [Resources] ツリーで、[/petstorewalkthrough/noflatten] ノードの下にある [GET] を選択します。

  2. [Method Execution] ペインで、[Method Response] を選択して [200] セクションを展開します。

  3. [Response Models for 200] エリアで、[application/json] の鉛筆アイコンを選択して、このメソッドのレスポンスモデルを更新します。

  4. [application/json] のコンテンツタイプのモデルとして [PetsModelNoFlatten] を選択し、チェックマークアイコンを選択して選択内容を保存します。

  5. [Method Execution]、[Integration Response] の順に選択してから、[200] の横の矢印を選択してセクションを展開します。

  6. [本文マッピングテンプレート] セクションを展開します。[Content type] の [application/json] を選択します。[Generate templates] で [PetsModelNoFlatten] を選択して、このメソッドの出力のマッピングスクリプトテンプレートを表示します。

  7. 次のようにコードを変更します。

    Copy
    #set($inputRoot = $input.path('$')) [ #foreach($elem in $inputRoot) { "number": $elem.id, "class": "$elem.type", "salesPrice": $elem.price }#if($foreach.hasNext),#end #end ]
  8. [Save] を選択します。

  9. [Method Execution] に戻って、[Client] ボックスで [TEST]、[Test] の順に選択します。成功すると、[Response Body] に次の内容が表示されます。

    Copy
    [ { "number": 1, "class": "dog", "salesPrice": 249.99 }, { "number": 2, "class": "cat", "salesPrice": 124.99 }, { "number": 3, "class": "fish", "salesPrice": 0.99 } ]

ステップ 6: API をデプロイする

このステップでは、API をデプロイして、以降 API Gateway コンソール外で呼び出せるようにします。

API をデプロイする

  1. [Resources] ペインで、[Deploy API] を選択します。

  2. [Deployment stage] で、[test] を選択します。

  3. [Deployment description] に、「モデルとマッピングテンプレートの演習」と入力します。

  4. [Deploy] を選択します。

ステップ 7: API をテストする

このステップでは、API Gateway コンソール外で HTTP エンドポイントと Lambda 関数を操作します。

  1. [Stage Editor] ペインの [Invoke URL] の横で、URL をクリップボードにコピーします。次のように表示されます。

    Copy
    https://my-api-id.execute-api.region-id.amazonaws.com/test
  2. ブラウザーの新しいタブのアドレスボックスにこの URL を貼り付けます。

  3. 次のように /petstorewalkthrough/noflatten を追加します。

    Copy
    https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/noflatten

    URL を参照します。次の情報が表示されます。

    Copy
    [ { "number": 1, "class": "dog", "salesPrice": 249.99 }, { "number": 2, "class": "cat", "salesPrice": 124.99 }, { "number": 3, "class": "fish", "salesPrice": 0.99 } ]
  4. petstorewalkthrough/ の後、noflattenflattensome と置き換えます。

  5. URL を参照します。次の情報が表示されます。

    Copy
    [ { "description": "Item 1 is a dog.", "askingPrice": 249.99 }, { "description": "Item 2 is a cat.", "askingPrice": 124.99 }, { "description": "Item 3 is a fish.", "askingPrice": 0.99 } ]
  6. petstorewalkthrough/ の後、flattensomeflattenall と置き換えます。

  7. URL を参照します。次の情報が表示されます。

    Copy
    { "listings" : [ "Item number 1 is a dog. The asking price is 249.99.", "Item number 2 is a cat. The asking price is 124.99.", "Item number 3 is a fish. The asking price is 0.99." ] }
  8. petstorewalkthrough/ の後、flattenalllambdaflattensome と置き換えます。

  9. URL を参照します。次の情報が表示されます。

    Copy
    [ { "description" : "Item 1 is a dog.", "askingPrice" : 249.99 }, { "description" : "Item 2 is a cat.", "askingPrice" : 124.99 }, { "description" : "Item 3 is a fish.", "askingPrice" : 0.99 } ]

ステップ 8: クリーンアップ

この演習で作成した Lambda 関数が不要になった場合は、削除できます。さらに、関数に付随する IAM リソースを削除できます。

警告

API が依存する Lambda 関数を削除すると、API は機能しなくなります。Lambda 関数の削除は元に戻すことができません。再度 Lambda 関数を使用するには、関数を再度作成する必要があります。

Lambda 関数が依存している IAM リソースを削除すると、Lambda 関数は機能しなくなります。また、同関数に依存する API は機能しなくなります。IAM リソースの削除は元に戻すことができません。再度 IAM 関数を使用するには、関数を再度作成する必要があります。この演習や他の演習で作成したリソースをひき続き試す場合は、Lambda 呼び出しロールまたは Lambda 実行ロールを削除しないでください。

API Gateway は現在、機能しない API の非アクティブ化や削除をサポートしていません。

Lambda 関数を削除するには

  1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にある AWS Lambda コンソールを開きます。

  2. [Lambda: Function list] ページの関数リストで、[GetPetsInfo] の横のボタンを選択した後、[Actions]、[Delete] の順に選択します。プロンプトが表示されたら、再度 [Delete] を選択します。

関連付けられた IAM リソースを削除する

  1. https://console.aws.amazon.com/iam/ にある IAM コンソールを開きます。

  2. [Details] エリアで、[Roles] を選択します。

  3. [APIGatewayLambdaExecRole] を選択した後、[Role Actions]、[Delete Role] の順に選択します。プロンプトが表示されたら、[Yes, Delete] を選択します。

  4. [Details] エリアで、[Policies] を選択します。

  5. [APIGatewayLambdaExecPolicy] を選択した後、[Policy Actions]、[Delete] の順に選択します。プロンプトが表示されたら、[Delete] を選択します。

この演習はこれで終了です。

次のステップ

次の演習では、API Gateway API を作成して AWS サービスにアクセスする方法を説明します。「AWS サービスプロキシを作成する」を参照してください。