あめがえるのITブログ

頑張りすぎない。ほどほどに頑張るブログ。

API Gateway(REST API)から届くHTTPリクエストを確認してみた(Lambdaプロキシ統合)

ここ最近API Gatewayを触り始めているがLambdaプロキシ統合というよくわからない項目があるので調べてみた。

◆Lambdaプロキシ統合とは

docs.aws.amazon.com

Amazon API Gateway Lambda プロキシ統合は、単一の API メソッドのセットアップで API を構築するシンプル、強力、高速なメカニズムです。Lambda プロキシ統合は、クライアントが単一の Lambda 関数をバックエンドで呼び出すことを可能にします。この関数は、他の Lambda 関数の呼び出しを含め、他の AWS のサービスのさまざまなリソースや機能にアクセスします。

これだけじゃわかんないやー( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \

◆やること

API GatewayREST APIでLambdaプロキシ統合あり、なしで作成し挙動を確認する。

◆実践!

1.IAMポリシー作成
 1.[IAM]-[ポリシー]-[ポリシー作成]
 2.JSONに下記を入力

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Resource": "*",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Effect": "Allow"
    }
  ]
}

 3.確認して作成画面が表示されたら下記を入力
  ・ポリシー名:lambda-policy
  ・説明:空白
 4.[ポリシーの作成]をクリック

2.ロール作成
 1.[IAM]-[ロール]-[ロールを作成]
 2.信頼されたエンティティを選択が表示されたら下記を入力
  ・信頼されたエンティティタイプ:AWSのサービス
  ・ユースケース:Lambda
 3.[次へ]をクリック
 4.許可を追加が表示されたら[lambda-policy]を選択
 5.[次へ]をクリック
 6.ロール名は[lambda-role]を入力し、[ロールを作成]をクリック

3.Lambda関数作成
 1.Lambdaコンソール-[関数]-[関数の作成]
 2.関数の作成ページが表示されたら下記を入力
  一から作成:✅
  関数名:sample-function
  ランタイム:python3.10
  既存のロール:lambda-role
 3.コードに下記を入力

import json
def lambda_handler(event, context):
    print(type(event))
    return {
        "statusCode": 200,
        "body": json.dumps(event)
    }

 4.[Deploy]をクリック

4.API Gateway作成
 1.API Gatewayコンソール-[API]-[REST API]内の[構築]をクリック
 2.下記を入力
  ・REST:✅
  ・新しいAPIの作成:新しいAPI
  ・API名:sample-api
  ・説明:空白
  ・エンドポイントタイプ:リージョン
 3.[APIの作成]をクリック
 4.リソース内の[/]を選択
 5.[アクション]プルダウンから[メソッドの作成]をクリック
 6.作成されたプルダウンから[GET]を選択
 7.GETの隣の✅をクリック
 8./-GET-セットアップが表示されたら下記を入力
  ・統合タイプ:Lambda関数
  ・Lambdaプロキシ統合の使用:✅
   ※まずはLambdaプロキシ統合を使用した場合のHTTPリクエストを確認する
  ・Lambda リージョン:ap-northeast-1
  ・Lambda関数:sample-function
  ・デフォルトタイムアウトの使用:✅
 9.[保存]をクリック
 10.[アクション]プルダウンから[APIのデプロイ]を選択
 11.APIのデプロイが表示されたら下記を入力
  ・デプロイされるステージ:[新しいステージ]
  ・ステージ名:test
  ・ステージの説明:空白
  ・デプロイメントの説明:空白
 12.[デプロイ]をクリック

5.動作確認(Lambdaプロキシ統合を利用した場合)
 1.ステージのUrLの呼び出しをクリック
※ブラウザに表示されるのはこんな感じ JSONをいい感じで成形してくれるサイトがあるので成形すると下記のような感じになる。

