はじめに
Lambda関数のデプロイ後にバグや不具合などが発生した場合、安全に迅速にロールバックする方法を調査していました。
その中でLambda関数のエイリアスとバージョンを使用した方法が有効そうに見えましたので、実際にやってみました。
目次
Lambda関数のエイリアスとバージョンとは
公式ドキュメントでの案内は下記の通りです。
Lambda 関数のエイリアスの作成
Lambda 関数のバージョンを管理する
Lambdaエイリアスを固定で保持しておいて、バージョンのみ変動することでロールバックが出来る仕組みのようです。
ロールバック方法
まずはLambdaのエイリアスとバージョンを発行します。
マネジメントコンソール上からも発行は可能ですが、今回はSAMテンプレートから実行しようと思います。
まずはsam init
を実行します。
sam init ターミナル(クリックで展開/縮小します)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
$ sam init SAM CLI now collects telemetry to better understand customer needs. You can OPT OUT and disable telemetry collection by setting the environment variable SAM_CLI_TELEMETRY=0 in your shell. Thanks for your help! Learn More: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-telemetry.html You can preselect a particular runtime or package type when using the <code>sam init</code> experience. Call <code>sam init --help</code> to learn more. Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Choose an AWS Quick Start application template 1 - Hello World Example 2 - Data processing 3 - Hello World Example with Powertools for AWS Lambda 4 - Multi-step workflow 5 - Scheduled task 6 - Standalone function 7 - Serverless API 8 - Infrastructure event management 9 - Lambda Response Streaming 10 - Serverless Connector Hello World Example 11 - Multi-step workflow with Connectors 12 - GraphQLApi Hello World Example 13 - Full Stack 14 - Lambda EFS example 15 - Hello World Example With Powertools for AWS Lambda 16 - DynamoDB Example 17 - Machine Learning Template: 1 Use the most popular runtime and package type? (Python and zip) [y/N]: y Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: N Would you like to enable monitoring using CloudWatch Application Insights? For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: N Would you like to set Structured Logging in JSON format on your Lambda functions? [y/N]: N Project name [sam-app]: Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment) ----------------------- Generating application: ----------------------- Name: sam-app Runtime: python3.9 Architectures: x86_64 Dependency Manager: pip Application Template: hello-world Output Directory: . Configuration file: sam-app/samconfig.toml Next steps can be found in the README file at sam-app/README.md Commands you can use next ========================= [*] Create pipeline: cd sam-app && sam pipeline init --bootstrap [*] Validate SAM template: cd sam-app && sam validate [*] Test Function in the Cloud: cd sam-app && sam sync --stack-name {stack-name} --watch |
そのあとにtemplate.yaml
にAutoPublishAlias
を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello_world/ Handler: app.lambda_handler Runtime: python3.9 AutoPublishAlias: live Architectures: - x86_64 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get |
AutoPublishAliasプロパティについては下記をご参照ください。
AutoPublishAlias プロパティが指定されている
AWS::Serverless::Function の AutoPublishAlias プロパティが指定されている場合、AWS SAM は AWS::Lambda::Alias と AWS::Lambda::Version の AWS CloudFormation リソースを生成します。
どうやらエイリアスとバージョンの両方を同時に作成してくれるプロパティのようです。
そして、バージョンが分かりやすいようにhello_world/app.py
を下記の通り変更します。
1 2 3 4 5 6 7 |
return { "statusCode": 200, "body": json.dumps({ "message": "hello world version 1", # "location": ip.text.replace("\n", "") }), } |
ソースコードを変更したらsam build
→ sam deploy --guided
を実行します。
CloudFormationのチェンジセットを確認するとAWS::Lambda::Alias
とAWS::Lambda::Version
が追加されています。
デプロイ完了後、Lambdaコンソールを確認するとエイリアスとバージョン1が作成されていることが分かります。
API Gatewayも確認するとlive
エイリアス付きのLambda関数を指していることが分かります。
では早速、API GatewayからLambdaを実行してみます。
PostmanからAPIを叩くと、version 1のメッセージが返ってきました。
続いて、バグバージョンをデプロイします。
hello_world/app.py
を以下のとおり変更してデプロイしてみます。
1 2 3 4 5 6 7 |
return { "statusCode": 500, "body": json.dumps({ "message": "error version 2",\ # "location": ip.text.replace("\n", "") }), } |
Lambdaコンソールを確認するとバージョン2を指していることが分かります。
API Gatewayは変わらずlive
エイリアス付きのLambda関数を指しています。
同じくPostmanからAPIを叩くと、エラーが返却されました。
ここからロールバックを行います。
ロールバック方法は意外と簡単でLambdaコンソールからバージョンを1つ戻すのみです。
バージョンを1つ戻してみます。
まずは[エイリアス]タブからエイリアスを選択して、[編集]ボタンを押下します。
次に[バージョン]を「1」に変更して[保存]を押下します。
保存後、[バージョン]タブを確認するとエイリアスにバージョン1が紐付いていることが分かります。
戻した後に再度PostmanからAPIを叩いてみます。
すると即座にVersion1が返却されるようになりました。
これでロールバックが完了しました。
さいごに
いかがでしたでしょうか。
ロールバック方法は様々あり、要件に応じて適切な方法が変わってきますが、Lambdaのバージョン管理は環境変数も保持しますので有効な部分があるかもしれません。
投稿者プロフィール
-
2021年4月からスカイアーチに中途入社しました。
AWSともっと仲良くなるべく日々勉強中です。