ECS Fargateでカナリアリリースを導入する
こんにちは、tacomsでSREをやっている佐野です。
今回は、ECS Fargateでカナリアリリースを導入したので、それに関する記事を書いていきたいと思います 🌜
背景
プロダクト、開発組織が拡大するに、以下のような要望が出るようになってきました。
- インフラにおける大きな設定変更において、ワークロードに影響がないか検証したい
- 本番環境でしか検証できない機能があり、影響範囲少なく検証したい
この要望を実現するためにSREはカナリアリリースを導入することとしました。
※なおカナリアリリースの説明はこの記事では行いません。
どんなカナリアリリースを実現したかったのか
要望だけだと実際どんなことをやりたかったのか少し想像しづらいと思うので、もう少し要望を分解してみます。「どんなテストをしたいか」という観点で要望を分解すると以下のようになります。
- 社内ユーザーだけが確認できるようにしたかった
- ユーザートラフィックを使ったテストをしたかった
それぞれ共通しているのが、我々が任意のタイミングで設定を修正して検証したいというものがありました。例えばトラフィックの分割が90:10で設定したい時があったり、その状態でテストを数時間テストしたり、時には何日かおいておくことを想定していました。
検討したこと
実現したかったことを元にどのように実現するかを検討してみます。
我々の基盤はECS Fargateなのですが、この場合カナリアリリースを実現する方法はいくつか存在します。今回は以下2つを検討し、2を採用することとしました。
1. CodeDeployの機能を使用する
CodeDeployの機能で、カナリアリリースを実現するものが存在します。
デプロイの最終判断などもCodeDeployがやってくれます。
2. カナリアリリース用のターゲットグループ、サービス、タスクを作成
既存サーバーと同じ構成で、カナリア用のターゲットグループ、サービス、タスクを作成します。その上で、ALBの重み付けルーティングの設定を変更することでカナリアリリースを実現します。
2を採用した理由は、我々が任意でデプロイや設定を変更できたためです。
1のCodeDeployを使用する場合は、デプロイのタイミングもCodeDeployが判断することになります。我々としてはテストを十分に行い、トラフィックの制御も自分たちのタイミングで行いたかったので、2を最終的に採用しました。
具体的な実現方法
ALBの重み付けルーティングの具体的な設定を書いていきたいと思います。
1.特定headerが送信された場合、カナリア用のサービスにリクエストさせる
要望を分解した時に出てきた「社内ユーザーだけが確認できるようにしたかった」を実現するための設定になります。事前にカナリア用のheaderを自ら定義しておいて、それを付与することでカナリア用のサーバーにリクエストを送信することができます。
例えば以下の画像だとhogehogeというheaderにhogehogeというvalueが入っていれば、カナリア用サーバーにリクエストが届くことになります。
2.ALBの重み付けルーティングでの設定だけ、カナリア用のサーバーにリクエストさせる
要望を分解した時に出てきた「ユーザートラフィックを使ったテストをしたかった」を実現するための設定になります。
カナリアリリースを使用する場合は、terraformで修正するのではなく、手動で修正する運用をしています。理由は、設定修正が簡単でかつ徐々にトラフィックの割合を徐々に修正したかったためです。また検証が終わっれば元に戻す想定ではあるので、そこの認識が取れていればterraformで毎回修正しなくても問題ない判断をしました。
運用
カナリアリリースを使用しない場合は、常にカナリア用のtaskは0にしています。
理由は、カナリアリリース使用時は手動デプロイを想定しているので、いつデプロイされたものなのかわからなる考えたためです。仮にALBの重み付けルーティングの設定を元に戻すのを忘れていた場合かつそのリクエストが成功していたら、元に戻し忘れていることに気づきにくくなると考えました。
またモニタリングに関しては、カナリアリリースを使用してもリリースバージョンごとに変化を観測できるようにしているので、異常があれば事前に気付けるようにしています。
おわりに
SREチームメンバーを中心に徐々に使われるようになってきています。直近のプロジェクトでもカナリアリリースがあることで、修正した内容がワークロードに問題ないと判断でき、自信を持って進めることができた事例も増えていきています。
今後は開発メンバーにもどしどし使っていってもらえるよう、使用事例を増やしていきたいと思います!
参考
Discussion
実は幻の3択目として「外部デプロイ」という自由度の高いものがあります!(あまりおすすめしません)
こんな方法あるんですね!
共有ありがとうございます😊