type
status
date
slug
summary
tags
category
icon
password
理論
高可用性と冗長性を持つサービスの設計
クラウド環境で高可用性や冗長性を持つサービスを設計するためには、いくつかの重要なコンセプトとAWSのサービスを理解する必要があります。この記事では、特にネットワークロードバランサ(NLB)やElastic IP(EIP)を使用したサービス設計の本質を解説します。
1. 高可用性と冗長性
高可用性とは、システムやサービスが障害に強く、常に稼働し続けることができる状態を指します。これを実現するためには、冗長性が重要です。冗長性とは、システムの主要なコンポーネントを複数設置し、障害が発生しても他のコンポーネントがその役割を引き継ぐことでサービスの継続を可能にすることです。
AWSで高可用性を実現するためには、次の要素を考慮する必要があります:
- 複数のアベイラビリティゾーン(AZ)にリソースを分散させる。
- 自動スケーリングを活用してトラフィックの増加に柔軟に対応する。
- 障害復旧のために、フェイルオーバー機能やバックアップを設定する。
これにより、特定のAZがダウンしても、他のAZでサービスが稼働し続けることができます。
2. ネットワークロードバランサ(NLB)
- NLB(Network Load Balancer)は、TCP、UDPトラフィックを効率的に処理するためのロードバランサです。特に、低レイテンシと高いスループットが要求されるサービスに向いています。
NLBの主な特徴:
- 高いパフォーマンス: 大量のTCP/UDPトラフィックを扱うため、高速な通信が求められるサービスに最適です。
- IPベースの負荷分散: トラフィックをIPアドレスに基づいて分散させるため、静的IP(Elastic IP)を提供することができます。
- 障害時のフェイルオーバー: サービスを複数のAZに分散することで、障害時に他のAZに自動的に切り替えることができます。
NLBを使用することで、固定IPアドレスを提供することができ、他の企業がそのIPアドレスを許可リストに追加することも可能です。これにより、サービスが外部からのアクセスを安全に受け入れられるようになります。
3. Elastic IP(EIP)
Elastic IPは、AWSが提供する静的IPアドレスです。EIPは、EC2インスタンスやNLBに割り当てることができ、サービスがスケールアウトやインスタンスの再起動を行っても、常に同じIPアドレスを維持できます。
EIPの主な特徴:
- 静的IPアドレス: アプリケーションが必要とする固定IPを提供します。
- 障害復旧: EC2インスタンスやNLBに問題が発生した場合でも、EIPを別のインスタンスやサービスに再割り当てできるため、ダウンタイムを最小限に抑えます。
このように、EIPはサービスを外部のシステムに公開する際に、固定IPアドレスを提供し、他の企業やサービスがそのIPアドレスを許可リストに追加できるようにします。
4. NLBの利用方法
NLBを利用したサービス設計では、以下のような流れで構成を組み立てることができます:
- EC2インスタンスやコンテナ(ECSやEKS)を複数のアベイラビリティゾーンに配置し、高可用性を確保します。
- NLBを使用して、複数のインスタンスやサービスにトラフィックを分散します。NLBの前にElastic IPを割り当てることで、固定IPを提供し、外部からのアクセスを受け入れます。
- DNS設定:
my.service.com
のDNSレコードを、NLBのDNS名にエイリアスとして設定します。これにより、ユーザーは固定IPを使用することなく、サービスにアクセスできます。
- セキュリティ: NLBを利用することで、EC2インスタンスやバックエンドのリソースに直接アクセスされることなく、安全にトラフィックを受けることができます。
5. 結論
高可用性と冗長性を持つサービスを設計する際、NLBとElastic IPを活用することで、固定IPの提供とトラフィックの負荷分散を実現できます。また、NLBは複数アベイラビリティゾーンへの冗長性を提供し、システムの可用性を確保します。このような設計を採用することで、外部企業がIPアドレスを許可リストに追加できるようにし、安全かつ高可用なサービスを提供することができます。
実践
参照元:
(前提)今回の構成と設定
パブリックサブネットに「internet-facing」のNLBを配置し、プライベートサブネットにEC2を配置します。 クライアントPCからインターネット経由でSSHでアクセスしてみます。


NLBの待ち受けポート番号は51512として、ターゲットグループにはEC2(TCP22番ポート)を設定します。 ヘルスチェックはトラフィックと同じTCP22番ポートを使用します。 ターゲットタイプはインスタンスに設定しています。


