Amazon ECS のデプロイが失敗する場合のトラブルシューティング方法を教えてください。
Amazon Elastic Container Service (Amazon ECS) のデプロイが失敗する原因をトラブルシューティングしたいです。
簡単な説明
新しいアプリケーションをデプロイしようとする際、Amazon ECS でデプロイが行き詰まることがあります。古いタスクは引き続きデプロイされますが、新しいタスクは安定した状態になりません。次の問題が原因で、Amazon ECS のデプロイは失敗する可能性があります。
- リソースの制約
- コンテナイメージの問題
- ネットワークの問題
- タスク定義の問題
- Amazon CloudWatch Logs
- ヘルスチェック設定
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
リソースの制約
タスクのデプロイ先で使用できる CPU またはメモリ容量が不足している場合、Amazon ECS サービスのデプロイが失敗することがあります。サービスイベントで RESOURCE:* エラーが発生し、Amazon ECS タスクが Running 状態に移行しなかった場合、リソース制約が発せします。
この問題を解決するには、次の手順を実行します。
- Amazon CloudWatch メトリクスを使用して Amazon ECS クラスターのリソース容量を監視します。
- Container Insights を設定し、詳細なタスクおよびコンテナレベルでのリソース使用状況のメトリクスを取得します。
- Auto Scaling グループの設定が、Amazon Elastic Compute Cloud (Amazon EC2) 起動タイプのクラスターにおけるワークロード要件と一致していることを確認します。インスタンスのキャパシティを監視し、CPU 使用量、メモリ使用量、またはカスタムメトリクスに基づいてスケーリングポリシーを設定します。
- awsvpc ネットワークモードの Amazon ECS タスクにおける Elastic ネットワークインターフェイスのキャパシティを確認します。デプロイの密度が高い場合は、Elastic ネットワークインターフェイスの上限が高いインスタンスタイプを使用してください。各タスクには、独自の Elastiic ネットワークインターフェイスが必要です。CIDR プランニングを使用して Elastic ネットワークインターフェイスを監視し、Amazon ECS タスクを起動する場所で十分な IP アドレスが使用可能であることを確認します。
コンテナインスタンスで使用可能なリソースを確認するには、AWS CLI コマンド list-container-instances を実行します。
aws ecs list-container-instances --cluster your-cluster-name
注: your-cluster-name は、実際のクラスター名に置き換えます。
次に、describe-container-instances コマンドを実行します。
aws ecs describe-container-instances --cluster your-cluster-name --container-instances container-instance-id
注: 実際のものでそれぞれ、your-cluster-name をクラスター名に、container-instance-id をコンテナのインスタンス ID に置き換えます。
コンテナイメージの問題
Amazon ECS がリソースリポジトリからイメージをプルできない場合、タスクは失敗し、サービスイベントで CannotPullContainerError エラーが発生します。コンテナインスタンスのエージェントログに関連するタスクが表示される場合があります。
このエラーを解決するには、Amazon ECS タスクの次のタスク定義設定および、サービスのネットワーク設定を確認します。
-
コンテナイメージの URI を設定します。
Amazon Elastic コンテナレジストリ (Amazon ECR) では、イメージが次のファイル命名形式と一致していることを確認します。account-id.dkr.ecr.region.amazonaws.com/repository-name:tag注: 実際のものでそれぞれ、account-id をアカウント ID に、region を AWS リージョンに、repository-name をリポジトリ名に置き換えます。
Docker Hub では、イメージが次のファイル命名形式と一致していることを確認します。
repository/image:tag注: repository は、実際のリポジトリ名に置き換えます。
-
Amazon ECS タスク実行 IAM ロールにアクセス許可 AmazonECSTaskExecutionRolePolicy がアタッチされていることを確認します。
-
タスク定義で環境プレースホルダーの欠落や誤りがないことを確認します。
-
Amazon ECS サービスをプライベートサブネットにデプロイする場合は、VPC エンドポイントを同じサブネットとセキュリティグループの内部に関連付けます。
インターフェイスエンドポイント
Amazon ECS には、com.amazonaws.region.ecs を使用します。
CloudWatch Logs には、com.amazonaws.us-east-1.logs を使用します。
Amazon ECR (Docker) には、com.amazonaws.us-east-1.ecr.dkr を使用します。
Amazon ECR API には、com.amazonaws.us-east-1.ecr.api を使用します。
ゲートウェイエンドポイント
Amazon S3 には、com.amazonaws.us-east-1.s3 を使用します。
ネットワークの問題
ネットワークの問題は、コンテナが外部サービスと通信できない、サービス検出が失敗する、またはタスクが必要なエンドポイントに到達できない場合に発生します。DNS 解決の失敗または、コンテナとその他の AWS サービス間の接続に関する問題が原因でアプリケーションログにタイムアウトエラーが表示されることがあります。この問題を解決するには、次の操作を行います。
- Amazon ECS サービスのインバウンドルールがコンテナへのトラフィックを許可していることを確認します。
- セキュリティグループのルールがサービス間で正しく設定されていることを確認します。
- パブリックサブネットにインターネットゲートウェイ経由でのインターネットへのルートがあることを確認します。
- プライベートサブネットの NAT ゲートウェイ設定を確認します。
- CIDR 範囲のサブネットに十分な数の IP アドレスがあることを確認します。
- 設定した Application Load Balancer では、その Application Load Balancer のセキュリティグループがセキュリティグループのインバウンドルールを許可していることを確認します。
CloudWatch Logs
CloudWatch ログを参考に、障害が発生した Amazon ECS タスクをトラブルシューティングするには、次の手順を実行します。
- Amazon ECS コンソールを開きます。
- ナビゲーションペインで [クラスター] を選択します。
- クラスターを選択します。
- [タスク] タブを選択します。
- 障害が発生したタスクのタスク ID を選択します。
- [Stopped ステータス] を参照し、コンテナで障害が発生した原因を判断します。
注: 停止したタスクに関するログは、ECS タスクが停止してから 1 時間だけ表示されます。 - コンテナでの障害をトラブルシューティングします。
ヘルスチェック設定
Application Load Balancer または Network Load Balancer で次のヘルスチェック設定をレビューします。
- HealthCheckTimeoutSeconds が、コンテナが正常に動作するのに十分な期間に設定されていることを確認します。ECS タスクが短時間でロードバランサーのヘルスチェックに不合格になる場合は、この値を変更してください。
- HealthCheckTimeoutSeconds が、コンテナを起動するのに十分な期間に設定されていることを確認します。
- アプリケーションのコンテナが、ロードバランサーで設定した HealthCheckPath にて、ステータスコード 200 で応答することを確認します。詳細については、「Application Load Balancer のターゲットグループに対するヘルスチェック」の HealthCheckPath 設定を参照してください。
問題が発生したヘルスチェックを特定するには、次の手順を実行します。
- Amazon EC2 コンソールを開きます。
- ナビゲーションペインで [ロードバランシング] を展開し、[ターゲットグループ] を選択します。
- 該当するターゲットグループ名を選択します。
- ターゲットグループの [詳細] を参照し、インスタンスが正常か異常かを確認します。
異常のあるインスタンスをトラブルシューティングする方法については、「Application Load Balancer のトラブルシューティング」を参照してください。
