Amazon API Gateway
開発者ガイド

AWS Lambda 関数の API GatewayAPI を作成する

注記

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

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

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

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

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

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

  3. Node.js 4.3 以降のランタイムの [Blank Function] 設計図を選択します。

  4. 画面上の指示に従って、[Lambda function code] エディタに移動します。

  5. 以下の 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); };
  6. 既存の IAM ロールを選択するか、ロールを新規作成します。

  7. 画面上の指示に従って、関数の作成を終了します。

この関数には、event 入力パラメーターからの 2 つのオペランド (ab) および演算子 (op) が必要です。入力は以下の形式の 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 リソースおよびメソッドを使用し、さまざまな API の動作を有効にして同じ関数を呼び出します。

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

  1. API Gateway コンソールで、LambdaGate という名前の API を作成します。

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

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

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

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

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

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

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

  2. [Actions] ドロップダウンメニューから [Create Method] を選択して、GET メソッドを作成します。

  3. 次の [Set up] ペインで、以下の操作を行います。

    1. [Integration type] として AWS Service を選択します。

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

    3. [AWS Service] として [Lambda] を選択します。

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

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

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

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

    8. [Execution role] で、IAM ロールの ARN を指定します。ロールの ARN は、IAM コンソールで確認できます。ロールには、発信者が Calc 関数を呼び出すために必要なアクセス許可と、API Gateway が発信者のロールを引き受けるために必要なアクセス許可が含まれている必要があります。

    9. この例ではバイナリデータを扱わないため、Passthrough は [Content Handling] のデフォルトのままにします。

    10. [Save] を選択し、GET /calc メソッドのセットアップを終了します。

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

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

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

  4. [Method Request] に移動し、バックエンド Lambda 関数への入力を受け取るように、[/calc] で [GET] メソッドのクエリパラメータを設定します。

    1. [Request Validator] の横にある鉛筆アイコンを選択し、[Validate query string parameters and headers] を選択します。この設定により、クライアントが必要なパラメータを指定しなかった場合に、それらが見つからないことを示すエラーメッセージが返されます。バックエンドへの呼び出しに対しては料金が請求されません。

    2. [URL Query String Parameters] セクションを展開します。[Add query string] を選択して、operand1operand2operator クエリ文字列パラメーターを追加します。パラメータごとに [Required] オプションを調べて、すべてのパラメータを確認します。

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

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

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

    2. When no template matches the request Content-Type headerを、[リクエストボディのパススルー] で選択します。

    3. application/jsonが [コンテンツタイプ] に表示されない場合、[マッピングテンプレートの追加] を選んで追加します。

    4. 次に、マッピングテンプレートエディタで次のマッピングスクリプトを入力して保存します。

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

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

    このステップの最終的な設定は次のようになります。

     メソッドリクエストの URL クエリ文字列を統合リクエストのペイロードにマッピングして Lambda 関数を呼び出せるようにする
  6. これで、[Test] を選択して、/calc リソースに対する GET メソッドが Lambda 関数を呼び出すように適切に設定されていることを確認できます。

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

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

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

  1. API Gateway コンソールに移動し、前に作成した API を選択します。

  2. [Resources] ペインで [/calc] リソースを強調表示します。

  3. [Actions] メニューから [Create Method] を選択して [POST /calc] メソッドを作成します。

  4. メソッドの [Set Up] パネルで、この POST メソッドを以下の統合設定に従ってセットアップします。詳細については、「 Lambda 関数を呼び出してクエリパラメータを渡す GET メソッドを作成する 」の説明を参照してください。

     Lambda 関数を呼び出すように POST メソッドを設定する
  5. API Gateway コンソールのプライマリナビゲーションペインで、API の下の [Models] を選択し、メソッドの入力および出力のデータモデルを作成します。

    1. [Models] ペインの [Create] を選択します。[Model name] に「Input」と入力し、[Content type] に「application/json」と入力します。さらに [Model schema] に次のスキーマ定義を入力します。

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

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

    2. [Models] ペインの [Create] を選択します。[Model name] に「Output」と入力し、[Content type] に「application/json」と入力します。さらに [Model schema] に次のスキーマ定義を入力します。

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

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

    3. [Models] ペインの [Create] を選択します。[Model name] に「Result」と入力し、[Content type] に「application/json」と入力します。さらに [Model schema] に次のスキーマ定義を入力します。

      { "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 (restapi-id) に定義されている Input スキーマと Output スキーマの両方を参照します。このチュートリアルではパススルー動作を利用するため、このモデルも使用しません。

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

    1. [Request Validator] の横にある鉛筆アイコンを選択し、[Validate body] を選択します。

    2. [Request Body] セクションを展開し、[Add model] を選択します。

    3. [Content-Type] 入力フィールドに「application/json」と入力し、[Model name] 列のドロップダウンリストから [Input] を選択します。

  7. これで、[Test] を選択して、POST メソッドが想定どおりに機能することを確認できます。以下の入力を渡します。

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

    以下の出力が生成されます。

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

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

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

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

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

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

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

  2. 前に作成した API の [Resources] ツリーで [/calc/{operand1}/{operand2}/{operator}] リソースを強調表示します。

  3. [Actions] ドロップダウンメニューから [Create Method] を選択し、[GET] を選択します。

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

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

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

  7. [Save]、[OK] の順に選択して、[Add Permissions to Lambda Function] に同意します。

  8. [Integration Request] を選択して本文マッピングテンプレートをセットアップします。

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

    2. [Add mapping template] を選択します。

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

    4. [Yes, secure this integration] を選択して続行します。

    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. マッピングテンプレートを保存します。

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

     Lambda 関数を呼び出してパスパラメーターを渡す GET メソッドを設定する
  9. ここで、コンソールの TestInvoke 機能を使用して API をテストします。

    1. [Method Execution] から [Test] を選択します。

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

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

    4. 次のような結果が表示されます。

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

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

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

    1. [/calc/{operand1}/{operand2}/{operator} - GET - Method Execution] で、[Method Response] を選択します。

    2. [200] レスポンスを

    3. [Response Body for 200] セクションで展開します。メソッドレスポンスにモデルが割り当てられていない場合は、

    4. application/json コンテンツタイプのモデルの横にある鉛筆アイコンを選択します。

    5. [Models] ドロップダウンリストから事前定義済みのモデルを選択します。このチュートリアルでは、これは Result です。

    6. 選択したモデルを保存します。

    注記

    application/json のコンテンツタイプにモデルが定義されていない場合は、[Add Response Model] を選択し、画面に表示される指示に従ってモデルを追加します。

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

  11. 指定されたスキーマに基づいてバックエンドの結果を返すには

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

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

    3. application/json を選択するか、これを [Content-Type] に追加します。

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

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

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

    7. マッピングテンプレートをテストするには、[Method Execution] で [Test] を選択し、[operand1]、[operand2]、[operator] の各入力フィールドに、それぞれ「1」、「2」、「+」と入力します。Lambda 関数からの統合レスポンスが Result オブジェクトにマッピングされます。

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