👏
Serverless Framework を使って AWS Lambda の カナリアリリースを実現する
この記事は mob Advent Calendar 6日目の記事になります。
今日は Serverless Framework を使って カナリアリリースを実現する方法を紹介します。
Pulgin のインストール
まずは Plugin をインストールします。
$ npm i --save-dev serverless-plugin-canary-deployments
設定する
元がこのような設定になっているとします。
service: sample-service
useDotenv: true
provider:
name: aws
runtime: java17
stage: ${opt:stage, 'dev'}
region: ap-northeast-1
...
package:
artifact: path/to/artifact.jar
functions:
api:
handler: com.xxx.LineEventHandler
timeout: 30
events:
- http:
path: line/webhook/{userId}/{chatBotId}
method: post
こんな感じで deploymentSettings
に タイプを設定して、 plugins
に serverless-plugin-canary-deployments
を設定します。
service: sample-service
useDotenv: true
provider:
name: aws
runtime: java17
stage: ${opt:stage, 'dev'}
region: ap-northeast-1
...
package:
artifact: path/to/artifact.jar
functions:
api:
handler: com.xxx.LineEventHandler
timeout: 30
events:
- http:
path: line/webhook/{userId}/{chatBotId}
method: post
+ deploymentSettings:
+ type: Linear10PercentEvery1Minute
+ alias: Live
+plugins:
+ - serverless-plugin-canary-deployments
type には 下記を設定できます。
- Canary10Percent5Minutes ( 10%リリースして、 5min後に残りをリリース )
- Canary10Percent10Minutes ( 10%リリースして、 10min後に残りをリリース )
- Canary10Percent15Minutes ( 10%リリースして、 15min後に残りをリリース )
- Canary10Percent30Minutes ( 10%リリースして、 30min後に残りをリリース )
- Linear10PercentEvery1Minute ( 1分ごとに10%リリース )
- Linear10PercentEvery2Minutes ( 2分ごとに10%リリース )
- Linear10PercentEvery3Minutes ( 3分ごとに10%リリース )
- Linear10PercentEvery10Minutes ( 10分ごとに10%リリース )
- AllAtOnce ( 一括でリリース )
deploy する
通常通り deploy コマンドを叩きます。
$ serverless deploy
初回はアプリケーションに登録されるだけで、リリースは一括で行われます。
次回からはデプロイに登録されるようになります。(下記は 3つ Function をデプロイしています)
下記のように CloudWatch Alarm や Hook の設定もできます。
...
functions:
hello:
handler: handler.hello
events:
- http: GET hello
deploymentSettings:
type: Linear10PercentEvery1Minute
alias: Live
preTrafficHook: preHook
postTrafficHook: postHook
alarms:
- FooAlarm
- name: BarAlarm
preHook:
handler: hooks.pre
postHook:
handler: hooks.post
ロールバック
もし問題があった場合はロールバックできます。まずは、下記コマンドでデプロイリストを出します。
$ serverless deploy list
ロールバックしたいデプロイメントのタイムスタンプを見つけて、下記コマンドでロールバックすることができます。
$ serverless rollback -t <タイムスタンプ>
Discussion