Fargate で Amazon ECS タスクを実行しているときの Network Load Balancer ヘルスチェックの失敗をトラブルシューティングするにはどうすればよいですか?

所要時間3分
0

AWS Fargate で Amazon Elastic Container Service (Amazon ECS) タスクを実行しているときに発生した Network Load Balancer のヘルスチェックの失敗をトラブルシューティングしたいと考えています。

簡潔な説明

ヘルスチェックを設定すると、Network Load Balancer は登録された各ターゲットに定期的にヘルスチェックリクエストを送信します。TCP のヘルスチェックの場合は、指定されたポートで TCP 接続を開こうとするだけです。設定されたタイムアウト時間内に指定されたポートで接続を開けなかった場合は、異常と見なされます。UDP サービスの場合、ターゲットの可用性は、ターゲットグループに対する、UDP ヘルスチェック以外のヘルスチェックを使用してテストされます。HTTP と HTTPS のヘルスチェックについては、「Fargate の Amazon ECSタスクにおけるアプリケーションロードバランサーのヘルスチェック失敗のトラブルシューティング方法を教えてください」を参照してください。

Amazon ECS タスクが Network Load Balancer のヘルスチェックに失敗すると、Amazon ECS サービスイベントメッセージから次のエラーが表示されることがあります。

  • Health checks failed error - (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)
  • is in an Availability Zone that is not turned on for the load balancer error - (service AWS-service) (port 80) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Target is in an Availability Zone that is not enabled for the load balancer)

Amazon ECS タスクコンソールからのエラーメッセージの例:

Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)

コンテナのヘルスチェックに失敗した場合は、「Amazon ECS タスクのコンテナヘルスチェックの失敗をトラブルシューティングするにはどうすればよいですか?」を参照してください。

Amazon ECS タスクが停止している場合は、「Checking stopped tasks for errors」を参照してください。

**注:**Amazon ECS タスクは、さまざまな理由で異常なステータスを返すことがあります。次の解決方法を実行してもエラーが解決しない場合は、「Troubleshooting service load balancers」を参照してください。

解決方法

重要: すべての AWS コマンドラインインターフェイス (AWS CLI) コマンドを確認し、example で始まる文字列のすべてのインスタンスを特定の値に置き換えます。たとえば、example-task-private-ip を特定のタスクのプライベート IP アドレスに置き換えます。

注: AWS CLI コマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を実行しているかどうかを確認してください

ヘルスチェックに失敗

Amazon ECS Fargate タスクでのロードバランサーのヘルスチェック失敗をトラブルシューティングするには、以下の手順を実行してください。

  • ロードバランサーと Amazon ECS タスク間の接続を確認します。
  • タスクが Amazon Virtual Private Cloud (Amazon VPC) 内の手動チェックに正しく応答できたことを確認します。
  • Amazon ECS コンテナ内のアプリケーションのステータスと設定を確認します。

ロードバランサーと Amazon ECS タスク間の接続を確認

ロードバランサーが Amazon ECS タスクのヘルスチェックを実行できることを確認します。手順は次のとおりです。

  • コンテナがポート 80 にマップされている場合は、コンテナセキュリティグループがポート 80 のインバウンドトラフィックを許可していることを確認します。
  • Amazon ECS Fargate ENI セキュリティグループが Amazon VPC CIDR 範囲のトラフィックを許可していることを確認します。これにより、Network Load Balancer ノードが Amazon ECS タスクにアクセスしてヘルスチェックを実行できます。詳細については、「Target security groups」を参照してください。
  • Fargate タスクのエラスティックネットワークインターフェイスのサブネットに関連付けられているネットワークアクセスコントロールリスト (ACL) が受信トラフィックを許可していることを確認します。ヘルスチェックポートでは受信トラフィックを許可する必要があります。また、ネットワーク ACL がエフェメラルポートでの送信トラフィックを許可していることを確認してください。

タスクが Amazon VPC 内の手動チェックに正しく応答していることを確認

Amazon VPC 内の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスタスクが手動チェックに正しく応答していることを確認してください。手順は次のとおりです。

注: Amazon EC2 起動タイプ用のクラスターを作成することも、新しい Amazon EC2 インスタンスを起動することもできます。Amazon EC2 インスタンスを起動したくない場合は、ECS exec 機能を使用できます。これを行うには、--enable-execute-commandを使用して同じ VPC でスタンドアロンタスクを起動します。

