🐨
API Gatewayのステージ と Lambdaのエイリアス
したいこと
- API GatewayのステージとLambdaのエイリアスを連携させて本番と検証で分けたい
例)
Lambdaのエイリアスstgのコードを呼び出すAPI
https://****.execute-api.us-east-1.amazonaws.com/stg
Lambdaのエイリアスv1のコードを呼び出すAPI
https://****.execute-api.us-east-1.amazonaws.com/v1
Lambdaのエイリアスを使って本番と検証を変える
バージョンを作成します
エイリアスを設定します
エイリアスstgは常に最新のバージョンを参照します。
エイリアスv1は特定のバージョンを参照します。
API Gatewayのステージを使って本番と検証のエンドポイントを変える
Lambdaをエイリアスを含んで指定する
統合リクエストの設定の箇所で関数名の後ろに :${stageVariables.alias} を付けて保存します。
変更前
変更後
アクセス権限の付与
統合リクエストの設定の関数名の修正の際に表示されたコマンドを実行(AWS CloudShellを使うと簡単です)します。
${stageVariables.alias}の箇所をエイリアスの値を設定します。
例)
aws lambda add-permission \
--function-name "arn:aws:lambda:us-east-1:***********:function:count_dns_lookup:stg" \
--source-arn "arn:aws:execute-api:us-east-1:***********:****/*/GET/" \
--principal apigateway.amazonaws.com \
--statement-id ******-***-***-***-***** \
--action lambda:InvokeFunction
Statement...という文字列が返ってきたら成功です!
ステージ変数の設定
ステージのステージ変数に変数を追加します。
aliasという変数を追加して、ステージに合わせて値を設定します。
v1ステージの例)
確認
APIの確認
API Gatewayでステージごとに呼び出すURLが違うので、それぞれ呼び出して確認します。
- API https://***/stg が Lambdaのstgエイリアスを呼び出されている
- API https://***/v1 が Lambdaのv1エイリアスを呼び出されている
トリガーはエラーメッセージ
Lambdaのトリガーで確認するとこんなエラーになってるんですよね。ちょっと気持ち悪い。
Lambda側でステージ変数を取得
Lambda側でステージ変数を取得してみます。
API Gatewayの統合リクエストのマッピングテンプレートに下記のように設定します。
"stage" : "$context.stage",
"stageVariables" : "$stageVariables"
Lambda側(Pythonの場合)
event['stage']
event['stageVariables']
出来たこと
運用するときに下記のフローでリリース出来る
- Lambda側のコードの修正を行う
- Lambdaエイリアスstgにコードが反映される
- API stgステージで動作確認
- 3で確認に問題なければ、Lambdaのエイリアスv1のバージョンを最新のバージョンを最新に変更。API v1ステージに反映され、リリース完了
Discussion