{
    "resource": "/",
    "path": "/",
    "httpMethod": "GET",
    "headers": {
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "ja,en-US;q=0.9,en;q=0.8",
        "Host": "bsm44pfp4j.execute-api.ap-northeast-1.amazonaws.com",
        "sec-ch-ua": "\"Chromium\";v=\"112\", \"Google Chrome\";v=\"112\", \"Not:A-Brand\";v=\"99\"",
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": "\"Windows\"",
        "sec-fetch-dest": "document",
        "sec-fetch-mode": "navigate",
        "sec-fetch-site": "cross-site",
        "sec-fetch-user": "?1",
        "upgrade-insecure-requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
        "X-Amzn-Trace-Id": "Root=1-64560383-7c194d0f1bf87edd1b7c394a",
        "X-Forwarded-For": "106.146.32.227",
        "X-Forwarded-Port": "443",
        "X-Forwarded-Proto": "https"
    },
    "multiValueHeaders": {
        "accept": [
            "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
        ],
        "accept-encoding": [
            "gzip, deflate, br"
        ],
        "accept-language": [
            "ja,en-US;q=0.9,en;q=0.8"
        ],
        "Host": [
            "bsm44pfp4j.execute-api.ap-northeast-1.amazonaws.com"
        ],
        "sec-ch-ua": [
            "\"Chromium\";v=\"112\", \"Google Chrome\";v=\"112\", \"Not:A-Brand\";v=\"99\""
        ],
        "sec-ch-ua-mobile": [
            "?0"
        ],
        "sec-ch-ua-platform": [
            "\"Windows\""
        ],
        "sec-fetch-dest": [
            "document"
        ],
        "sec-fetch-mode": [
            "navigate"
        ],
        "sec-fetch-site": [
            "cross-site"
        ],
        "sec-fetch-user": [
            "?1"
        ],
        "upgrade-insecure-requests": [
            "1"
        ],
        "User-Agent": [
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
        ],
        "X-Amzn-Trace-Id": [
            "Root=1-64560383-7c194d0f1bf87edd1b7c394a"
        ],
        "X-Forwarded-For": [
            "106.146.32.227"
        ],
        "X-Forwarded-Port": [
            "443"
        ],
        "X-Forwarded-Proto": [
            "https"
        ]
    },
    "queryStringParameters": null,
    "multiValueQueryStringParameters": null,
    "pathParameters": null,
    "stageVariables": null,
    "requestContext": {
        "resourceId": "nm7rzm696i",
        "resourcePath": "/",
        "httpMethod": "GET",
        "extendedRequestId": "EfV8lGntNjMFYbQ=",
        "requestTime": "06/May/2023:07:36:35 +0000",
        "path": "/test",
        "accountId": "xxxxxxxxxxx",
        "protocol": "HTTP/1.1",
        "stage": "test",
        "domainPrefix": "bsm44pfp4j",
        "requestTimeEpoch": 1683358595497,
        "requestId": "c98e8a85-d909-46d7-a217-d3273f68b44a",
        "identity": {
            "cognitoIdentityPoolId": null,
            "accountId": null,
            "cognitoIdentityId": null,
            "caller": null,
            "sourceIp": "106.146.32.227",
            "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/112.0.0.0 Safari/537.36",
            "user": null
        },
        "domainName": "bsm44pfp4j.execute-api.ap-northeast-1.amazonaws.com",
        "apiId": "bsm44pfp4j"
    },
    "body": null,
    "isBase64Encoded": false
}

6.動作確認(Lambdaプロキシ統合を利用しない場合)
 1,API Gatewayコンソール-[リソース]-[GET]-[統合リクエスト]をクリック
 2./-GET-統合リクエストが表示されたら[Lambdaプロキシ統合の使用]の✅を外す
 3.[アクション]プルダウンから[APIのデプロイ]をクリック
 4.APIのデプロイが表示されたら下記を入力
  ・デプロイされるステージ:test
 5.ステージのUrLの呼び出しをクリック

{"statusCode": 200, "body": "{}"} 

◆結論
Lambda統合プロキシを利用した場合HTTPリクエストが自動で生成されバックエンド(今回はLambda)に届くようになっている模様。
つまりはアプリ側でHTTPリクエストを生成しなくてもAPI Gatewayが実施してくれている。現時点ではそんな認識。。

◆感想
この辺の挙動がどこかに書いていればよいのだが、、
AWSのサイトは細かく書かれているが肝心なことが書かれていないことが多いように思う。