Amazon ECS タスクが停止するのはなぜですか?

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

Amazon Elastic Container Service (Amazon ECS) タスクが停止しました。Amazon ECS タスクを停止させる問題のトラブルシューティング方法を教えてください。

簡単な説明

Amazon ECS タスクは、さまざまな理由で停止することがあります。最も一般的な理由を以下に示します。

  • 不可欠なコンテナが終了した
  • Elastic Load Balancing (ELB) ヘルスチェックが失敗した
  • コンテナのヘルスチェックが失敗した
  • 異常なコンテナインスタンス
  • 基盤のインフラストラクチャのメンテナンス
  • サービススケーリングイベントがトリガーされた
  • ResourceInitializationError
  • CannotPullContainerError
  • ユーザーによりタスクが停止された

停止したタスクと停止した理由の相関関係を理解しておくと、トラブルシューティングに必要な労力を軽減できます。

解決方法

DescribeTasks API を使用して、停止したタスクの詳細を表示できます。ただし、停止したタスクの詳細は、返される結果に 1 時間だけ表示されます。停止したタスクの詳細をより長く表示するには、この AWS CloudFormation テンプレートを使用して、タスクが停止したときにトリガーされる EventBridge イベントの Amazon CloudWatch ログを保存できます。

停止した理由

タスク内の不可欠なコンテナが終了した

すべてのタスクには、不可欠なコンテナが少なくとも 1 つ必要です。コンテナの不可欠なパラメーターが true としてマークされ、そのコンテナが何らかの理由で失敗または停止した場合、そのタスクの一部である他のすべてのコンテナは停止します。この原因でタスクが終了した理由を理解するには、DescribeTasks API を使用して終了コードを特定し、この記事の「一般的な終了コード」セクションに移動してください。

タスクが ELB ヘルスチェックに失敗した

ELB ヘルスチェックが原因でタスクが失敗した場合は、コンテナセキュリティグループが ELB から発信されるトラフィックを許可していることを確認してください。以下の点を考慮してください。

  • ヘルスチェックの最低猶予期間を定義します。これは、タスクがインスタンス化された後、事前定義済み期間は Elastic Load Balancing ヘルスチェックを無視するようにサービススケジューラに指示します。
  • デフォルトでは、ターゲットがターゲットグループに登録され、最初のヘルスチェックに合格すると、そのターゲットがリクエストの完全なシェアを受信し始めます。スロースタートモードを使用すると、ロードバランサーがリクエストの完全なシェアを送信する前に、ターゲットにウォームアップする時間が与えられます。
  • サービスの CPU およびメモリのメトリクスをモニタリングします。例えば、CPU が高いと、アプリケーションが応答しなくなり、502 エラーが発生する可能性があります。
  • アプリケーションログでアプリケーションエラーを確認します。
  • ping ポートとヘルスチェックパスが正しく設定されているかどうかを確認します。
  • Amazon Elastic Compute Cloud (Amazon EC2) 内からヘルスチェックパスを Curl で実行し、レスポンスコードを確認します。

コンテナのヘルスチェックが失敗した

ヘルスチェックは TaskDefinition API または Dockerfile で定義できます。

DescribeTasks API オペレーションを使用して、個々のコンテナとタスクの両方のヘルスステータスを表示できます。

ヘルスチェックコマンドの終了ステータスでコンテナが正常であることが示されていることを確認してください。タスク定義で指定されたログドライバ設定を使用して、コンテナログにアプリケーションエラーがないか確認します。値は次のとおりです。

  • 0: 成功 – コンテナは正常で、使用できる状態です。
  • 1: 以上 – コンテナは正常に動作していません。
  • 2: 予約済み – この終了コードは使用しないでください。

(インスタンス i-xx) (ポート x) が (ヘルスチェックが失敗した理由) で異常

これは、コンテナのステータスが異常であることを示します。この問題を解決するには、次の手順を実行します。

  • コンテナインスタンスにアタッチされたセキュリティグループがトラフィックを許可していることを確認します。
  • バックエンドから遅滞なく正常な応答があることを確認します。
  • 応答時間の値を正しく設定します。
  • 詳細については、ロードバランサーのアクセスログを確認してください。

