Lambda 統合により Amazon API Gateway での REST API を作成する - Amazon API Gateway

Lambda 統合により Amazon API Gateway での REST API を作成する

Lambda プロキシ統合および Lambda 非プロキシ統合を使用して、Amazon API Gateway で REST API を作成し、デプロイするためにこのチュートリアルを使用できます。

Lambda 統合では、クライアントからの HTTP メソッドリクエストが バックエンドの Lambda 関数呼び出しにマッピングされます。

Lambda プロキシ統合では、リクエストパラメータの注文が保存されていない場合を除き、クライアントリクエスト全体がそのままバックエンド Lambda 関数に送信されます。API Gateway は、クライアントリクエスト全体をバックエンドの Lambda 関数の入力 event パラメータにマッピングします。Lambda 関数の出力 (ステータスコード、ヘッダー、本文を含む) は、そのままクライアントに返されます。多くのユースケースでは、これが推奨される統合タイプです。詳細については、「API Gateway で Lambda プロキシ統合を設定する」を参照してください。

Lambda 非プロキシ統合 (別称「カスタム統合」) では、クライアントリクエストのパラメータ、ヘッダーおよび本文がバックエンド Lambda 関数が要求する形式に変換される方法を設定します。また、クライアントが要求する形式で Lambda 関数出力が再度変換される方法を設定します。詳細については、「API Gateway で Lambda カスタム統合を設定する」を参照してください。

ユースケースに応じて API Gateway API では、Lambda プロキシ統合、Lambda 非プロキシ統合、あるいはその両方を選択できます。

ステップ 1: Lambda コンソールで Lambda 関数を作成する

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

  1. まだ行っていない場合には、「前提条件: API Gateway で API を作成するための準備」 の手順を完了してください。

  2. AWS Lambda デベロッパーガイドの「Lambda 関数を作成するには」のステップを完了します。

ステップ 2: API Gateway コンソールで REST API を作成する

