チュートリアル: Lambda プロキシ統合を使用した Hello World REST API の構築 - Amazon API Gateway

チュートリアル: Lambda プロキシ統合を使用した Hello World REST API の構築

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

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

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

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

「Hello, World!」 Lambda 関数

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

{ "greeting": "Good {time}, {name} of {city}.[ Happy {day}!]" }
「Hello, World!」 Lambda コンソールで Lambda 関数を作成します。
  1. Lambda コンソール (https://console.aws.amazon.com/lambda/) にサインインします。

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

    注記

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

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

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

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

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

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

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

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

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

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

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

    'use strict'; console.log('Loading hello world function'); export const 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. [デプロイ] を選択します。

「Hello, World!」 API

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

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

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

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

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

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

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

      • [API 名] に「LambdaSimpleProxy」と入力します。

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

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

    3. [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. [保存] を選択します。

    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

それ以外のメソッドの場合は、POSTMANcURL などの高度な 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", "httpMethod":"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?name=John&city=Seattle' \ -H 'content-type: application/json' \ -H 'day: Thursday'

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