Amazon API Gateway
開発者ガイド

チュートリアル: Lambda プロキシ統合による Hello World API の構築

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

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

  • API のバックエンドとなる「Hello, World!」Lambda 関数を作成する

  • 「Hello, World!」 API を Lambda プロキシ統合を使用して作成し、テストする

「Hello, World!」 Lambda 関数を作成する

この関数は、次の形式で JSON オブジェクトとして発信者に挨拶を返します。

{ "greeting": "Good {time}, {name} of {city}.[ Happy {day}!]" }

Lambda コンソールで「Hello, World!」Lambda 関数を作成する

  1. https://console.aws.amazon.com/lambda で Lambda コンソールにサインインします。

  2. AWS ナビゲーションバーで、[region (リージョン)] を選択します (米国東部 (バージニア北部) など)。

    注記

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

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

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

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

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

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

    2. [ランタイム] ドロップダウンリストから、[Node.js 8.10] を選択します。

    3. [Permissions (アクセス許可)] で、[実行ロールの選択または作成] を選択します。[Execution role (実行ロール)] ドロップダウンリストから、[Create new role from AWS policy templates (AWS ポリシーテンプレートから新しいロールを作成)] を選択します。

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

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

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

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

    'use strict'; console.log('Loading hello world function'); exports.handler = async (event) => { let name = "you"; let city = 'World'; let time = 'day'; let day = ''; let responseCode = 200; console.log("request: " + JSON.stringify(event)); if (event.queryStringParameters && event.queryStringParameters.name) { console.log("Received name: " + event.queryStringParameters.name); name = event.queryStringParameters.name; } if (event.queryStringParameters && event.queryStringParameters.city) { console.log("Received city: " + event.queryStringParameters.city); city = event.queryStringParameters.city; } if (event.headers && event.headers['day']) { console.log("Received day: " + event.headers.day); day = event.headers.day; } if (event.body) { let body = JSON.parse(event.body) if (body.time) time = body.time; } let greeting = `Good ${time}, ${name} of ${city}.`; if (day) greeting += ` Happy ${day}!`; let responseBody = { message: greeting, input: event }; // The output from a Lambda proxy integration must be // in the following JSON object. The 'headers' property // is for custom response headers in addition to standard // ones. The 'body' property must be a JSON string. For // base64-encoded payload, you must also set the 'isBase64Encoded' // property to 'true'. let response = { statusCode: responseCode, headers: { "x-custom-header" : "my custom header value" }, body: JSON.stringify(responseBody) }; console.log("response: " + JSON.stringify(response)) return response; };
  8. [Save] を選択します。

「Hello, World!」 API を作成する

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

「Hello, World!」API を API

  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

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

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

  3. 以下の手順で空の API を作成します。

    1. [Choose the protocol (プロトコルの選択)] で、[REST] を選択します。

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

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

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

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

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

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

  4. helloworld リソースを以下のように作成します。

    1. [Resources (リソース)] ツリーのルートリソース (/) を選択します。

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

    3. [Configure as proxy resource (プロキシリソースとして設定)] チェックボックスはオフのままにします。

    4. [Resource Name (リソース名)] に helloworld と入力します。

    5. [Resource Path (リソースパス)] を [/helloworld] に設定したままにします。

    6. [Enable API Gateway CORS (API Gateway CORS を有効にする)] チェックボックスはオフのままにします。

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

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

    ANY メソッドを設定するには、次の操作を行います。

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

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

    3. ドロップダウンメニューから [ANY] を選択し、チェックマークアイコンを選択します。

    4. [Integration type (統合タイプ)] を [Lambda Function (Lambda 関数)] に設定したままにします。

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

    6. [Lambda Region (Lambda リージョン)] ドロップダウンメニューから、 GetStartedLambdaProxyIntegration Lambda 関数を作成したリージョンを選択します。

    7. [Lambda Function (Lambda 関数)] フィールドに任意の文字を入力し、ドロップダウンメニューから [GetStartedLambdaProxyIntegration] を選択します。

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

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

    10. [Add Permission to Lambda Function (Lambda 関数に権限を追加する)] のプロンプトが表示されたら、[OK] を選択します。

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

API Gateway コンソールに API をデプロイする

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

  2. [デプロイされるステージ] で、[新しいステージ] を選択します。

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

  4. 必要に応じて、[Stage description (ステージの説明)] に入力してください。

  5. 必要に応じて、[Deployment description (デプロイの説明)] に入力してください。

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

  7. API の [Invoke URL (URL の呼び出し)] をメモしておきます。

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

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

クエリ文字列パラメータのみを使用して GET リクエストをテストするには、API の helloworld リソースの URL をブラウザのアドレスバーに入力します。以下に例を示します。https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle

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

cURL を使用してデプロイされた API をテストするには

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

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

    curl -v -X POST \ 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle' \ -H 'content-type: application/json' \ -H 'day: Thursday' \ -d '{ "time": "evening" }'

    注記

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

    curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle" -H "content-type: application/json" -H "day: Thursday" -d "{ \"time\": \"evening\" }"

以下のようなペイロードで正常なレスポンスを受け取ります。

{ "message":"Good evening, John of Seattle. Happy Thursday!", "input":{ "resource":"/helloworld", "path":"/helloworld", "httpMethod":"POST", "headers":{"Accept":"*/*", "content-type":"application/json", "day":"Thursday", "Host":"r275xc9bmd.execute-api.us-east-1.amazonaws.com", "User-Agent":"curl/7.64.0", "X-Amzn-Trace-Id":"Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6", "X-Forwarded-For":"72.21.198.64", "X-Forwarded-Port":"443", "X-Forwarded-Proto":"https"}, "multiValueHeaders":{"Accept":["*/*"], "content-type":["application/json"], "day":["Thursday"], "Host":["r275xc9bmd.execute-api.us-east-1.amazonaws.com"], "User-Agent":["curl/0.0.0"], "X-Amzn-Trace-Id":["Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6"], "X-Forwarded-For":["11.22.333.44"], "X-Forwarded-Port":["443"], "X-Forwarded-Proto":["https"]}, "queryStringParameters":{"city":"Seattle", "name":"John" }, "multiValueQueryStringParameters":{ "city":["Seattle"], "name":["John"] }, "pathParameters":null, "stageVariables":null, "requestContext":{ "resourceId":"3htbry", "resourcePath":"/helloworld", "htt* Connection #0 to host r275xc9bmd.execute-api.us-east-1.amazonaws.com left intact pMethod":"POST", "extendedRequestId":"a1b2c3d4e5f6g7h=", "requestTime":"20/Mar/2019:20:38:30 +0000", "path":"/test/helloworld", "accountId":"123456789012", "protocol":"HTTP/1.1", "stage":"test", "domainPrefix":"r275xc9bmd", "requestTimeEpoch":1553114310423, "requestId":"test-invoke-request", "identity":{"cognitoIdentityPoolId":null, "accountId":null, "cognitoIdentityId":null, "caller":null, "sourceIp":"test-invoke-source-ip", "accessKey":null, "cognitoAuthenticationType":null, "cognitoAuthenticationProvider":null, "userArn":null, "userAgent":"curl/0.0.0","user":null }, "domainName":"r275xc9bmd.execute-api.us-east-1.amazonaws.com", "apiId":"r275xc9bmd" }, "body":"{ \"time\": \"evening\" }", "isBase64Encoded":false } }

前述のメソッドリクエストで POST から PUT に変更した場合も同じレスポンスを受け取ります。

GET メソッドをテストするには、次の cURL コマンドをコピーしてターミナルウィンドウに貼り付け、r275xc9bmd を API の API ID に、us-east-1 を API がデプロイされているリージョンに置き換えます。

curl -X GET \ 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?Seattle?name=John' \ -H 'content-type: application/json' \ -H 'day: Thursday'

GET リクエストにペイロードが含まれていないことを除けば、前の POST リクエストの結果と同様のレスポンスが得られます。したがって、body パラメータは null になります。