AWS Lambda オーソライザー検証の最小手順

## はじめに
AWS 初学者で AWS Management Console が操作できるレベル程度の自分が Lambda へのカスタム認証を実装・検証したいと思い、下記を参考に Python でリクエストタイプのオーソライザーの検証を進めていましたが、

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html

色々と時間を要してしまい、そのため検証完了後に必要最小限の手順を整理し、覚書として残すことにしました。
VPCも作らず確認後すぐ消す想定で、セキュリティ的なところは無視です。

## 構築の概要
1. AWS Lambda を二つ作成する。一つは処理本体用で、もう一つはオーソライザー用(認証ロジック用)
1. API Gateway に REST API を作成し、処理本体を呼び出すように設定する
1. 前手順で作成した REST API にオーソライザーを設定し、認証されるようにする
1. 動作確認する

## 1.実装(Lambda 作成)

### 1-a.処理本体用 Lambda の作成

以下を指定してあとはそのまま画面右下の [関数の作成] をクリック
 - オプション : 一から作成
 - 関数名 : hello2
 - ランタイム : Python 3.13

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/d7c2f27d-2b30-453e-b229-f3a7c2c9dc36.png)

作成されて画面が切り替わったら [テスト] タブ内画面右の [テスト] をクリック、結果確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/a35a0496-bd44-4fca-a65a-a76ad58fa9de.png)


### 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)] をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/acb7061b-6c36-44d6-aaf2-d125cf3b9d6f.png)

(33 行目をコメント化し、34, 35 行目を追加しています。)

:::note warn
実行してみれば(CloudWatch ログで確認して)わかるのですが headers のキー名 headerauth1 はすべて小文字にする必要があります。つまり引用元のこの AWS サンプルはそのままの形では動作できません。
:::

この画面では HTTP Header を指定できずテストできないので、次へ進みます。

## 2.実装(API Gateway の構成1)

### 概要
ここでは API Gateway に REST API を構成し、処理本体用 Lambda と紐づけます。

### 手順
API Gateway の画面から REST API の [構築] をクリックし、適当な名前をつけて [APIを作成] をクリック
(hello2rest としました。この名前は管理上のもので REST API の URL に露出しません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/07377423-2c18-4844-97cf-7b1e49585b13.png)

作成されたら [リソースを作成] を押し、次の画面でリソース名を入力し [リソースの作成] をクリック
(リソース名は REST API の URL 末尾になります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/d334bbcf-7d9c-47af-b535-c087be52e030.png)

次に画面右の [メソッドを作成] を押し、以下のように指定
 - メソッドタイプ : GET
 - 統合タイプ : Lambda 関数
 - Lambda 関数 : 作成済みの hello2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/b64b6f86-ac1a-4792-ab21-e061fc38092d.png)

さらに画面をスクロールして以下を指定し、[メソッドを作成] をクリック
 - HTTP リクエストヘッダー > 名前 : headerauth1 (Lambda 内のソースと一致させる)
 - HTTP リクエストヘッダー > 必須 : ON
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/534dabfb-63ce-40e3-839b-7d6bf53e0d8f.png)

もとの画面に戻るので、この状態で一度画面右上の [APIをデプロイ] をクリック
表示されるダイアログで下記を指定し [デプロイ] をクリック
 - ステージ : * 新しいステージ *
 - ステージ名 : v1 (好きな名前。REST API の URL に含まれます)

:::note info
ステージ名は URL 上、リソース名の上に付与されます。
https://~amazonaws.com/ステージ名/リソース名
:::

### 動作確認

画面中央の [ステージ] 内ツリーを展開していき [GET] をクリックすると URL が得られる。curl でひとまず動作確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/2ca9f248-1e43-4e5d-9742-b230342852b4.png)

```
$ 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 の左ペインから [オーソライザー] を選び、画面右上の [オーソライザーを作成] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/19c8b7c6-ef6d-4356-8399-754504fec4ff.png)

次の画面で以下を設定し、[オーソライザーを作成] をクリック

 - オーソライザー名 : hello2auth (好きな名前)
 - オーソライザーのタイプ : Lambda
 - Lambda 関数 : 作成済みの hello2auth
 - Lambda イベントペイロード : リクエスト
 - ID ソースタイプ : ヘッダー
 - キー : headerauth1
 - 認可のキャッシュ : OFF

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/5624cde3-d9b5-49c6-a7aa-4f1d6745af63.png)

ここまででオーソライザーの構成が完了。あとはこのオーソライザーを使って認証されるように設定する。

API Gateway の左ペインの [リソース] を選び、画面中央の [リソース] を展開、[メソッドリクエスト] タブ内右にある [編集] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/9b0ccc57-894c-469b-ba53-60935ea46e31.png)

[メソッドリクエストを編集] 画面で以下を指定し、[保存] をクリック
 - 認可 : hello2auth を選ぶ
 - HTTP リクエストヘッダー : 設定済みだが念の為展開して確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/29ba4f12-f285-4a3d-be69-c792b7563666.png)

最後に右上の [APIをデプロイ] をクリックして、デプロイを忘れず行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665941/703b0d69-ab03-4984-8bb9-4f84123234b8.png)

## 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 です。