メニュー
Amazon API Gateway
開発者ガイド

API およびプロキシリソースを通じた Lambda プロキシ統合を作成する

前提条件として、プロキシリソース との Lambda プロキシ統合を通じた API のバックエンドとして Lambda 関数を作成します。AWS Lambda コンソールを使用して LambdaForSimpleProxy という名前の次のような Node.js 関数を作成する方法を示します。

次に API Gateway コンソールを使用して、プロキシリソースを通じて LambdaForSimpleProxy 関数を使用することで、API および Lambda プロキシ統合を作成します。最後に、API をテストする方法を示します。

プロキシ統合用の Node.js の Lambda 関数

次に示す Node.js の Lambda 関数は、"Hello World!" アプリケーションです。この関数は、クライアントによる API Gateway プロキシリソースへのリクエストを含む入力 event パラメーターを解析する方法を示しています。このリソースは、Lambda プロキシ統合を使用して関数と統合されます。また、この関数は、Lambda 関数の出力を API Gateway 用の形式に設定し、結果を HTTP レスポンスとして返す方法も示しています。このタイプの Lambda 関数で従う必要がある入力形式と出力形式の詳細については、「プロキシ統合のための Lambda 関数の入力形式 」および「プロキシ統合のための Lambda 関数の出力形式」を参照してください。

Copy
'use strict'; console.log('Loading hello world function'); exports.handler = function(event, context, callback) { var name = "World"; var responseCode = 200; console.log("request: " + JSON.stringify(event)); if (event.queryStringParameters !== null && event.queryStringParameters !== undefined) { if (event.queryStringParameters.name !== undefined && event.queryStringParameters.name !== null && event.queryStringParameters.name !== "") { console.log("Received name: " + event.queryStringParameters.name); name = event.queryStringParameters.name; } if (event.queryStringParameters.httpStatus !== undefined && event.queryStringParameters.httpStatus !== null && event.queryStringParameters.httpStatus !== "") { console.log("Received http status: " + event.queryStringParameters.httpStatus); responseCode = event.queryStringParameters.httpStatus; } } var responseBody = { message: "Hello " + name + "!", input: event }; var response = { statusCode: responseCode, headers: { "x-custom-header" : "my custom header value" }, body: JSON.stringify(responseBody) }; console.log("response: " + JSON.stringify(response)) callback(null, response); };

API Gateway の プロキシリソース で使用すると、event の入力パラメーターには API Gateway によって JSON オブジェクトとしてマーシャリングされた API リクエストが含まれます。この入力には、リクエストの HTTP メソッド (httpMethod)、パス (pathpathParameters)、クエリパラメーター (queryStringParameters)、ヘッダー (headers)、適切なペイロード (body)、コンテキスト (requestContext)、およびステージ変数 (stageVariables) を含めることができます。

この例の Lambda 関数では、event パラメーターを解析して namehttpStatus のクエリ文字列パラメーターを取得します。

その後、responseBody オブジェクトの message プロパティで、指定されたユーザーに挨拶を返します。また、API Gateway によってマーシャリングされた受信リクエストの詳細を表示するために、受信した event オブジェクトをレスポンス本文の input プロパティとして返します。

最後に、終了時に必要な statusCode、適切な headersbody を含む JSON オブジェクトを返します。このオブジェクトが HTTP レスポンスとして API Gateway からクライアントに返されます。

プロキシ統合用の C# の Lambda 関数

C# で Lambda 関数を作成する」の説明に従って C# Lambda 関数ハンドラを作成します。また、以下の Java Lambda 関数で示したプログラミングフローを拡張します。

プロキシ統合用の Java の Lambda 関数

次に示す Java の Lambda 関数は "Hello World!" アプリケーションであり、Node.js の 同等のものと似ています。この関数では、クライアントから API Gateway プロキシリソースへのリクエストを含み、InputStream オブジェクトとして渡される入力イベントを解析する方法を示します。このリソースは、Lambda プロキシ統合を使用して関数と統合されます。また、context オブジェクトを解析して LambdaLogger を取得する方法も示します。さらに、Java で API Gateway の Lambda 関数の出力をフォーマットして、その結果を HTTP レスポンスとして OutputStream オブジェクトで返す方法も示します。Lambda プロキシ統合の入力形式と出力形式の詳細については、「プロキシ統合のための Lambda 関数の入力形式 」と「プロキシ統合のための Lambda 関数の出力形式」を参照してください。

