Amazon API Gateway
開発者ガイド

API Gateway で AWS Lambda 関数の REST API を作成する

注記

REST API を Lambda と統合するには、API Gateway と Lambda サービスの両方を利用できるリージョンを選択する必要があります。各リージョンの可用性については、「リージョンとエンドポイント」を参照してください。

開始方法」セクションで、API Gateway コンソールを使用して Lambda 関数を公開するための API を作成する方法について説明しました。コンソールでは、[統合タイプ] として、HTTPMockAWS Service などのほかに、Lambda Function オプションを選択できます。Lambda Function オプションは、AWS Service 統合タイプの特殊なケースであり、デフォルト設定を使用して統合のセットアップを簡素化します。たとえば、前者では、Lambda 関数を呼び出すために必要なリソースベースのアクセス許可がコンソールによって自動的に追加されます。後者では、より詳細に制御できますが、適切なアクセス許可を含む IAM ロールを作成して指定するなど、統合の設定に伴う責任が増えます。どちらのオプションでも、基盤となる integration.type は API Gateway REST API およびその OpenAPI 定義ファイルの AWS です。

このセクションでは、AWS Service および Lambda Function 統合タイプを使用して API を Lambda 関数と統合する手順についてステップごとに説明します。Lambda 関数の非同期呼び出しをサポートするには、X-Amz-Invocation-Type:Event ヘッダーを統合リクエストに明示的に追加する必要があります。同期呼び出しの場合、X-Amz-Invocation-Type:RequestResponse ヘッダーを統合リクエストに追加するか、指定しないでおくことができます。次の例は、Lambda 関数の非同期呼び出しの統合リクエストを示しています。

POST /2015-03-31/functions/FunctionArn/invocations?Qualifier=Qualifier HTTP/1.1 X-Amz-Invocation-Type: Event ... Authorization: ... Content-Type: application/json Content-Length: PayloadSize Payload

この例で、FunctionArn は呼び出す Lambda 関数の ARN です。Authorization ヘッダーは、HTTPS 経由での Lambda 関数の安全な呼び出しに必要です。詳細については、AWS Lambda Developer Guideの「Invoke アクション」を参照してください。

API を Lambda の AWS サービスプロキシとして作成および設定する方法を示すため、加算 (+)、減算 (-)、乗算 (x)、および除算 (/) を実行する Lambda 関数 (Calc) を作成します。クライアントがこれらのオペレーションを実行するメソッドリクエストを送信すると、API Gateway は対応する統合リクエストを投稿して、指定された Lambda 関数を呼び出し、JSON ペイロードとして必要な入力 (2 つのオペランドと 1 つの演算子) を渡します。同期呼び出しは JSON ペイロードとして結果を返します (ある場合)。非同期呼び出しではデータは返されません。

Lambda 関数を呼び出すには、/calc リソースで GET または POST メソッドを公開できます。GET メソッドでは、クライアントは 3 つのクエリ文字列パラメータ (operand1operand2operator) を通じてバックエンド Lambda 関数に入力を渡します。これらを統合リクエストの JSON ペイロードにマッピングするには、マッピングテンプレートを設定します。POST メソッドでは、クライアントはメソッドリクエストの JSON ペイロードとして入力を Lambda 関数に渡します。クライアントの入力が入力モデルに準拠している場合は、メソッドリクエストのペイロードを統合リクエストに渡すことができます。または、/calc/{operand1}/{operand2}/{operator} リソースで GET メソッドを公開できます。このメソッドでは、クライアントはパスパラメーターの値として Lambda 関数の入力を指定します。メソッドリクエストのパスパラメータを Lambda 関数への入力として統合リクエストのペイロードに変換したり、統合レスポンスからの出力をメソッドレスポンスに変換したりするには、マッピングテンプレートが必要になります。