※ターゲットタイプをIPアドレスに設定した場合は挙動が変わりますのでご注意ください。詳細は以下リンクに記載があります。
ターゲットをインスタンス ID で登録すると、クライアントの送信元 IP アドレスが保持され、アプリケーションに提供されます。ターゲットを IP アドレスで登録する場合、送信元 IP アドレスはロードバランサノードのプライベート IP アドレスとなります。
結論の整理
ターゲットグループのタイプが「インスタンス」の場合、以下の要点が確認されました:
1. NAT Gateway・ルーティング設定
- 不要: EC2からクライアントPCへの通信を返す際、NAT Gatewayや特別なルーティング設定は必要ありません。
2. EC2のセキュリティグループ
以下の許可設定が必要です:
- NLBのプライベートIPからの通信許可
- 目的: ヘルスチェック用(SSH通信)。
- クライアントPCのIPからの通信許可
- 目的: メイントラフィック用(SSH通信)。
3. tcpdumpの記録内容
- 送信元IPアドレス: クライアントPC。
- 宛先ポート番号: 22番ポート(SSH通信)。
4. VPC Flow Logsの記録内容
- 送信元IPアドレス: クライアントPC。
- 宛先ポート番号: 22番ポート(SSH通信)。
まとめ
- NAT Gatewayや特別なルーティング設定は不要。
- セキュリティグループ設定で、NLBのヘルスチェックとクライアントPCの通信を許可する必要あり。
- tcpdumpとVPC Flow Logsには、クライアントPCを送信元とする通信が記録される。
EC2からクライアントPCへ通信を返すために、NAT Gateway・クライアントPC向けのルーティング設定は不要。
今回EC2はプライベートサブネットに配置していますが、NAT Gatewayを設置せずにクライアントPCに通信を返すことができました。 また、プライベートサブネットのルートテーブルにはインターネット向けのルートがありませんが、これも問題ありませんでした。

以下リンクの記載の通り、EC2からの戻りの通信がNLBを経由しているため、このような挙動となるようです。
ポイント整理
- NLBと戻りパケット
- NLBはAWS Hyperplaneを使用し、戻りのパケットもNLBを通過する仕組み。
- AWS Hyperplaneは、AWSが提供する高度なネットワーク仮想化技術の一つで、主にロードバランサやゲートウェイサービスの背後で動作します。
- クライアント側から見ると、NLBと直接通信しているように見える。
- バックエンド側のルーティング設定は不要。
- セキュリティグループ設定
- バックエンドサーバー側でクライアントIP(Internet-facingの場合は
0.0.0.0/0
)の通信を許可する必要がある。
- EC2発のインターネット通信
- 必要な設定: NAT Gatewayとインターネット向けルーティング。
- 用途: パッケージダウンロードなどのアウトバウンド通信。
要点まとめ
NLB経由の通信では特別なルーティングは不要。ただし、EC2発のインターネット通信にはNAT Gatewayが必要となる。
EC2のセキュリティグループ
NLBのプライベートIPからのSSH通信(ヘルスチェック用)
ヘルスチェック用に、NLBのプライベートIPからのSSH通信を許可する必要がありました。 ※NLBにはセキュリティグループを設定できないため、直接IPを指定しています。今回はNLBに固定IPを設定しなかったので、ネットワークインターフェイスの画面からIPを確認しました。

クライアントPCのIPからのSSH通信(メイントラフィック用)
以下リンクの通り、クライアントのIPからの通信を許可する必要があります。
「透過」とは、ネットワークやシステムにおいてデータの送受信が中継機器やサービスを経由しても、元の情報(例: 送信元IPアドレスやポート番号)が変更されず、そのまま保持される状態を指します。
NLBにおける透過性の具体例
- 透過される情報:
- 送信元IPアドレス(クライアントPCのIPアドレス)が変更されずにEC2インスタンスに届く。
- 変更される情報:
- 宛先ポート番号はNLBのリスナールールに従い、ターゲットグループの待ち受けポートに変換される。
透過性があるため、バックエンド(EC2など)はクライアントのIPアドレスをそのまま認識可能ですが、セキュリティグループやアプリケーションの設定でクライアントIPを許可する必要があります。

EC2のtcpdumpでは、送信元IPアドレス:クライアントPC、宛先ポート番号:22番ポートの通信として記録される。
以下はEC2でtcpdumpを実行した際のログです。
見づらくて申し訳ありませんが、送信元と宛先のIPアドレスが記載されているのが分かるかと思います。 10.0.128.108がEC2のIPアドレス、一部マスキングしていますが114.xxx.xxx.xxxがクライアントPCのIPアドレスです。
VPC Flow Logsでも、送信元IPアドレス:クライアントPC、宛先ポート番号:22番ポートの通信として記録される。
VPC Flow Logsの確認方法
- 目的
クライアントPCからEC2への通信ログを特定するため、VPC Flow Logsを使用。
- フィルターパターン
クライアントPCのIPアドレスと宛先ポート番号22、プロトコルTCPを条件に以下のパターンでログを絞り込み。
- 理由
- NLBのヘルスチェック通信ログが大量に記録され、目的の通信を特定しづらいため、クライアントPCのIPを条件に含める。
- 補足
詳細なVPC Flow Logsのフィルター方法については、AWSの公式ブログを参照可能。
フィルターした結果、クライアントPCからのSSHリクエストが許可されているログが確認できました。

