Amazon ECS タスクが保留状態のまま止まっているのはなぜですか?

最終更新日: 2022 年 3 月 22 日

Amazon Elastic Container Service (Amazon ECS) タスクが保留状態のまま止まっています。

簡単な説明

ECS タスクが保留状態のまま止まる原因となる一般的なシナリオには次のものがあります。

  • Docker デーモンが応答しない。
  • Docker イメージが大きい。
  • Amazon ECS コンテナエージェントと Amazon ECS サービスとの接続がタスクの起動中に失われた。
  • Amazon ECS コンテナエージェントが既存のタスクを停止するのに長い時間がかかる。
  • Amazon Virtual Private Cloud (Amazon VPC) のルーティングが正しく設定されていない。

解決方法

タスクが保留状態のまま止まっている理由を確認するには、次のトラブルシューティング手順を実行します。

注: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

Docker デーモンが応答しない

CPU の問題については、次の手順を実行します。

1.    Amazon CloudWatch メトリックを使用して、コンテナインスタンスが最大 CPU を超えたかどうかを確認します。

2.    必要に応じて、コンテナインスタンスのサイズを増やします

メモリの問題については、次の手順を実行します。

1.    無料コマンドを実行して、システムで使用可能なメモリ量を確認します。

2.    必要に応じて、コンテナインスタンスのサイズを増やします

I/O 問題については、次の手順を実行します。

1.    iotop コマンドを実行します。

2.    どのサービスのどのタスクが IOPS を最も多く使用しているかを調べます。次に、タスク配置の制約と戦略を使用して、これらのタスクを個別のコンテナインスタンスに分散します。

- または -

CloudWatch を使用して、Amazon Elastic Block Store (Amazon EBS) BurstBalance メトリクスのアラームを作成します。次に、AWS Lambda 関数または独自のカスタムロジックを使用して、タスクのバランスを取ります。

Docker イメージが大きい

画像が大きいとダウンロードに時間がかかるため、タスクが保留状態になる時間が長くなります。

移行時間を短縮するには、ECS_IMAGE_PULL_BEHAVIOR パラメータを調整して、画像キャッシュを活用します。

注: 例えば、ECS_IMAGE_PULL_BEHAVIOR パラメータを /etc/ecs/ecs.configprefer-cached に設定します。prefer-cached が指定されていて、キャッシュされたイメージがない場合、リモートでイメージを取得します。それ以外の場合、インスタンスのキャッシュされたイメージを使用します。

Amazon ECS コンテナエージェントと Amazon ECS サービスとの接続が起動中に失われた

1.    Amazon ECS コンテナエージェントのステータスと接続を検証するには、コンテナインスタンスで次のいずれかのコマンドを実行します。

Amazon Linux 1 の場合:

$ sudo status ecs
$ sudo docker ps -f name=ecs-agent

Amazon Linux 2 の場合:

$ sudo systemctl status ecs
$ sudo docker ps -f name=ecs-agent

注: 出力に「active/running」(アクティブ/実行中) と表示されます。

2.    ECS コンテナインスタンスで実行しているタスクのメタデータを表示するには、コンテナインスタンスで次のコマンドを実行します。

$ curl http://localhost:51678/v1/metadata

次の出力が表示されます。

{
  "Cluster": "CLUSTER_ID",
  "ContainerInstanceArn": "arn:aws:ecs:REGION:ACCOUNT_ID:container-instance/TASK_ID",
  "Version": "Amazon ECS Agent - AGENT "
}

3.    実行中のタスクに関する情報を表示するには、コンテナインスタンスで次のコマンドを実行します。

$ curl http://localhost:51678/v1/tasks

次の出力が表示されます。

{
  "Tasks": [
    {
      "Arn": "arn:aws:ecs:REGION:ACCOUNT_ID:task/TASK_ID",
      "DesiredStatus": "RUNNING",
      "KnownStatus": "RUNNING",
      ... ...
    }
  ]
}

4.    切断されたエージェントに関連している問題については、次のいずれかのコマンドでコンテナエージェントを再起動します。

Amazon Linux 1 の場合:

$ sudo stop ecs
$ sudo start ecs

Amazon Linux 2 の場合:

$ sudo systemctl stop ecs
$ sudo systemctl start ecs

次のような出力が表示されます。

ecs start/running, process xxxx

5.    エージェントの接続を確認するには、関連する時間枠で「エラー」、「警告」、「エージェント移行状態」などのキーワードについて、次のログを確認します。

/var/log/ecs/ecs-agent.log.yyyy-mm-dd-hh にある Amazon ECS コンテナエージェントのログを表示します。
/var/log/ecs/ecs-init.log にある Amazon ECS init ログを表示します。
/var/log/docker にある Docker ログを表示します。

注: Amazon ECS ログコレクターを使用して、一般的なオペレーティングシステムのログ、Docker ログ、および Amazon ECS のコンテナエージェントのログを収集することもできます。

Amazon ECS コンテナエージェントが既存のタスクを停止するのに長い時間がかかる

Amazon ECS コンテナエージェントに、Amazon ECS から開始する新しいタスク (保留から実行まで) を受信したときに停止する古いタスクがある場合、エージェントは古いタスクが停止するまでこれらの新しいタスクを開始しません。

次の 2 つのパラメータを設定して、コンテナインスタンスレベルでコンテナの停止と開始のタイムアウトを制御できます。

1.    /etc/ecs/ecs.config で、コンテナが単独で正常に終了しない場合にコンテナが強制終了されるまでの経過時間を、ECS_CONTAINER_STOP_TIMEOUT パラメータの値に設定します。

注意: Linux および Windows のデフォルト値は 30 秒です。

2.    /etc/ecs/ecs.config で、Amazon ECS コンテナエージェントがコンテナの起動試行を停止するまでの経過時間を、ECS_CONTAINER_START_TIMEOUT パラメータの値に設定します。

注: デフォルト値は、Linux で 3 分、Windows で 8 分です。

エージェントのバージョンが 1.26.0 以降の場合、タスクごとに前述の停止および開始タイムアウトのパラメータを定義できます。これにより、タスクが停止状態に移行する可能性があります。例えば、containerA は、containerB が完了、成功、または正常ステータスに達することに依存していると仮定してください。containerB に startTimeout 値を指定せず、その時間内に containerB が目的のステータスに到達しない場合、containerA は起動しなくなります。

コンテナの依存関係の例については、AWS GitHub の「例: コンテナの依存関係」を参照してください。

Amazon VPC のルーティングが正しく設定されていない

VPC またはサブネットが正しく設定されていないために、Amazon ECS または Amazon ECR にアクセスできない VPC サブネットで Amazon ECS または Fargate タスクが実行されるように設定している可能性があります。この問題を解決するには、サブネットのルートテーブルにインターネットゲートウェイまたは NAT ゲートウェイがあることを確認します。インターネットへの Egress ルートがないサブネットでタスクを起動する場合、AWS PrivateLink を利用して、プライベート IP アドレスを使用して Amazon ECS API にプライベートにアクセスします。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?