はじめに
AWS 初学者で AWS Management Console が操作できるレベル程度の自分が Lambda へのカスタム認証を実装・検証したいと思い、下記を参考に Python でリクエストタイプのオーソライザーの検証を進めていましたが、
色々と時間を要してしまい、そのため検証完了後に必要最小限の手順を整理し、覚書として残すことにしました。
VPCも作らず確認後すぐ消す想定で、セキュリティ的なところは無視です。
構築の概要
- AWS Lambda を二つ作成する。一つは処理本体用で、もう一つはオーソライザー用(認証ロジック用)
- API Gateway に REST API を作成し、処理本体を呼び出すように設定する
- 前手順で作成した REST API にオーソライザーを設定し、認証されるようにする
- 動作確認する
1.実装(Lambda 作成)
1-a.処理本体用 Lambda の作成
以下を指定してあとはそのまま画面右下の [関数の作成] をクリック
- オプション : 一から作成
- 関数名 : hello2
- ランタイム : Python 3.13
作成されて画面が切り替わったら [テスト] タブ内画面右の [テスト] をクリック、結果確認
1-b.オーソライザー用 Lambda の作成
関数名を hello2auth とし、先程と同様に [関数の作成] をクリック
作成されて画面が切り替わったら [コード] タブ上のソースコードをすべて消して、以下の Python ソースに差し替える
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html#api-gateway-lambda-authorizer-request-lambda-function-create
さらに、話を簡単にするため、今回は HTTP Header の固定値だけで認証するように、以下に書き換えて [Deploy (Ctrl+Shift+U)] をクリック
(33 行目をコメント化し、34, 35 行目を追加しています。)
実行してみれば(CloudWatch ログで確認して)わかるのですが headers のキー名 headerauth1 はすべて小文字にする必要があります。つまり引用元のこの AWS サンプルはそのままの形では動作できません。
この画面では HTTP Header を指定できずテストできないので、次へ進みます。
2.実装(API Gateway の構成1)
概要
ここでは API Gateway に REST API を構成し、処理本体用 Lambda と紐づけます。
手順
API Gateway の画面から REST API の [構築] をクリックし、適当な名前をつけて [APIを作成] をクリック
(hello2rest としました。この名前は管理上のもので REST API の URL に露出しません)
作成されたら [リソースを作成] を押し、次の画面でリソース名を入力し [リソースの作成] をクリック
(リソース名は REST API の URL 末尾になります)
次に画面右の [メソッドを作成] を押し、以下のように指定
- メソッドタイプ : GET
- 統合タイプ : Lambda 関数
- Lambda 関数 : 作成済みの hello2
さらに画面をスクロールして以下を指定し、[メソッドを作成] をクリック
- HTTP リクエストヘッダー > 名前 : headerauth1 (Lambda 内のソースと一致させる)
- HTTP リクエストヘッダー > 必須 : ON
もとの画面に戻るので、この状態で一度画面右上の [APIをデプロイ] をクリック
表示されるダイアログで下記を指定し [デプロイ] をクリック
- ステージ : * 新しいステージ *
- ステージ名 : v1 (好きな名前。REST API の URL に含まれます)
ステージ名は URL 上、リソース名の上に付与されます。
https://~amazonaws.com/ステージ名/リソース名
動作確認
画面中央の [ステージ] 内ツリーを展開していき [GET] をクリックすると URL が得られる。curl でひとまず動作確認
$ curl https://~.amazonaws.com/v1/hello2
{"statusCode": 200, "body": "\"Hello from Lambda!\""}
上記のように API Gateway 経由で呼び出した時に、Lambda 単体でのテスト時と同様の結果が得られれば OK です。
3.実装(API Gateway の構成2)
概要
ここでは API Gateway に作成した REST API に対してオーソライザーを構成し、オーソライザー用 Lambda と紐付け、認証が必要な形に構成します。
手順
API Gateway の左ペインから [オーソライザー] を選び、画面右上の [オーソライザーを作成] をクリック
次の画面で以下を設定し、[オーソライザーを作成] をクリック
- オーソライザー名 : hello2auth (好きな名前)
- オーソライザーのタイプ : Lambda
- Lambda 関数 : 作成済みの hello2auth
- Lambda イベントペイロード : リクエスト
- ID ソースタイプ : ヘッダー
- キー : headerauth1
- 認可のキャッシュ : OFF
ここまででオーソライザーの構成が完了。あとはこのオーソライザーを使って認証されるように設定する。
API Gateway の左ペインの [リソース] を選び、画面中央の [リソース] を展開、[メソッドリクエスト] タブ内右にある [編集] をクリック
[メソッドリクエストを編集] 画面で以下を指定し、[保存] をクリック
- 認可 : hello2auth を選ぶ
- HTTP リクエストヘッダー : 設定済みだが念の為展開して確認
最後に右上の [APIをデプロイ] をクリックして、デプロイを忘れず行う。
4.最終動作確認
構成後に少しタイムラグがあるようですが、curl で動作確認できます。
$ curl https://~.amazonaws.com/v1/hello2
{"message":"Unauthorized"}
$ curl https://~.amazonaws.com/v1/hello2 -H "headerauth1:headerValue1"
{"statusCode": 200, "body": "\"Hello from Lambda!\""}
$ curl https://~.amazonaws.com/v1/hello2 -H "HeaderAuth1:headerValue1"
{"statusCode": 200, "body": "\"Hello from Lambda!\""}
$ curl https://~.amazonaws.com/v1/hello2 -H "headerauth1:XXX"
{"message":"Unauthorized"}
※実際には改行コードの問題があり上記のようにきれいには出力はされません。
※呼び出し側の HTTP Header 指定は大文字小文字区別しなくて OK です。