はじめに
API Gatewayのステージと、Lambdaにおけるバージョン及びエイリアスを利用した紐付けを調査した際の構築メモとなります。
参考:APIGateway+Lambdaによるアプリサーバをバージョン管理する
構成イメージ
APIGatewayのステージとLambdaのエイリアスを紐づける事で、呼び出すLambdaを変更する事でステージごとに挙動を変えることが可能となります。
そして、これが構築できることでLambda内のエイリアスの重みづけによる切り替えも可能になります(ここの記載は掲載してません)
ハンズオン
Lambdaの作成
Lambdaの画面から構築
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!')
}
バージョンを発行
バージョンの番号を入力
バージョン作成完了画面
バージョン作成後の画面
エイリアスの作成
エイリアスの設定
エイリアス作成後の画面
再度バージョンが変わった事を確認するように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の最新状態が反映されるエイリアスとなります
API Gatewayの作成
REST API で構築
API Gatewayの作成画面からREST APIを作成します
作成したAPIのリソースを設定する
作成したAPI Gatewayを選択して、左ペインのリソースをクリックして、アクションを押下、メソッドの作成で(今回の確認では)メソッドの作成で"GET"を選択する
LambdaとAPIGatewayを紐づける
※保存後表示される、Lambdaに対しての呼び出しを許可する事で、先ほど作成したLambdaに対してリソースベースのポリシーが付与される。
Lambda > 設定 > アクセス制限 > リソースベースポリシー でアタッチされていることが確認できる
左ペイン『リソース』で画面にある『統合リクエスト』を選択
統合リクエストの”Lambda関数”を修正
Lambda関数の末尾に__:${stageVariables.alias}__を追記する
これによりLambdaのエイリアス込みで呼び出すことが可能となる
追記した際に表示されるコマンドを、赤枠部分をステージ名に変更して、CLIでコマンドを叩く
末尾に追記することで、Lambdaをエイリアス込みで呼び出すことは可能となりましたが、権限がないため下記コマンドをターミナル又はプロンプトなどで入力する
※今回は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のデプロイを選択
devステージ作成
ステージ変数の入力
左ペイン『ステージ』を選択して、『ステージ変数』画面で”alias”と”dev”を入力することで、Lambdaのエイリアスが紐づきます
ステージ画面上部の ”URLの呼び出し”をクリック
画面が表示される
prodステージ作成
ステージ変数の入力する
誤ってdev(既に手順ではステージ変数が入力されているので間違えないかとは思いますが)のステージに入力すると画面表示は失敗しますので注意ください
ステージ画面上部の ”URLの呼び出し”をクリック
画面が表示される
まとめ
この紐付けができることで、Lambdaでバージョン管理・エイリアスでの切り戻が可能となりました。
ターミナル画面で権限を追加させる部分ですが、Lambdaのエイリアスを見境なく(prod-2など)作成すると、その度にターミナルで権限を付与しないといけないので、そこいらは明確なルールでの運用が必要かと思いました。
次はAPI GatewayのCanaryとか使って同じことができないか調査したいと。