ecs-cliでECSを操作している際に以下のエラーが発生して、サービスの削除も追加もできない状態になってしまいました。
$ ecs-cli compose --file docker-compose.test.yml service down
ERRO[0000] Error updating service error="InvalidParameterException: At least one of maximumPercent or minimumHealthyPercent must be present in DeploymentConfiguration\n\tstatus code: 400, request id: ad136f04-c544-11e8-845c-12345" service=test-app
FATA[0000] InvalidParameterException: At least one of maximumPercent or minimumHealthyPercent must be present in DeploymentConfiguration
status code: 400, request id: ad136f04-c544-11e8-845c-12345
結論から言うと、一度scaleを0にしてからservice rm
することで対処することができました。
$ ecs-cli compose --file docker-compose.test.yml service scale 0 --deployment-max-percent 200 --deployment-min-healthy-percent 50
INFO[0000] Updated ECS service successfully deployment-max-percent=200 deployment-min-healthy-percent=50 desiredCount=0 serviceName=test-app
INFO[0000] Service status desiredCount=0 runningCount=2 serviceName=test-app
INFO[0015] Service status desiredCount=0 runningCount=0 serviceName=test-app
INFO[0015] (service test-app) has stopped 2 running tasks: (task 70bbc563-36cf-42b8-bd45-12345) (task 8fc51952-acb8-4de2-8c2c-12345). timestamp="2018-10-01 07:11:52 +0000 UTC"
INFO[0015] (service test-app) has reached a steady state. timestamp="2018-10-01 07:12:02 +0000 UTC"
INFO[0015] ECS Service has reached a stable state desiredCount=0 runningCount=0 serviceName=test-app
$ ecs-cli compose --project-name test-app --file docker-compose.test.yml service rm
INFO[0000] Deleted ECS service service=test-app
INFO[0000] ECS Service has reached a stable state desiredCount=0 runningCount=0 serviceName=test-app
$ ecs-cli ps
Name State Ports TaskDefinition Health
70bbc563-36cf-42b8-bd45-12345/ruby STOPPED ExitCode: 137 80->80/tcp test-app:3 UNKNOWN
このエラーはdeploymentConfigurationを定義しなかったことにより、Rolling updateがうまく動作しなかったことが原因なのではないかと思ったので、以下のドキュメントを再度確認して適切な設定を試みました。
サービス定義パラメーター - Amazon Elastic Container Service
deploymentConfiguration
デプロイ時に実行されるタスクの数と、タスクの停止および開始の順序を制御するオプションのデプロイパラメーター。maximumPercent
maximumPercent パラメーターは、デプロイ時に RUNNING または PENDING 状態にできるサービスのタスクの上限数を desiredCount のパーセント値 (最も近い整数に切り下げ) で表します。このパラメーターを使用すると、デプロイのバッチサイズを定義できます。たとえば、レプリカサービスで desiredCount が 4 タスク、maximumPercent 値が 200% とすると、スケジューラは 4 つの古いタスクを停止する前に、4 つの新しいタスクを開始できます (そのために必要なクラスターリソースを使用できることが前提)。レプリカサービスの maximumPercent のデフォルト値は 200% です。デーモンサービスタイプを使用している場合、maximumPercent はデフォルト値の 100% のままにする必要があります。
デプロイ時のタスクの最大数は、desiredCount に maximumPercent/100 を乗算したもので、最も近い整数値に切り下げられます。
デプロイ時におけるサービスのタスクの上限数ということで、リソースに余裕があるのであれば早さを重視して200%でいいですね。
minimumHealthyPercent
minimumHealthyPercent は、デプロイ時に RUNNING 状態に保つ必要のあるサービスのタスクの下限数を desiredCount のパーセント値 (最も近い整数値に切り上げ) で表します。このパラメーターにより、追加のクラスターキャパシティーを使用せずにデプロイできます。たとえば、サービスで desiredCount が 4 タスク、minimumHealthyPercent が 50% とすると、スケジューラは 2 つの新しいタスクを開始する前に、2 つの既存のタスクを停止してクラスターのキャパシティーを解放できます。ロードバランサーを使用しないサービスのタスクは、RUNNING 状態にある場合、正常と見なされます。ロードバランサーを使用するサービスのタスクは、タスクが RUNNING 状態にあり、ロードバランサーをホストするコンテナインスタンスが正常と報告された場合に、正常と見なされます。レプリカサービスの minimumHealthyPercent のデフォルト値は、AWS マネジメントコンソール では 50%、AWS CLI、AWS SDK、API では 100% です。デーモンサービスの minimumHealthyPercent のデフォルト値は、AWS CLI、AWS SDK、API では 0%、AWS マネジメントコンソール では 50% です。デプロイ時の正常なタスクの最小数は、desiredCount に minimumHealthyPercent/100 を乗算したもので、最も近い整数値に切り上げられます。
こちらはサービスが半分維持できていればいいので50%でよさそうです。
ということで、maximumPercentは200、minimumHealthyPercentは50で定義しました。
(ドキュメント中にはデフォルト値が同じ値で定義されていると書いてあるので、もしかすると直接の原因ではなかったかもしれません。)