📝

API Gateway の Lambda 非プロキシ統合で Lambda プロキシ統合と同じ requestContext を作成してみた

に公開

API Gateway での REST API の Lambda 統合 - Amazon API Gateway

Lambda 非プロキシ統合では、プロキシ統合のセットアップステップに加えて、受信リクエストデータがどのように統合リクエストにマッピングされるか、統合レスポンスデータの結果がメソッドレスポンスにどのようにマッピングされるかを指定します。

Lambda 非プロキシ統合でマッピングテンプレートを使用して実装してみました。

Lambda の実装

Lambda 非プロキシ統合と Lambda プロキシ統合で同じ Lambda をバックエンドに指定します。
Lambda 関数のコードは以下の通り event を出力するだけです。

export const handler = async (event) => {

  console.log(JSON.stringify(event, null, 2))
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};

Lambda プロキシ統合の場合

API Gateway での Lambda プロキシ統合 - Amazon API Gateway
Lambda で出力した event に含まれる requestContext は以下の通りでした

{
  "requestContext": {
    "resourceId": "yybzmdnd85",
    "resourcePath": "/",
    "httpMethod": "GET",
    "extendedRequestId": "IVoETGuhtjMEe5w=",
    "requestTime": "01/Apr/2025:10:04:11 +0000",
    "path": "/dev",
    "accountId": "012345678901",
    "protocol": "HTTP/1.1",
    "stage": "dev",
    "domainPrefix": "gk4inipgkl",
    "requestTimeEpoch": 012345678901,
    "requestId": "9c4386d9-9fa1-4297-aafd-ead5f6d6f96e",
    "identity": {
      "cognitoIdentityPoolId": null,
      "accountId": null,
      "cognitoIdentityId": null,
      "caller": null,
      "sourceIp": "xxx",
      "principalOrgId": null,
      "accessKey": null,
      "cognitoAuthenticationType": null,
      "cognitoAuthenticationProvider": null,
      "userArn": null,
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
      "user": null
    },
    "domainName": "gk4inipgkl.execute-api.ap-northeast-1.amazonaws.com",
    "deploymentId": "4bp7v0",
    "apiId": "gk4inipgkl"
  }
}

Lambda 非プロキシ統合での実装

REST API を作成後、統合タイプ Lambda のメソッドを作成しました。
バックエンドは上記手順で作成済みの Lambda 関数です。

統合リクエストの編集から以下を設定しました。

  • コンテンツタイプ: application/json
  • テンプレート本文: 以下の通り
{
  "requestContext": {
    "resourceId": "$context.resourceId",
    "resourcePath": "$context.resourcePath",
    "httpMethod": "$context.httpMethod",
    "extendedRequestId": "$context.extendedRequestId",
    "requestTime": "$context.requestTime",
    "path": "$context.path",
    "accountId": "$context.accountId",
    "protocol": "$context.protocol",
    "stage": "$context.stage",
    "domainPrefix": "$context.domainPrefix",
    "requestTimeEpoch": $context.requestTimeEpoch,
    "requestId": "$context.requestId",
    "identity": {
      "cognitoIdentityPoolId": #if($context.identity.cognitoIdentityPoolId) "$context.identity.cognitoIdentityPoolId" #else null #end,
      "accountId": #if($context.identity.accountId) "$context.identity.accountId" #else null #end,
      "cognitoIdentityId": #if($context.identity.cognitoIdentityId) "$context.identity.cognitoIdentityId" #else null #end,
      "caller": #if($context.identity.caller) "$context.identity.caller" #else null #end,
      "sourceIp": "$context.identity.sourceIp",
      "principalOrgId": #if($context.identity.principalOrgId) "$context.identity.principalOrgId" #else null #end,
      "accessKey": #if($context.identity.accessKey) "$context.identity.accessKey" #else null #end,
      "cognitoAuthenticationType": #if($context.identity.cognitoAuthenticationType) "$context.identity.cognitoAuthenticationType" #else null #end,
      "cognitoAuthenticationProvider": #if($context.identity.cognitoAuthenticationProvider) "$context.identity.cognitoAuthenticationProvider" #else null #end,
      "userArn": #if($context.identity.userArn) "$context.identity.userArn" #else null #end,
      "userAgent": "$context.identity.userAgent",
      "user": #if($context.identity.user) "$context.identity.user" #else null #end
    },
    "domainName": "$context.domainName",
    "deploymentId": "$context.deploymentId",
    "apiId": "$context.apiId"
  }
}

パラメータの多くはコンテキスト変数として用意されています。
API Gateway のデータ変換の変数 - Amazon API Gateway

上記マッピングテンプレートを保存後、API をデプロイします。
デプロイ後に API Gateway のデフォルト URL へアクセスし、Lambda の実行ログに以下のログが出力されれば成功です。

{
  "requestContext": {
    "resourceId": "vp1p8z7oic",
    "resourcePath": "/",
    "httpMethod": "GET",
    "extendedRequestId": "IVn9aGurNjMESKA=",
    "requestTime": "01/Apr/2025:10:03:27 +0000",
    "path": "/dev",
    "accountId": "012345678901",
    "protocol": "HTTP/1.1",
    "stage": "dev",
    "domainPrefix": "pn06ltxub0",
    "requestTimeEpoch": 1743501807063,
    "requestId": "b48a43f3-e57f-45b1-9327-4e50d085ef89",
    "identity": {
      "cognitoIdentityPoolId": "",
      "accountId": "",
      "cognitoIdentityId": "",
      "caller": "",
      "sourceIp": "xxx",
      "principalOrgId": "",
      "accessKey": "",
      "cognitoAuthenticationType": "",
      "cognitoAuthenticationProvider": "",
      "userArn": "",
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
      "user": ""
    },
    "domainName": "pn06ltxub0.execute-api.ap-northeast-1.amazonaws.com",
    "deploymentId": "1bi54b",
    "apiId": "pn06ltxub0"
  }
}

差分について

以下は Visual Studio Code で比較した画像です。
左がプロキシ統合、右が非プロキシ統合のログです。

値が null か空欄かやリクエスト時刻などの差異はありますが、フォーマットとしては同じ形式であることを確認できました。

まとめ

今回は API Gateway の Lambda 非プロキシ統合で Lambda プロキシ統合と同じ requestContext を作成してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion