AWS Batch で「DockerTimeoutError」エラーを解決する方法を教えてください。

最終更新日: 2020 年 12 月 18 日

AWS Batch コンピューティング環境のジョブが、「DockerTimeoutError: Could not transition to created; timed out after waiting 4m0s.」というエラーで失敗します。

簡単な説明

docker startdocker create の呼び出しに 4 分を超える時間がかかると、このエラーが表示されます。Amazon Elastic Container Service (Amazon ECS) コンテナエージェントによって設定されるデフォルトのタイムアウト制限は 4 分です。

このエラーは、以下の問題によって引き起こされている可能性があります。

  • AWS Batch コンピューティング環境の ECS インスタンスボリュームは、キュー内の他のすべてのジョブから高い I/O プレッシャーを受けます。ECS インスタンスで作成され実行されるこれらのジョブは、バーストバランスを使い果たす可能性があります。この問題を解決するには、バーストバランスの問題解決セクションの手順に従います。
  • 停止した ECS コンテナは、Docker デーモンを解放するのに十分なほど速くはクリーンアップされません。AWS Batch が提供するデフォルトの Amazon マシンイメージ (AMI) の代わりにカスタマイズされた AMI を使用している場合は、Docker の問題が発生する可能性があります。AWS Batch のデフォルト AMI は、Amazon ECS のクリーンアップ設定を最適化します。この問題を解決するには、Docker の問題の解決セクションの手順に従ってください。

これらの問題のどれもエラーの原因でない場合は、以下を試してください。

  • Docker ログでエラーの原因を確認します。
  • AWS Batch コンピューティング環境に関連付けられている ECS クラスター内の ECS インスタンスで Amazon ECS ログコレクタースクリプトを実行します。

解決方法

バーストバランスの問題の解決

ECS インスタンスのバーストバランスを確認するには:

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

2.    ナビゲーションペインで [Clusters] を選択し、次にジョブを含むクラスターを選択します。

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

3.    [ECS Instances] タブを選択します。

4.    [EC2 Instance] (EC2 インスタンス) 列で、インスタンスを選択します。

注: 失敗したジョブのインスタンス ID を見つけるには、aws batch describe-jobs –jobs awsExampleJobID コマンドを実行します。インスタンス ID が、containerInstanceArn の出力に表示されます。

5.    Amazon EC2 コンソールの [Descriptions] タブで、 [Block devices] からボリュームのリンクを選択します。

6.    EBS ID のブロックデバイスのポップアップウィンドウで、ボリュームを選択します。

7.    [Monitoring] タブを選択し、[バーストバランス ] を選択して、バ ーストバランスメトリクスを確認します。

注意: バーストバランスが 0 まで低下すると、バーストバランスは使い果たされています。

マネージド型コンピューティング環境用の起動テンプレートを作成するには、以下の手順を実行します。

注意: 起動テンプレートを変更した場合は、新しいコンピューティング環境を作成する必要があります。

1.    Amazon EC2 コンソールを開き、[Launch Templates] を選択します。

2.    [Create launch template] を選択します。

3.    AMI ID については、デフォルトの Amazon ECS に最適化された AMI を選択します。

4.    [Storage (Volumes)] セクションの [Volume type] 列でボリュームの種類を選択し、[Size(GiB)] 列に整数値を入力します。

注意: ボリュームの種類で プロビジョンド IOPS SSD (io1) を選択した場合、IOPS に許可されている整数値を入力します。

5.    [Create launch template] を選択します。

6.    新しい起動テンプレートを使用して、新しいマネージド型コンピューティング環境を作成します。

AMI で、AWS Batch コンピューティング環境を作成するには、以下の手順を実行します。

注意: AMI を変更した場合は、AMI ID パラメータを更新できないため、新しいコンピューティング環境を作成する必要があります。

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

2.    [Launch instance] を選択します。

3.    セットアップウィザードの手順に従ってインスタンスを作成します。

重要: Add Storage ページで、インスタンスの種類またはサイズを変更します。ボリュームサイズが大きいほど、ベースラインパフォーマンスが高くなり、バーストバランスの補充が遅くなります。高 I/O 負荷の高いパフォーマンスを得るには、ボリュームの種類を io1 に変更します。

4.    インスタンスからコンピューティングリソース AMI を作成します。

5.    AMI ID を含む AWS Batch のコンピューティング環境を作成します。

Docker の問題を解決する

デフォルトでは、Amazon ECS コンテナエージェントは、停止したタスクと、コンテナインスタンスのタスクが使用していない Docker イメージを、自動的にクリーンアップします。新しいイメージで新しいジョブを実行すると、使用していない Docker イメージでコンテナストレージがいっぱいになる可能性があります。

1.    SSH を使用して AWS Batch コンピューティング環境のコンテナインスタンスに接続します。

2.    Amazon ECS コンテナエージェントを調べるには、Docker の inspect ecs-agent コマンドを実行してから、出力の env セクションを確認します。

注: 以下の変数の値を減らすと、タスクとイメージのクリーンアップをスピードアップできます: ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION、ECS_IMAGE_CLEANUP_INTERVAL、ECS_IMAGE_MINIMUM_CLEANUP_AGE、および ECS_NUM_IMAGES_DELETE_PER_CYCLE。また、自動化されたタスクとイメージのクリーンアップ調整可能なパラメータを使用することもできます。

3.    更新された値を使用して新しい AMI を作成するか、新しい環境変数を含むユーザーデータで起動テンプレートを作成します。

新しい AMI を作成するには:

1.    /etc/ecs/ecs.config ファイルでエージェント設定パラメータを設定します。

2.    コンテナエージェントを再起動します。

3.    インスタンスからコンピューティングリソース AMI を作成します。

4.    AMI ID を含む AWS Batch のコンピューティング環境を作成します。

起動テンプレートを作成するには:

1.    ユーザーデータを含む起動テンプレートを作成します

たとえば、以下の MIME マルチパートファイルのユーザーデータは、コンピューティングリソースのデフォルトの Docker イメージのクリーンアップ設定を上書きします。

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
echo ECS_IMAGE_CLEANUP_INTERVAL=60m >> /etc/ecs/ecs.config
echo ECS_IMAGE_MINIMUM_CLEANUP_AGE=60m >> /etc/ecs/ecs.config
--==MYBOUNDARY==--

2.    新しい起動テンプレートを使用して、マネージドコンピューティング環境を作成します。