カナリアリリースについて考える
構成
API サーバー : ECS on Fargate
DB サーバー : RDS
Service Mesh : App Mesh
前提条件
すでに 1 つの ECS Service / Task(A と呼ぶ)が動作している
アプリケーションログのエラーレートを計測する基盤が整っている
手順
機能開発・修正を行う
新しいバージョンのアプリケーションをすでに動作している Service とは別の Service(B と呼ぶ)にデプロイする
デプロイが完了したあと、A と B に適切な比重でルーティングする
例えば A : B = 9 : 1 など
基本的に A の値は B の値と比較して十分大きい数とする
エラーレートを確認する
B のエラーレートが A のエラーレートと比較して無視できない差が生じていた場合
B を落とす(Task の数を 0 にする)
機能開発・修正を行う(はじめに戻る)
B のエラーレートが A のエラーレートと比較して有意な差が生まれていない場合は次に進む
A と B のルーティング比重を変更する
先程の値よりも B の値を大きくする
例えば A : B = 5 : 5
エラーレートを確認する
すべてのリクエストを B に向ける
A : B = 0 : 10
エラーレートを確認する
A へのリクエストが無くなったことを確認する
A を落とす
デプロイ完了
メリデメ
メリット
新規デプロイしたバージョンにバグが含まれていてもすぐに旧バージョンに切り戻すことができる
本番のトラフィック内でテストを行うことができる
デメリット
稼働サーバーが 1 台増えることによるコスト増
考慮すべき事項
DB マイグレーションを伴うデプロイが行われそこにバグが含まれていた場合 DB 側をどのように切り戻すか
また、切り戻しによるデータ不整合は発生しないか
RDS の Blue / Green Deployment を併用することでクリアできるか
上記機能を使用する場合、RDS も 1 台増えることによりコスト増となる
必要なもの
ルーティング比重を変更するツール
エラーレートを確認して、次に行うべき手順を判定する仕組み
ルーティング比重を変更するツール
以下の理由により App Mesh の定義を変更するツールの導入が必要そう
App Mesh はアプリケーションというよりはインフラであるため terraform で定義されがち
ただその場合、ルーティング比重を変更する度(つまりアプリケーションデプロイ毎)に terraform を変更する必要がある
アプリケーションデプロイ毎に terraform を変更するのは運用的にしんどい
エラーレートを確認して、次に行うべき手順を判定する仕組み
カナリアリリースは基本的にエラーレートと相談してデプロイの方針を決定する、というデプロイ手法であるためこちらの機能が肝となる
どのバージョンのエラーレートが大きくなっているかをログからトラッキングできるように、ログにメタタグを付与する必要がありそう
新バージョンのエラーレートが大きくなっていることを確認した際に、自動的に旧バージョンにすべてのリクエストをルーティングできるように変更できる仕組みが必要
実行のトリガーは APM ツールに任せる
実行場所はどこか?APM ツールから Lambda 等を呼び出すことができれば良い?
ルーティング比重を変更するツールについて
こちらの設計について考えてみる
やりたきことの整理
Route にてリクエストをどの Node にルーティングするかを定義するため、こちらを変更するツールを作成する
こちらに付随して、Node も定義できるほうがおそらく便利
... という具合に芋づる式で App Mesh のリソースをこちらのツールで定義したほうがやりやすいとなりそう
(なんだかんだ terraform のリソースで表現するほうがわかりやすいので)terraform リソースで言うところの以下のリソースをこちらのツールで定義できるようにすることが望ましいと思われる
aws_appmesh_route
aws_appmesh_virtual_router
aws_appmesh_virtual_node
aws_appmesh_virtual_service
aws_appmesh_virtual_gateway
aws_appmesh_gateway_route
どの Node に新旧どちらのバージョンがデプロイされているかを追うことができる
ECS デプロイの機能は搭載するべきか?
ある程度密に連携できるようにはしておくべきとは考えている
CI(GitHub Actions)で実行可能なツールを作成する
懸念事項
EKS では AWS 公式が Operator を作成している
ECS でも公式が作成してくる可能性はある。その場合もれなく公式のものが完全上位互換になるため、そうなると悲しみがある
まあいいけど
ECS Blue / Gleen Deployment でも目的が達成できるのでは?
Code Deploy を利用すれば ECS Blue / Green Deployment ができるようになるらしい
ただ、カナリアリリースと Blue / Green Deployment は別物
せっかく App Mesh を導入しているので、App Mesh のツールでカナリアリリース以外の機能も諸々サポートされていると旨味がありそうな気がしている