Copy
package examples; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.BufferedReader; import java.io.Writer; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import org.json.simple.JSONObject; import org.json.simple.JSONArray; import org.json.simple.parser.ParseException; import org.json.simple.parser.JSONParser; public class ProxyWithStream implements RequestStreamHandler { JSONParser parser = new JSONParser(); public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { LambdaLogger logger = context.getLogger(); logger.log("Loading Java Lambda handler of ProxyWithStream"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); JSONObject responseJson = new JSONObject(); String name = "World"; String responseCode = "200"; try { JSONObject event = (JSONObject)parser.parse(reader); if (event.get("queryStringParameters") != null) { JSONObject qps = (JSONObject)event.get("queryStringParameters"); if ( qps.get("name") != null) { name = (String)qps.get("name"); } if (qps.get("httpStatus") != null) { responseCode = qps.get("httpStatus").toString(); } } JSONObject responseBody = new JSONObject(); responseBody.put("input", event.toJSONString()); responseBody.put("message", "Hello " + name + "!"); JSONObject headerJson = new JSONObject(); headerJson.put("x-custom-response-header", "my custom response header value"); responseJson.put("statusCode", responseCode); responseJson.put("headers", headerJson); responseJson.put("body", responseBody.toString()); } catch(ParseException pex) { responseJson.put("statusCode", "400"); responseJson.put("exception", pex); } logger.log(responseJson.toJSONString()); OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); writer.write(responseJson.toJSONString()); writer.close(); } }

API Gateway の プロキシリソース で使用すると、入力ストリームには API Gateway によって JSON 文字列としてシリアル化された API リクエストが含まれます。入力データには、リクエストの HTTP メソッド (httpMethod)、パス (pathpathParameters)、クエリパラメーター (queryStringParameters)、ヘッダー (headers)、適切なペイロード (body)、コンテキスト (requestContext)、およびステージ変数 (stageVariables) を含めることができます。

この例の Lambda 関数では、inputStream パラメーターを解析して namehttpStatus のクエリ文字列パラメーターを取得します。ログ記録として、受信した context から LambdaLogger オブジェクトを取得します。

その後、responseBody オブジェクトの message プロパティで、指定されたユーザーに挨拶を返します。また、API Gateway によってマーシャリングされた受信リクエストの詳細を表示するために、レスポンス本文で入力データ (event) を返します。

最後に、終了時に必要な statusCode、適切な headersbody を含む JSON 文字列を返します。この文字列が HTTP レスポンスとして API Gateway からクライアントに返されます。

この関数を Lambda コンソールで作成するには、事前にデプロイパッケージを作成して Lambda にアップロードする必要があります。デプロイパッケージを作成するには、以下の手順に従います。

Lambda プロキシ統合のためのバックエンドの作成

ここで Lambda コンソールを使用して API Gateway で Lambda 関数を作成してみます。

Lambda コンソールで API 用の Lambda 関数とプロキシリソースを作成する

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

  2. コンソールの右上で、Lambda 関数で使用可能なリージョンを選択します。

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

  4. 以下のいずれかの手順を選択して Node.js または Java で Lambda 関数を作成します。この手順は、他の言語やプラットフォームにも適応可能です。

    1. Node.js Lambda 関数を作成するには、[Create a Lambda function] または [Get Started Now] を選択してリージョンで最初の Lambda 関数を作成し、以下の作業を行います。

      1. [Select blueprint] ページで、[Skip] を選択します。

      2. [Configure triggers] ページで、[Next] を選択します。

      3. [: Configure function] ページで、以下の作業を行います。

        - [Name] 入力フィールドに関数名を入力します。

        - [Description] 入力フィールドに関数の短い説明を入力します。

        - [Runtime] ドロップダウンリストから、[Node.js 4.3] を選択します。

      4. [Lambda function code] で次の操作を行います。

        - [Code entry type] ドロップダウンリストから [Edit code inline] を選択します。

        - インラインコードエディターに Node.js コードを入力またはコピーします。

      5. [Lambda function handler and role] で次の操作を行います。

        - [Handler] の [index.handler] はそのままにします。

        - 関数の実行のために既存の IAM ロールを選択するか、新しい IAM ロールを作成します。

      6. [Advanced settings] はデフォルト値のままにします。

      7. [Next] を選択します。

      8. [Review] ペインで、[Create function] を選択します。

      このチュートリアルでは、関数名として LambdaForSimpleProxy を使用し、標準ポリシーテンプレートである [Simple Microservice permissions] を選択して、必要な Lambda 実行ロールを作成します。

    2. Java Lambda 関数を作成するには、[Create a Lambda function] または [Get Started Now] を選択してリージョンで最初の Lambda 関数を作成し、以下の作業を行います。

      1. [Select blueprint] ページで、[Skip] を選択します。

      2. [Configure triggers] ページで、[Next] を選択します。

      3. [: Configure function] ページで、以下の作業を行います。

        - [Name] 入力フィールドに関数名を入力します。

        - [Description] 入力フィールドに関数の短い説明を入力します。

        - [Runtime] ドロップダウンリストから、[Java 8] を選択します。

      4. [Lambda function code] で次の操作を行います。

        - ローカルドライブまたは Amazon S3 からデプロイパッケージをアップロードするには、[Code entry type] を選択します。

        - [Function package] の横にある [Upload] を選択します。

        - デプロイパッケージの場所に移動し、パッケージを選択します。

      5. [Lambda function handler and role] で次の操作を行います。

        - [Handler] に package_name.function_name::method_name 形式の関数ハンドラーを入力します。

        - 関数の実行のために既存の IAM ロールを選択するか、新しい IAM ロールを作成します。

      6. [Advanced settings] はデフォルト値のままにします。

      7. [Next] を選択します。

      8. [Review] ペインで、[Create function] を選択します。

      このチュートリアルでは、Java パッケージ名として examples、Java クラス名として ProxyWithStreams、Java 関数名として handleRequest、Lambda 関数ハンドラー名として examples.ProxyWithStreams::handleRequest を使用します。標準ポリシーテンプレートである [Simple Microservice permissions] を選択して、必要な Lambda 実行ロールを作成します。

