概要
AWS CloudformationでECSのblue/greenデプロイを構築中、サービスの中身を更新したらUnable to update task definition...
というエラーになりました。原因を備忘録として残しておきます。
エラー内容
DesiredCount
(希望するタスク数)を変更したく、Parameters
で定義したTaskDeployNumWeb
の数値を0
から1
に変えて実行しました。
(マネコンからいじってもいいですが、保守性を高めるためにCF更新で行おうと思ったため)
しかし、Cloudformation実行後、以下のエラーになりました。
Resource handler returned message: "Invalid request provided: UpdateService error: Unable to update task definition on services with a CODE_DEPLOY deployment controller. Use AWS CodeDeploy to trigger a new deployment. (Service: AmazonECS; Status Code: 400; Error Code: InvalidParameterException; Request ID: XXXXXXXX; Proxy: null)" (RequestToken: XXXXXXXX, HandlerErrorCode: InvalidRequest)
該当箇所は以下。
ServiceXXX:
Type: AWS::ECS::Service
DependsOn: HttpListenerRuleWebBlue
Properties:
Cluster: !Sub ${rEcsName}
DesiredCount: !Ref TaskDeployNumWeb # Parametersで数値を割り当てています
ServiceName: !Sub ${SysTag}
LaunchType: "EC2"
PlacementStrategies:
- Field: "attribute:ecs.availability-zone"
Type: spread
- Field: "instanceId"
Type: spread
DeploymentController:
Type: CODE_DEPLOY
LoadBalancers:
- TargetGroupArn: !Ref TargetGroupWebBlue
ContainerPort: 80
ContainerName: Web
TaskDefinition: !Ref TaskXXX
原因
エラーメッセージは、まずDeploymentController
がCODE_DEPLOY
で設定されている場合、タスク定義の更新が制限されている、ということを示しています。つまり、CODE_DEPLOY
デプロイメントコントローラーを使用している場合は、サービスを更新することはできないよ〜ということを言っているのです。
結論、どうすればいいか?というと、CFで行うためにはタスク定義から作り直さないといけないようです。しかもデプロイも必要だ、と...。
うーん、、もうbuildspec.yaml
とかで諸々設定していたので、それは面倒だなぁ...となりますた。
ということで、マネジメントコンソールから「サービスの更新」→「必要なタスク」を1
にして対応としました。