チュートリアル: Lambda プロキシ統合を使用して REST API を作成する - Amazon API Gateway

チュートリアル: Lambda プロキシ統合を使用して REST API を作成する

Lambda プロキシ統合は、軽量で柔軟な API Gateway API 統合タイプであり、これを使用すると、API メソッドまたは API 全体を Lambda 関数と統合できます。Lambda 関数は、Lambda がサポートする任意の言語で記述できます。これはプロキシ統合であるため、API を再デプロイする必要がなく、いつでも Lambda 関数の実装を変更できます。

このチュートリアルでは、以下の作業を行います。

  • 「Hello, World!」 Lambda 関数を API のバックエンドにします。

  • 「Hello, World!」 Lambda プロキシ統合による API。

「Hello, World!」 Lambda 関数

「Hello, World!」を作成するには Lambda コンソールで Lambda 関数を作成します。
  1. Lambda コンソール (https://console.aws.amazon.com/lambda/) にサインインします。

  2. AWS ナビゲーションバーで、AWS リージョンを選択します。

    注記

    Lambda 関数を作成したリージョンを書き留めます。これは、API を作成するときに必要になります。

  3. ナビゲーションペインで、[関数] を選択します。

  4. [関数の作成] を選択します。

  5. Author from scratch を選択します。

  6. [基本的な情報] で、以下の作業を行います。

    1. [関数名] に GetStartedLambdaProxyIntegration と入力します。

    2. [ランタイム] で、サポートされている最新の Node.js または Python ランタイムのいずれかを選択します。

    3. [アーキテクチャ] は、デフォルト設定のままにします。

    4. [Permissions] (許可) で、[Change default execution role] (デフォルトの実行ロールの変更) を展開します。[実行ロール]] ドロップダウンリストで、[AWS ポリシーテンプレートから新しいロールを作成] を選択します。

    5. [ロール名] に GetStartedLambdaBasicExecutionRole と入力します。

    6. [Policy templates] フィールドは空白のままにします。

    7. [関数の作成] を選択します。

  7. インラインコードエディタの [Function code (関数コード)] に、以下のコードをコピーして貼り付けます。

    Node.js
    export const handler = function(event, context, callback) { console.log('Received event:', JSON.stringify(event, null, 2)); var res ={ "statusCode": 200, "headers": { "Content-Type": "*/*" } }; var greeter = 'World'; if (event.greeter && event.greeter!=="") { greeter = event.greeter; } else if (event.body && event.body !== "") { var body = JSON.parse(event.body); if (body.greeter && body.greeter !== "") { greeter = body.greeter; } } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") { greeter = event.queryStringParameters.greeter; } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") { greeter = event.multiValueHeaders.greeter.join(" and "); } else if (event.headers && event.headers.greeter && event.headers.greeter != "") { greeter = event.headers.greeter; } res.body = "Hello, " + greeter + "!"; callback(null, res); };
    Python
    import json def lambda_handler(event, context): print(event) greeter = 'World' try: if (event['queryStringParameters']) and (event['queryStringParameters']['greeter']) and ( event['queryStringParameters']['greeter'] is not None): greeter = event['queryStringParameters']['greeter'] except KeyError: print('No greeter') try: if (event['multiValueHeaders']) and (event['multiValueHeaders']['greeter']) and ( event['multiValueHeaders']['greeter'] is not None): greeter = " and ".join(event['multiValueHeaders']['greeter']) except KeyError: print('No greeter') try: if (event['headers']) and (event['headers']['greeter']) and ( event['headers']['greeter'] is not None): greeter = event['headers']['greeter'] except KeyError: print('No greeter') if (event['body']) and (event['body'] is not None): body = json.loads(event['body']) try: if (body['greeter']) and (body['greeter'] is not None): greeter = body['greeter'] except KeyError: print('No greeter') res = { "statusCode": 200, "headers": { "Content-Type": "*/*" }, "body": "Hello, " + greeter + "!" } return res
  8. [デプロイ] を選択します。

「Hello, World!」 API

ここで、「Hello, World!」に API を作成します。API Gateway コンソールを使用して Lambda 関数を実行します。