注記

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

API と Lambda プロキシ統合を作成する

次に、API Gateway コンソールを使用して、Lambda 関数用の API とプロキシリソースを作成します。

Lambda 関数用の API とプロキシリソースを作成する

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

  2. API を作成するには、[Create new API] (最初の API を作成する場合)または [Create API] (以降の API を作成する場合)を選択します。次に、以下の手順を実行します。

    1. [New API] を選択します。

    2. [API Name] に名前を入力します。

    3. 必要に応じて、[Description] に短い説明を 入力します。

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

    このチュートリアルでは、API 名として LambdaSimpleProxy を使用します。

  3. 子リソースを作成するには、[Resources] ツリーで親リソース項目を選択し、[Actions] ドロップダウンメニューから [Create Resource] を選択します。次に、[New Child Resource] ペインで次の操作を行います。

    1. プロキシリソースを作成するには、[Configure as proxy resource] オプションを選択します。それ以外の場合は、選択しないままにします。

    2. [Resource Name*] テキスト入力フィールドに名前を入力します。

    3. [Resource Path*] テキスト入力フィールドで、新しい名前を入力するか、デフォルト名を使用します。

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

    5. 必要に応じて、[Enable API Gateway CORS] を選択します。

    このチュートリアルでは、ルートリソース (/) を親リソースとして使用します。[Configure as proxy resource] を選択します。[Resource Name] は、デフォルトの proxy を使用します。[Resource Path] には /{proxy+} を使用します。[Enable API Gateway CORS] の選択を解除します。

  4. Lambda バックエンドとの統合用に ANY メソッドを設定するには、次の操作を行います。

    1. [Integration type] として [Lambda Function Proxy] を選択します。

    2. [Lambda Region] からリージョンを選択します。

    3. [Lambda Function] に Lambda 関数の名前を入力します。

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

    5. [Add Permission to Lambda Function] のプロンプトが表示されたら、[OK] を選択します。

    このチュートリアルでは、以前に作成した LambdaForSimpleProxy を [Lambda Function] で使用します。

Lambda で先ほど作成した プロキシリソース API として、API Gateway はクライアントからの生のリクエストを処理するために Lambda 関数のバックエンドに転送します。リクエストには、リクエストメソッド、パス、クエリ文字列とヘッダーパラメーター、ペイロード、コンテキスト変数、ステージ変数が含まれています。次の手順では、これをテストする方法を説明します。

API と Lambda プロキシ統合をテストする

次の手順では、プロキシ統合をテストする方法について説明します。

