- これは
- はじめに
- コンテナの pull に失敗した場合 (例えば、コンテナイメージが存在しない場合)
- コンテナの起動に失敗した場合 (アプリケーションの異常終了)
- ecspresso rollback
- circuit breaker 機能
- メモ
- 以上
これは
YAMAP エンジニア Advent Calendar 2021 の第 16 日目の記事にします。
はじめに
YAMAP では、全てのプロジェクトにおいて ECS 上にアプリケーションを展開していて、デプロイには ecspresso を利用しています。これまでに、特にデプロイが失敗したことで、サービスの障害につながるようなケースは発生していませんが、ECS のデプロイが失敗した際の挙動について確認したいと思ったので、実際にデプロイ失敗時の挙動を確認してみました。
尚、この検証を行ったのは、2021 年の 8 月中旬となりますので、場合によっては、異なる挙動となるかもしれませんのご注意下さい。
コンテナの pull に失敗した場合 (例えば、コンテナイメージが存在しない場合)
- ecspresso に設定したタイムアウトまでは待機する
- ECS の deployment にデプロイが滞留してしまう
- コンテナイメージの所在を正しく設定して、デプロイを再実行することで、滞留していたデプロイも削除される
コンテナの起動に失敗した場合 (アプリケーションの異常終了)
- ecspresso に設定したタイムアウトまでは待機する
- deployment にデプロイが滞留してしまう
- アプリケーションを修正し (コンテナイメージを登録し直して)、正しいデプロイを再実行することで、滞留していたデプロイも削除される
ecspresso rollback
- 一つ前の正常に動いていたタスク定義に自動的に戻してくれる、rollback という便利なコマンドが用意されている
- コンテナイメージタグが固定だと、タスク定義をロールバックしても、コンテナイメージは更新されてしまっていると、rollback の意味を成さない
- デプロイ毎にコンテナイメージタグはユニークにする必要がある
circuit breaker 機能
- https://aws.amazon.com/jp/blogs/news/announcing-amazon-ecs-deployment-circuit-breaker-jp/
- 以下の
"failedTasks": 5,
がインクリメントされて、10
になったら、自動的にデプロイがロールバックする
$ aws ecs describe-services --services test-service --cluster test-cluster --query services[].deployments [ [ { "id": "ecs-svc/12345678901234567890", "status": "PRIMARY", "taskDefinition": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxxx:task-definition/test-task:12", "desiredCount": 1, "pendingCount": 1, "runningCount": 0, "failedTasks": 5, "createdAt": "2021-08-02T16:09:29.510000+09:00", "updatedAt": "2021-08-02T16:09:29.510000+09:00", "launchType": "EC2", "rolloutState": "IN_PROGRESS", "rolloutStateReason": "ECS deployment ecs-svc/12345678901234567890 in progress." }, { "id": "ecs-svc/99999999999999999999", "status": "ACTIVE", "taskDefinition": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxxx:task-definition/test-task:11", "desiredCount": 1, "pendingCount": 0, "runningCount": 1, "failedTasks": 0, "createdAt": "2021-08-02T16:06:15.444000+09:00", "updatedAt": "2021-08-02T16:10:04.498000+09:00", "launchType": "EC2", "rolloutState": "COMPLETED", "rolloutStateReason": "ECS deployment ecs-svc/99999999999999999999 completed." } ] ]
メモ
ecspresso の使い方
ecspresso init
ECS サービスの定義、最新のタスク定義を取得出来る。
ecspresso init --region ap-northeast-1 \ --cluster test-cluster \ --service test-service \ --config test-service.yaml
ecspresso deploy
ECS サービスを更新する。
ecspresso deploy --config test-service.yaml
以上
Nヶ月後の自分の為に書きました。