スキップしてコンテンツを表示

Amazon ECS のスケジュールされたタスクに関連する問題をトラブルシューティングする方法を教えてください。

所要時間2分
0

Amazon Elastic Container Service (Amazon ECS) タスクを定期的に実行するようにスケジュールしたのですが、Amazon ECS タスクがアクティブ化されず、クラスター内のタスクに関する実行ログや履歴を取得できません。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

スケジュールされたタスクの使用時に、Amazon EventBridge は Amazon ECS の RunTask API を 呼び出し、ユーザーに代わってタスクを実行します。スケジュールされた Amazon ECS タスクは、次の原因で呼び出されない場合があります。

  • イベントブリッジの時間または cron 式が正しく設定されていない。
  • EventBridge のルールまたはスケジュールがターゲットを呼び出していない。
  • RunTask API の実行に失敗した。
  • アプリケーションの問題またはリソースの制約により、コンテナインスタンスが終了した。
  • キャパシティの制約により、スケジュールされたタスクを実行できなかった。
  • ネットワーク接続の問題により、スケジュールされたタスクを実行できなかった。

EventBridge の cron 式が正しく設定されていることを確認する

EventBridge の cron 式を取得するには、次のいずれかの AWS CLI コマンドを実行します。

EventBridge ルールを使用している場合は、describe-rule コマンドを実行します。

aws events describe-rule --name example-rule --region example-region

EventBridge Scheduler を使用している場合は、get-schedule コマンドを実行します。

aws scheduler get-schedule --name example-schedule --region example-region

注: 実際のものでそれぞれ、example-rule をルール名に、example-schedule をスケジュール名に、example-region を AWS リージョンに置き換えます。

コマンドの出力で、ScheduleExpression パラメータ内の EventBridge cron 式を確認します。rule のスケジュールは、UTC+0 タイムゾーンに設定する必要があります。

ルールかスケジュールがターゲットが呼び出していないかどうかを確認する

EventBridge ルールの Amazon CloudWatch メトリクス Invocations および FailedInvocations を確認するには、次の手順を実行します。

  1. CloudWatch コンソールを開きます。
  2. ナビゲーションペインで [メトリクス] を選択した後、[すべてのメトリクス] を選択します。
  3. [イベント] を選択します。
  4. [ルール名別] を選択します。
  5. Amazon ECS タスクを実行する EventBridge ルールで、TriggerRulesInvocationsFailedInvocations を選択します。
  6. [グラフ化されたメトリクス] タブを選択します。
  7. [統計情報] で、各メトリクスの [SUM] を選択します。

EventBridge Scheduler のパフォーマンスを確認するには、CloudWatch メトリクス InvocationAttemptCount、TargetErrorCount、InvocationDroppedCount をレビューします。

FailedInvocations または InvocationDroppedCount のデータが表示される場合は、EventBridge の AWS Identity and Access Management (IAM) ロールにタスクを呼び出すためのアクセス許可があるかどうかを確認します。

targetErrorCount のデータが表示される場合は、ターゲットの呼び出しに問題があります。タスクが開始されたか、開始後すぐに失敗したか、完了しなかったかを確認します。

RunTask アクションが実行できなかったかどうかを確認する

次の手順を実行します。

  1. AWS CloudTrail コンソールを開きます。
  2. ナビゲーションペインで [イベント履歴] を選択します。
  3. [ルックアップ属性][イベント名] を選択します。
  4. [イベント名を入力] に run task と入力します。
  5. 時間範囲フィルターで、スケジュールされた Amazon ECS タスクの実行に想定した時間を選択します。
  6. テーブルで、表示するイベントを選択します。
  7. JSON イベントレコードで errorMessage または responseElements.failures.reason を参照し、API がスケジュールされたタスクを呼び出さなかったことを確認します。
    注: 失敗したタスクのタスク ID は、responseElements.tasks.taskARN フィールドで確認できます。
  8. API の障害をトラブルシューティングします

タスクの実行後にコンテナが終了したかどうかを確認する

タスクが正常に実行された後でも、アプリケーションの問題やリソースの制約により Amazon ECS タスクが停止する場合があります。この問題を解決するには、「コンテナの終了時に、Amazon ECS タスクが停止したり開始できなかったりする場合のトラブルシューティング方法を教えてください」を参照してください。

キャパシティ制約の問題を確認する

タスクが失敗する原因となるキャパシティ制約の問題は、クラスターに CPU やメモリなどの十分なコンピューティングリソースがない場合に発生します。この問題は、同じクラスター上で実行中の他のワークロードによってリソースの使用率が高くなっている場合にも発生します。タスク配置の制約や戦略が厳しい場合、使用可能なリソースが減少する可能性があります。

リソースの使用状況を監視するには、Amazon ECS クラスターで Container Insights を設定します。](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ConsoleAlarms.html)リソース使用量のしきい値に達したときに通知するように CloudWatch [ アラームを設定することもできます。必要なときにリソースを使用できるようにするには、タスク用に CPU とメモリの予約を設定します。Amazon ECS サービスの目標数を増やしてクラスターをスケールアウトするか、クラスターの自動スケーリングを使用する必要がある場合があります。

既存のタスク配置制約を見直して調整し、制限を緩和します。重要なワークロードを優先して重要でないワークロードを再スケジュールし、スプレッド、ビンパック、ランダムなどのさまざまな配置戦略をテストすることがベストプラクティスです。

Amazon ECS キャパシティプロバイダーを使用すると、重要なワークロード用にキャパシティを予約できます。分離されたハードウェアを必要とするワークロードには、Amazon Elastic Compute Cloud (Amazon EC2) 専有インスタンスを使用することがベストプラクティスです。使用可能なリソースを必要とするタスクには、AWS Fargate を使用します。

ネットワーク接続の問題を確認する

スケジュールされたタスクのネットワーク接続に関する問題をトラブルシューティングするには、次の操作を行います。

  • セキュリティグループとネットワークアクセスコントロールリスト (ネットワーク ACL) のルールが、タスクに必要なインバウンドトラフィックとアウトバウンドトラフィックを許可していることを確認します。
  • 仮想プライベートクラウド (VPC) 用のインターネットゲートウェイまたは NAT ゲートウェイが正しく設定されていることを確認します。
  • ゲートウェイのルートテーブルを確認します。
  • タスク定義で、ハードコードされた IP アドレスまたはホスト名を含む環境変数を確認します。既存の IP アドレスまたはホスト名が正確であり、アクセスできることを確認します。

コンテナインスタンスからのネットワーク接続をテストするには、次の手順を実行します。

  1. SSH を使用して Amazon EC2 インスタンスに接続します
  2. コマンドをコンテナに対してリモートで実行するには、次の execute-command コマンドを実行します。
    aws ecs execute-command --cluster cluster-name --task task-id --container container-name --command "/bin/bash" --interactive
    注: 実際のものでそれぞれ、cluster-name をクラスター名に、task-id をタスク ID に、container-name をコンテナインスタンス名に置き換えます。
  3. 接続をテストするには、次のいずれかのコマンドを実行します。
    curl -v http://example.com
    または、
    nslookup example.com
    または、
    nc -zv example.com 80
    注: example.com は、お使いのドメインに置き換えます。
  4. DNS の解決とルーティングを確認して、ネットワークの問題を特定します。

接続を簡素化するには、Amazon EC2 ではなく Fargate でタスクを実行します。Fargate では、基盤インフラストラクチャを管理する必要はありません。または、VPC エンドポイントを使用すると、インターネットゲートウェイ、NAT デバイス、VPN 接続、AWS Direct Connect 接続を使用せずにサービスに接続できます。

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