Amazon API Gateway
開発者ガイド

Amazon API Gateway で Lambda 統合を使用して、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 Developer Guide』の「Lambda 関数を作成するには」の手順を完了してください。

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

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

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

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

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

    
                        API Gateway の開始方法
  3. [Choose the protocol (プロトコルの選択)] で、[REST] を選択します。

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

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

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

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

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

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

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

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

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

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

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

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

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

  13. [Add Permission to Lambda Function (Lambda 関数にアクセス許可追加)] がポップアップ表示されたら ([You are about to give API Gateway permission to invoke your Lambda function… (API Gateway に Lambda 関数を呼び出す権限を付与します)] の表示)、[OK] を選択して API Gateway にこのアクセス許可を付与します。

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


                API Gateway Method Execution ペイン

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

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

  • Method Request (メソッドリクエスト): このボックスは、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. [Actions (アクション)] ドロップダウンメニューから、[Deploy API (デプロイ API)] を選択します。

  2. [Deployment Stage (デプロイステージ)] ドロップダウンメニューから [New Stage (新しいステージ)] を選択します。

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

  4. Deploy を選択します。

  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 MacintoshWindows
    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. [Services (サービス)] メニュから [Lambda] を選択して、Lambda コンソールに移動します。

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

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

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

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

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

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

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

    Node.js 8.10Python 3.7
    Node.js 8.10
    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. [Save] を選択します。

ステップ 5: API Gateway コンソールでリソース、メソッド、パラメータを REST API に追加します。

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

  1. [Services (サービス)] メニューから 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 Function] ボックスで、任意の文字を入力したら、ドロップダウンメニューから [my-function2] を選択します。(ドロップダウンメニューが表示されない場合は、入力した文字を削除してドロップダウンメニューが表示されるようにします)。 [Save (保存)] を選んで選択を保存します。

  12. [Add Permission to Lambda Function (Lambda 関数にアクセス許可追加)] がポップアップ表示されたら ([You are about to give API Gateway permission to invoke your Lambda function… (API Gateway に Lambda 関数を呼び出す権限を付与します)] の表示)、OK を選択して にこのアクセス許可を付与します。

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

    [Integration Request] を選択します。

    
                        API Gateway Method Execution ペイン
  14. [Mapping Templates (マッピングテンプレート)] を展開します。

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

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

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

  18. [Change passthrough behavior (パススルー動作の変更)] がポップアップ表示されたら、[Yes, secure this integration] を選択します。これにより、統合が定義した [Content-Type (コンテンツタイプ)] と一致するリクエストのみを許可することを確実にします。

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

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

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

  20. Save を選択します。

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

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

  23. Deploy を選択します。

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

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

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

    Linux or MacintoshWindows
    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 MacintoshWindows
    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 にカスタムドメイン名を設置する API Gateway の API カスタムドメイン名を設定する
Lambda オーソライザー関数を API に追加する API Gateway Lambda オーソライザーの使用
Amazon Cognito ユーザープールオーソライザーを API に追加する Amazon Cognito ユーザープール をオーソライザーとして使用して REST API へのアクセスを制御する
API で CORS を有効にする API Gateway REST API リソースの CORS を有効にする

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

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

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