このチュートリアルでは、以下のトピックについて説明します。

  • JSON 形式で入力を受け取って出力を返す、算術オペレーションを実装した Calc Lambda 関数を作成する。

  • /calc リソースに対するメソッドとして、Lambda 関数を呼び出してクエリ文字列として入力を渡す GET を公開する。リクエストの検証を有効にして、API Gateway が Lambda 関数を呼び出す前に、クライアントからすべての必要なクエリ文字列パラメータが送信されていることを確認します。

  • /calc リソースに対するメソッドとして、Lambda 関数を呼び出してペイロードとして入力を渡す POST を公開する。リクエストの検証を有効にして、API Gateway が Lambda 関数を呼び出す前に、クライアントから有効なリクエストペイロードが送信されていることを確認します。

  • /calc/{operand1}/{operand2}/{operator} リソースに対するメソッドとして、Lambda 関数を呼び出してパスパラメータで入力を指定する GET を公開する。Result スキーマを定義してメソッドレスポンス本文をモデル化し、Result スキーマで定義したプロパティを介して、API の厳密に型指定された SDK からメソッドレスポンスデータにアクセスできるようにする方法についても説明します。

サンプル API は、その OpenAPI 定義ファイルで検査できます。API OpenAPI 定義は、「REST API を API Gateway にインポートする」の手順に従って API Gateway にインポートすることもできます。

API Gateway コンソールを使用して API を作成するには、まず AWS アカウントにサインアップする必要があります。

AWS アカウントをお持ちでない場合は、次に説明する手順に従ってアカウントを作成してください。

AWS にサインアップするには

  1. https://aws.amazon.com/ を開き、[AWS アカウントの作成] を選択します。

  2. オンラインの手順に従います。

API が Lambda 関数を呼び出せるようにするには、適切な IAM ポリシーがアタッチされた IAM ロールが必要です。次のセクションでは、必要に応じて IAM のロールとポリシーを確認および作成する方法について説明します。

API が Lambda 関数を呼び出すように IAM のロールとポリシーを設定する

API Gateway で Lambda 関数を呼び出すには、Lambda の InvokeFunction アクションを呼び出すためのアクセス許可が API に必要です。つまり、最低でも、IAM ロールに以下の IAM ポリシーをアタッチして、API Gateway がそのポリシーを引き受けるようにする必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "*" } ] }

このポリシーを作成しない場合、API の呼び出し元は 500 Internal Server Error レスポンスを受け取ります。レスポンスには、エラーメッセージ「Invalid permissions on Lambda function」が含まれます。Lambda によって返されるエラーメッセージの完全なリストについては、「呼び出し」トピックを参照してください。

API Gateway が引き受け可能なロールは、以下の信頼関係のある IAM ロールです。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

以下では、このチュートリアルに必要な IAM ロールを作成する方法を示します。

  1. IAM コンソールに移動します。

  2. [Roles] を選択します。

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

  4. [信頼されたエンティティの種類を選択] の下で、[AWS サービス] を選択します。

  5. [このロールを使用するサービスを選択] の下で、[Lambda] を選択します。

  6. [Next: Permissions (次へ: アクセス許可)] を選択します。

  7. [Create Policy] を選択します。

    新しい [ポリシーの作成] コンソールウィンドウが開きます。このウィンドウで、以下の操作を行います。

    1. [JSON] タブで、既存のポリシーを以下のポリシーに置き換えます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "*" } ] }
    2. [ポリシーの確認] を選択します。

    3. [ポリシーの確認] で、以下の作業を行います。

      1. [名前] には lambda_execute などの名前を入力します。

      2. [Create Policy] を選択します。

  8. 元の [ロールの作成] ウィンドウで、以下の操作を行います。

    1. [アクセス権限ポリシーをアタッチする] で、ドロップダウンリストから lambda_execute ポリシーを選択します。

    2. [次へ: レビュー] を選択します。

    3. [ロール名] には、lambda_invoke_function_assume_apigw_role などの名前を入力します。

    4. [ロールの作成] を選択します。

  9. ロールのリストから lambda_invoke_function_assume_apigw_role 関数を選択します。

  10. [信頼関係] タブを選択します。

  11. [Edit trust relationship (信頼関係の編集)] を選択します。

  12. 既存のポリシーを以下に置き換えます。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com", "apigateway.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
  13. [Update Trust Policy] を選択します。

  14. 作成したロールのロール ARN を書き留めます。後で必要になります。

バックエンドで Lambda 関数を作成する

