ECSの組み込み機能でB/Gデプロイが可能になったので、試したみた
はじめに
いつもの朝の日課でXを眺めていたら、AWS界隈の方々が「ECSの組み込み機能で、B/Gデプロイが可能になったぞ!うおおおおお」っと盛り上がっていました
はじめは「ふーん。CodeDeployが不要になるんやー、便利やなー」位にしか感じてなかったのですが、少し深堀りしていくと、この組み込みのB/Gデプロイ機能
なんと!ServiceConnectを使っているECSサービスでのB/Gデプロイが可能 & ネイティブなサーキットブレーカーも使えるとのことじゃあ〜ないですか!
前者は、ECSサービス間通信手法でServiceConnectを選定するのに、ネガティブ要素になっていた「ServiceConnectを使っているECSサービスはローリングアップデートのみ」を解決してくれる
後者は、「GreenのECSタスクが何回も再起動する状態で、どんだけ頑張っても正常に立ち上がらない状況なのに、即時にデプロイ失敗させてロールバックしてくれない問題」を解決してくれる
これは嬉しい!
ただ、従来のB/Gデプロイは、ターゲットグループ(BlueとGreenで2つ)に対するターゲット登録/解除、ALBのリスナーの更新を自動で行うことで実現されていたので、組み込みのB/Gデプロイだと、どうなるか気になってので、試してみました!
試した内容
検証用のリソースは、アマQに適当に作成して貰う
作成して貰ったリソースの構成はこんな感じ
ロードバランサーと接続が有る、フロントエンドのECSサービスで、デプロイ戦略をローリングアップデートからB/Gに変更してみる
そうすると、ロードバランサーセクションに、従来のB/GデプロイでCodeDeploy側に設定が必要だったものと、ほぼ同じような設定が追加で必要になるので、ロードバランサーと接続が有るECSサービスに関しては、デプロイコントローラーがCodeDeploy
なのかECS
かの違いなだけで、従来のB/Gデプロイと同様の動きになると思われる(Green用のリソースを用意するのが面倒だったので、実際には試してない笑)
ただ、冒頭でも述べたように、ネイティブなサーキットブレーカーが組み込みのB/Gデプロイでは使えるのと、今回の構成のような、ロードバランサーとServiceConnectの両方に接続があるECSサービスだと、従来のB/Gデプロイが使えないので、ロードバランサーと接続が有るECSサービスであっても、従来のB/Gデプロイを選択する必要はないと思われる
次に、ロードバランサーと接続が無い(ServiceConnectと接続のみ)、バックエンドのECSサービスで、デプロイ戦略をローリングアップデートからB/Gに変更してみる
こちらに関しては、デプロイオプション以外で必須の追加設定は不要な模様
この状態で、新しいデプロイを強制して、B/Gデプロイを試してみる
そうすると、ECSサービスのデプロイタブにサービスリビションなる表示が(デプロイタブの表示、他にも色々と変わってる)
ソースがBlue(旧バージョン)、ターゲットがGreen(新バージョン)
暫く待機すると、「現在のデプロイ段階」がベイク時間(Greenのタスクが起動して、トラフィック切り替えを待機している状態)に変化
ロードバランサーと接続が有るECSサービスの場合、このベイク時間でテストトラフィックリスナーを使って、Greenの動作確認を外部からWebアクセスして行なうことができるが、ロードバランサーと接続が無いECSサービスの場合は、これができない
その代わり、ServiceConnect間通信で、HTTPヘッダーを使用した、テストトラフィック用ルールを設けることができるようなので、ネイティブなサーキットブレーカー以外で、Greenの正常性を確認してから、安全にトラフィックを切り替えたい場合は、これが活用できそう
今回は、特にテストトラフィック用ルールは設定してないので、ベイク時間終了で自動でGreenにトラフィックが切り替わってデプロイ完了
具体的に、どのような仕組みでB/Gデプロイが実現されているのかは、ロードバランサーを使ったB/Gデプロイのように、コンソールからは確認することは難しいが、ServiceConnectは内部的にEnvoyを使っているので、EnvoyのB/Gデプロイ機能を使ってるのだろうと妄想
さいごに
B/Gデプロイは、安全なリリースを行うという観点において、非常に有用なデプロイ戦略でしたが、CodeDeployが必要だったり、ServiceConnectが使えないなどなど、若干な導入ハードルがありました
今回のアップデートで、特に問題(コスト問題とか)がなければ、ECSのデプロイ戦略はB/Gデプロイを選択するのが、標準になるかもしれませんね
Discussion