Fargate で Amazon ECS タスクを実行しているときに、Network Load Balancer のヘルスチェックに合格できない場合のトラブルシューティング方法を教えてください。

所要時間3分
0

AWS Fargate で Amazon Elastic Container Service (Amazon ECS) タスクを実行すると、Network Load Balancer のヘルスチェックに合格できません。

簡単な説明

HTTP と HTTPS のヘルスチェックについては、「Fargate の Amazon ECS タスクにおいて、Application Load Balancer のヘルスチェックに合格できない場合のトラブルシューティング方法を教えてください」を参照してください。

Amazon ECS タスクが Network Load Balancer のヘルスチェックに合格できない場合、サービスイベントメッセージに次の例のようなエラーが表示されます。

  • エラー: ヘルスチェック不合格 - (service AWS-service) (port 80) は、(target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) において正常な状態ではありません。理由: (ヘルスチェック不合格の理由)
  • エラー: ターゲットは、ロードバランサー用に有効になっていないアベイラビリティーゾーンにあります - (service AWS-service) (port 80) は、(target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) において正常な状態ではありません。理由: (ターゲットは、ロードバランサー用に有効になっていないアベイラビリティーゾーンにあります)
  • ヘルスチェックリクエストがタイムアウトしています - (service AWS-service) (port 8443) は、(target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) において正常な状態ではありません。理由: (リクエストがタイムアウトした理由)

コンテナのヘルスチェックが不合格となった場合は、「Amazon ECS タスクのコンテナヘルスチェックが合格できない場合のトラブルシューティング方法を教えてください」を参照してください。

Amazon ECS タスクが停止した場合は、「Amazon ECS のタスク停止エラーを確認する」を参照してください。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

ヘルスチェックの不合格

Fargate タスクでのロードバランサーヘルスチェックに合格できない場合のトラブルシューティングには、次の手順を実行します。

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

ロードバランサーが Amazon ECS タスクのヘルスチェックを実行できるようにするために、次の設定を確認します。

  • コンテナがポート 80 にマップされている場合、タスクセキュリティグループでポート 80 でのインバウンドトラフィックを許可している。
  • アプリケーションは、タスク定義でコンテナインスタンスにマッピングされたポートで実行できる。
  • Elastic ネットワークインターフェイスのセキュリティグループは、Amazon Virtual Private Cloud (Amazon VPC) CIDR 範囲のトラフィックを許可している。詳細については、「ターゲットセキュリティグループ」を参照してください。
  • Network Load Balancer のセキュリティグループルールは、必要なコンテナポートの Amazon ECS サービスセキュリティグループへのアウトバウンドトラフィックを許可している。
  • タスクのネットワークインターフェイスサブネットのネットワークアクセスコントロールリスト (ネットワーク ACL) は、ヘルスチェックポートでのインバウンドトラフィックを許可している。
  • ネットワーク ACL は、エフェメラルポートでのアウトバウンドトラフィックを許可している。

タスクが Amazon VPC 接続内の手動チェックに正常に応答することを確認する

Amazon VPC 内の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスタスクが、手動チェックに正常に応答することを確認します。

注: Amazon EC2 起動タイプ用のクラスターを作成することも、新しい Amazon EC2 インスタンスを起動することもできます。Amazon EC2 インスタンスを起動しない場合は、ECS Exec を使用できます。

タスクの応答を確認するには、Amazon VPC 接続内で SSH を使用して EC2 インスタンスに接続します。次に、以下のコマンドのいずれかを実行してターゲットグループの構成をテストします。

HTTP ヘルスチェック

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

注: 実際のものでそれぞれ、example-task-private-ip をタスクの IP アドレスに、example-port をポートに置き換えます。コマンドの出力には、ターゲットグループの HTTP ヘルスチェック構成に関する成功ステータスコードが 200 〜 399 の範囲で表示されます。

出力例:

HTTP/1.1 200 OK

ターゲットで SSL を使用しない TCP ヘルスチェック:

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

注: 実際のものでそれぞれ、example-task-private-ip をタスクの IP アドレスに、example-port をポートに置き換えます。

出力例:

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

バックエンドヘルスチェックに SSL を必要とする TCP ヘルスチェック:

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

注: 実際のものでそれぞれ、example-task-private-ip をタスクの IP アドレスに、example-port をポートに置き換えます。

