Fargate 上の Amazon ECS タスクがヘルスチェックにパスできない問題をトラブルシューティングする方法を教えてください。
AWS Fargate 上の Amazon Elastic Container Service (Amazon ECS) タスクに対するヘルスチェックにパスできません。
簡単な説明
Fargate 上の Amazon ECS タスクに対するヘルスチェックは、次の理由で不合格となる可能性があります。
- コンテナのヘルスチェックでのエラー
- ターゲットがロードバランサーでは有効になっていないアベイラビリティーゾーンにある
- CPU またはメモリのリソース制約
- ヘルスチェック設定が誤っている
- ネットワーク接続に問題がある
タスクがロードバランサーのヘルスチェックをパスできなかった場合、Amazon ECS サービスイベントメッセージには次のいずれかのエラーが表示されることがあります。
- "(target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) において、(サービス AWS-service) (ポート 8080) が異常状態です。原因: (次のコードが発生したためヘルスチェックにパスできませんでした: [5xx]/[4xx]/[3xx]) または (Request timed out)。"
- "(サービス AWS-Service) (タスク eaa3ec9e9f104070b461490987654321) がコンテナのヘルスチェックをパスできませんでした。"
- "(target-group arn:aws:elasticloadbalancing:ap-south-1:120987654321:targetgroup/AWS-Service-TG/159c835dc9d8cf84) において、(サービス AWS-Service) (インスタンス 10.122.144.145) (ポート 8080) が異常状態です。原因: (ターゲットがロードバランサーで有効ではないアベイラビリティーゾーンにあります)。"
Amazon ECS タスクコンソールには、"(target-group arn:aws:elasticloadbalancing:ap-south-1:111111111111:targetgroup/aws-targetgroup/123456789) において、タスクが ELB ヘルスチェックにパスできませんでした" というエラーが表示される場合もあります。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
HTTP [5xx]/[4xx]/[3xx] エラーまたは (Request timed out) エラーのトラブルシューティング
ロードバランサーのヘルスチェック設定を確認する
これらのエラーは、Elastic Load Balancing (ELB) ロードバランサーが HTTP コード 200 を想定しているが、エラーコード 3xx、4xx、5xx を受信した場合に発生します。その結果、ロードバランサーはタスクを停止し、Unhealthy とマークします。この問題を解決するには、正しいヘルスチェックパスを設定するか、ヘルスチェック設定を変更します。
Application Load Balancer での HTTP エラーについては、「ロードバランサーで HTTP エラーが発生する」を参照してください。
Amazon ECS タスクがタイムアウト期間内にロードバランサーのヘルスチェックに応答しない場合、Request timed out エラーが発生します。
ロードバランサーがヘルスチェックを実行できることを確認する
次の設定を確認します。
- ロードバランサーに関連付けられているセキュリティグループにより、登録されたコンテナポートで Amazon ECS タスクのエラスティックネットワークインターフェイスへのアウトバウンドトラフィックが許可されている。
- Amazon ECS セキュリティグループが、ロードバランサーに関連付けられたセキュリティグループからのすべてのインバウンドトラフィックを登録されたコンテナポートで許可している。
タイムアウトパラメータを設定する
Amazon ECS タスクがヘルスチェックに応答するまでに時間がかかる場合は、HealthCheckGracePeriod パラメータの値を増やすことがベストプラクティスです。
アプリケーションがヘルスチェックに応答するまでに時間がかかることが多い場合は、ターゲットグループでもヘルスチェックのタイムアウト値を増やします。このパラメータは、Amazon ECS タスクがヘルスチェックに応答しなければならない時間を定義します。
リソースの使用状況を確認する
アプリケーションでデータベースへのバックエンド接続が必要な場合は、データベースレベルでの高いリソース使用率について確認します。リソースの使用率が高いと、アプリケーションの初期化プロセス中に問題が発生したり、ロードバランサーのヘルスチェック中にエラーが発生したりする可能性があります。
応答が遅い場合のトラブルシューティング
ECS Exec を使用して、ヘルスチェックのパスとポートでのアプリケーションの応答を確認します。遅延が発生せず、バックエンドから正常に応答が行われたことを確認するには、次のコマンドを実行します。
curl -iv localhost:container-port/path
注: container-port はコンテナが使用するポートに、path はヘルスチェックのパスに置き換えます。
ヘルスチェックの設定を確認する
まず、ファイルがターゲットグループのヘルスチェックで設定したパスに置かれていることを確認します。
ファイルが正しい場所にあるにもかかわらずヘルスチェックにパスできない場合は、次の手順を実行します。
- Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開きます。
- ナビゲーションペインの [ロードバランシング] で [ターゲットグループ] を選択します。
- 該当するターゲットグループを選択します。
- [ヘルスチェック] タブを選択し、[編集] を選択します。
- [ターゲットグループの編集] ページの [成功コード] に、エラーメッセージの HTTP コードを入力します。たとえば、404 と入力します。
- [保存] を選択します。
重要: ターゲットグループのプロトコルは、アプリケーションがサポートする HTTP プロトコルに設定する必要があります。
Amazon ECS のリソース制約について確認する
Amazon ECS サービスのメトリクスで CPU とメモリの使用率を確認します。CpuUtilization または MemoryUtilization が常に高い場合は、ヘルスチェックが不合格となる原因となるパフォーマンスの問題が発生しています。
リソースの使用量を減らすには、次の手順を実行します。
- タスク定義にさらに多くの CPU とメモリリソースを割り当てます。
- 構成を水平方向にスケーリングするために、実行中のタスクの数を増やしてワークロードを複数のインスタンスに均等に分散し、突然の急増時のパフォーマンスを向上させます。
- さまざまな負荷条件下でのシステムパフォーマンスを定期的に評価して潜在的なボトルネックを特定し、より適切なリソース割り当てを行います。
- アプリケーションのネットワーク使用状況、接続パターン、応答時間を監視して潜在的なボトルネックを特定し、非効率的なネットワーク使用パターンを最適化します。
システムの動作を頻繁に監視し、必要に応じて設定を調整することがベストプラクティスです。
不合格となったコンテナヘルスチェックエラーのトラブルシューティング
タスク内の ECS コンテナインスタンスで、サービスが合格できないヘルスチェックを使用している場合、failed container health checks というエラーが発生します。、この問題をトラブルシューティングするには、「Amazon ECS タスクでコンテナヘルスチェックが不合格になった場合のトラブルシューティング方法を教えてください」を参照してください。
ターゲット Amazon ECS タスクでのアベイラビリティーゾーンの問題のトラブルシューティング
有効化していないアベイラビリティーゾーンにターゲットを登録した場合、登録されたターゲットはトラフィックを受信しません。詳細については、「アベイラビリティーゾーンとロードバランサーノード」を参照してください。
たとえば、お使いの Amazon ECS サブネットが us-east-1x と us-east-1y のアベイラビリティーゾーンに属している一方、ロードバランサーでは us-east-1p と us-east-1q のアベイラビリティーゾーンが有効化されていると、エラーが発生します。
ロードバランサーのアベイラビリティーゾーン用のサブネットを使用するために Amazon ECS を更新するには、AWS CLI コマンド update-service を実行します。
aws ecs update-service --cluster cluster-name --service service-name --region region-code --network-configuration '{"awsvpcConfiguration": {"subnets": ["subnet-1","subnet-2"],"securityGroups": ["sg-abcdxyz"]}}'
注: お使いのものでそれぞれ、cluster-name をクラスター名に、service-name をサービス名に、region-code を AWS リージョンに置き換えます。さらに、subnet-1 と subnet-2 を実際のサブネットに、sg-abcdxyz をお使いのセキュリティグループに置き換えます。