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が直接レスポンスを返しています。