このステップでは、API Gateway コンソールで簡単な REST API を作成し、バックエンドとして Lambda 関数をこれにアタッチします。

  1. [サービス] メニューから [API Gateway] を選択し、API Gateway コンソールに移動します。

  2. API Gateway を初めて使用する場合は、サービスの特徴を紹介するページが表示されます。[REST API] で、[ビルド] を選択します。[Create Example API (サンプル API の作成)] がポップアップ表示されたら、[OK] を選択します。

    API Gateway を使用するのが初めてではない場合、[Create API (API の作成)] を選択します。[REST API] で、[ビルド] を選択します。

  3. [Create new API (新しい API の作成)] で、[New API (新しい API)] を選択します。

  4. [Settings (設定)] で以下のように設定します。

    • [API name (API 名)] に my-api と入力します。

    • 必要に応じて、[Description (説明)] フィールドに説明を入力します。それ以外の場合は空のままにします。

    • [Endpoint Type (エンドポイントタイプ)] を [Regional (リージョン別)] に設定したままにします。

  5. [Create API] を選択します。

  6. [Resources (リソース)] では [/] のみが表示されます。これはルートレベルのリソースであり、API のベースパス URL に対応します (https://b123abcde4.execute-api.us-west-2.amazonaws.com/{stage-name}))。

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

  7. リソース名 (/) の下にドロップダウンメニューが表示されます。[GET] を選択したら、チェックマークアイコンを選択して選択を保存します。

  8. [/ – GET – Setup] ペインの [Integration type (統合タイプ)] で、[Lambda Function (Lambda 関数)] を選択します。

  9. [Use Lambda proxy integration (Lambda プロキシ統合の使用)] を選択します。

  10. [Lambda Region (Lambda リージョン)]で、Lambda 関数を作成したリージョンを選択します。

  11. [Lambda 関数] フィールドに任意の文字を入力し、ドロップダウンメニューから [my-function] (または、前のステップで作成した関数に付けた名前) を選択します(ドロップダウンメニューが表示されない場合は、入力した文字を削除してドロップダウンメニューが表示されるようにします)。 [Default Timeout (デフォルトタイムアウトの使用)] チェックボックスをオンのままにしておきます。[Save (保存)] を選んで選択を保存します。

  12. [Lambda 関数にアクセス許可を追加する] がポップアップ表示されたら ([API Gateway に Lambda 関数を呼び出すアクセス許可を付与します] の表示)、[OK] を選択して API Gateway にこのアクセス許可を付与します。

これで、[/-GET-Method Execution (/ - GET メソッド実行)]ペインが表示されるようになります。


                API Gateway のメソッド実行ペイン

[Method Execution (メソッド実行)] ペインには、以下の項目が時計回り順に含まれています。

  • Client (クライアント): このボックスは、API の GET メソッドを呼び出すクライアント (ブラウザまたはアプリケーション) を表しています。[Test (テスト)] リンクを選択して [Test (テスト)] を選ぶと、クライアントからの GET リクエストをシミュレートします。

  • メソッドリクエスト: このボックスは、API Gateway から受信したクライアントの GET リクエストを表します。[Method Request (メソッドリクエスト)] を選択すると、認証や統合リクエストとしてバックエンドに渡される前のメソッドリクエストの変更などの設定が表示されます。このステップでは、すべての設定をデフォルト値のままにしておきます。

  • Integration Request (統合リクエスト): このボックスは、バックエンドに渡された GET リクエストを表しています。この設定は、選択した [Integration Type (統合タイプ)] によって異なります。[URL Path Parameters (URL パスパラメータ)]、[URL Query String Parameters (URL クエリ文字列パラメータ)]、[HTTP Headers (HTTP ヘッダー)]、および [Mapping Templates (マッピングテンプレート)] の 設定は、特定のバックエンドに必要なメソッドリクエストを変更する設定です。[Integration Type (統合タイプ)] を [Lambda function (Lambda 関数)] に設定したままで、他の設定はデフォルト値のままにします。

  • Lambda my-function: このボックスは、ステップ 1 で作成したバックエンドの Lambda 関数を表しています。Lambda コンソールで my-function Lambda 関数を開く my-function を選択します。

  • Integration Response (統合レスポンス): このボックスは、レスポンスがメソッドエスポンスとしてクライアントに渡される前の、バックエンドからのレスポンスを表します。Lambda プロキシ統合では、このボックス全体が灰色表示されます。これは、プロキシ統合が Lambda 関数の出力をそのまま返すことによります。Lambda 非プロキシ統合の場合、統合レスポンスが Lambda 関数の出力をクライアントアプリケーションに適切な形式に変換するように設定することができます。これを実行する方法については、このチュートリアルで後ほど説明します。

    この開始方法の手順では、すべてをデフォルト値のままで設定します。

  • Method Response (メソッドレスポンス): このボックスは、HTTP ステータスコード、オプションのレスポンスヘッダー、およびオプションのレスポンス本文としてクライアントに返されるメソッドレスポンスを表しています。デフォルトでは、Lambda 関数によって返されるレスポンスの本文は、JSON ドキュメントとしてそのまま渡されます。このため、レスポンスの本文のデフォルト設定は、空のモデル (本文がそのまま渡されることを示す) を使用した application/json です。ここでも、すべてをデフォルト値のままで設定します。

ステップ 3: API Gateway コンソールで REST API をデプロイする

ステップ 2 を完了すると API が作成されますが、まだ実際に使用することはできません。これをデプロイする必要があるためです。

  1. [アクション] ドロップダウンメニューから [API のデプロイ] を選択します。

  2. [デプロイされるステージ] ドロップダウンメニューから [新しいステージ] を選択します。

  3. [Stage name (ステージ名)] に prod と入力します。

  4. [デプロイ] を選択します。

  5. prod [Stage Editor (ステージエディタ)] に上部の [Invoke URL (URL の呼び出し)] を書き留めます。次の形式にする必要があります。(https://b123abcde4.execute-api.us-west-2.amazonaws.com/prod)[Invoke URL (URL の呼び出し)] を選択すると、その URL で新しいブラウザタブが開きます。新しいブラウザタブを更新すると、返されるメッセージ本文 ("Hello from Lambda!") が表示されます。

実際の API テストでは、cURLPOSTMAN のようなツールを使用して API をテストします。たとえば、コンピュータに cURL がインストールされている場合は、次のように API をテストすることができ、

  1. ターミナルウィンドウを開きます。

  2. 次の cURL コマンドをコピーしてターミナルウィンドウに貼り付け、b123abcde4 を API の API ID に、us-west-2 を API がデプロイされているリージョンに置き換えます。

    Linux or Macintosh
    curl -X GET 'https://b123abcde4.execute-api.us-west-2.amazonaws.com/prod'
    Windows
    curl -X GET "https://b123abcde4.execute-api.us-west-2.amazonaws.com/prod"

    このコマンドは、次のサンプル出力を返します。"Hello from Lambda!"

ステップ 4: Lambda コンソールで 2 番目の Lambda 関数を作成する

このステップでは、2 番目のバックエンドの Lambda 関数を作成します。これは、入力パラメータを 1 つ受け取ります。ステップ 5では、独自の GET メソッドがある API に子レスポンスを作成します。パラメータ値をこの新しい関数に渡すようにメソッドを設定します。

  1. [サービス] メニューから [Lambda] を選択して、Lambda コンソールに移動します。

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

  3. [Author from scratch] を選択します。

  4. [Function name (関数名)] に my-function2 と入力します。

  5. [ランタイム] で [Node.js 12.x] あるいは [Python 3.7] を選択します。。

  6. [Permissions (アクセス許可)] で、[実行ロールの選択または作成] を選択します。[Execution role (実行ロール)] ドロップダウンリストから、[Use an existing role (既存のロールを使用)] を選択します。[既存のロール] で、前の Lambda 関数からロールを選択します。ロールの名前は service-role/my-function-a1b23c4d 形式になります。または、[基本的な Lambda アクセス許可で新しいロールを作成] を選択します。

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

  8. [Function code (関数コード)] ペインで、デフォルトの「Hello from Lambda!」function を選択します。関数全体を次のように置き換えます。

    Node.js 12.x
    exports.handler = async (event) => { let myParam = event.myParam; const response = { statusCode: 200, body: JSON.stringify(myParam) }; return response; };
    Python 3.7
    import json def lambda_handler(event, context): myParam = event['myParam'] return { 'statusCode': 200, 'body': json.dumps(myParam) }
  9. [デプロイ] を選択します。

ステップ 5: API Gateway コンソールでリソース、メソッド、およびパラメータを REST API に追加する

リソースとメソッドは、REST API の名詞および動詞です。このステップでは、API に子リソースを作成し、GET メソッドをこのリソースに追加します。クエリ文字列パラメータを新しいメソッドに追加して、ステップ 4 で作成した Lambda 関数の入力パラメータと一致させます。新しい関数にこのメソッドを統合して、ユーザー入力 (シンプルな「Hello from API Gateway!」テキスト文字列) を取得し、Lambda 関数の入力 (同じくシンプルな文字列) にこれをマッピングする方法を示します。

  1. [サービス] メニューから [API Gateway] を選択し、API Gateway コンソールに移動します。

  2. [API] リストで、[my-api] を選択します。

  3. [Resources (リソース)]で、[/] を選択します。

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

  5. [Resource Name (リソース名)] に my-resource と入力します。[Resource Path (リソースパス)] フィールドにリソース名が自動的に入力されていることを確認します。

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

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

  8. リソース名 (my-resource) の下にドロップダウンメニューが表示されます。[GET] を選択したら、チェックマークアイコンを選択して選択を保存します。

  9. [/my-resource – GET – Setup] ペインの [Integration type (統合タイプ)] で、[Lambda Function (Lambda 関数)] を選択します。

  10. [Lambda Region (Lambda リージョン)]で、Lambda 関数を作成したリージョンを選択します。

  11. [Lambda 関数] ボックスで、任意の文字を入力したら、ドロップダウンメニューから [my-function2] を選択します。(ドロップダウンメニューが表示されない場合は、入力した文字を削除してドロップダウンメニューが表示されるようにします)。 [Save (保存)] を選んで選択を保存します。

  12. [Lambda 関数にアクセス許可を追加する] がポップアップ表示されたら ([API Gateway に Lambda 関数を呼び出すアクセス許可を付与します] の表示)、[OK] を選択して API Gateway にこのアクセス許可を付与します。

  13. これで、[/my-resource-GET-Method Execution] ペインが表示されるようになります。[Integration Response (統合レスポンス)] チェックボックスが今回は灰色では表示されていないことを確認します。

    [Integration Request] を選択します。

    
                        API Gateway のメソッド実行ペイン
  14. [Mapping Templates (マッピングテンプレート)] を展開します。

  15. [Request body passthrough (リクエスト本文のパススルー)] を [When there are no templates defined (テンプレートが定義されていない場合)] に設定します。

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

  17. [Content-Type (コンテンツタイプ)] に application/json と入力し、チェックマークアイコンを選んでこの選択を保存します。

  18. [パススルー動作の変更] の [はい、この統合を保護します] を選択します。これにより、統合が定義した [Content-Type (コンテンツタイプ)] と一致するリクエストのみを許可することを確実にします。

  19. テンプレートウィンドウで、次のように入力します。

    { "myParam": "$input.params('myParam')" }

    これは、入力イベントオブジェクトの本文で Lambda 関数に渡される JSON ドキュメントです。右側は、入力クエリ文字列で検索する対象物を API Gateway に伝えます。左側は、Lambda 関数に今追加するパラメータにこれを格納します。

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

  21. [アクション] ドロップダウンメニューから [API のデプロイ] を選択します。

  22. [デプロイされるステージ] ドロップダウンメニューから [prod] を選択します。

  23. [デプロイ] を選択します。

次のように API をテストします。

  1. ターミナルウィンドウを開きます。

  2. 次の cURL コマンドをコピーしてターミナルウィンドウに貼り付け、b123abcde4 を API の API ID に、us-west-2 を API がデプロイされているリージョンに置き換えます。

    Linux or Macintosh
    curl -X GET 'https://b123abcde4.execute-api.us-west-2.amazonaws.com/prod'
    Windows
    curl -X GET "https://b123abcde4.execute-api.us-west-2.amazonaws.com/prod"

    これによって API が呼び出され、返される「Hello from Lambda!」が表示されます。これは、新しい Lambda 関数である my-function2 がルートリソース (/) にアタッチされていないためです。これは、作成した新しいリソースである my-resource にアタッチされます。したがって、呼び出した Lambda 関数は、前に作成した「Hello from Lambda!」関数である my-function です。

  3. cURL コマンドラインで、prod に続いて /my-resource?myParam=Hello%20from%20API%20Gateway! と入力します。完全なコマンドは、次のようになります。

    Linux or Macintosh
    curl -X GET 'https://b123abcde4.execute-api.us-west-2.amazonaws.com/prod/my-resource?myParam=Hello%20from%20API%20Gateway!'
    Windows
    curl -X GET "https://b123abcde4.execute-api.us-west-2.amazonaws.com/prod/my-resource?myParam=Hello%20from%20API%20Gateway!"

    これで返される正しいレスポンスが表示されるようになります ({"statusCode": 200, "body": "\"Hello from API Gateway!\""})。

次のステップ

以下のトピックの一部またはすべてに目を通して、Amazon API Gateway に精通してください。

詳細を確認するトピック 参照先
入力をバックエンドの Lambda 関数に渡す プロキシ統合のための Lambda 関数の入力形式
バックエンドの Lambda 関数からの出力を返す プロキシ統合のための Lambda 関数の出力形式
API にカスタムドメイン名を設置する REST API のカスタムドメイン名を設定する
Lambda オーソライザー関数を API に追加する API Gateway Lambda オーソライザーを使用する
Amazon Cognito ユーザープールオーソライザーを API に追加する Amazon Cognito ユーザープールをオーソライザーとして使用して REST API へのアクセスを制御する
API で CORS を有効にする REST API リソースの CORS を有効にする

コミュニティから Amazon API Gateway に関するヘルプを参照するには、API Gateway Discussion Forum を参照してください。(このフォーラムにアクセスするには AWS へのサインインが必要になることがあります。)

AWS から直接 API Gateway のサポートを得るには、AWS サポートページでサポートオプションを参照してください。

また、よくある質問 (FAQ) を参照したり、直接お問い合わせいただくこともできます。