ステータスが [RUNNABLE] である AWS Batch ジョブがスタックしているのはなぜですか?

最終更新日: 2022 年 6 月 28 日

AWS Batch ジョブが [RUNNABLE] ステータスでスタックしています。なぜこのような状態になっているのでしょうか? また、AWS Batch ジョブのスタックを解決するにはどうすればよいですか?

簡単な説明

ジョブに未解決の依存関係がなく、ホストにスケジュールされる準備ができている場合、AWS Batch はジョブを [RUNNABLE] ステータスに移行します。[RUNNABLE] ジョブは、ジョブのキューにマッピングされているコンピューティング環境の 1 つで十分なリソースが利用可能になるとすぐに開始されます。

ジョブを実行するために十分なリソースが利用できない場合、ジョブは無期限に [RUNNABLE] ステータスのままになる可能性があります。詳細については、「AWS Batch ユーザーガイド」の「Jobs stuck in a RUNNABLE status」(ジョブが [RUNNABLE] ステータスでスタックしている) を参照してください。

AWS Batch ジョブが [RUNNABLE] ステータスでスタックしている問題をトラブルシューティングするには、次を実行します。

解決方法

コンピューティング環境に、ジョブを実行するのに十分なリソースがあることを確認する

1.    AWS Batch コンソールを開きます。

2.    [Dashboard] (ダッシュボード) を選択します。

3.    [Job queue overview] (ジョブキューの概要) ウィンドウの [RUNNABLE] 列で、[RUNNABLE] ステータスのままになっているジョブを選択します。[Job details] (ジョブの詳細) ページが表示されます。

4.    [Job details] (ジョブの詳細) ページの [Container] (コンテナ) セクションで、[vCPUs] (vCPU) と [Memory] (メモリ) の値を確認します。ステップ 7~9 を完了するには、これらの値が必要です。

5.    左のナビゲーションペインで、[Compute environments] (コンピューティング環境) を選択します。その後、[Name] (名前) 列で、ジョブを実行する必要があるコンピューティング環境の名前を見つけます。

6.    コンピューティング環境の [Status] (ステータス) 列を確認します。[VALID] に設定されていることを確認します。

7.    コンピューティング環境の [State] (状態) 列を確認します。[ENABLED] に設定されていることを確認します。

8.    コンピューティング環境の [Max vCPUs] (最大 vCPU) 列と [Desired vCPUs] (必要な vCPU) 列を確認します。[Max vCPUs] (最大 vCPU) の値が、AWS Batch でジョブを実行するために [Desired vCPUs] (必要な vCPU) の数を増やすのに十分な大きさに設定されていることを確認します。
注意: Fargate コンピューティング環境を使用している場合は、コンピューティング環境のネットワークとセキュリティ設定の検証セクションに進んでください。

9.    [Desired vCPUs] (必要な vCPU) の値が、ジョブを実行する必要のある vCPU 以上であることを確認します。

10.    [Desired vCPU] (必須 vCPU) の値が 0 の場合は、メモリ量と CPU リソースの数が、お客様の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスタイプで利用できるか確認してます。

- または -

[Desired vCPU] (必要な vCPU) が 0 より大きい場合、またはジョブがまだ [RUNNABLE] ステータスの場合は、この記事の次のセクションの手順を完了します。

重要: コンピューティング環境で少なくとも 1 つのインスタンスタイプでは、ジョブが指定したメモリより大きいメモリが必要です。また、インスタンスタイプに、ジョブが指定した以上の CPU リソースが必要です。少なくとも 1 つのインスタンスタイプに、ジョブを実行するのに十分なメモリまたは CPU リソースがない場合は、ジョブをキャンセルします。次に、必要な CPU またはメモリが少ない新しいジョブを実行します。または、ジョブを実行するのに十分なリソースを持つ新しいコンピューティング環境を作成してから、そのジョブを適切なジョブキューに割り当てることができます。

コンピューティング環境にインスタンスがあり、そのインスタンスがジョブの実行に使用できることを確認します

1.    Amazon Elastic Container Service (Amazon ECS) コンソールを開きます。

2.    左側のナビゲーションペインで、[Clusters] (クラスター) を選択します。その後、ジョブを含むクラスターを選択します。

注: クラスターの名前はコンピューティング環境の名前で始まり、その後に _Batch_ とランダムな数字と文字を含むハッシュが続きます。

3.    [ECS Instances] (ECS インスタンス) ビューを選択します。その後、ジョブを実行するためにコンテナインスタンスが使用可能であることを確認します。

4.    ジョブを実行するために使用できるコンテナインスタンスがクラスターにある場合は、Docker デーモンと Amazon ECS コンテナエージェントのステータスを確認してください。詳細については、「切断された Amazon ECS エージェントをトラブルシューティングするにはどうすればよいですか?」を参照してください。

