概要
Application Load Balancer(ALB)で負荷分散されたWeb Server群のうち、1台だけがインターネットからの接続を受信できないというトラブルは、実務でも試験でも頻出のシナリオです。
このようなケースでは、ネットワークACLやSecurity Group、仮想セキュリティアプライアンスのルールセットが正しいことが確認済みであっても、接続できない原因が残ることがあります。この記事では「複数台のうち1台だけ」という条件に着目して、確認すべきポイントを整理し、ALBのターゲットグループとENI単位のSecurity Group設定という2つの観点からトラブルシューティングの手順をまとめます。

この記事のメリット
- ALB + Web Server構成におけるトラフィックフローを理解できる
- 「1台だけの問題」に対するトラブルシューティングの考え方を習得できる
- ENI単位のSecurity Group設定の重要性がわかる
- ALBターゲットグループの役割とヘルスチェックの仕組みを把握できる
- ルートテーブルやサブネット設定が1台固有の問題にならない理由を理解できる
- SCS試験でALB関連のトラブルシューティング問題を正確に判断できるようになる
技術解説
ALB + Web Server構成のトラフィックフロー
ALBを使用した一般的なWeb Server構成では、インターネットからのトラフィックは以下の経路をたどります。
flowchart LR
Internet[インターネット] --> IGW[IGW] -->
VSA[仮想セキュリティ<br>アプライアンス] --> ALB[ALB] --> EC2[Web
Server<br>(EC2)]各コンポーネントの役割は以下のとおりです。
| コンポーネント | 役割 |
|---|---|
| Internet Gateway(IGW) | VPCとインターネット間の通信を仲介する |
| 仮想セキュリティアプライアンス | トラフィックの検査・フィルタリングを行う |
| Application Load Balancer(ALB) | ターゲットグループに登録された健全な(healthy)Web Serverへリクエストを分散する |
| Web Server(EC2) | 実際のリクエスト処理を行う |
このフローにおいて、ネットワークACL・Security Group・仮想アプライアンスのルールは、すべてのWeb Serverに共通して適用されます。そのため、これらのルールが正しければ、1台だけが接続を受信できない原因にはなりません。
トラブルシューティングの考え方:「1台だけの問題」はインスタンス固有の設定を疑う
複数のWeb Serverのうち1台だけが問題を起こしている場合、全サーバーに共通する設定ではなく、そのインスタンスに固有の設定に原因がある可能性が高くなります。この切り分けがトラブルシューティングの出発点です。
全サーバー共通の設定(1台だけの原因にならない)
- ネットワークACL:サブネット単位で適用されるため、同じサブネット内のサーバーには同一のルールが適用される
- ルートテーブル:サブネット単位で関連付けられるため、同じサブネット内のサーバーは同じルーティングを使用する
- 仮想セキュリティアプライアンスのルール:トラフィックの検査ルールは全トラフィックに共通で適用される
- 仮想アプライアンスからWeb Serverサブネットへのルート設定:ルーティングはサブネット単位のため、1台だけに影響しない
インスタンス固有の設定(1台だけの原因になりうる)
- ENIに設定されたSecurity Group:インスタンス(ENI)単位で異なるSecurity Groupを設定できる
- ALBターゲットグループへの登録:特定のインスタンスだけ登録されていない、またはヘルスチェックに失敗している可能性がある
ENI単位のSecurity Group設定の重要性
Security Groupは「ルールセットが正しい」ことと「正しいSecurity Groupがアタッチされている」ことは別の問題です。問題文で「Security Groupのルールセットは正しい」と言及されている場合でも、そのSecurity Groupが対象インスタンスのENIに正しく適用されているかは別途確認が必要です。
たとえば、以下のようなケースが考えられます。
- 問題のWeb ServerのENIに、Web Server用のSecurity Groupではなく別のSecurity Groupが誤ってアタッチされている
- インスタンスの再作成や設定変更時に、Security Groupの関連付けが外れた
- 複数のENIがアタッチされており、トラフィックを受信するENIに適切なSecurity Groupが設定されていない
EC2インスタンスには1つ以上のENI(Elastic Network Interface)がアタッチされており、Security GroupはENI単位で設定されます。同じVPC内のインスタンスであっても、ENIごとに異なるSecurity Groupを設定できるため、1台だけ異なる設定になっている可能性があります。
ALBターゲットグループの役割とヘルスチェック
ALBはターゲットグループに登録されたインスタンスにのみトラフィックを分散します。ターゲットグループに関連する問題として、以下の2つのパターンがあります。
パターン1: ターゲットグループに登録されていない
そもそもターゲットグループにWeb Serverが登録されていなければ、ALBからトラフィックが転送されません。インスタンスの追加や置き換え時に登録漏れが発生することがあります。
パターン2: ヘルスチェックに失敗している
ターゲットグループに登録されていても、ヘルスチェックに失敗してステータスが unhealthy になっているインスタンスにはトラフィックが転送されません。ただし、ALBにはフェイルオープンの仕組みがあり、アベイラビリティーゾーン内の健全なターゲット数が設定されたしきい値を下回った場合、そのゾーンの全ターゲット(unhealthy を含む)にトラフィックを送信します。デフォルトでは、このしきい値は「off」(1台でも healthy なターゲットがあれば通常どおり分散する)に設定されています。
ヘルスチェックの失敗原因としては以下が考えられます。
- Web Serverのアプリケーションが正常に動作していない
- ヘルスチェックのパス(デフォルト:
/)が期待するHTTPステータスコード(デフォルト:200)を返さない - ヘルスチェックのレスポンスがタイムアウト(デフォルト: 5秒)している
- ヘルスチェックのポートがSecurity Groupで許可されていない
確認すべき項目の比較表
| 確認項目 | 1台だけの原因になるか | 理由 |
|---|---|---|
| Web ServerのENIに設定されたSecurity Group | はい | ENI単位で異なるSGを設定できるため、1台だけ誤った設定になりうる |
| ALBターゲットグループへの登録状況 | はい | インスタンス単位で登録するため、1台だけ未登録や unhealthy になりうる |
| 仮想アプライアンスからWeb Serverサブネットへのルート設定 | いいえ | ルーティングはサブネット単位で適用されるため、同一サブネット内の全サーバーに影響する |
| Web Serverサブネットのルートテーブル | いいえ | ルートテーブルはサブネットに関連付けられるため、同一サブネット内の全サーバーに影響する |
| ネットワークACL | いいえ | サブネット単位で適用されるため、同一サブネット内の全サーバーに影響する |
実践
ここでは、ALB環境で1台のWeb Serverだけがインターネットからの接続を受信できない場合のトラブルシューティング手順をコンソールで説明します。
前提条件
- リージョン:
ap-northeast-1(東京) - VPC・サブネットが構成済みの状態
- ALBが作成済みで、ターゲットグループにWeb Server(EC2インスタンス)が登録されている状態
- Web Server用のSecurity Group(HTTP 80番ポートを許可)が作成済みの状態
作成済みリソース一覧
| リソース種別 | リソース名(例) | 用途 |
|---|---|---|
| VPC | web-vpc | Web Server環境用VPC |
| ALB | web-alb | Web Serverへの負荷分散 |
| ターゲットグループ | web-target-group | ALBのルーティング先 |
| Security Group | web-server-sg | Web ServerのENIにアタッチするSG |
| EC2インスタンス | web-server-1 ~ web-server-3 | Web Server(3台構成) |
手順1: ALBターゲットグループの登録状況を確認する
まず、問題のWeb Serverがターゲットグループに正しく登録されているかを確認します。
- AWSマネジメントコンソールにログインし、右上のリージョンが「アジアパシフィック(東京) ap-northeast-1」であることを確認します。
- 上部の検索バーに
EC2と入力し、表示された「EC2」を選択します。 - 左側ナビゲーションの「ロードバランシング」→「ターゲットグループ」を選択します。
- ターゲットグループの一覧から
web-target-groupを選択します。 - 「ターゲット」タブを選択します。
- 「登録済みターゲット」セクションで、以下の点を確認します。
- 問題のWeb Server(
web-server-1など)が一覧に表示されているか - 表示されていない場合は、ターゲットグループに未登録であることが原因です
- 表示されている場合は、「ステータス」列の値を確認します
- 問題のWeb Server(

手順2: ヘルスチェックのステータスを確認する
ターゲットグループに登録されている場合、ヘルスチェックのステータスを確認します。
- 手順1の「ターゲット」タブで、各ターゲットの「ヘルスステータス」列を確認します。
- 正常なWeb Serverは
healthyと表示されます。 - 問題のWeb Serverが
unhealthyと表示されている場合、「ヘルスステータスの詳細」列に失敗の理由コードが表示されます。
主な理由コード:
| 理由コード | 説明 |
|---|---|
Elb.InitialHealthChecking | 初回ヘルスチェック実行中(登録直後) |
Elb.RegistrationInProgress | ターゲット登録処理中 |
Target.Timeout | ヘルスチェックのレスポンスがタイムアウト |
Target.FailedHealthChecks | ヘルスチェックが連続して失敗 |
Target.ResponseCodeMismatch | レスポンスのHTTPステータスコードが期待値と不一致 |
Target.InvalidState | ターゲットが停止状態または終了状態 |
- ヘルスチェックの設定を確認するには、「ヘルスチェック」タブを選択します。
- 以下の設定項目を確認します。
| 設定項目 | デフォルト値 | 説明 |
|---|---|---|
| ヘルスチェックプロトコル | HTTP | ヘルスチェックに使用するプロトコル |
| ヘルスチェックパス | / | ヘルスチェックリクエストの宛先パス |
| ポート | トラフィックポート | ヘルスチェック送信先ポート |
| 正常のしきい値 | 5回 | healthyと判定するまでの連続成功回数 |
| 非正常のしきい値 | 2回 | unhealthyと判定するまでの連続失敗回数 |
| タイムアウト | 5秒 | レスポンスのタイムアウト時間 |
| 間隔 | 30秒 | ヘルスチェックの実行間隔 |
| 成功コード | 200 | 正常と判定するHTTPステータスコード |

手順3: ターゲットグループにWeb Serverを登録する
問題のWeb Serverがターゲットグループに未登録だった場合、以下の手順で登録します。
- 「ターゲット」タブで「ターゲットの登録」をクリックします。
- 「使用可能なインスタンス」セクションで、問題のWeb Server(
web-server-1など)のチェックボックスを選択します。 - ポートが正しいこと(例:
80)を確認します。 - 「保留中として以下を含める」をクリックします。
- 「ターゲットを確認」セクションに対象のインスタンスが表示されていることを確認します。

- 「保留中のターゲットの登録」をクリックします。
- 「ターゲット」タブに戻り、登録したインスタンスのステータスが
initial(初回ヘルスチェック中)と表示されていることを確認します。 - しばらく待ち、ステータスが
healthyに変わることを確認します。
手順4: Web ServerのENIに設定されたSecurity Groupを確認する
ターゲットグループの登録に問題がなかった場合、または登録後もヘルスチェックが unhealthy のままの場合、ENIのSecurity Groupを確認します。
- 左側ナビゲーションの「インスタンス」→「インスタンス」を選択します。
- 問題のWeb Server(
web-server-1など)のチェックボックスを選択します。 - 画面下部の「セキュリティ」タブを選択します。
- 「セキュリティグループ」セクションに表示されているSecurity Groupの名前とIDを確認します。
web-server-sgがアタッチされているか- 他のWeb Server(正常に動作しているもの)と同じSecurity Groupがアタッチされているか
- 正常に動作しているWeb Serverのセキュリティタブも同様に確認し、Security Groupを比較します。
Security Groupが異なる場合の修正手順
- 問題のインスタンスが選択された状態で、画面上部の「アクション」をクリックします。
- ドロップダウンメニューから「セキュリティ」→「セキュリティグループを変更」を選択します。
- 「関連付けられたセキュリティグループ」セクションで、誤ったSecurity Groupの右側にある「削除」をクリックして外します。
- 「セキュリティグループを追加」のドロップダウンで
web-server-sgを検索・選択し、「セキュリティグループを追加」をクリックします。 - 正しいSecurity Groupのみが表示されていることを確認します。

- 右下の「保存」をクリックします。
手順5: 修正後の動作確認
Security Groupの変更またはターゲットグループへの登録が完了したら、動作を確認します。
- 左側ナビゲーションの「ロードバランシング」→「ターゲットグループ」を選択します。
web-target-groupを選択し、「ターゲット」タブを開きます。- 問題のWeb Serverのヘルスステータスが
healthyに変わったことを確認します。ヘルスチェックの間隔と正常しきい値の設定によっては、ステータスの更新までに数十秒から数分かかる場合があります。

- ALBのDNS名(例:
web-alb-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com)にブラウザでアクセスし、正常にページが表示されることを確認します。 - 複数回リロードして、問題のWeb Serverにもトラフィックが分散されていることを確認します。アクセスログやアプリケーション側でどのサーバーが応答しているかを確認できるようにしておくと、分散状況がわかりやすくなります。

まとめ
ALB環境で複数のWeb Serverのうち1台だけが接続を受信できない場合、トラブルシューティングの鍵は「1台だけの問題 → インスタンス固有の設定を疑う」という考え方です。
| 確認項目 | 確認すべき理由 | 1台だけの原因になるか |
|---|---|---|
| ENIのSecurity Group | インスタンス単位で異なるSGを設定できるため | はい |
| ALBターゲットグループの登録 | インスタンス単位で登録するため | はい |
| ルートテーブル | サブネット単位で適用されるため | いいえ |
| ネットワークACL | サブネット単位で適用されるため | いいえ |
| 仮想アプライアンスのルート設定 | サブネット単位のルーティングのため | いいえ |
Security Group・ネットワークACL・仮想アプライアンスの「ルールセット」が正しいことが確認済みであっても、正しいSecurity Groupがそのインスタンスにアタッチされているか、ALBのターゲットグループに正しく登録されているかは別の確認事項です。特にSecurity Groupについては「ルールの正しさ」と「適用先の正しさ」を分けて考えることが重要です。
SCS試験では、問題文に「Security Groupのルールは正しい」「ネットワークACLは正しい」と書かれている場合、これらのルール自体を再確認する選択肢は除外できます。代わりに、インスタンス固有の設定(ENIへのSGの適用状況、ターゲットグループへの登録状況)を確認する選択肢を選ぶことがポイントです。
