Lambdaエイリアスとバージョンを使用してロールバックをしてみました

はじめに

Lambda関数のデプロイ後にバグや不具合などが発生した場合、安全に迅速にロールバックする方法を調査していました。
その中でLambda関数のエイリアスとバージョンを使用した方法が有効そうに見えましたので、実際にやってみました。

目次

Lambda関数のエイリアスとバージョンとは

公式ドキュメントでの案内は下記の通りです。
Lambda 関数のエイリアスの作成
Lambda 関数のバージョンを管理する

Lambdaエイリアスを固定で保持しておいて、バージョンのみ変動することでロールバックが出来る仕組みのようです。

ロールバック方法

まずはLambdaのエイリアスとバージョンを発行します。
マネジメントコンソール上からも発行は可能ですが、今回はSAMテンプレートから実行しようと思います。

まずはsam initを実行します。

sam init ターミナル(クリックで展開/縮小します)

そのあとにtemplate.yamlAutoPublishAliasを追加します。

AutoPublishAliasプロパティについては下記をご参照ください。
AutoPublishAlias プロパティが指定されている

AWS::Serverless::Function の AutoPublishAlias プロパティが指定されている場合、AWS SAM は AWS::Lambda::Alias と AWS::Lambda::Version の AWS CloudFormation リソースを生成します。

どうやらエイリアスとバージョンの両方を同時に作成してくれるプロパティのようです。

そして、バージョンが分かりやすいようにhello_world/app.pyを下記の通り変更します。

ソースコードを変更したらsam buildsam deploy --guidedを実行します。
CloudFormationのチェンジセットを確認するとAWS::Lambda::AliasAWS::Lambda::Versionが追加されています。
cfn_changeset-1.png

デプロイ完了後、Lambdaコンソールを確認するとエイリアスとバージョン1が作成されていることが分かります。
lambda_alias_version1.png
lambda_version_version1.png

API Gatewayも確認するとliveエイリアス付きのLambda関数を指していることが分かります。
api_gateway_version1.png

では早速、API GatewayからLambdaを実行してみます。
PostmanからAPIを叩くと、version 1のメッセージが返ってきました。
postman_response_version1_1.png

続いて、バグバージョンをデプロイします。
hello_world/app.pyを以下のとおり変更してデプロイしてみます。

Lambdaコンソールを確認するとバージョン2を指していることが分かります。
lambda_alias_version2-1.png
lambda_version_version2-1.png

API Gatewayは変わらずliveエイリアス付きのLambda関数を指しています。
api_gateway_version2.png

同じくPostmanからAPIを叩くと、エラーが返却されました。
postman_response_version2.png

ここからロールバックを行います。
ロールバック方法は意外と簡単でLambdaコンソールからバージョンを1つ戻すのみです。
バージョンを1つ戻してみます。
まずは[エイリアス]タブからエイリアスを選択して、[編集]ボタンを押下します。
lambda_change_version_1.png
次に[バージョン]を「1」に変更して[保存]を押下します。
lambda_change_version_2.png
保存後、[バージョン]タブを確認するとエイリアスにバージョン1が紐付いていることが分かります。
lambda_change_version_3.png

戻した後に再度PostmanからAPIを叩いてみます。
すると即座にVersion1が返却されるようになりました。
postman_response_version1_2.png

これでロールバックが完了しました。

さいごに

いかがでしたでしょうか。
ロールバック方法は様々あり、要件に応じて適切な方法が変わってきますが、Lambdaのバージョン管理は環境変数も保持しますので有効な部分があるかもしれません。

投稿者プロフィール

nagura
2021年4月からスカイアーチに中途入社しました。
AWSともっと仲良くなるべく日々勉強中です。