API Gateway HTTP API に Lambda Authorizer を作成する
Lambda Authorizerは、認証のロジックをLambda関数に書くことで、自由にカスタマイズした認証をAPI Gatewayに付与することができます。
今回は、最もシンプルな方法でLambda Authorizerを作っていきます。
詳しくはAWSのドキュメントを確認してください。
Lambda 関数を作成する
今回必要なLambdaは2種類あります。
- Lambda Authorizer (認証用のLambda)
- 認証後に動作する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という名前で作成します。

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

その後Authorizationのタブから、オーソライザーを作成してアタッチを選択します。
遷移先の設定画面にて、オーソライザーのタイプはLambdaを、オーソライザーの設定は以下のような値にし、作成します。
- 名前: TestAuthorizer (任意)
- Lambda関数: 上で作成したAuthorizer (TestAuthorizer)
- IDソース: $request.querystring.code

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

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

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

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

このとき、実際にTestAuthorizerが起動し、クエリ文字列を見てリクエストを弾いています。
失敗 (401)
クエリ文字列無しでリクエストを送ると、Unauthorizedが返ってきます。

これは、API Gatewayに設定されたIDソースに合致しないリクエストが送られた場合の挙動です。
このときLambda Authorizerは起動されず、API Gatewayが直接レスポンスを返しています。