Amazon ECS クラスターにインスタンスがない場合は、ご利用のコンピューティング環境でインスタンスを作成できることを確認します。インスタンスが作成できることを確認するには、ご利用のコンピューティング環境に基づいて次のいずれかを実行します。

インスタンスがオンデマンドコンピューティング環境で作成できることを確認するには

1.    Amazon EC2 コンソールを開きます。

2.    左のナビゲーションペインで、[Auto Scaling Groups] (Auto Scaling グループ) を選択します。

3.    [フィルター] に、コンピューティング環境の名前を入力します。

注: Amazon EC2 は、同じコンピューティング環境に対して複数の Auto Scaling グループを作成する可能性があります。

4.    Auto Scaling グループごとに、[Activity History] (アクティビティ履歴) ビューを選択します。その後、ブロッキングの問題がないかを確認します。インスタンスの起動をブロックする何らかの問題がある場合は、[Status] (ステータス) 列に、[Unsuccessful] (失敗) と表示されます。例えば、アカウントがインスタンスの最大数に達した場合、Amazon EC2 は次のようなメッセージを返す可能性があります。

Launching a new EC2 instance. Status Reason: Your quota allows for 0 more running instance(s). You requested at least 1. Launching EC2 instance failed.

このイベントには、ジョブを送信した時点のタイムスタンプが UTC で表示されます。例えば、以下のようになります。

At 2018-09-03T05:54:30Z a user request update of AutoScalingGroup constraints to min: 0, max: 1, desired: 1 changing the desired capacity from 0 to 1.
At 2018-09-03T05:54:52Z an instance was started in response to a difference between desired and actual capacity, increasing the capacity from 0 to 1.

注意: AWS Batch はユーザーに代わってインスタンスをリクエストします。Auto Scaling グループを手動で変更すると、コンピューティング環境が [INVALID] になる可能性があります。インスタンス制限と制限の引き上げをリクエストする方法については、「Amazon EC2 のサービスクォータ」を参照してください。

5.    Auto Scaling グループの最新のイベントが成功したイベントだけを表示する場合は、次のセクションのステップを実行します。

重要:暗号化された Amazon Elastic Block Store (Amazon EBS) ボリュームとカスタマーマネージド AWS Key Management Service (AWS KMS) キーを持つカスタム Amazon マシンイメージ (AMI) の場合: サービスにリンクされた AWS Identity and Access Management (IAM) ロールAWS ServiceRoleForAutoScaling には、少なくともカスタマーマネージド AWS KMS キーに対するユーザーアクセス権が必要です。詳細については、「Amazon EC2 Auto Scaling ユーザーガイド」の「例 1: カスタマー管理キーへのアクセスを許可するキーポリシーセクション」を参照してください。

インスタンスがスポットコンピューティング環境で作成できることを確認するには

1.    Amazon EC2 コンソールを開きます。

2.    左のナビゲーションペインで、[Instances] (インスタンス) を選択します。その後、[Spot Requests] (スポットリクエスト) を選択します。

3.    フィルタで、[Request type] に対して fleet を選択します。

4.    [Status] に対して active を選択します。

5.    [Description] (説明) を選択します。その後、[Total target capacity] (合計ターゲット容量) の値を確認して、スポットインスタンスリクエストが処理されたかどうかを確認します。インスタンスが作成されていない場合は、[History] (履歴) ビューでその理由を説明するメッセージを確認してください。例えば、リクエストが入札料金に達していない場合、次のようなメッセージが返されます。

m4.large, ami-aff65ad2, Linux/UNIX (Amazon VPC), us-east-1a, Spot bid price is less than Spot market price $0.0324

6.    コンピューティング環境に適した入札率を選択します。また、入札料金を変更する場合は、必ず新しいコンピューティング環境を作成してください。詳細については、スポットインスタンスの料金履歴を参照してください。

注: AWS Batch が、自動的にスポットフリートリクエストを作成します。スポットフリートリクエストを手動で変更しないようにしてください。手動で変更すると、コンピューティング環境が [INVALID] になる可能性があります。

7.    Auto Scaling グループの最新のイベントが成功したイベントだけを表示する場合は、次のセクションのステップを実行します。

コンテナインスタンスの IAM ロールを確認する

1.    AWS Batch コンソールを開きます。

2.    ナビゲーションペインで、[Compute environments] (コンピューティング環境) を選択します。その後、コンピューティング環境を選択します。

3.    [Compute environment details] (コンピューティング環境の詳細) セクションで、[Instance role] (インスタンスロール) の名前をコピーします。

4.    IAM コンソールを開きます。

5.    検索ボックスで、[Instance role] (インスタンスロール) の名前を入力します。その後、結果からインスタンスロールを選択します。

