[API Gateway + Lambda]ステージとエイリアスを使ってバージョン管理してみた
こんにちは、臼田です。
皆さん、Lambdaしていますか?
今回はAPI Gateway + Lambdaでprodやdevのエンドポイント毎に対応したバージョンのLambda関数を動かしてみたいと思います。
API Gateway + Lambdaのセットアップは下記ブログをご参照下さい。
何がしたいか
APIを作成して運用していく中で、本番用のエンドポイントとは別で、開発用のエンドポイントを用意して、それぞれ別のバージョンのLambdaを実行したくなります。
API Gatewayには1つのAPIを複数のステージにデプロイし、エンドポイントを複数作成することができます。例えば下記のようになります。
- https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
- https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod
Lambda関数も1つの関数で複数のバージョンを持つことができます。
また、バージョンと対応するエイリアスを設定することができます。
例としては、バージョンを1
, 2
のような形で作成していき、そのバージョンと紐づくdev
, prod
エイリアスを設定する事ができます。また、$LATEST
というバージョンが常に最新の状態を指しているため、dev
エイリアスを$LATEST
に当てることも多いです。
このAPI GatewayのステージとLambdaのエイリアスを紐付けて、以後のバージョン管理を楽にしたいと思います。
やってみた
文章だとわかりづらいので早速やってみます。API GatewayやLambda関数は構築してあるところから始めます。
Lambdaのバージョン・エイリアス設定
Lambda関数は作成済みの想定です。下記はversion 1
をreturnするだけの関数です。
Lambda関数は作成されただけの状態だとまだバージョンは作成されていない状態になります。バージョン情報は「限定条件」から確認できます。
バージョンの作成は「アクション -> 新しいバージョンを発行」から行います。なお、バージョンの作成をすると作成されたバージョンは変更できないので気をつけましょう。($LATEST
は引き続き変更可能です)
バージョンの説明を適当に設定して「発行」します。
バージョン1
が発行されました。パンくずからバージョン1
を表示している事がわかったり、ARNもバージョンを含んだものに変更されていることがわかります。
バージョンを作成した場合、コード部分がホワイトアウトして編集できなくなります。編集する場合には$LATEST
に戻るか、パンくずから関数名をクリックして移動する必要があります。
続いて、エイリアスを作成します。「アクション -> エイリアスの作成」へ移動します。
dev
エイリアスを作成し、$LATEST
と紐付けます。
エイリアスが作成され、$LATEST
に紐付いている事が確認できます。パンくずやARNもバージョンと同様に変わっています。
もう一つprod
エイリアスを同じように作成します。こちらはバージョン1
に紐付けます。
「エイリアス(限定条件の場所) -> 別名」でdev
が$LATEST
、prod
が1
と紐付いていることが確認できます。
現状ではバージョン1
と$LATEST
が実質同じなので、$LATEST
を編集します。$LATEST
を選択して移動します。
returnをveresion 2
に変更して保存します。
これでLambda側の準備は完了しました。
API Gatewayの設定
API Gatewayについては構築が完了し、dev
ステージのみデプロイされている想定です。
devステージは特にエイリアスと紐付けてない状態のため、エンドポイントへリクエストすると$LATEST
の結果が返ってきます。
まずはLambdaのエイリアスと対応付ける設定を行います。Lambdaと関連付けているメソッドのページから「統合リクエスト」へ移動します。
「Lambda関数」項目で鉛筆マークを押して編集します。関数名の後ろに:${stageVariables.alias}
を付けて保存します。こちらはAPI Gatewayのステージ変数を参照する設定です。ステージ変数は後ほど説明します。
保存時に「Lambda関数に権限を追加する」という項目とともに権限を追加するためのスクリプトが生成されます。ステージとエイリアスを紐付けるためには、現状CLIから手動で権限を追加する必要があります。こちらのコードを控えます。
AWS CLIにて控えたコードを実行します。ただし、コードの中にある${stageVariables.alias}
は実際のエイリアスの値を入れる必要があります。そのため、dev
とprod
で2回実行します。
$ aws lambda add-permission --function-name arn:aws:lambda:ap-northeast-1:000000000000:function:test-hello:dev --source-arn 'arn:aws:execute-api:ap-northeast-1:000000000000:xxxxxxxxxx/*/GET/' --principal apigateway.amazonaws.com --statement-id 00000000-000000000-000000000000000 --action lambda:InvokeFunction { "Statement": "{\"Sid\":\"00000000-000000000-000000000000000\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:000000000000:function:test-hello:dev\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:ap-northeast-1:000000000000:xxxxxxxxxx/*/GET/\"}}}" } $ aws lambda add-permission --function-name arn:aws:lambda:ap-northeast-1:000000000000:function:test-hello:prod --source-arn 'arn:aws:execute-api:ap-northeast-1:000000000000:xxxxxxxxxx/*/GET/' --principal apigateway.amazonaws.com --statement-id 00000000-000000000-000000000000000 --action lambda:InvokeFunction { "Statement": "{\"Sid\":\"00000000-000000000-000000000000000\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:000000000000:function:test-hello:prod\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:ap-northeast-1:000000000000:xxxxxxxxxx/*/GET/\"}}}" }
Windowsのコマンドプロンプトでawscliを利用している場合には、--source-arn
の'
が適切に処理されないので、"
に置き換えて実行して下さい。
それではprodステージを作成します。
デプロイしたら、ステージ変数を設定します。ステージ変数はステージごとに異なる値を設定でき、${stageVariables.xxxxx}
で利用することができます。ここに、先程のLambda関数のエイリアスに入れたい値を設定します。
「ステージ変数の追加」から追加します。
名前にalias
、値にprod
を入れてチェックを押します。
この状態でURLの呼び出しからprod
のエンドポイントをリクエストすると、version 1
が返ってきます。Lambdaのprod
エイリアスと紐付いているバージョン1
が返していることがわかります。
さて、この状態ではdevではエイリアスと紐付ける設定がされていません。試しに新しいバージョンを作成してLambda関数のdev
エイリアスを、$LATEST
以外にしてみます。
$LATEST
から「新しいバージョンを発行」してバージョン2
を作成します。
バージョン選択から「別名 -> dev」を選択します。
バージョンを$LATEST
から2
に変更して保存します。
$LATEST
に移動して、returnをversion 3
に変更して保存します。
dev
のエンドポイントにリクエストすると、$LATEST
の結果であるversion 3
が返ってきて、Lambda側のエイリアスの設定が反映されていないことが確認できます。
さて、devステージの更新ですが、新たにAPI Gatewayのリソース画面からデプロイしてもいいですが、prod
でデプロイしたバージョンと同じものを選択できます。
devステージへ移動して「デプロイ履歴」から、これまでのデプロイが一覧で表示されますので、新しいバージョンを選んで「デプロイの変更」を押します。
これでリクエスト先のLambda関数にエイリアスを入れる設定が反映されました。あとはステージ変数を設定します。
この状態でdev
へリクエストすると、version 2
が返ってきてエイリアスが反映されていることが確認できました。
おわりに
これでLambda側でバージョンとエイリアスの設定を変えるだけで、API自体の動作を変更することができるようになりました。
それでは快適な開発ライフを!