APIGatewayのステージごとにエイリアスで指定したLambdaを紐づけハンズオン

## はじめに
API Gatewayのステージと、Lambdaにおけるバージョン及びエイリアスを利用した紐付けを調査した際の構築メモとなります。

参考：[APIGateway+Lambdaによるアプリサーバをバージョン管理する](https://tm-progapp.hatenablog.com/entry/2021/01/19/202623)

## 構成イメージ
APIGatewayのステージとLambdaのエイリアスを紐づける事で、呼び出すLambdaを変更する事でステージごとに挙動を変えることが可能となります。
そして、これが構築できることでLambda内のエイリアスの重みづけによる切り替えも可能になります（ここの記載は掲載してません）
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.51.14-1-640x331.png)

## ハンズオン
### Lambdaの作成
#### Lambdaの画面から構築
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.29.50-640x259.png)

#### Lambdaのコード修正
変化をわかりやすくするため『'Hello from Lambda version 1!』とコードを修正します
```
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda version 1!')
    }
```

#### バージョンを発行
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.36.04-640x68.png)

#### バージョンの番号を入力
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.35.21-640x251.png)

#### バージョン作成完了画面
※左上のパンクズリストから前のページに戻ることが可能です
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.32.07-640x338.png)

#### バージョン作成後の画面
再度バージョンを確認すると、v1が登録されています
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.37.42-640x106.png)

#### エイリアスの作成
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.38.34-640x147.png)

#### エイリアスの設定
v1をエイリアスと紐付けます
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.39.04-640x410.png)

#### エイリアス作成後の画面
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.40.21-640x108.png)

#### 再度バージョンが変わった事を確認するようにLambdaのコードを変更する
変化をわかりやすくするため『'Hello from Lambda version 2!』とコードを修正します
```
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda version 2!')
    }

```

#### 最新デプロイバージョンのエイリアスを作成
先ほどとは異なりバージョンで指定するのではなく、＄LATESTを選択してdevというエイリアスを作成します
※Lambdaの最新状態が反映されるエイリアスとなります
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.47.36-640x401.png)

### API Gatewayの作成
#### REST API で構築
API Gatewayの作成画面からREST APIを作成します
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.50.51-640x380.png)

#### 作成したAPIのリソースを設定する
作成したAPI Gatewayを選択して、左ペインのリソースをクリックして、アクションを押下、メソッドの作成で(今回の確認では)メソッドの作成で"GET"を選択する
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-16.15.07.png)

#### LambdaとAPIGatewayを紐づける
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.54.08-640x336.png)
※保存後表示される、Lambdaに対しての呼び出しを許可する事で、先ほど作成したLambdaに対してリソースベースのポリシーが付与される。
__Lambda > 設定 > アクセス制限 > リソースベースポリシー__ でアタッチされていることが確認できる

__【Lambdaでの画面】__
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.56.43-640x204.png)

#### 左ペイン『リソース』で画面にある『統合リクエスト』を選択
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-14.58.43-640x260.png)

#### 統合リクエストの”Lambda関数”を修正
Lambda関数の末尾に__:${stageVariables.alias}__を追記する
これによりLambdaのエイリアス込みで呼び出すことが可能となる
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.01.17-640x414.png)

#### 追記した際に表示されるコマンドを、赤枠部分をステージ名に変更して、CLIでコマンドを叩く
末尾に追記することで、Lambdaをエイリアス込みで呼び出すことは可能となりましたが、権限がないため下記コマンドをターミナル又はプロンプトなどで入力する
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.05.00-640x263.png)
※今回はLambdaで作成した”dev” と　”prod”で作成していきます(下記コマンドは例として”dev”のみなので、prodも入力ください。)
※この時点ではAPI Gatewayは”dev”も”prod”もステージは作成されていませんが、権限は作成可能です。
```
aws lambda add-permission   
--function-name "arn:aws:lambda:ap-northeast-1:XXXXXXXX:function:tetutetu-lambda:dev"   
--source-arn "arn:aws:execute-api:ap-northeast-1:XXXXXXXX:XXXXX/*/GET/"   
--principal apigateway.amazonaws.com   
--statement-id XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
--action lambda:InvokeFunction
```

#### APIのデプロイを選択
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.14.11.png)

#### devステージ作成
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.14.56.png)

#### ステージ変数の入力
左ペイン『ステージ』を選択して、『ステージ変数』画面で”alias”と”dev”を入力することで、Lambdaのエイリアスが紐づきます
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.16.18-1-640x197.png)

#### ステージ画面上部の ”URLの呼び出し”をクリック
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.19.40-640x241.png)

#### 画面が表示される
devは最新バージョンが反映されるので下記画面が表示される
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.20.50.png)

#### prodステージ作成
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.22.39-640x155.png)

#### ステージ変数の入力する
誤ってdev（既に手順ではステージ変数が入力されているので間違えないかとは思いますが）のステージに入力すると画面表示は失敗しますので注意ください
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.23.46-640x191.png)

#### ステージ画面上部の ”URLの呼び出し”をクリック
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.25.23-640x276.png)

#### 画面が表示される
prodはバージョン1が反映されるので下記画面が表示される
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-09-15.27.00.png)


## まとめ
この紐付けができることで、Lambdaでバージョン管理・エイリアスでの切り戻が可能となりました。
ターミナル画面で権限を追加させる部分ですが、Lambdaのエイリアスを見境なく（prod-2など）作成すると、その度にターミナルで権限を付与しないといけないので、そこいらは明確なルールでの運用が必要かと思いました。
次はAPI GatewayのCanaryとか使って同じことができないか調査したいと。