👏

Serverless Framework を使って AWS Lambda の カナリアリリースを実現する

2023/12/06に公開

この記事は 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 に タイプを設定して、 pluginsserverless-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