🦭

【ECS on EC2】タスクがプロビジョ二ングで停止してしまった時の確認事項

2024/12/11に公開

前提

  • ECS on EC2を使用している環境で、タスクがPROVISIONING状態から先に進まずに停止してしまう。

確認ポイント

1. EC2インスタンスのリソース確認

タスク定義で要求しているvCPU・メモリ量が、EC2インスタンス側のリソース上限を超えていないか確認してください。

2. ECSクラスタ設定の反映

起動テンプレートのユーザーデータで、EC2を正しくECSクラスタに紐付ける設定が行われていることを確認します。

例: user_data.sh

#!/bin/bash
echo ECS_CLUSTER=${cluster_name} >> /etc/ecs/ecs.config

Terraform例:

user_data = base64encode(templatefile("${path.module}/user_data.sh", {
    cluster_name = var.cluster_name
}))

3. EC2インスタンスのIAMロール権限不足

EC2インスタンスに付与したIAMロールが、ECSへの登録やECR・CloudWatch Logsなどへのアクセスに必要な権限を持っているか確認してください。AmazonEC2ContainerServiceforEC2Role のポリシーを持っていれば十分です。

また、ロールの信頼ポリシーに以下のような設定があるか確認します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

4. ヘルスチェックエンドポイントの有無

タスク内のコンテナが正常に稼働していることを示すため、/healthなどのHTTPエンドポイントで200 OKを返すにします。

5. ネットワーク構成の確認

  • プライベートサブネット内にインスタンスがある場合:ECSエージェントがECS/ECRにアクセスするため、VPCエンドポイントまたはNATゲートウェイが必要です。
  • パブリックサブネットにインスタンスがある場合:インターネットへの直接アクセスが可能なため、上記は不要です。

自分はプライベートサブネット内にインスタンスを配置して、半日以上無駄にしました😭😭😭

参考

https://stackoverflow.com/questions/63123466/all-tasks-on-an-ecs-service-stuck-in-provisioning-state

https://repost.aws/questions/QU6wyUfAxRSFyDLz1YEUlWag/deploying-ecs-task-definition-through-is-stuck-on-provisioning

Discussion