Amazon ECS で Application Load Balancer のヘルスチェックに合格するために、Amazon EC2 起動タイプを使用して Amazon ECS タスクを実行するにはどうすればよいですか?

最終更新日: 2022 年 3 月 17 日

Amazon Elastic Container Service (Amazon ECS) で Amazon Elastic Compute Cloud (Amazon EC2) インスタンスの Application Load Balancer ヘルスチェックが異常なステータスを返します。EC2 インスタンスをヘルスチェックに合格させたいと考えています。

簡単な説明

Amazon ECS タスクがロードバランサーのヘルスチェックに失敗すると、Amazon ECS サービスのイベントメッセージで次のいずれかのエラーが表示されます:

  • (サービス AWS-service) (ポート 8080) は、(理由 コード[502または504]でのヘルスチェック失敗) または [リクエストタイムアウト] のため、(target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) で異常です
  • (サービス AWS-Service) (ポート 8080) は、(理由 ヘルスチェック失敗) のため、target-group tf-20190411170 で異常です
  • (サービス AWS-Service) (インスタンス i-1234567890abcdefg) (ポート 443) は、(ヘルスチェック失敗)のため、 (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) で異常です

また、Amazon ECS タスクコンソールで次のエラーが表示されることもあります:

タスクが (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)でELB ヘルスチェックに失敗しました

エラー「(サービス AWS-Service) (task c13b4cb40f1f4fe4a2971f76ae5a47ad)がコンテナヘルスチェックに失敗しました」が表示された場合は、「Amazon ECS タスクのコンテナヘルスチェックの失敗をトラブルシューティングする方法」を参照してください。

注: Amazon ECS タスクは、さまざまな理由で異常なステータスを返すことがあります。次のステップで問題が解決しない場合は、サービスロードバランサーのトラブルシューティングを参照してください。

ヒント: ECS タスクが停止した原因を確認するには、停止したタスクのエラーを確認するを参照してください。

解決方法

Amazon ECS タスクでロードバランサーのヘルスチェックの問題をトラブルシューティングし、Application Load Balancer のヘルスチェックに合格するには、以下を確認します:

  • ロードバランサーと Amazon ECS タスク間の接続
  • ターゲットグループのヘルスチェック設定
  • ECS コンテナ内のアプリケーションのステータスと設定
  • コンテナインスタンスのステータス

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

ロードバランサーが Amazon ECS タスクのヘルスチェックを実行できるかどうかを確認するには、次の点を確認してください。

ロードバランサーとコンテナインスタンス、または awsvpc ネットワークモードの ECS タスクの Elastic Network Interface に添付されたセキュリティグループが正しく設定されている

ロードバランサーとコンテナインスタンス、またはタスクの Elastic Network Interface に異なるセキュリティグループを設定することがベストプラクティスです。この方法により、ロードバランサーとコンテナインスタンスまたはタスク Elastic Network Interface の間のすべてのトラフィックが可能となります。また、コンテナインスタンスが、タスクに対して指定されたポートでトラフィックを受け入れることもできます。

  • ロードバランサーに関連付けられたセキュリティグループが、登録されたポートのコンテナインスタンスまたはタスク Elastic Network Interface への送信トラフィックを許可していることを確認します。コンテナインスタンスに関連付けられたヘルスチェックポートについても同じことが当てはまることを確認します (該当する場合)。
  • コンテナインスタンスまたはタスクElastic Network Interfaceに関連付けられたセキュリティグループが、ロードバランサーに関連付けられたセキュリティグループからタスクホストのポートの範囲へのすべての受信トラフィックを許可することを確認します。ロードバランサーに関連付けられているセキュリティグループを確認するには、Application Load Balancer のセキュリティグループを参照してください。

重要:動的ポートマッピングを使用している場合、サービスはホストポートではなく、動的ポート (通常はポート 32768~65535) で公開されます。このため、コンテナインスタンスセキュリティグループが、ロードバランサーの受信ルールのエフェメラルポート範囲をソースとして反映していることを確認します。

ロードバランサーが、awsvpc ネットワークモード用のコンテナインスタンスまたは ECS タスクの Elastic Network interface と同じアベイラビリティーゾーンに設定されている

ロードバランサーのアベイラビリティーゾーンを有効にすると、Elastic Load Balancing はアベイラビリティーゾーンにロードバランサーノードを作成します。アベイラビリティーゾーンにターゲットを登録していても、アベイラビリティーゾーンを有効にしないと、登録されたターゲットはトラフィックを受信しません。詳細については、「アベイラビリティーゾーンとロードバランサーノード」を参照してください。