次の手順では、Lambda コンソールを使用して Lambda 関数を作成するステップを示します。

  1. Lambda コンソールに移動します。

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

  3. [一から作成] を選択します。

  4. [Name] に、「Calc」と入力します。

  5. [ランタイム] を「Node.js 6.10」に設定したままにします。

  6. 以下の Lambda 関数をコピーし、Lambda コンソールのコードエディターに貼り付けます。

    console.log('Loading the Calc function'); exports.handler = function(event, context, callback) { console.log('Received event:', JSON.stringify(event, null, 2)); if (event.a === undefined || event.b === undefined || event.op === undefined) { callback("400 Invalid Input"); } var res = {}; res.a = Number(event.a); res.b = Number(event.b); res.op = event.op; if (isNaN(event.a) || isNaN(event.b)) { callback("400 Invalid Operand"); } switch(event.op) { case "+": case "add": res.c = res.a + res.b; break; case "-": case "sub": res.c = res.a - res.b; break; case "*": case "mul": res.c = res.a * res.b; break; case "/": case "div": res.c = res.b===0 ? NaN : Number(event.a) / Number(event.b); break; default: callback("400 Invalid Operator"); break; } callback(null, res); };
  7. 既存の IAM ロールを選択するか、ロールを新規作成します。

  8. [Save] を選択します。

この関数には、a 入力パラメータからの 2 つのオペランド (bop) および演算子 (event) が必要です。入力は以下の形式の JSON オブジェクトです。

{ "a": "Number" | "String", "b": "Number" | "String", "op": "String" }

この関数は計算結果 (c) と入力を返します。入力が無効な場合、関数は結果として Null 値または「Invalid op」文字列のいずれかを返します。出力は以下の JSON 形式になります。

{ "a": "Number", "b": "Number", "op": "String", "c": "Number" | "String" }

この関数は、次のステップで API と統合する前に、Lambda コンソールでテストする必要があります。

Lambda 関数の API リソースを作成する

以下の手順では、作成した Lambda 関数の API リソースを作成する方法について説明します。ここでは、API のルート外に /calc リソースを作成します。以降のセクションでは、このリソースで、クライアントからバックエンドの Lambda 関数を呼び出す GET メソッドと POST メソッドを公開します。発信者は、必要な入力を渡す方法として、GET リクエストではクエリ文字列パラメータを (?operand1=...&operand2=...&operator=... として宣言して) 使用し、POST リクエストでは JSON ペイロードを使用する必要があります。

また、/calc/{operand1}/{operand2}/{operator} リソースのサブツリーを作成し、GET メソッドを公開して Lambda 関数を呼び出します。呼び出し元では、3 つのパスパラメータ (operand1operand2operator) を指定して、必要な入力を渡す必要があります。

Lambda 関数の API リソースを作成するには

  1. API Gateway コンソールで、[新しい API] を選択します。

  2. [Name] に、「LambdaGate」と入力します。

  3. [説明] を空のままにして、[エンドポイントタイプ] を [リージョン別] に設定したままにします。

Lambda 関数を呼び出してクエリパラメータを渡す GET メソッドを作成する

Lambda 関数を呼び出してクエリパラメータを渡す GET メソッドを作成すると、API ユーザーはどのブラウザからでも計算ができるようになります。これは、オープンなアクセスを許可する API で特に役立ちます。

