Fargate での Amazon ECS タスクの Application Load Balancer のヘルスチェックエラーをトラブルシューティングする方法を教えてください。
AWS Fargate で Amazon Elastic Container Service (Amazon ECS) タスクを実行しているときの Application Load Balancer のヘルスチェックエラーを解決したいと考えています。
簡単な説明
Amazon ECS タスクが Application Load Balancer のヘルスチェックに失敗すると、Amazon ECS サービスイベントメッセージから次のいずれかの内容のエラーが表示されることがあります:
- リクエストがタイムアウトした
- ヘルスチェックがエラーコードなしで失敗した
- ヘルスチェックが 404 または 5xx のエラーコードで失敗した
- ターゲットがロードバランサー用に有効になっていないアベイラビリティーゾーンにある
失敗したコンテナのヘルスチェックについては、「Amazon ECS タスクのコンテナヘルスチェックの失敗をトラブルシューティングするにはどうすればよいですか?」を参照してください。
Amazon ECS を Amazon Elastic Compute Cloud (Amazon EC2) コンテナインスタンスで使用している場合は、以下のドキュメントを参照してください:
- Amazon ECS で Application Load Balancer のヘルスチェックに合格するために、Amazon EC2 起動タイプを使用して Amazon ECS タスクを実行するにはどうすればよいですか?
- 停止した Amazon ECS タスクについては、「Checking stopped tasks for errors」(停止したタスクのエラーの確認) を参照してください。
解決策
**注:**AWS コマンドラインインターフェイス (AWS CLI) のコマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を実行していることを確認してください。次の AWS CLI コマンドで、サンプル値を適した値に置き換えます。
リクエストタイムアウトエラー
セキュリティグループをチェックして、ロードバランサーが Fargate タスクに対してヘルスチェックリクエストを送信できることを確認します。Fargate タスクのセキュリティグループは、タスク定義で指定されたコンテナポートでのインバウンドトラフィックとアウトバウンドトラフィックを許可する必要があります。ソースは Application Load Balancer のセキュリティグループである必要があります。Application Load Balancer のセキュリティグループは、Fargate タスクのセキュリティグループへのアウトバウンドトラフィックを許可する必要があります。
**注:**ベストプラクティスは、Fargate タスクとロードバランサーに異なるセキュリティグループを設定して、それらの間のトラフィックを許可することです。
セキュリティグループが Fargate タスクと Application Load Balancer 間の通信を許可している場合は、ヘルスチェックの設定で HealthCheckTimeoutSeconds を確認してください。必要に応じて、タイムアウトの秒数を少し増やしてください。
**注:**アプリケーションがヘルスチェックに応答するのに長時間かかる場合にのみ、HealthCheckTimeoutSeconds を増やしてください。
平均応答時間を確認するには、次のコマンドを実行します:
$ time curl -Iv http://<example-task-pvt-ip>:<example-port>/<example_healthcheck_path>
注: タスクのリソース使用率が高いと、処理が遅くなったり、ハングアップしたりして、ヘルスチェックが失敗する可能性があります。
ヘルスチェックがエラーコードなしで失敗した
ヘルスチェック失敗のエラーメッセージの例:
(service AWS-service) (port 80) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)
同様のエラーメッセージが表示された場合は、Amazon ECS で開始したタスクがすぐに応答することを確認してください。また、アプリケーションが正しいレスポンスコードで応答していることを確認してください。
Amazon ECS でタスクが開始されてから応答する時間があることを確認する
開始後にタスクが応答するのに十分な時間があることを確認するには、healthCheckGracePeriodSeconds を増やしてください。これにより、Amazon ECS はタスクを長期間保持し、異常な Elastic Load Balancing ターゲットのヘルスチェックを無視できるようになります。
注: 新しいサービスを作成する場合は、ロードバランサーの設定ページでヘルスチェックの猶予期間を設定できます。
既存の Amazon ECS サービスの healthCheckGracePeriodSeconds を更新するには、次のコマンドを実行します:
$ aws ecs update-service --cluster <EXAMPLE-CLUSTER-NAME> --service <EXAMPLE-SERVICE-NAME> --region <EXAMPLE-REGION> --health-check-grace-period-seconds <example-value-in-seconds>
アプリケーションが正しいレスポンスコードで応答することを確認する
アプリケーションがヘルスチェックパスで送信したレスポンスコードを確認するには、次の方法を使用します。
アプリケーションにアクセスログを設定した場合は、ELB-HealthChecker/2.0 を使用して応答を確認します。AWS CloudWatch Logs を使用している場合は、CloudWatch Logs Insights を使用して次のコマンドを実行します:
fields @timestamp, @message | sort @timestamp desc | filter @message like /ELB-HealthChecker/
同じAmazon Virtual Private Cloud (Amazon VPC) 内の Amazon EC2 インスタンスの場合、次のコマンドを実行して、タスクが手動チェックに応答することを確認します。新しい Amazon EC2 インスタンスを起動するには、「Tutorial: Get started with Amazon EC2 Linux instances」(チュートリアル: Amazon EC2 Linux インスタンスで始めましょう) を参照してください。
HTTP ヘルスチェック
$ curl -Iv http://<example-task-pvt-ip>:<example-port>/<example_healthcheck_path>
HTTPS ヘルスチェック
$ curl -Iv https://<example-task-pvt-ip>:<example-port>/<example_healthcheck_path>
タスクがすぐに停止してプライベート IP アドレスを取得できない場合は、Amazon ECS の外部でスタンドアロンタスクを起動して、問題のトラブルシューティングを行ってください。同じタスク定義を使用し、その IP アドレスに curl コマンドを実行してタスクを起動します。ヘルスチェックが失敗してもタスクは停止しません。
また、Amazon ECS Exec を使用してコンテナレベルでリスニングポートをチェックしてください。netstat を使用して、アプリケーションが適切なポートでリッスンしていることを確認します:
$ netstat -tulpn | grep LISTEN
ヘルスチェックが 404 または 5xx のエラーコードで失敗した
404 または 5xx のエラーコードでヘルスチェックが失敗した場合は、ヘルスチェックリクエストは確認されたものの、無効なレスポンスコードを受け取ったことを示しています。このコードは、アプリケーションが送信したレスポンスコードが、ターゲットグループレベルで設定された成功コードと一致していないことも示します (パラメータ: Matcher)。
404 のエラーコードは、ヘルスチェックパスが存在しない場合や、ヘルスチェックパスの設定に入力ミスがある場合に発生する可能性があります。 5xx のエラーコードは、タスク内のアプリケーションがリクエストに正しく応答していない場合、または処理エラーが発生した場合に発生する可能性があります。
アプリケーションが正常に起動しているかどうかを確認するには、アプリケーションログを確認します。
ターゲットがロードバランサー用に有効になっていないアベイラビリティーゾーンにある
ロードバランサーのアベイラビリティーゾーンを有効にすると、Elastic Load Balancing によりアベイラビリティーゾーンにロードバランサーノードが作成されます。アベイラビリティーゾーンにターゲットを登録し、アベイラビリティーゾーンをオンにしない場合、登録されたターゲットはトラフィックを受信しません。詳細については、「Availability Zones and load balancer nodes」(アベイラビリティーゾーンとロードバランサーノード) を参照してください。
ロードバランサーが設定されているアベイラビリティーゾーンを特定するには、次のコマンドを実行します:
aws elbv2 describe-load-balancers --load-balancer-arns <EXAMPLE-ALB-ARN> --query 'LoadBalancers[*].AvailabilityZones[].{Subnet:SubnetId}'
Fargate タスクが設定されているアベイラビリティーゾーンを特定するには、次のコマンドを実行します:
aws ecs describe-services --cluster <EXAMPLE-CLUSTER-NAME> --service <EXAMPLE-SERVICE-NAME> --query 'services[*].deployments[].networkConfiguration[].awsvpcConfiguration.{Subnets:subnets}'
**注:**AWS CLI の update-service コマンドを使用して Amazon ECS サービスのサブネット設定を変更します。AWS CLI の enable-availability-zones-for-load-balancer コマンドを使用して、既存の Application Load Balancer にアベイラビリティーゾーンを追加 します。
関連情報
関連するコンテンツ
- 質問済み 7ヶ月前lg...
- 質問済み 3年前lg...