ロードバランサーが設定されているアベイラビリティーゾーンを確認するには、次の手順を実行してください:

  1. Amazon EC2 コンソールを開きます。
  2. ナビゲーションペインの [Load Balancing] 下で、[Load Balancers] を選択します。
  3. Amazon ECS サービスで使用しているロードバランサーを選択します。
  4. [説明] タブの [アベイラビリティーゾーン] フィールドに、アベイラビリティーゾーンを表示できます。

注:Application Load Balancerでは、アベイラビリティーゾーンをいつでも有効または無効にできます。Network Load Balancerでは、有効にしたアベイラビリティーゾーンを無効にすることはできませんが、追加のアベイラビリティーゾーンを有効にすることはできます。

Application Load Balancerを使用している場合、クロスゾーンロードバランシングは常に有効になります。Network Load Balancers を使用している場合、クロスゾーンロードバランシングはデフォルトでオフになっています。Network Load Balancer を作成すると、クロスゾーンロードバランシングをいつでもオンまたはオフにできます。詳細については、Elastic Load Balancingの仕組みを参照してください。

コンテナインスタンスが設定されているアベイラビリティーゾーンを確認するには、次の手順を実行します:

  1. Amazon EC2 コンソールを開きます。
  2. ナビゲーションペインの [Auto Scaling] で、[オートスケーリンググループ] を選択します。
  3. クラスターに関連付けられているコンテナインスタンス Auto Scaling グループを選択します。
  4. [詳細] タブの [ネットワーク] で、表示されているアベイラビリティーゾーンが、ロードバランサーにリストされているアベイラビリティーゾーンと一致していることを確認します。

クラスターのアベイラビリティーゾーンを変更するには、 AWS CloudFormation コンソールを開き、クラスターの CloudFormation スタックを選択して、サブネット設定を更新します。

awsvpc のタスクの Elastic Network Interface が設定されているアベイラビリティーゾーンを確認するには、次の手順を実行します:

  1. Amazon ECS コンソールを開きます。
  2. ナビゲーションペインで [クラスター] を選択し、次にサービスを含むクラスターを選択します。
  3. クラスターページの [サービス] タブの [サービス名] 列で、確認するサービスを選択します。
  4. [詳細] を選択し、[許可されたサブネット] を選択して、サービスに対して有効になっているサブネットを表示します。
  5. Amazon VPC コンソールでサブネットを表示できます。
  6. サブネットのアベイラビリティーゾーンが、ロードバランサーにリストされているアベイラビリティーゾーンと一致することを確認します。

注:Amazon ECS サービスのサブネット設定を Amazon ECS コンソールから変更することはできません。この操作は、AWS Command Line Interface (AWS CLI) update-service コマンドを使用して実行できます。

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

ロードバランサーと ECS コンテナインスタンスのサブネット、または awsvpc ネットワークモードの ECS タスク Elastic Network Interface に関連付けられているネットワークアクセスコントロールリスト (ACL) が正しく設定されている

ロードバランサーとコンテナインスタンスまたはタスクの Elastic Network Interface のサブネットは異なる場合があります。これらのサブネット間でトラフィックが許可されていることを確認するには、次の点を確認してください:

  • ロードバランサーのサブネットに関連付けられたネットワーク ACLが、エフェメラルポート (1024 - 65535) とリスナーポートでの受信トラフィックを許可することを確認します。ネットワーク ACL が、ヘルスチェックポートとエフェメラルポートで送信トラフィックも許可していることを確認します。
  • awsvpc モードのコンテナインスタンスまたはタスクの Elastic Network Interface のサブネットに関連付けられたネットワーク ACL が、ヘルスチェックポートで受信トラフィックを許可することを確認します。ネットワーク ACL がエフェメラルポートで送信トラフィックを許可することを確認します。

ネットワーク ACL の詳細については、ネットワーク ACL の操作をご参照ください。

ターゲットグループのヘルスチェック設定を確認する