Lambda 関数を呼び出してクエリ文字列を渡す GET メソッドを設定するには

  1. API Gateway コンソールの [リソース] で、API の /calc リソースを選択します。

  2. [アクション] ドロップダウンメニューから、[メソッドの作成] を選択します。

  3. 表示される [メソッド] ドロップダウンメニューから、[GET] を選択します。

  4. チェックマークアイコンを選択して、選択を保存します。

  5. 次の [Set up (設定)] ペインで、以下の操作を行います。

    1. [統合タイプ] で、[AWS サービス] を選択します。

    2. [AWS リージョン] の Lambda 関数を作成したリージョン (us-west-2 など) を選択します。

    3. [AWS サービス] で、[Lambda] を選択します。

    4. この Lambda 関数は、どの AWS サブドメインでもホストされていないため、[AWS サブドメイン] は空白のままにします。

    5. [HTTP メソッド] で、[POST] を選択し、チェックマークアイコンを選択して選択内容を保存します。Lambda では、Lambda 関数の呼び出しに POST リクエストを使用する必要があります。この例では、フロントエンドのメソッドリクエストの HTTP メソッドは、バックエンドの統合リクエストとは異なる場合があることを示しています。

    6. [アクションタイプ] として [Use path override] を選択します。このオプションでは、実行する Invoke アクションの ARN を指定して Calc 関数を呼び出すことができます。

    7. [パス上書き] に「/2015-03-31/functions/arn:aws:lambda:region:account-id:function:Calc/invocations」と入力します。

    8. [実行ロール] に、に作成した lambda_invoke_function_assume_apigw_role IAM ロールのロール ARN を入力します。以下に例を示します。

    9. このメソッドではバイナリデータを扱わないため、[コンテンツの処理] は [パススルー] のままにしておきます。

    10. [デフォルトタイムアウトの使用] チェックボックスをオンのままにしておきます。

    11. [Save] を選択します。

    セットアップが成功すると、設定は次のように表示されます。

    
                        Lambda との統合用にメソッドを設定する

    [統合リクエスト] で X-Amz-Invocation-Type: Event | RequestResponse | DryRun ヘッダーを追加し、アクションをリクエストおよびレスポンスとして、またはテスト実行として、それぞれ非同期に呼び出すこともできます。ヘッダーを指定しない場合、アクションはリクエストとレスポンスとして呼び出されます。

  6. [メソッドリクエスト] を選択します。

    バックエンド Lambda 関数に代わって入力を受け取ることができるように、/calcGET メソッドのクエリパラメータを設定します。

    1. [リクエストの検証] の横にある鉛筆アイコンを選択し、ドロップダウンメニューから [クエリ文字列パラメータおよびヘッダーの検証] を選択します。この設定により、クライアントが必要なパラメータを指定しなかった場合に、それらが見つからないことを示すエラーメッセージが返されます。バックエンドへの呼び出しに対しては料金が請求されません。

    2. チェックマークアイコンを選択して、選択を保存します。

    3. [URL クエリ文字列パラメータ] セクションを展開します。

    4. [クエリ文字列の追加] を選択します。

    5. [Name] に、「operand1」と入力します。

    6. チェックマークアイコンを選択してパラメータを保存します。

    7. 上記のステップを繰り返し、operand2 および operator という名前のパラメータを作成します。

    8. パラメータごとに [必須] オプションを調べて、すべてのパラメータを確認します。

    設定は次のようになります。

    
                        Lambda との統合用にメソッドリクエストの URL クエリ文字列を設定する
  7. [メソッドの実行]、[統合リクエスト] の順に選択し、Calc 関数の要求に応じて、クライアントで指定したクエリ文字列を統合リクエストのペイロードに変換するためのマッピングテンプレートを設定します。

    1. [マッピングテンプレート] セクションを展開します。

    2. [リクエストボディのパススルー] で [リクエストの Content-Type ヘッダーに一致するテンプレートがない場合] を選択します。

    3. [Content-Type] の [マッピングテンプレートの追加] を選択します。

    4. application/json」と入力し、チェックマークアイコンを選択してテンプレートエディタを開きます。

    5. [はい、この統合を保護します] を選択して続行します。

    6. マッピングテンプレートエディターに以下のマッピングスクリプトを入力します。

      { "a": "$input.params('operand1')", "b": "$input.params('operand2')", "op": "$input.params('operator')" }

      このテンプレートでは、[メソッドリクエスト] で宣言した 3 つのクエリ文字列パラメータは、バックエンド Lambda 関数への入力として、JSON オブジェクトの指定したプロパティ値にマッピングされます。変換された JSON オブジェクトは統合リクエストのペイロードとして含まれます。

    7. [Save] を選択します。

    設定は次のようになります。

    
                        メソッドリクエストの URL クエリ文字列を統合リクエストのペイロードにマッピングして Lambda 関数を呼び出せるようにする
  8. [メソッドの実行] を選択します。

  9. これで、GET メソッドをテストして、このメソッドが Lambda 関数を呼び出すように適切に設定されていることを確認できます。

    1. [クエリ文字列] に「operand1=2&operand2=3&operator=+」と入力します。

    2. [Test] を選択します。

      結果は以下のようになります。

      
                                Lambda プロキシとして API Gateway で API を作成する

Lambda 関数を呼び出して JSON ペイロードを渡す POST メソッドを作成する

Lambda 関数を呼び出して JSON ペイロードを渡す POST メソッドを作成すると、クライアントはバックエンド関数に渡す入力をリクエストボディで送信できるようになります。クライアントが正しい入力データをアップロードしたことを確認するために、ペイロードに対してリクエストの検証を有効にします。

