API Gatewayで本番・開発それぞれにエンドポイントを用意して
実行するAWS Lambda関数を切り替える方法です。
以下のように開発(dev)では常に最新バージョンを参照し、
本番(prod)では特定のバージョンを参照するような想定です。
https://xxx.execute-api.ap-northeast-1.amazonaws.com/prod/app/print
https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/app/print
サンプルAWS Lambda関数の作成
単純にバージョン番号を返すだけの関数を作成します。
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps("this function is version 1.")
}
関数を作成しただけではバージョンは作成されないのでバージョンを発行します。
「バージョンタブ」 → 「新しいバージョンを発行」でバージョン1を発行します。
バージョン1のARNは以下のようになります。最後の「1」がバージョンです。
arn:aws:lambda:ap-northeast-1:xxx:function:funcname:1
AWS Lambdaのエイリアス作成
エイリアスを作成し、エンドポイントを切り替え可能にします。
devとprodの2つのエイリアスを作成し、バージョンを紐付けます。
devは最新バージョン、prodは「1」に紐付けます。
エイリアス名 | バージョン |
dev | $LATEST |
prod | 1 |
API GatewayでAWS Lambdaエイリアスとの紐付け
Lambdaと関連付けているメソッドのページから「統合リクエスト」へ移動します。
「Lambda関数」の項目で鉛筆マークを押して編集します。
関数名の後ろに:${stageVariables.alias}を付けて保存します。
「stageVariables」はステージ変数となり、実際の設定はこの後に行います。
保存すると権限を追加するためのスクリプトが生成され、
ポップアップで表示されるのでスクリプトを控えておきます。
控えたスクリプトの中で${stageVariables.alias}の部分を
任意の値に置き換えてCLIで実行します。
今回の場合、dev, prodを用意するので、それぞれに置き換えて
2回CLIを実行します。
prodとdevのステージを作成し、デプロイを行います。
デプロイ後にステージ変数を追加します。
これで先程設定した${stageVariables.alias}の値が
設定した値で置き換わるようになります。
対象ステージ | ステージ変数名 | ステージ変数の値 |
dev | alias | dev |
prd | alias | prod |
テスト
Lambda関数の実装を以下のように更新してデプロイします。
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps("this function is version 2.")
}
devとprodそれぞれのエンドポイントを叩いてレスポンスが変わることを確認。
curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/app/print
curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/prod/app/print
参考
AWS Lambdaを新機能バージョニングとエイリアスでBlue-Green Deploymentする #reinvent
以上