(オプション 1) HTTP ヘルスチェックの場合:

$ curl -Iv http://<example-task-private-ip>:<example-port>/<healthcheck_path>

出力例:

HTTP/1.1 200 OK

注: ターゲットグループの HTTP ヘルスチェック用に行われた設定では、200 ~ 399 の範囲の成功ステータスコードを受け取ることができます。

(オプション 2) ターゲットで SSL を使用しない TCP ヘルスチェックの場合:

$ nc -z -v -w10 example-task-private-ip example-port

出力例:

nc -z -v -w10 10.x.x.x 80
Connection to 10.x.x.x port 80 [tcp/http] succeeded!

(オプション3) バックエンドヘルスチェックに SSL を必要とする TCP ヘルスチェックの場合:

$ nc -z -v -w10 --ssl example-task-private-ip example-port

出力例:

nc -z -v -w10 10.x.x.x 443
Connection to 10.x.x.x port 443 [tcp/https] succeeded!

ECS コンテナ内のアプリケーションのステータスと設定を確認

  • ターゲットグループの ping ポートとヘルスチェックパスが正しく設定されていることを確認します。
  • Amazon ECS サービスの CPUとメモリの使用率メトリックスをモニタリングします。
  • Amazon ECS タスクを Network Load Balancer に登録するためにヘルスチェックの猶予期間を長くする必要がある場合は、HealthCheckGracePeriodSeconds を大きくします。ヘルスチェックの猶予期間を更新するには、次のコマンドを実行します。
$ aws ecs update-service --cluster example-cluster --service example-service --region <example-region> --health-check-grace-period-seconds <example-value-in-seconds>
  • アプリケーションログにアプリケーションエラーがないか確認します。詳細については、「Viewing awslogs container logs in CloudWatch Logs」を参照してください。
  • アプリケーションから送信されたレスポンスコードを HealthCheckPath で確認してください。アプリケーションにアクセスのログ記録が設定されている場合は、ELB-HealthChecker/2.0 キーワードを使用してログに記録された応答を確認します。CloudWatch Logs を使用している場合は、Log Insights を使用して次のクエリを実行します。
fields @timestamp, @message
| sort @timestamp desc
| filter @message like /ELB-HealthChecker/

ターゲットがロードバランサー用に有効になっていないアベイラビリティーゾーンにある

ロードバランサーのアベイラビリティーゾーン (AZ) を有効にすると、ロードバランシングによって AZ にロードバランサーノードが作成されます。AZ にターゲットを登録した場合、登録されたターゲットがトラフィックを受信できるように AZ を有効にする必要があります。詳細については、「Availability Zones and load balancer nodes」を参照してください。

ロードバランサーが設定されているアベイラビリティーゾーンを特定するには、次のコマンドを実行します。

$ aws elbv2 describe-load-balancers --load-balancer-arn <example-arn-load-balancer> --region <example-region> --query "LoadBalancers[].AvailabilityZones[].ZoneName"

注: ネットワークロードバランサー作成後にアベイラビリティーゾーンを無効にすることはできませんが、追加のアベイラビリティーゾーンを有効にすることはできます。

Amazon ECS Fargate タスクが設定されているアベイラビリティーゾーンを特定するには、以下のコマンドを実行します。

**注:**次のコマンドは、サービスが設定されているサブネットを返します。

$ aws ecs describe-services —cluster <example-cluster-name> —services <example-service-name> --region <example-region> --query "services[].networkConfiguration.awsvpcConfiguration.subnets"

前述のサブネットのアベイラビリティーゾーンを識別するには、以下のコマンドで前述のサブネット ID を使用します。

**注:**次のコマンドは、サービスが設定されているアベイラビリティーゾーンを返します。

$ aws ec2 describe-subnets --subnet-ids <example-subnet-ids> --region <example-region> --query "Subnets[].AvailabilityZone"

注: Amazon ECS サービスのサブネット設定は、AWS CLI update-service コマンドを使用して変更できます。

関連情報

Troubleshooting service load balancers

Health checks for your target groups

AWS公式
AWS公式更新しました 1年前
コメントはありません