サービス ABCService: ECS は、タスクをホストする基盤のインフラストラクチャでメンテナンスを実行している

これはタスクのメンテナンスの問題が原因でタスクが停止されたことを示します。詳細については、「AWS Fargate タスクのメンテナンス」を参照してください。

サービスでは、指定されたスケジューリング戦略に従い、タスクが停止または失敗したときにタスクが再スケジュールされます。コンテナインスタンスが Auto Scaling グループの一部である場合、新しいコンテナインスタンスを起動してタスクを配置する必要があります。詳細については、「Auto Scaling グループのスケーリングアクティビティの確認」を参照してください。

ECS サービススケーリングイベントがトリガーされた

これは標準のサービスメッセージです。Amazon ECS は、Application Auto Scaling サービスを活用して、この機能を提供しています。ECS サービスには、タスクの数を自動的に増減する機能があります。以下の手順を実行してください。

  • CloudWatch アラームを確認します。
  • デプロイがスケジュールされているかどうかを確認します。

ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed (ResourceInitializationError: シークレットまたはレジストリ認証をプルできません: 実行リソースの取得に失敗しました)

このエラーを解決するには、「Amazon ECS で「unable to pull secrets or registry auth」(シークレットまたはレジストリー認証をプルできません) というエラーのトラブルシューティング方法を教えてください。」を参照してください

    CannotPullContainerError

    このエラーは、使用されているタスク実行ロールに Amazon ECS と通信するアクセス許可がないことを示します。この問題を解決するには、次の手順を実行します。

    • タスク実行ロールに必要なアクセス許可があることを確認します。Amazon ECS には、ほとんどのユースケースのアクセス許可が含まれている AmazonECSTaskExecutionRolePolicy という管理ポリシーが用意されています。
    • ECR サービスエンドポイントecr.region.amazonaws.comdkr.ecr.region.amazonaws.com にアクセスできることを確認します。
    • 認証が必要なプライベートイメージの場合は、repositoryCredentialscredentialsParameter が正しい情報で定義されていることを確認します。詳細については、「タスクのプライベートレジストリの認証」を参照してください。

    ユーザーによりタスクが停止された

    これはタスクが StopTask を受信したことを示します。userIdentity 情報の CloudTrail で StopTask を表示すると、呼び出しを開始したユーザー特定できます。

    一般的な終了コード

    • 0 – Entrypoint、success、または CMD が実行を完了しているため、コンテナが停止しています。
    • 1 – アプリケーションエラーを表します。詳細については、アプリケーションログを確認してください。
    • 137 – タスクがコンテナの強制終了 (SIGKILL) であった場合に発生します。
      SIGKILL が送信された後、デフォルトの 30 秒以内に SIGTERM に応答できない場合、コンテナは強制停止します。デフォルトの 30 秒の期間は、ECS_CONTAINER_STOP_TIMEOUT パラメータを使用して ECS コンテナエージェントで設定できます。
      これはメモリ不足 (OOM) の状況でも発生する可能性があります。CloudWatch メトリクスを確認して、OOM が発生したかどうかを確認します。
    • 139 – セグメンテーション違反が発生した場合に発生します。使用できないメモリ領域にアプリケーションがアクセスしようとしたか、未設定または無効な環境変数がある可能性があります。
    • 255 – コンテナ内の ENTRYPOINT CMD コマンドがエラーにより失敗した場合に発生します。CloudWatch ログを確認してください。

    一般的なエラーメッセージ

    No Container Instances were found in your cluster (クラスターにコンテナインスタンスがありません)

    クラスターのコンテナインスタンスセクションを確認します。必要に応じて、コンテナインスタンスを起動できます。

    InvalidParameterException

    TaskDefinition で定義されているパラメータが存在し、ARN が正しいことを確認します。タスクロールタスク実行ロールに十分なアクセス許可があることを確認します。

    You've reached the limit of the number of tasks you can run concurrently (同時に実行できるタスク数の上限に達しました)

    制限の詳細については、ECS のサービスクォータを参照してください。

    それ以外のクォータ引き上げリクエストについては、AWS Support コンソールでケースを作成した上で、[Service limit increase] (サービス制限の引き上げ) をクリックします。


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


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