ようへいの日々精進XP

よかろうもん

ECS デプロイが失敗した際の挙動を確認 〜 Nヶ月後の自分の為に 〜

これは

YAMAP エンジニア Advent Calendar 2021 の第 16 日目の記事にします。

qiita.com

はじめに

YAMAP では、全てのプロジェクトにおいて ECS 上にアプリケーションを展開していて、デプロイには ecspresso を利用しています。これまでに、特にデプロイが失敗したことで、サービスの障害につながるようなケースは発生していませんが、ECS のデプロイが失敗した際の挙動について確認したいと思ったので、実際にデプロイ失敗時の挙動を確認してみました。

尚、この検証を行ったのは、2021 年の 8 月中旬となりますので、場合によっては、異なる挙動となるかもしれませんのご注意下さい。

コンテナの pull に失敗した場合 (例えば、コンテナイメージが存在しない場合)

  • ecspresso に設定したタイムアウトまでは待機する
  • ECS の deployment にデプロイが滞留してしまう
  • コンテナイメージの所在を正しく設定して、デプロイを再実行することで、滞留していたデプロイも削除される

コンテナの起動に失敗した場合 (アプリケーションの異常終了)

  • ecspresso に設定したタイムアウトまでは待機する
  • deployment にデプロイが滞留してしまう
  • アプリケーションを修正し (コンテナイメージを登録し直して)、正しいデプロイを再実行することで、滞留していたデプロイも削除される

ecspresso rollback

  • 一つ前の正常に動いていたタスク定義に自動的に戻してくれる、rollback という便利なコマンドが用意されている
  • コンテナイメージタグが固定だと、タスク定義をロールバックしても、コンテナイメージは更新されてしまっていると、rollback の意味を成さない
    • デプロイ毎にコンテナイメージタグはユニークにする必要がある

circuit breaker 機能

$ 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ヶ月後の自分の為に書きました。