プロキシリソース を通じて LambdaForSimpleProxy Lambda 関数を呼び出します。

  1. ブラウザを使用して API の特定のリソースに対して GET メソッドを呼び出すには、次の操作を行います。

    1. 作成した API に対して、[Actions] ドロップダウンメニューから [Deploy API] を選択します (まだ選択していない場合)。API を特定のステージにデプロイするための手順に従います。最後に [Stage Editor] ページに [Invoke URL] が表示されることを確認します。これは API のベース URL です。

    2. 特定のリソースに対する GET リクエストを送信するには、前のステップで取得した [Invoke URL] の値に対して該当するクエリ文字列式を含むリソースパスを追加し、その URL 全体をブラウザのアドレスバーにコピーして Enter を選択します。

    このチュートリアルでは、API を test ステージにデプロイし、hello?name=me を API のベース URL に追加して、https://wt6mne2s9k.execute-api.us-west-2.amazonaws.com/test/hello?name=me の URL を生成します。

    成功のレスポンスにより、バックエンド Lambda 関数から以下の出力と似た結果が返されます。input プロパティは API Gateway からの名前のリクエストをキャプチャします。レスポンスには httpMethodpathheaderspathParametersqueryStringParametersrequestContextstageVariables が含まれています。

    Copy
    { "message": "Hello me!", "input": { "path": "/test/hello", "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Encoding": "gzip, deflate, lzma, sdch, br", "Accept-Language": "en-US,en;q=0.8", "CloudFront-Forwarded-Proto": "https", "CloudFront-Is-Desktop-Viewer": "true", "CloudFront-Is-Mobile-Viewer": "false", "CloudFront-Is-SmartTV-Viewer": "false", "CloudFront-Is-Tablet-Viewer": "false", "CloudFront-Viewer-Country": "US", "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48", "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)", "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==", "X-Forwarded-For": "192.168.100.1, 192.168.1.1", "X-Forwarded-Port": "443", "X-Forwarded-Proto": "https" }, "pathParameters": {"proxy": "hello"}, "requestContext": { "accountId": "123456789012", "resourceId": "us4z18", "stage": "test", "requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9", "identity": { "cognitoIdentityPoolId": "", "accountId": "", "cognitoIdentityId": "", "caller": "", "apiKey": "", "sourceIp": "192.168.100.1", "cognitoAuthenticationType": "", "cognitoAuthenticationProvider": "", "userArn": "", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48", "user": "" }, "resourcePath": "/{proxy+}", "httpMethod": "GET", "apiId": "wt6mne2s9k" }, "resource": "/{proxy+}", "httpMethod": "GET", "queryStringParameters": {"name": "me"}, "stageVariables": {"stageVarName": "stageVarValue"} } }

    注記

    requestContext はキーと値のペアのマップであり、$context 変数に対応します。その結果は API に依存します。API Gateway はマップに新しいキーを追加する場合があります。詳細については、「プロキシ統合のための Lambda 関数の入力形式 」を参照してください。

    /hello/world?name=me の別のプロキシリソースパスを使用して Lambda 関数を呼び出すことができます。成功のレスポンスの JSON ペイロードの input.path プロパティ値は、test/hello/world になります。

    代わりに POSTANY として使用した場合、レスポンスペイロードの input プロパティには body JSON プロパティが含まれます。POST リクエストをテストするには、API Gateway コンソールの TestInvoke 機能、Curl コマンド、Postman、または AWS SDK を使用できます。

  2. API Gateway コンソールで API の呼び出しをテストするには、次の操作を行います。

    1. [Resources] ツリーで プロキシリソース の [ANY] を選択します。

    2. [Method Execution] ペインの [Test] を選択します。

    3. [Method] ドロップダウンリストから、バックエンドでサポートされる HTTP 動詞を選択します。

    4. [Path] で、選択したオペレーションをサポートする特定の プロキシリソース パスを入力します。

    5. 必要に応じて、[Query Strings] で、選択したオペレーションの該当するクエリ式を入力します。

    6. 必要に応じて、[Headers] で、選択したオペレーションの該当するヘッダー式を 1 つ以上入力します。

    7. 設定する場合、[Stage Variables] で、選択したオペレーションの必須のステージ変数値を設定します。

    8. プロンプトが表示された場合は、必要に応じて [Client Certificate] で、バックエンドで認証するオペレーションに対して API Gateway で生成されたクライアント証明書を選択します。

    9. プロンプトが表示された場合は、[Request Body] で、テキストエディターの適切なリクエスト本文を入力します。

    10. [Test] を選択してメソッドの呼び出しをテストします。

    このチュートリアルでは、GET を HTTP メソッドとして、hello{proxy} のプロキシリソースパスとして、name=me をクエリ式として使用します。

    成功のレスポンスは、前の手順に示したペイロードに似た JSON ペイロードを返します。