ターゲットグループのヘルスチェック設定が正しく設定されていることを確認するには、次の手順を実行します:

  1. Amazon EC2 コンソールを開きます。
  2. ナビゲーションペインの [ロードバランシング] の下で、[ターゲットグループ] を選択します。
  3. ターゲットグループを選択します。
    重要: 新しいターゲットグループを使用してください。Amazon ECS がターゲットグループにコンテナを自動的に登録および登録解除するため、ターゲットグループにターゲットを手動で追加しないでください。
  4. [ヘルスチェック] タブで、次の操作を行います:
    [ポート] フィールドと [パス] フィールドが正しく設定されていることを確認します。[ポート] フィールドが正しく設定されていない場合、ロードバランサーによりコンテナの登録が解除される可能性があります。
    [ポート] で、[トラフィックポート] が選択されていることを確認します。
    注: [上書き] を選択した場合は、指定したポートがタスクホストポートと一致することを確認します。
    [タイムアウト] で、応答タイムアウトの値が正しく設定されていることを確認します。
    注: 応答タイムアウトとは、コンテナがヘルスチェック ping に応答を返すまでの時間です。この値が応答に必要な時間よりも小さい場合、ヘルスチェックは失敗します。

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

ECS コンテナ内のアプリケーションがロードバランサーのヘルスチェックに応答することを確認する

ECS コンテナ内のアプリケーションがロードバランサーのヘルスチェックに正しく応答しているかどうかを確認するには、次の手順を実行します:

  • ターゲットグループの ping ポートとヘルスチェックパスが正しく設定されていることを確認します。
  • ECS サービスの CPU とメモリの使用率メトリクスをモニタリングします。例えば、CPU が高いと、アプリケーションが応答しなくなり、502 エラーまたはタイムアウトが発生する可能性があります。
  • ヘルスチェックの最低猶予期間を定義します。この設定は、タスクがインスタンス化されてから事前に定義された期間は Elastic Load Balancing ヘルスチェックを無視するようにサービススケジューラに指示します。Amazon ECS タスクでは、Network Load Balancer登録のために、ヘルスチェックの猶予期間がより長く必要になる場合があります。
  • アプリケーションログでアプリケーションエラーを確認します。詳細については、CloudWatch Logs でawslogコンテナログを表示するを参照してください。

ECS コンテナのアプリケーションが正しいレスポンスコードを返していることを確認する

ロードバランサーがヘルスチェックパスに HTTP GET リクエストを送信すると、ECS コンテナのアプリケーションはデフォルトの 200 OK レスポンスコードを返すはずです。

注: Application Load Balancer を使用する場合は、Matcher 設定を 200 以外のレスポンスコードに更新できます。詳細に関しては、ターゲットグループのヘルスチェックをご覧ください。

1.    SSH を使用してコンテナインスタンスに接続します

2.    (オプション) システムに適したコマンドで curl をインストールします。

Amazon Linux およびほかの RPM ベースのディストリビューションに関しては、以下のコマンドを実行します。

sudo yum –y install curl

Ubuntu などの Debian ベースのシステムに関しては、以下のコマンドを実行します。

sudo apt-get install curl

3.    コンテナ ID を取得するには、次のコマンドを実行します:

docker ps

注: ローカルリスナーのポートは、PORTS のコマンド出力で、シーケンスの最後に表示されます。

4.    コンテナの IP アドレスを取得するには、docker inspect コマンドを実行します:

112233445566 は必ずコンテナの ID 番号に置き換えてください。

$ IPADDR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' 112233445566)

注: コンテナの IP アドレスは IPADDR に保存されます。このコマンドは、 BRIDGE ネットワークモードを使用する場合にのみ使用してください。

AWSVPC ネットワークモードを使用する場合は、タスク Elastic Network Interfaceに割り当てられたタスク IP アドレスを使用します。HOST ネットワークモードを使用する場合は、タスクが公開されているホストの IP アドレスを使用します。

5.    ステータスコードを取得するには、IPADDR とローカルリスナーのポートを含むcurlコマンドを実行します。たとえば、ヘルスチェックパスが /health であるポート 8080 でリッスンするコンテナで curl コマンドを実行すると、コマンドはレスポンスコード 200 OK を返す必要があります:

curl -I http://${IPADDR}:8080/health

HTTP 以外のエラーメッセージを受け取った場合、アプリケーションは HTTP トラフィックをリッスンしていません。Matcher 設定で指定したものとは異なる HTTP ステータスコードを受信する場合、アプリケーションはHTTP トラフィックをリッスンしていますが、正常なターゲットのステータスコードを返していません。

コンテナインスタンスのステータスを確認する

AWS ECS サービスイベントから次のイベントメッセージを受け取ったとします:

(サービス AWS-Service) (インスタンス i-1234567890abcdefg) (ポート 443) は、(ヘルスチェック失敗)のため、 (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) で異常です

Amazon EC2 コンソールでステータス確認を表示して、コンテナインスタンスのステータスを確認します。インスタンスがシステムステータスチェックに失敗した場合は、インスタンスを停止し、スタートしてみてください


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?