「Hello, World!」を作成するには API
  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

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

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

  3. [API 名] に「LambdaProxyAPI」と入力します。

  4. (オプション) [説明] に説明を入力します。

  5. [API エンドポイントタイプ][リージョン別] に設定したままにします。

  6. API の作成 を選択します。

API を作成したら、リソースを作成します。通常、API リソースはアプリケーションロジックに従ってリソースツリーに整理されます。この例では、/helloworld リソースを作成します。

リソースを作成するには
  1. [リソースの作成] を選択します。

  2. [プロキシのリソース] はオフのままにします。

  3. [リソースパス]/ のままにします。

  4. [リソース名] に「helloworld」と入力します。

  5. [CORS (Cross Origin Resource Sharing)] はオフのままにします。

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

プロキシ統合では、任意の HTTP メソッドを表すすべての ANY メソッドをキャッチオールがらリクエスト全体がそのままバックエンド Lambda 関数に送信されます。実際の HTTP メソッドは、実行時にクライアントによって指定されます。ANY メソッドでは、単一の API メソッドのセットアップを DELETEGETHEADOPTIONSPATCHPOST および PUT のサポートされるすべての HTTP メソッドに使用できます。

ANY メソッドを作成するには
  1. /helloworld リソースを選択し、[メソッドを作成] を選択します。

  2. [メソッドタイプ] で、[ANY] を選択します。

  3. [統合タイプ] で、[Lambda 関数] を選択します。

  4. [Lambda プロキシ統合]を有効にします。

  5. [Lambda 関数] で、Lambda 関数を作成した AWS リージョンを選択し、関数名を入力します。

  6. 29 秒のデフォルトのタイムアウト値を使用するには、[デフォルトタイムアウト] をオンのままにします。カスタムのタイムアウトを設定するには、[デフォルトタイムアウト] を選択してから、タイムアウト値を 5029000 ミリ秒の間で入力します。

  7. [メソッドの作成] を選択します。

API をデプロイしてテストする

API をデプロイするには
  1. [API のデプロイ] を選択します。

  2. [ステージ][新規ステージ] を選択します。

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

  4. (オプション) [説明] に説明を入力します。

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

  6. [ステージの詳細] で、コピーアイコンを選択して API の呼び出し URL をコピーします。

ブラウザと cURL を使用して Lambda プロキシ統合で API をテストする

API をテストするためにブラウザまたは cURL を使用できます。

クエリ文字列パラメータのみを使用して GET リクエストをテストする場合は、API の helloworld リソースの URL をブラウザのアドレスバーに入力できます。

API の helloworld リソースの URL を作成するには、リソース helloworld とクエリ文字列パラメータ ?greeter=John を呼び出し URL に追加します。URL は次のようになります。

https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John

それ以外のメソッドの場合は、POSTMANcURL などの高度な REST API テストユーティリティを使用する必要があります。このチュートリアルでは cURL を使用します。以下の cURL コマンドの例は、cURL がコンピュータにインストールされていることを前提としています。

cURL を使用してデプロイした API をテストするには
  1. ターミナルウィンドウを開きます。

  2. 次の cURL コマンドをコピーしてターミナルウィンドウに貼り付け、呼び出し URL を前のステップでコピーした URL に置き換えて、URL の末尾に /helloworld を追加します。

    注記

    Windows でコマンドを実行している場合は、代わりに次の構文を使用してください。

    curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld" -H "content-type: application/json" -d "{ \"greeter\": \"John\" }"
    1. ?greeter=John のクエリ文字列パラメータを使用して API を呼び出すには

      curl -X GET 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John'
    2. greeter:John のヘッダーパラメータを使用して API を呼び出すには

      curl -X GET https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \ -H 'content-type: application/json' \ -H 'greeter: John'
    3. {"greeter":"John"} の本文を使用して API を呼び出すには

      curl -X POST https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \ -H 'content-type: application/json' \ -d '{ "greeter": "John" }'

    すべてのケースで、出力は、次のレスポンス本文を持つ 200 レスポンスです。

    Hello, John!