Lambda 関数を呼び出して JSON ペイロードを渡す POST メソッドを設定するには

  1. API Gateway コンソールに移動します。

  2. [API] を選択します。

  3. 以前に作成した [LambdaGate] API を選択します。

  4. [リソース] ペインで [/calc] リソースを選択します。

  5. [アクション] メニューから、[メソッドの作成] を選択します。

  6. [メソッド] ドロップダウンリストから [POST] を選択します。

  7. チェックマークアイコンを選択して、選択を保存します。

  8. 次の [Set up (設定)] ペインで、以下の操作を行います。

    1. [統合タイプ] で、[AWS サービス] を選択します。

    2. [AWS リージョン] の Lambda 関数を作成したリージョン (us-west-2 など) を選択します。

    3. [AWS サービス] で、[Lambda] を選択します。

    4. この Lambda 関数は、どの AWS サブドメインでもホストされていないため、[AWS サブドメイン] は空白のままにします。

    5. [HTTP メソッド] で、[POST] を選択し、チェックマークアイコンを選択して選択内容を保存します。Lambda では、Lambda 関数の呼び出しに POST リクエストを使用する必要があります。この例では、フロントエンドのメソッドリクエストの HTTP メソッドは、バックエンドの統合リクエストとは異なる場合があることを示しています。

    6. [アクション] の横の鉛筆アイコンを選択します。[アクションタイプ] の [Use path override] を選択し、チェックマークアイコンを選択して選択内容を保存します。このオプションでは、実行する Invoke アクションの ARN を指定して Calc 関数を呼び出すことができます。

    7. [パス上書き] に「/2015-03-31/functions/arn:aws:lambda:region:account-id:function:Calc/invocations」と入力します。

    8. [実行ロール] に、に作成した lambda_invoke_function_assume_apigw_role IAM ロールのロール ARN を入力します。以下に例を示します。

    9. このメソッドではバイナリデータを扱わないため、[コンテンツの処理] は [パススルー] のままにしておきます。

    10. [デフォルトタイムアウトの使用] チェックボックスをオンのままにしておきます。

    11. [Save] を選択します。

  9. API Gateway コンソールのプライマリナビゲーションペインで、API の下の [モデル] を選択し、メソッドの入力および出力のデータモデルを作成します。

    1. [モデル] ペインの [作成] を選択します。[モデル名] に「Input」と入力し、[コンテンツタイプ] に「application/json」と入力します。さらに [モデルスキーマ] に次のスキーマ定義を入力します。

      { "type":"object", "properties":{ "a":{"type":"number"}, "b":{"type":"number"}, "op":{"type":"string"} }, "title":"Input" }

      このモデルでは、入力データ構造を記述し、受信リクエストボディを検証します。

    2. [モデル] ペインの [作成] を選択します。[モデル名] に「Output」と入力し、[コンテンツタイプ] に「application/json」と入力します。さらに [モデルスキーマ] に次のスキーマ定義を入力します。

      { "type":"object", "properties":{ "c":{"type":"number"} }, "title":"Output" }

      このモデルでは、バックエンドの計算結果のデータ構造を記述します。このモデルを使用して統合レスポンスデータを別のモデルにマッピングできます。このチュートリアルではパススルー動作を利用するため、このモデルは使用しません。

    3. コンソール画面の上部で API の API ID を見つけます。これは API 名の後に括弧で囲んで表示されます。

      [モデル] ペインの [作成] を選択します。[モデル名] に「Result」と入力し、[コンテンツタイプ] に「application/json」と入力します。さらに [モデルスキーマ] に次のスキーマ定義を入力します。

      { "type":"object", "properties":{ "input":{ "$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/Input" }, "output":{ "$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/Output" } }, "title":"Output" }

      このモデルでは、返されたレスポンスデータのデータ構造を記述します。このモデルは、指定された API (Input) に定義されている Output スキーマと restapi-id スキーマの両方を参照します。このチュートリアルではパススルー動作を利用するため、このモデルも使用しません。

  10. メインナビゲーションペインで、API の [リソース] を選択します。

  11. [リソース] ペインで、API の POST メソッドを選択します。

  12. [メソッドリクエスト] を選択します。

  13. [メソッドリクエスト] 構成設定で、以下の操作を行って、受信リクエストボディに対するリクエストの検証を有効にします。

    1. [リクエストの検証] の横にある鉛筆アイコンを選択し、[Validate body] を選択します。チェックマークアイコンを選択して、選択を保存します。

    2. [リクエストボディ] セクションを展開し、[モデルの追加] を選択します。

    3. [Content-Type] 入力フィールドに「application/json」と入力し、[モデル名] 列のドロップダウンリストから [Input] を選択します。チェックマークアイコンを選択して、選択を保存します。

  14. POST メソッドをテストするには、以下の作業を行います。

    1. [メソッドの実行] を選択します。

    2. [Test] を選択します。

  15. 次の JSON ペイロードを [リクエストボディ] にコピーします。

    { "a": 1, "b": 2, "op": "+" }
  16. [Test] を選択します。

    [リクエストボディ] では、次のような出力が表示されます。

    { "a": 1, "b": 2, "op": "+", "c": 3 }

