CircleCIのOrbを利用してECSのBlue/Greenデプロイを行う方法


目次

CircleCIを利用して、CodeDeployを使用しECSへデプロイを実施したいが、下記のエラーが発生する。

1
2
3
4
5


An error occurred (InvalidParameterException) when calling the UpdateService operation: Unable to update task definition on services with a CODE_DEPLOY deployment controller. Use AWS CodeDeploy to trigger a new deployment.

Exited with code exit status 254

なお、今回の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_namecodedeploy_deployment_group_nameだけに見え、また、デプロイメントコントローラーの設定が、CODE_DEPLOYを利用するようになっている必要がある、と初回に読み解きました。(これが間違い)

つまり具体的には、以下の様な設定としていました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

- aws-ecs/deploy_service_update:
          auth:
            - aws-cli/setup:
                region: 'aws-region'
                role_arn: 'aws-role'
          codedeploy_deployment_group_name: 'codedeploy-group'
          codedeploy_application_name: 'codedeploy-name'
          cluster: 'ecs-fargate-cluster'
          container_image_name_updates: 'container=ecs-container-name,tag=ecr-tag-name'
          family: 'ecs-family'
          force_new_deployment: true
          service_name: 'ecs-service'

デプロイメントコントローラーの設定が、CODE_DEPLOYを利用するようになっている必要がある、と初回に読み解いた

ここが間違いでした。現状のサービスとしてのデプロイメントコントローラーではなく、deployment_controller (deployment controllerではなく、deployment_controller <- アンダースコア)だったのです。つまり、deployment_controllerはパラメータだったのだよー!(な、なんだってー)

正直Jobのパラメータが多すぎてページ内検索しかしてなかったから、気が付いてませんでした。が、改めてよくよく見ると

https://res.cloudinary.com/dlhmnejhz/ypzh7c2yihjojpohj5fh.png
the deployment_controller ってかいてあるー!

the deployment_controller って書いてありますね…….

いやぁ、これ気が付かないわぁ・・・。その他、改めてちゃんとパラメータを見るとAppSec用のパラメータもきちんとあります。

というわけで今回の結論

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

- aws-ecs/deploy_service_update:
          auth:
            - aws-cli/setup:
                region: 'aws-region'
                role_arn: 'aws-role'
          codedeploy_deployment_group_name: 'codedeploy-group'
          codedeploy_application_name: 'codedeploy-name'
          cluster: 'ecs-fargate-cluster'
          container_image_name_updates: 'container=ecs-container-name,tag=ecr-tag-name'
          family: 'ecs-family'
          force_new_deployment: true
          service_name: 'ecs-service'
          ## 追記
          deployment_controller: "CODE_DEPLOY"
          codedeploy_load_balanced_container_name: 'ecs-container-name'
          codedeploy_load_balanced_container_port: '80'
  • deployment_controller を入れ忘れると、パラメータは揃っていても Orb は「ECS 標準デプロイ」(aws ecs update-service)側にフォールバックする。
  • codedeploy_load_balanced_container_name , codedeploy_load_balanced_container_port は、AppSpecで使うターゲットコンテナ指定のために必要。

以上。