![[API Gateway + Lambda]ステージとエイリアスを使ってバージョン管理してみた](https://devio2023-media.developers.io/wp-content/uploads/2015/07/api_gateway.png)
[API Gateway + Lambda]ステージとエイリアスを使ってバージョン管理してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、臼田です。
皆さん、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自体の動作を変更することができるようになりました。
それでは快適な開発ライフを!