出力例:

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

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

次のアクションを実行します。

  • ターゲットグループの ping ポートとヘルスチェックパスが正しく設定済みであることを確認します。
  • サービスの CPU およびメモリ使用量に関するメトリクスを監視して、アプリケーションがヘルスチェックリクエストに応答しない要因となる、リソースの大量消費が発生していないかどうかを確認します。

タスクには長いヘルスチェック猶予期間が必要な場合は、次の update-service AWS CLI コマンドを実行して healthCheckGracePeriodSeconds を増やします。

aws ecs update-service --cluster example-cluster --service example-service --region example-region --health-check-grace-period-seconds example-value --force-new-deployment

注: 実際のものでそれぞれ、example-cluster をクラスター名に、example-service をサービス名に、example-region を AWS リージョンに、example-value をヘルスチェックの猶予期間 (秒単位) に置き換えます。

デフォルトのタイムアウト期間よりも応答に時間がかかることが原因で、ターゲットグループのターゲットがヘルスチェックで不合格となっているかどうかを確認します。この問題を解決するには、次の modify-target-group コマンドを実行してターゲットグループのタイムアウト秒数を増やします。

aws elbv2 modify-target-group --target-group-arn Target-Group-ARN --health-check-timeout-seconds Timeout-Value

注: 実際のものでそれぞれ、Target-Group-ARN をターゲットグループの ARN に、Timeout-Value をグループのタイムアウト秒数に置き換えます。

アプリケーションログで、アプリケーションエラーの有無を確認します

アプリケーションが HealthCheckPath で送信する応答コードが、ターゲットグループのヘルスチェックパラメータの応答コードと一致することを確認してください。アプリケーションにアクセスログを設定した場合は、キーワード ELB-HealthChecker/2.0 を使用して記録された応答を確認します。Amazon CloudWatch Logs を使用している場合は、CloudWatch Logs Insights を使用して次のクエリを実行します。

fields @timestamp, @message| sort @timestamp desc
| filter @message like /ELB-HealthChecker/

クエリの出力には、Network Load Balancer が送信するヘルスチェックリクエスト、応答コード、エラーが表示されます。

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

アベイラビリティーゾーンにターゲットを登録する場合、そのアベイラビリティーゾーンを有効化し、登録したターゲットがトラフィックを受信できるようにする必要があります。

重要: ロードバランサーを作成した後に、Network Load Balancer でアベイラビリティーゾーンを無効化することはできません。ただし、追加のアベイラビリティーゾーンを有効化することはできます。

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

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

注: 実際のものでそれぞれ、example-arn-load-balancer をロードバランサーの ARN に、example-region をリージョンに置き換えます。

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

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

注: お使いのものでそれぞれ、example-cluster-name をクラスター名に、example-service-name をサービス名に、example-region をリージョンに置き換えます。コマンドの出力には、サービス内のサブネットの ID が表示されます。

タスクのサブネットのアベイラビリティーゾーンを特定するには、次の describe-subnets コマンドを実行します。

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

注: 実際のものでそれぞれ、example-subnet-ids をサブネット ID に、example-region をリージョンに置き換えます。コマンドの出力には、サービスの設定対象であるアベイラビリティーゾーンが表示されます。

Amazon ECS サービスのサブネット設定を変更するには、次の update-service コマンドを実行します。

aws ecs update-service --cluster cluster-name --service service-name --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxx,subnet-yyyyy]}"

注: お使いのものでそれぞれ、cluster-name をクラスター名に、service-name をサービス名に置き換えます。

バックエンドの依存関係

アプリケーションのヘルスチェックパスがデータベースなどのアップストリームまたはダウンストリームサービスと通信する場合は、それらのサービスが使用可能であることを確認します。かかるサービスに問題がある場合、ヘルスチェックに合格できない可能性があります。

複数の要因で、Amazon ECS タスクが Unhealthy 状態になる可能性があります。上記の解決策で問題が解決しない場合は、「Amazon ECS におけるサービスロードバランサーのトラブルシューティング」を参照してください。

関連情報

Network Load Balancer のターゲットグループに対するヘルスチェック

ネットワーク設定

AWS公式
AWS公式更新しました 4ヶ月前
コメントはありません

関連するコンテンツ