6.    [Permissions] (許可) ビューを選択します。その後、AmazonEC2ContainerServiceforEC2Role マネージドポリシーがロールにアタッチされていることを確認します。ポリシーがアタッチされている場合、インスタンスロールは正しく設定されているので、ステップ 11 に進むことができます。

7.    [Attach Policies] (ポリシーをアタッチ) を選択します。

8.    検索ボックスに、AmazonEC2ContainerServiceforEC2Role と入力します。

9.    AmazonEC2ContainerServiceforEC2Role ポリシーについては、チェックボックスをオンにします。その後、[Attach Policy] (ポリシーをアタッチ) を選択します。

10.    [Trust Relationships] (信頼関係) ビューを選択します。その後、[Edit trust relationship] (信頼関係の編集) を選択します。

11.    信頼関係に次のポリシーが含まれていることを確認します。

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

12.    信頼関係が前述の例のポリシーと一致する場合は、[Cancel] (キャンセル) を選択します。

- または -

上記の例で、信頼関係がポリシーと一致しない場合は、[Policy Document] (ポリシードキュメント) コンソールにポリシーをコピーします。その後、[Update Trust Policy] (信頼ポリシーを更新する) を選択します。

インスタンスが ECS クラスターにまだ参加していない場合は、次のセクションのステップを完了します。

コンピューティング環境のネットワークとセキュリティ設定を確認する

1.    AWS Batch コンソールを開きます。

2.    左のナビゲーションペインで、[Compute environments] (コンピューティング環境) を選択します。その後、コンピューティング環境を選択します。

3.    [Compute resources] (コンピューティングリソース) セクションで、[Subnets] (サブネット) と [Security groups] (セキュリティグループ) の値をコピーします。

4.    Amazon Virtual Private Cloud (Amazon VPC) コンソールを開きます

5.    左のナビゲーションペインで、[Subnets] (サブネット) を選択します。

6.    コンピューティング環境内の各サブネットについて、[Description] (説明) を選択します。その後、[Auto-assign public IPv4 address] (パブリック IPv4 アドレスの自動割り当て) の値を確認します。

[Auto-assign public IPv4 address] (パブリック IPv4 アドレスの自動割り当て) の値が [Yes] (はい) の場合

サブネットで起動されるインスタンスには、次が含まれます。

  • パブリック IPv4 アドレス
  • ルートの送信先が 0.0.0.0/0 のルートテーブル
  • [Target] (ターゲット) に設定されたインターネットゲートウェイ (例: igw-1a2b3c4d)

[Auto-assign public IPv4 address] (パブリック IPv4 アドレスの自動割り当て) の値が [No] (いいえ) の場合

サブネットで起動されるインスタンスには、次が含まれます。

  • プライベート IPv4 アドレス
  • ルートの送信先が 0.0.0.0/0 のルートテーブル
  • [Target] (ターゲット) に設定された NAT ゲートウェイ (例: nat-12345678901234567)。

注意: 詳細については、Routing を参照してください。

7.    ナビゲーションペインで、[Security Groups] (セキュリティグループ) を選択します。

8.    コンピューティング環境で指定される各セキュリティグループについて、[Outbound Rules] (アウトバウンドルール) ビューを選択します。その後、次の設定のルールが存在することを確認します。
[Type] (タイプ) で、[ALL Traffic] (すべてのトラフィック) を選択します。
[プロトコル] で、[すべて] を選択する。
[ポート範囲] で、[すべて] を選択する。
[Destination] (送信先) で、0.0.0.0/0 を選択します。

重要: ルールが存在しない場合は、[Edit] (編集) を選択します。その後、ルールを作成します。アウトバウンドトラフィックのより制限の厳しいルールについては、[Type] (タイプ) に [HTTPS (443)]、[Destination] (送信先) に [0.0.0.0/0] を選択します。

9.    左のナビゲーションペインで、[Network ACLs] (ネットワーク ACL) を選択します。

10.    VPC のアクセスコントロールリスト (ACL) を選択します。

11.    デフォルトのネットワーク ACL が、すべてのトラフィックが関連するサブネットに出入りできるように設定されていることを確認します。

重要: ACL を変更した場合は、サブネットからインターネットへの IPv4 HTTPS 発信トラフィックを許可するルールを追加してください。詳細については、「セキュリティグループを使用してリソースへのトラフィックを制御する」および「ネットワーク ACL を使用してサブネットへのトラフィックを制御する」を参照してください。VPC、サブネット、セキュリティグループを変更するには、新しいコンピューティング環境を作成します。

それでもインスタンスが ECS クラスターに参加していない場合は、インスタンスに接続します。次に、Docker デーモンと Amazon ECS コンテナエージェントのステータスを確認します。


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


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