🐨

API Gatewayのステージ と Lambdaのエイリアス

2024/09/01に公開

したいこと

  • 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']

出来たこと

運用するときに下記のフローでリリース出来る

  1. Lambda側のコードの修正を行う
  2. Lambdaエイリアスstgにコードが反映される
  3. API stgステージで動作確認
  4. 3で確認に問題なければ、Lambdaのエイリアスv1のバージョンを最新のバージョンを最新に変更。API v1ステージに反映され、リリース完了

Discussion