CircleCIを利用したカナリアデプロイの紹介

記事タイトルとURLをコピーする

こんにちは。サーバーワークスでCloud AutomatorのSREチームで開発・運用を担当している尾崎です。
この記事は、SREチームが主体となって取り組んだCI/CD改善の後編になります。 前回はCDを別リポジトリに切り出すなどの工夫でCI/CDのメンテナンス性を改善した内容をお届けしました。

blog.serverworks.co.jp

今回の記事ではCI/CDのメンテナンス性を改善したことで達成できた、CircleCIを利用したカナリアデプロイについて紹介します。

従来の課題

Cloud Automatorは複数のアプリケーションで構成されているというのは前回の記事でも書きましたが、その中のアプリケーションのデプロイがインプレースデプロイとなっており、デプロイするたびに新しいコードが一度に全ユーザーに影響してしまうという課題がありました。

もちろんデプロイを行う前にQA環境で動作確認やパフォーマンスの計測をしてはいるものの、本番環境でしか再現できないバグや考慮漏れが発生することもあり、ユーザーに影響が出てしまうだけでなく、開発者にとってもデプロイが辛いものとなっていました。

そのため、SREチーム主導でこのアプリケーションデプロイにカナリアデプロイを導入し、以下を実現させました。

  • デプロイのたびに、一度に全ユーザーへ影響がでないようにする
  • 新しいコードの影響を徐々に展開させていくことで開発者の精神的安心も担保する

Cloud Automatorでは主にCircleCIを利用したCI/CDを行っており、カナリアデプロイについてもCircleCIを利用して実現しています。
続くセクションでは、CircleCIでカナリアデプロイを実現させる際に行った工夫を紹介します。

CircleCIの手動承認機能を利用してカナリアの昇格・ロールバックを行う

CircleCIのワークフローには手動承認機能があり、この機能を利用することで、デプロイジョブの進行を選択できます。

今回対象としているアプリケーションはカナリアの昇格・ロールバックを手動で行いたかったので、この手動承認機能を利用して、カナリアをデプロイしたあと、一定期間後にカナリアを「昇格する」か「ロールバックする」かを手動で選択するように構成しています。

f:id:swx-ozaki:20220222172801p:plain

この手動承認のおかげで、CircleCIを利用したカナリアデプロイは比較的簡単に実現できました。

カナリアの昇格(ロールバック)後に誤操作によるロールバック(昇格)を行わせない

CircleCIのワークフローの特徴として、承認待ちになっているフローを任意のタイミングで進められる、というものがあります。
CircleCIによるカナリアデプロイは比較的簡単に導入が可能でしたが、誤操作でカナリアを昇格(もしくはロールバック)した後にもう一方のフローを進めてしまうと、意図しないアプリケーションデプロイとなってしまいます。特にカナリアをロールバックした後、仮に誤操作でカナリアの昇格フローを進めてしまうと、回避できるはずだったバグが全ユーザーに影響してしまいます。

f:id:swx-ozaki:20220222172923p:plain

これを解決するために、昇格(もしくはロールバック)後にワークフロー自体をキャンセルするという処理をデプロイフローに加えました。

CircleCIの設定ファイルで以下のジョブを定義し、ワークフローの最後で実行しています。

jobs:
  end_workflow:
    executor: "default"
    steps:
    - run:
        name: "End workflow"
        command: |
          curl -X POST \
          -H "Circle-Token: ${CIRCLECI_TOKEN}" \
          "https://circleci.com/api/v2/workflow/${CIRCLE_WORKFLOW_ID}/cancel" 

環境変数 CIRCLECI_TOKEN は別途設定が必要ですが、CIRCLE_WORKFLOW_ID はCircleCI側がワークフローごとに自動定義するため、設定不要です。

これにより、デプロイフローのどちらかを選択すると他のフローは進められないように構成できました。

f:id:swx-ozaki:20220222173315p:plain

まとめ

前回のCI/CDメンテナンス改善でCDの修正を容易にできるようにさせたことで、今回紹介するCircleCIを利用したカナリアデプロイができるようになり、ユーザーだけでなく開発者にも以下のようなメリットが生まれました。

  • デプロイのたびに全ユーザーへ影響がでる状態を回避する
  • 新しいコードの影響を徐々に展開させていくことで開発者の精神的安心も担保する

特に後者の開発者の精神的安心は目に見えないものの、安定してサービスを提供していくうえではとても大事なものだと考えており、そこに寄与できたのはとても良かったと考えています。

CI/CDの改善を2回の記事でお送りしました。今後も折を見てCloud Automator SREチームの取り組みを紹介していければと思っています。