このメソッドを非同期呼び出しとして実装する場合は、メソッドリクエストに InvocationType ヘッダーを追加し、それを X-Amz-Invocation-Type の静的な値を使用するか、'Event' のヘッダーマッピング式を使用して、統合リクエストの method.request.header.InvocationType ヘッダーにマッピングできます。後者の場合、クライアントはメソッドリクエストに InvocationType:Event ヘッダーを含める必要があります。非同期呼び出しは、代わりに、空のレスポンスを返します。

Lambda 関数を呼び出してパスパラメータを渡す GET メソッドを作成する

このセクションでは、一連のパスパラメータで指定されたリソースで GET メソッドを作成し、バックエンドの Lambda 関数を呼び出します。パスパラメータの値は、Lambda 関数への入力データを指定します。ここでは、受信パスパラメータ値を、必要な統合リクエストペイロードにマッピングするためのマッピングテンプレートを定義します。

さらに、Lambda コンソールが提供する簡単な API Gateway 統合機能を使用してメソッドをセットアップします。このコンソールの機能を使うと、ユーザーエクスペリエンスがさらに合理化されます。

生成された API リソースの構造は次のようになります。


                Lambda プロキシとして API Gateway で API を作成する

Lambda 関数を呼び出して URL パスパラメータを渡す GET メソッドを設定するには

  1. API Gateway コンソールに移動します。

  2. [API] で、以前に作成した LambdaGate API を選択します。

  3. API の [リソース] メインナビゲーションペインで、[/calc] を選択します。

  4. [アクション] ドロップダウンメニューから、[リソースの作成] を選択します。

  5. [リソースパス] に「{operand1}」と入力します。

  6. [リソース名] に「{operand1}」を入力します。

  7. [リソースの作成] を選択します。

  8. 先ほど作成した /calc/{operand1} を選択します。

  9. [アクション] ドロップダウンメニューから、[リソースの作成] を選択します。

  10. [リソースパス] に「{operand2}」と入力します。

  11. [リソース名] に「{operand2}」を入力します。

  12. [リソースの作成] を選択します。

  13. 先ほど作成した /calc/{operand1}/{operand2} を選択します。

  14. [アクション] ドロップダウンメニューから、[リソースの作成] を選択します。

  15. [リソースパス] に「{operator}」と入力します。

  16. [リソース名] に「{operator}」を入力します。

  17. [リソースの作成] を選択します。

  18. 先ほど作成した /calc/{operand1}/{operand2}/{operator} を選択します。

  19. [アクション] ドロップダウンメニューから、[メソッドの作成] を選択します。

  20. [メソッド] ドロップダウンメニューから GET を選択します。

  21. [Setup (設定)] ペインで、[統合タイプ] の [Lambda Function] を選択し、コンソールで有効になっている合理化されたセットアッププロセスを使用します。

  22. [Lambda リージョン] で、リージョン (us-west-2 など) を選択します。これは、Lambda 関数がホストされているリージョンです。

  23. [Lambda 関数] で、既存の Lambda 関数 (Calc など) を選択します。

  24. [保存]、[OK] の順に選択して、[Add Permissions to Lambda Function (Lambda 関数にアクセス許可を追加)] に同意します。

  25. マッピングテンプレートを次のようにセットアップします。

    1. [マッピングテンプレート] セクションを展開します。

    2. [マッピングテンプレートの追加] を選択します。

    3. [Content-Type] に「application/json」と入力し、チェックマークアイコンを選択してテンプレートエディタを開きます。

    4. [はい、この統合を保護します] を選択して続行します。

    5. テンプレートエディタに以下のマッピングスクリプトを入力します。

      { "a": "$input.params('operand1')", "b": "$input.params('operand2')", "op": #if($input.params('operator')=='%2F')"/"#{else}"$input.params('operator')"#end }

      このテンプレートでは、/calc/{operand1}/{operand2}/{operator} リソースを作成したときに宣言した 3 つの URL パスパラメータが、JSON オブジェクトの指定したプロパティ値にマッピングされます。URL パスは URL エンコードされる必要があるため、除算演算子を %2F ではなく / として指定してください。このテンプレート では、%2F/ に変換してから Lambda 関数に渡します。

    6. [Save] を選択します。

    メソッドが正しく設定されると、次のようになります。

    
                        Lambda 関数を呼び出してパスパラメータを渡す GET メソッドを設定する
  26. GET 関数をテストするには、以下の作業を行います。

    1. [メソッドの実行] を選択します。

    2. [Test] を選択します。

    3. [{operand1}]、[{operand2}]、[{operator}] の各フィールドに、それぞれ「1」、「2」、「+」と入力します。

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

    5. 結果は以下のようになります。

      
                                メソッドリクエストの URL パスパラメータを統合リクエストのペイロードにマッピングして Lambda 関数を呼び出せるようにする

    このテスト結果では、マッピングテンプレートを設定していないため、バックエンドの Lambda 関数からの出力はそのままマッピングされずに統合レスポンスに渡されています。次に、Result スキーマに従って、メソッドレスポンスペイロードのデータ構造をモデル化します。

  27. デフォルトでは、メソッドレスポンス本文に空のモデルが割り当てられます。これにより、統合レスポンス本文はマッピングされずに渡されます。ただし、Java や Objective-C などの厳密に型指定された言語のいずれかの SDK を生成すると、SDK ユーザーは空のオブジェクトを結果として受け取ります。REST クライアントと SDK クライアントの両方が必要な結果を受け取るためには、事前定義済みのスキーマを使用してデータをモデル化する必要があります。ここでは、メソッドレスポンス本文のモデルを定義する方法と、マッピングテンプレートを構築して統合レスポンス本文をメソッドレスポンス本文に変換する方法を示します。

    1. [/calc/{operand1}/{operand2}/{operator} - GET - メソッドの実行] で、[メソッドの実行] を選択します。

    2. [200] レスポンスを

    3. [Response Body for 200 (200 のレスポンス本文)] で、application/json コンテンツタイプのモデルの横にある鉛筆アイコンを選択します。

    4. [モデル] ドロップダウンリストから [Result] を選択します。

    5. チェックマークアイコンを選択して、選択を保存します。

    メソッドレスポンス本文のモデルを設定すると、レスポンスデータは該当する SDK の Result オブジェクトにキャストされます。この場合、統合レスポンスデータが適切にマッピングされていることも確認する必要があります。この点については、以下で説明します。

  28. 指定されたスキーマに基づいてバックエンドの結果を返すには、以下の操作を実行します。

    1. [メソッドの実行] を選択します。

    2. [統合レスポンス] を選択して、200 メソッドレスポンスエントリを展開します。

    3. [マッピングテンプレート] セクションを展開します。

    4. [Content-Type] リストから [application/json] を選択します。

    5. [テンプレートの生成] ドロップダウンリストから [Result] を選択し、Result テンプレート設計図を表示します。

    6. テンプレート設計図を次のように変更します。

      #set($inputRoot = $input.path('$')) { "input" : { "a" : $inputRoot.a, "b" : $inputRoot.b, "op" : "$inputRoot.op" }, "output" : { "c" : $inputRoot.c } }
    7. [Save] を選択します。

    8. マッピングテンプレートをテストするには、[メソッドの実行] で [テスト] を選択し、[operand1]、[operand2]、[operator] の各入力フィールドに、それぞれ「1」、「2」、「+」と入力します。Lambda 関数からの統合レスポンスが Result オブジェクトにマッピングされ、コンソールで [レスポンス本文] の下に以下が表示されます。

      { "input": { "a": 1, "b": 2, "op": "+" }, "output": { "c": 3 } }
  29. API Gateway コンソールでテスト呼び出し後の API をアクセス可能にするには、[アクション] ドロップダウンメニューから [API のデプロイ] を選択します。リソースやメソッドの追加、変更、削除、データマッピングの更新、ステージ設定の更新を行うたびに、API を必ず再デプロイしてください。そうしないと、新しい機能や更新プログラムを利用できません。