CircleCIのOrbを利用してECSのBlue/Greenデプロイを行う方法
困っていた内容
CircleCIを利用して、CodeDeployを使用しECSへデプロイを実施したいが、下記のエラーが発生する。
| |
なお、今回のOrbsは2025年4月時点の最新版の7.0.0を参考にしています。
背景
ブルー/グリーンデプロイしているECSサービスは内部的にはupdate-serviceを利用したアップデートはできないように制限がされています。
理由としてはデプロイメントコントローラーがCODE_DEPLOYを利用するように設定されており、この時には、create-deploymentを利用する必要があります。
また、このcreate-deploymentはAppSpec ファイルという、デプロイ後にロードバランサーと接続するための設定情報を用意する必要があり、AppSpecファイルを用意することもなかなかに面倒臭いものです。
これらを簡易にするために、CircleCIではOrbsと呼ばれるパッケージがあり、ECSサービスのOrbsも存在していますが、きちんとパラメータを設定しないと、Orbsのロジックがupdate-serviceの処理に流れてしまい、期待値の動作をしない、ということとなります。
原因
ECSサービスのOrbsのJobをみるとdeploy_service_updateというJobが用意されています。
オプションが様々にありますが、ざざっと読んだ感じで「CodeDeploy 用パラメータ」はcodedeploy_application_nameとcodedeploy_deployment_group_nameだけに見え、また、デプロイメントコントローラーの設定が、CODE_DEPLOYを利用するようになっている必要がある、と初回に読み解きました。(これが間違い)
つまり具体的には、以下の様な設定としていました。
| |
どう対応すれば良いのか?
デプロイメントコントローラーの設定が、
CODE_DEPLOYを利用するようになっている必要がある、と初回に読み解いた
ここが間違いでした。現状のサービスとしてのデプロイメントコントローラーではなく、deployment_controller (deployment controllerではなく、deployment_controller <- アンダースコア)だったのです。つまり、deployment_controllerはパラメータだったのだよー!(な、なんだってー)
正直Jobのパラメータが多すぎてページ内検索しかしてなかったから、気が付いてませんでした。が、改めてよくよく見ると

the deployment_controller って書いてありますね…….
いやぁ、これ気が付かないわぁ・・・。その他、改めてちゃんとパラメータを見るとAppSec用のパラメータもきちんとあります。
というわけで今回の結論
| |
deployment_controllerを入れ忘れると、パラメータは揃っていても Orb は「ECS 標準デプロイ」(aws ecs update-service)側にフォールバックする。codedeploy_load_balanced_container_name,codedeploy_load_balanced_container_portは、AppSpecで使うターゲットコンテナ指定のために必要。
以上。

