Amazon ECS で Application Load Balancer のヘルスチェックに合格するために、Amazon EC2 起動タイプを使用して Amazon ECS タスクを実行するにはどうすればよいですか?
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) (タスク c13b4cb40f1f4fe4a2971f76ae5a47ad) コンテナヘルスチェックの失敗」が表示される場合は、「Amazon ECS タスクのコンテナヘルスチェックの失敗をトラブルシューティングするにはどうすればよいですか?」を参照してください。
注: Amazon ECS タスクが異常ステータスを返す理由はさまざまです。次の手順を実行しても問題が解決しない場合は、「サービスロードバランサーのトラブルシューティング」を参照してください。 ECS タスクが停止した理由を確認するには、「停止されたタスクでのエラーの確認」を参照してください。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
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 がアベイラビリティーゾーンにロードバランサーノードを作成します。アベイラビリティーゾーンにターゲットを登録し、アベイラビリティーゾーンをオンにしない場合、登録されたターゲットはトラフィックを受信しません。詳細については、「アベイラビリティーゾーンとロードバランサーノード」を参照してください。
ロードバランサーが設定されているアベイラビリティーゾーンを確認するには、以下の手順を実行します。
- Amazon EC2 コンソールを開きます。
- ナビゲーションペインの [ロードバランシング] で、[ロードバランサー] を選択します。
- Amazon ECS サービスに使用しているロードバランサーを選択します。
- **[説明]**タブの [アベイラビリティーゾーン] フィールドでアベイラビリティーゾーンを表示できます。
注: Application Load Balancer では、いつでもアベイラビリティーゾーンを有効または無効にできます。Network Load Balancer では、有効にしたアベイラビリティーゾーンを無効にすることはできませんが、追加のアベイラビリティーゾーンを有効にすることはできます。
Application Load Balancers を使用する場合、クロスゾーン負荷分散は常に有効です。Network Load Balancer を使用する場合、クロスゾーン負荷分散はデフォルトでオフになっています。Network Load Balancer を作成したら、いつでもクロスゾーン負荷分散をオンまたはオフにできます。詳細については、「Elastic Load Balancing の仕組み」を参照してください。
コンテナインスタンスが設定されているアベイラビリティーゾーンを確認するには、以下の手順を実行します。
- Amazon EC2 コンソールを開きます。
- ナビゲーションペインの [自動スケーリング] で、[Auto Scaling グループ] を選択します。
- クラスターに関連付けられているコンテナインスタンスの Auto Scaling グループを選択します。
- [詳細] タブの [ネットワーク] で、表示されているアベイラビリティーゾーンが、お使いのロードバランサーについて表示されているアベイラビリティーゾーンと一致していることを確認します。
クラスターのアベイラビリティーゾーンを変更するには、AWS CloudFormation コンソールを開き、クラスターの CloudFormation スタックを選択し、サブネット設定を更新します。 awsvpc のタスクの Elastic Network Interface が設定されているアベイラビリティーゾーンを確認するには、以下の手順を実行します。
- Amazon ECS コンソールを開きます。
- ナビゲーションペインで [クラスター] を選択し、サービスを含んでいるクラスターを選択します。
- クラスターのページの [サービス] タブにある [サービス名] 列で、確認するサービスを選択します。
- [詳細]、[許可されたサブネット] の順に選択すると、サービスで有効になっているサブネットが表示されます。
- Amazon VPC コンソールでサブネットを表示できます。
- サブネットのアベイラビリティーゾーンが、ロードバランサーのリストにあるアベイラビリティーゾーンと一致していることを確認します。
注: Amazon ECS コンソールから Amazon ECS サービスのサブネット設定を変更することはできません。AWS CLI の update-service コマンドを使用してサブネット設定を変更できます。
ロードバランサーと ECS コンテナインスタンスのサブネットに関連付けられているネットワークアクセスコントロールリスト (ACL)、または awsvpc ネットワークモードの ECS タスクの Elastic Network Interface が正しく設定されている
ロードバランサーとコンテナインスタンスまたはタスクの Elastic Network Interface のサブネットは異なる場合があります。これらのサブネット間のトラフィックが許可されていることを確認するには、以下をチェックします。
- ロードバランサーのサブネットに関連付けられているネットワーク ACL が、エフェメラルポート (1024 ~ 65535) とリスナーポートでの入力トラフィックを許可していることを確認します。ネットワーク ACL が、ヘルスチェックポートとエフェメラルポートでの出力トラフィックも許可していることを確認します。
- お使いのコンテナインスタンスまたは awsvpc モードのタスクの Elastic Network Interface のサブネットに関連付けられているネットワーク ACL が、ヘルスチェックポートでの入力トラフィックを許可していることを確認します。ネットワーク ACL が、エフェメラルポートでの出力トラフィックを許可していることを確認します。
ネットワーク ACL の詳細については、「ネットワーク ACL の動作」を参照してください。
ターゲットグループのヘルスチェック設定を確認する
ターゲットグループのヘルスチェック設定が正しく設定されていることを確認するには、以下の手順を実行します。
- Amazon EC2 コンソールを開きます。
- ナビゲーションペインの [ロードバランシング] で、[ターゲットグループ] を選択します。
- ターゲットグループを選択します。
重要: 新しいターゲットグループを使用してください。Amazon ECS ではターゲットグループにコンテナを自動的に登録および登録解除するため、ターゲットをターゲットグループに手動で追加しないでください。 - [ヘルスチェック] タブで、次の情報を入力します。
[ポート] フィールドと [パス] フィールドが正しく設定されていることを確認します。[ポート] フィールドが正しく設定されていない場合、ロードバランサーがコンテナの登録を解除する可能性があります。
[ポート] で、トラフィックポートを選択します。
注: [オーバーライド] を選択した場合は、指定したポートがタスクホストポートと一致していることを確認してください。
[タイムアウト] の場合は、レスポンスタイムアウト値が正しく設定されていることを確認してください。
注: レスポンスタイムアウトは、コンテナがヘルスチェックの ping にレスポンスを返すまでにかかる時間です。この値がレスポンスに必要な時間よりも小さい場合、ヘルスチェックは失敗します。
ECS コンテナ内のアプリケーションのステータスと構成を確認する
ECS コンテナ内のアプリケーションがロードバランサーのヘルスチェックに応答することを確認する
ECS コンテナ内のアプリケーションがロードバランサーのヘルスチェックに正しく応答することを確認するには、以下のタスクを完了します。
- ターゲットグループの ping ポートとヘルスチェックパスが正しく設定されていることを確認します。
- ECS サービスの CPU とメモリの使用率メトリクスを監視します。CPU 使用率が高い場合は、アプリケーションが応答しなくなり、502 エラーまたはタイムアウトが発生することがあります。
- ヘルスチェックの猶予期間の最小値を定義します。この設定は、タスクがインスタンス化された後、事前に定義された期間、Elastic Load Balancing のヘルスチェックを無視するようサービススケジューラーに指示します。Amazon ECS タスクでは、Network Load Balancer を登録するために必要なヘルスチェックの猶予期間がより長くなる可能性があります。
- アプリケーションログにアプリケーションエラーがないか確認します。詳細については、「CloudWatch ログで awslog コンテナログを表示する」を参照してください。
ECS コンテナ内のアプリケーションが正しいレスポンスコードを返すことを確認する
ロードバランサーがヘルスチェックパスに HTTP GET リクエストを送信すると、ECS コンテナ内のアプリケーションはデフォルトの 200 OK レスポンスコードを返すことが予想されます。
注: Application Load Balancer を使用する場合は、Matcher の設定を 200 以外のレスポンスコードに更新できます。詳細に関しては、「ターゲットグループのヘルスチェック」をご覧ください。
-
SSH を使用してコンテナインスタンスに接続します。
-
(オプション) システムに適したコマンドで curl をインストールします。
Amazon Linux およびその他の RPM ベースのディストリビューションでは、次のコマンドを実行します。sudo yum -y install curl
Debian ベースのシステム (Ubuntu など) では、次のコマンドを実行します。
sudo apt-get install curl
-
コンテナ ID を取得するには、次のコマンドを実行します。
docker ps
注: ローカルリスナーのポートは、シーケンスの最後の PORTS 以下でコマンド出力に表示されます。
-
コンテナの IP アドレスを取得するには、docker inspect コマンドを実行します。
$ IPADDR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' 112233445566)
注: コンテナの IP アドレスは IPADDR に保存されます。このコマンドは、BRIDGE ネットワークモードを使用する場合にのみ使用してください。112233445566 をコンテナの ID 番号に置き換えてください。
awsvpc ネットワークモードを使用する場合は、タスクの Elastic Network Interface に割り当てられたタスク IP アドレスを使用します。HOST ネットワークモードを使用する場合は、タスクが公開されているホストの IP アドレスを使用します。 -
ステータスコードを取得するには、IPADDR とローカルリスナーのポートを含んだ curl コマンドを実行します。たとえば、ポート 8080 でリッスンしているコンテナで、ヘルスチェックパスが /health の場合に 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 コンソールのステータスチェックを表示することで、コンテナインスタンスのステータスを確認します。インスタンスがシステムのステータスチェックに失敗した場合は、インスタンスの停止と起動を試みてください。
関連情報
関連するコンテンツ
- 質問済み 4年前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前