AWS Batch コンピューティング環境のジョブが失敗し、次のエラーが返されます。 「DockerTimeoutError: Could not transition to created; timed out after waiting 4m0s」 このエラーを解決するにはどうすればよいですか?
簡単な説明
Docker の起動と Docker 作成の API コールに 4 分以上かかる場合、AWS Batch は DockerTimeoutError エラーを返します。
**注:**Amazon Elastic Container Service (Amazon ECS) のコンテナエージェントが設定するデフォルトのタイムアウト制限は 4 分です。
このエラーの原因として最もよく見られる原因は以下のとおりです。
- AWS Batch コンピューティング環境の ECS インスタンスボリュームが、キュー内の他のすべてのジョブからの高い I/O 負荷にさらされている。これらのジョブはバーストバランスを使い果たす可能性があります。
- 停止した ECS コンテナが、Docker デーモンを解放するのに十分な速さでクリーンアップされていない。AWS Batch が提供するデフォルトの AMI ではなく、カスタマイズされた Amazon マシンイメージ (AMI) を使用すると、Docker の問題が発生する可能性があります。
どちらの問題もエラーの原因になっていない場合は、次のアクションを実行して問題を解決してください。
解決策
バーストバランスの問題の解決
**ECS インスタンスのバーストバランスを確認する **
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、使用している AWS CLI が最新バージョンであることを確認してください。
次の手順を実行します。
- Amazon ECS コンソールを開きます。
- ナビゲーションペインで [クラスター] を選択します。次に、ジョブを含むクラスターを選択します。
**注:クラスターの名前はコンピューティング環境の名前で始まり、その後に\ _Batch\ _ **、数字と文字のランダムハッシュが続きます。
- [インフラストラクチャ] タブを選択します。
- [コンテナインスタンス] 行の下の**[インフラストラクチャ]** 列からインスタンス ID を選択します。
**注:**失敗したジョブのインスタンス ID を確認するには、AWS Batch のdescribe-jobs AWS CLI コマンドを実行します。インスタンス ID は **containerInstanceArn ** の出力に表示されます。
- Amazon EC2 コンソールで、インスタンスがまだ選択されていることを確認します。次に、[ストレージ] セクションで volumeID のリンクを選択します。
- ブロックデバイスのポップアップウィンドウの **[ボリューム ID]**で、ボリュームを選択します。
- [モニタリング] タブを選択します。次に、[バーストバランス] を選択して、バーストバランスの指標を確認します。バーストバランスが使い果たされると 0 になります。
**マネージドコンピューティング環境用の起動テンプレートを作成する **
**注:**起動テンプレートを変更する場合は、新しいコンピューティング環境を作成する必要があります。
次の手順を実行します。
- Amazon EC2 コンソールを開き、[テンプレートを起動] を選択します。
- [起動テンプレートの作成] を選択します。
- AMI ID には、デフォルトの Amazon ECS に最適化された AMI を選択します。
- **[ストレージ (ボリューム)]**セクションの [ボリュームタイプ] ** 列でボリュームタイプを選択します。次に、[サイズ (GiB)] ** 列に整数値を入力します。
**注:**ボリュームタイプにプロビジョンド IOPS SSD (io1) を選択した場合は、IOPS で許可される整数値を入力します。
- [起動テンプレートの作成] を選択します。
- 新しい起動テンプレートを使用して、新しいマネージドコンピューティング環境を作成します。
**AMI を使用して AWS Batch コンピューティング環境を作成する **
**注:**AMI を変更する場合は、AMI ID パラメータを更新できないため、新しいコンピューティング環境を作成する必要があります。
次の手順を実行します。
- Amazon EC2 コンソールを開きます。
- [インスタンスを起動] を選択します。
- セットアップウィザードの手順に従ってインスタンスを作成します。
重要:****[ストレージの追加] ページで、インスタンスのボリュームタイプまたはサイズを変更します。ボリュームサイズが大きいほど、ベースラインパフォーマンスが向上し、バーストバランスの補充が遅くなります。I/O 負荷が高い場合のパフォーマンスを向上させるには、ボリュームを io1 タイプに変更します。
- インスタンスからコンピュートリソース AMI を作成します。
- AMI ID を含む AWS Batch 用のコンピューティング環境を作成します。
Docker の問題を解決する
デフォルトでは、Amazon ECS コンテナエージェントは、コンテナインスタンスが使用していない停止したタスクと Docker イメージを自動的にクリーンアップします。新しいイメージを使用して新しいジョブを実行すると、使用しない Docker イメージでコンテナストレージがいっぱいになる可能性があります。AWS Batch のデフォルト AMI は、Amazon ECS クリーンアップ設定を最適化します。
次の手順を実行します。
- SSH を使用して、AWS Batch コンピューティング環境のコンテナインスタンスに接続します。
- Amazon ECS コンテナエージェントを検査するには、inspect ecs-agent Docker コマンドを実行します。次に、出力の env セクションを確認します。
**注:**タスクとイメージのクリーンアップを迅速に行うには、次の変数の値を減らします。
ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION
ECS_IMAGE_CLEANUP_INTERVAL
ECS_IMAGE_MINIMUM_CLEANUP_AGE
ECS_NUM_IMAGES_DELETE_PER_CYCLE
また、調整可能なパラメーターを使用して自動タスクとイメージのクリーンアップを実行することもできます。
- 値を更新して新しい AMI を作成します。
または、
新しい環境変数を含むユーザーデータを使用して起動テンプレートを作成します。
**更新された値を使って新しい AMI を作成する **
次の手順を実行します。
- /etc/ecs/ecs.config ファイルでエージェント設定パラメータを設定します。
- コンテナエージェントを再起動します。
- インスタンスからコンピュートリソース AMI を作成します。
- AMI ID を含む AWS Batch 用のコンピューティング環境を作成します。
新しい環境変数を含むユーザーデータを使用して起動テンプレートを作成します。
次の手順を実行します。
-
ユーザーデータを含む起動テンプレートを作成します。
例えば、次の MIME multi-part ファイル内のユーザーデータは、コンピュートリソースのデフォルトの 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==--
MIME multi-part ファイルの詳細については、cloud-init ウェブサイトの「MIME multi-part file」を参照してください。
-
新しい起動テンプレートを使用して、マネージドコンピューティング環境を作成します。
関連情報
CloudWatch メトリクスを発行する AWS のサービス
Compute resource AMIs
GitHub ウェブサイトの amazon-ecs-agent