まとめの図
これまでの設定と、送信元/宛先アドレスの状態の変化をまとめると、下図のようになりました。 ※well-knownポート以外のポート番号を使うケースについては、便宜上「Un-Wellknown」としました。

おわりに
以上、NLBを使用する場合の設定と動作の確認でした。(ターゲットタイプがインスタンスの場合のみですが)
基本的な事ではありますが、戻りの通信がNLBを経由するのかどうか、セキュリティグループで許可する通信は何か等、意外と理解があやふやだったので、今回しっかり確認することが出来て良かったです。
この記事が少しでも参考になれば幸いです。
一問道場
次の要件を満たす新しいサービスを開発中の会社があります:
- サービスはTCPを使用して静的ポートでアクセスされる。
- サービスは高可用性があり、複数のAZに冗長性がある必要がある。
- サービスは「my.service.com」というDNS名でアクセスできる必要がある。
- サービスは他の企業がそのアドレスを許可リストに追加できるよう、固定IPアドレスを使用する必要がある。
- リソースは単一のリージョン内の複数のアベイラビリティゾーンにデプロイされる。
この要件を満たすソリューションは次のうちどれでしょうか?
A.
- Amazon EC2インスタンスを作成して各インスタンスにElastic IPアドレスを割り当て
- ネットワークロードバランサ(NLB)を作成して静的TCPポートを公開
- EC2インスタンスをNLBに登録
- 「my.service.com」という名前サーバーレコードセットを作成し、EC2インスタンスのElastic IPアドレスをそのレコードセットに割り当て
- EC2インスタンスのElastic IPアドレスを他の企業に提供して、許可リストに追加できるようにする
B.
- Amazon ECSクラスターとアプリケーションのサービス定義を作成
- ECSクラスターに公開IPアドレスを割り当て、ネットワークロードバランサ(NLB)を作成してTCPポートを公開
- ターゲットグループを作成し、ECSクラスター名をNLBに割り当て
- 「my.service.com」というAレコードセットを作成し、ECSクラスターの公開IPアドレスをそのレコードセットに割り当て
- ECSクラスターの公開IPアドレスを他の企業に提供して、許可リストに追加できるようにする
C.
- Amazon EC2インスタンスをサービスのために作成
- 各アベイラビリティゾーンに1つのElastic IPアドレスを作成
- ネットワークロードバランサ(NLB)を作成して割り当てられたTCPポートを公開
- Elastic IPアドレスを各アベイラビリティゾーンのNLBに割り当て、ターゲットグループを作成してEC2インスタンスをNLBに登録
- 「my.service.com」というA(エイリアス)レコードセットを作成し、NLBのDNS名をそのレコードセットに割り当て
D.
- Amazon ECSクラスターとアプリケーションのサービス定義を作成
- クラスター内の各ホストに公開IPアドレスを割り当て、アプリケーションロードバランサ(ALB)を作成して静的TCPポートを公開
- ターゲットグループを作成し、ECSサービス定義名をALBに割り当て
- CNAMEレコードセットを作成し、公開IPアドレスをそのレコードセットに関連付け
- EC2インスタンスのElastic IPアドレスを他の企業に提供して、許可リストに追加できるようにする
上記のオプションの中で、要件に最も適した解決策を選択してください。
解説
要件:
- TCPでアクセスするサービス
- 高可用性と冗長性(複数のアベイラビリティゾーン)
- 固定IPアドレス
- DNS名
my.service.com
でアクセス
各オプションの解説:
- A: EC2インスタンスにElastic IPを割り当ててNLBを使う。
→ 固定IPを提供できるが、EC2インスタンスを手動で管理する必要があり、管理が面倒。
- B: ECSクラスターを使ってNLBに公開IPを割り当てる。
→ ECSタスクは動的なIPを使うため、固定IPアドレスを提供できない。
- C: EC2インスタンスにElastic IPを割り当て、NLBを使用。
→ 固定IPを提供し、高可用性を確保できる最適な方法。
- D: ECSクラスターを使い、ALBで公開IPを割り当てる。
→ ALBは固定IPを提供できないため、要件を満たさない。
結論:
C が最適です。
Elastic IPを使って固定IPを提供し、NLBを使って高可用性と冗長性を確保するからです。
- 作者:みなみ
- 链接:https://tangly1024.com/資格勉強/163d7ae8-88e2-8072-93ac-e7543cf822b7
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章