blog top

API Gateway HTTP API に Lambda Authorizer を作成する

Lambda Authorizerは、認証のロジックをLambda関数に書くことで、自由にカスタマイズした認証をAPI Gatewayに付与することができます。

今回は、最もシンプルな方法でLambda Authorizerを作っていきます。

詳しくはAWSのドキュメントを確認してください。

Lambda 関数を作成する

今回必要なLambdaは2種類あります。

  1. Lambda Authorizer (認証用のLambda)
  2. 認証後に動作するLambda

今回は特定のクエリ文字列(?code=12345)付きでリクエストされたときに認証するようなAuthorizerを作っていきます。

名前はTestAuthorizerとします。

// TestAuthorizer
export const handler = async(event) => {
  if (event.queryStringParameters.code !== "12345") {
    return {
      "isAuthorized": false  
    }
  }
  return {
    "isAuthorized": true
  }
};

また、認証後に動作するLambdaは以下のようにします(コンソール画面で一から作成した場合のデフォルトです)。

名前はTestFunctionとします。

// TestFunction
export const handler = async (event) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};

API Gateway HTTP API に Lambda を設定する

API Gateway HTTP APIをTestAPIという名前で作成します。

TestAPI

次にRoutesのタブから、GET /のルートを作成します。

GET / のルート

その後Authorizationのタブから、オーソライザーを作成してアタッチを選択します。

遷移先の設定画面にて、オーソライザーのタイプはLambdaを、オーソライザーの設定は以下のような値にし、作成します。

Authorization

最後にIntegrationsの画面で統合を作成してアタッチを押し、遷移先の画面で「統合ターゲット」の統合タイプはLambda 関数、「統合の詳細」のLambda関数は上で作成したTestFunctionを選択します。

Integrations

動作確認

API: TestAPI(...)というタブをクリックすると「デフォルトのエンドポイント」が確認できます。こちらを使ってAPI Gatewayにアクセスしていきます。

Integrations

成功 (200)

?code=12345をエンドポイントにつけてリクエストを送ると、'Hello from Lambda!'が帰ってきます。

Integrations

失敗 (403)

?code=11111として誤った値をつけてリクエストを送ると、Forbiddenが返ってきます。

Integrations

このとき、実際にTestAuthorizerが起動し、クエリ文字列を見てリクエストを弾いています。

失敗 (401)

クエリ文字列無しでリクエストを送ると、Unauthorizedが返ってきます。

Integrations

これは、API Gatewayに設定されたIDソースに合致しないリクエストが送られた場合の挙動です。

このときLambda Authorizerは起動されず、API Gatewayが直接レスポンスを返しています。