AmplifyでAPI GatewayのLambda Authorizerを設定し認可を実装する方法

はじめに

このブログはギークフィードアドベントカレンダー2023の15日目の記事です。

今回はAmplifyで生成したREST APIのAPI Gatewayに、Lambda Authorizerを作成しAPI Gatewayの認証に使用する方法をご紹介します。

構築する背景

構築することとなった背景をご紹介いたします。

認可の方法ですが、①Cognito認証でのフロントからのリクエストと②IAMでのLambdaからのリクエスト二つをAPI Gatewayに設定する必要がありました。

本来であればCognitoのユーザーにIAMポリシーをアタッチする方法をとればIAM認証のみの設定で構築したいことの実現は可能です。

しかし今回は要件として、

・CognitoはAmplifyがデプロイされているAWSアカウントとは別のAWSアカウント上にありカスタマイズができない

という問題があり、API GatewayはCognito認証とIAM認証を同時に設定することができないためLambda Authorizerを構築しカスタム認可を設定する必要がありました。

以下は簡単な構成図です。

環境情報

Lambda:Node18

フロントアプリ:React17、Node16.15.1

Lambda Authorizerとは

Lambda オーソライザー (以前のカスタムオーソライザー) は、Lambda 関数を使用して API へのアクセスを制御する API Gateway の機能です。

(引用: API Gateway Lambda オーソライザーを使用する

Lambda Authorizer には二種類あります。

  • TokenベースのLambda Authorizer
  • リクエストベースのLambda Authorizer

今回はTokenベースのLambda AuthorizerについてAmplifyが生成したAPI Gatewayにアタッチする方法と、Lambda内で受け取ったTokenを判別し認証を与える方法について解説していきます。

Lambda Authorizerの作成方法

Amplify CLIでいつもLambdaを生成するように

コマンドを使用しLambdaを作成します

今回はNode.jsを選びます。

テンプレートはHello Worldでいいです。

こんな感じです。

Lambda AuthorizerをAPI Gatewayにアタッチする方法

Amplify CLIを使用して以下のコマンドを打ちます。

設定したい選択肢を選ぶと「amplify/backend/api/{api名}/override.ts」が生成されます。

これで設定できます。

では認可の中身を実装していきます。

Lambda Authorizerのコードについて

冒頭でフロントからのCognito認証でのリクエストとLambdaからのIAM認証でのリクエストを同時にしたいと述べました。

送られてきたTokenがフロントからのリクエストかLambdaからのリクエストかまず判別しなければなりません。

今回私はフロントアプリケーションのCognitoトークンとLambdaからのIAM認証を以下のように分け識別できるようにいたしました。(セキュリティ上の観点から一部ブログ投稿用に変更を加えています。)

  • フロントからのリクエスト

  • Lambdaからのリクエスト

先ほど作成したLambda Authorizerでは以下のような処理で認可しています。

index.mjs

verifyCognitoToken.mjs

verifyIAMToken.mjs

これでCognitoトークンとIAMのSTS検証を行いセキュアにAPI Gatewayを構築することができました。

generatedPoricyのstatementOne.Resource については今回キャッシュの都合上ワイルドカードを使いました。詳しくはこちら

verifyCognitoToken.mjsの方はaws-jwt-verifyというライブラリを使用しトークンの検証を行い、verifyIAMToken.mjsの方はSTSのGetCallerIdentityを使用しトークンからIAMの判別を行うことでセキュリティを強固なものにしております。

また、今回は簡略化のために環境変数を使用していますが、SSMパラメータストアでシークレット環境変数の設定をするとよりセキュアに実装できると思います。

最後に

以上でAmplifyでAPI GatewayのLambda Authorizerを設定し認可を実装する方法の解説を終わります。

参考資料

Amplify の REST API に Lambda オーソライザーを設定する

aws-jwt-verify

GetCallerIdentity

この記事が気に入ったら
いいね ! しよう

Twitter で

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