Elastic Load Blancingについて勉強
AWS 認定ソリューションアーキテクト – アソシエイトを受けるため、改めてAmazon Web Service(AWS)の勉強をする。
今回もこの本を一読したうえで機能単位で勉強していく。
- Elastic Load Blancing(ELB)とは
Elastic Load Blancing(ELB)とは
EC2や特定IPアドレスへの通信トラフィックを分散するロードバランシングサービス。
ELBを使用することでスケーラブルで高い可用性持ったシステムを構築できる。
ELBの特徴
- スケーラブル
- 安価な従量課金
- マネージドサービスのため運用管理が楽
- 豊富な連携機能
スケーラブル
ELB自体も負荷に応じてキャパシティを自動増減(スケール)する。NLB以外のALBやCLBがスケールする場合は、IPアドレスが変更されるためDNS名でELBへアクセスることが必要
豊富な連携機能
AutoScalingやRoute53、CloudFormationなどと連携ができるのに加え、ロードバランシング機能に複数のEC2インスタンスやECSコンテナに対してもロードバランシング機能を使用して負荷分散をすることができる。
高可用性
可用性とは
システムが正常に継続して動作し続ける能力を指す。可用性の指数はパーセンテージで表す。いわゆる稼働率。稼働率を高めるにはいかにシステムやサーバを単一ではなく複数で構成する冗長化を行っていくか。障害が発生しても別のサーバなどにフェイルオーバーするかを考えたアーキテクチャを考えるのが一般的。
リソースの冗長化
障害が発生するとシステム全体が使用不能なる単一障害点をなくすための冗長化。2台以上で構成されるEC2をELBで負荷分散することで冗長化する。
RDSをマスタースレーブ構成にする。
地理的に離れた場所で冗長化
リソースの冗長化でインスタンス等分散していても、データセンター規模で障害が発生してしまっては元も子もない。そのため、複数アベイラビリティゾーン構成にすることで、片方のアベイラビリティゾーンでデータセンター規模で障害が起こったとしても可用性を維持することができる。
システムを疎結合で構成する
単一障害点にならないためにそれぞれシステムやコンポーネントを独立させることが重要。ELBとSQSを利用した疎結合構成。
ELBで負荷分散しつつ、SQSでバッファリングして処理を並列化させることで大量データの処理が可能になる。
ELBとSQSはAWS内部で冗長化されているので意識する必要はない。
ELBの種類
種類は大きく分けて3種類存在する。
Classic Load Blancer(CLB)
OSI参照モデルのL4とL7のロードバランサー。プロトコルはHTTPとHTTPS、TCP、SSL。
初期に提供されたELBであり、現在は新規に作成する場合はこちらは推奨されていない。
標準的なロードバランシングを提供。
TCPリクエストをバックエンドインスタンへ振り分け、指定されたポートへ通信トラフィックを転送する。
Application Load Blancer(ALB)
OSI参照モデルのL7のコンテントベースのロードバランサープロトコルとしてはHTTPとHTTPS
CLBでできなかったものができるようになっているELB。
URLパスに応じたルーティングが可能なパスベースルーティングが可能になった。(URLに応じてどこにアクセスするのかを決めることができるようになった)
1インスタンスに対して複数ポートを登録可能になった。
EC2をターゲットグループに割り当てるときに複数ポートを個別のターゲットとして登録することが可能。
これにより複数ポートを利用するコンテナサービス(ECS)をロードバランシング可能になった。
ターゲットグループでのヘルスチェックが可能になる。
任意のセキュリティグループを指定することが可能。
Webにおいて双方向通信を低コストで行うWebSoketはALBのみ対応している。
AWS Lambda関数をターゲットに指定することも可能
Network Load Blancer(NLB)
OSI参照モデルのL4のコンテントベースのロードバランサー
プロトコルとしてはTCP、UDP、TLS。
揮発性ワークロードを処理し、毎秒数百万リクエストに対応できる能力を持つ。
これによりALBなどはPre-warning申請が必要な大規模アクセスに対しても適用することができる。
VPC外のターゲットを含めたIPアドレスや静的IPアドレスでの登録が可能。
フォールトレランス機能を内蔵している。
低レイテンシで高いスループットを実現するときに利用する。
送信元アドレスを保持するため、レスポンスはクライアントへ直接返す。
NLBはセキュリティグループをは関連付けることができないので注意
負荷分散
複数のアベイラビリティゾーンへの分散
配下のEC2(EC2をターゲットグループとしてまとめた)の負荷に応じて、複数のAZにまたがるEC2インスタンスの負荷分散を行うことができる。クロスゾーン負荷分散
ELBは複数のAZに登録されたすべてのインスタンスに対してリクエストを均等に分散することが可能。ALBとCLBはデフォルトで有効だが、NLBはデフォルト無効となっている。
例えば「A」「B」という2種類のAZがあり、それぞれ10台、2台のインスタンスが動作しているとします。
A-AZ:10台のインスタンス
B-AZ:2台のインスタンス「クロスゾーン負荷分散」が無効の場合はA、Bそれぞれ50%ずつ負荷が分散されるため、2台しかないBのインスタンスには負荷がかかります。
一方でAのインスタンスは負荷が低くなります。結果としてもし12台すべて同じスペックの機器の場合効率が悪くなります。「クロスゾーン負荷分散」を有効にすると、ELBがA,B上のインスタンスに関して負荷が「平等に」かかるよう振り分けます。要するに100%÷12=約8% の均等な負荷が12台にかかることになります。
AWS | ELBの「クロスゾーン負荷分散」はどのようなケースで有効化するのか
有効しないと片方のインスタンスに負荷が異常にかかるようになる。
IPアドレスをターゲットに設定する
ALBとNLBのみの機能。オンプレミスのサーバなどのIPアドレスを使用してオンプレミスサーバーに対して負荷分散させることも可能。
スケールするときの注意点
ELBは負荷に応じて自動スケールを行うが、ALB(CLB)は急激なリクエストが発生した場合にスケーリングが間に合わない場合がある。その場合はHTTP503を返却する。
- 新サービス
- TVやメディアによるサービス紹介
- 負荷テスト
回避方法
事前にALB(CLB)をスケールしておくことが必要。
監視
ELBは正常なターゲットのみにトラフィックをルーティングする。設定値にもどつきターゲットに対してヘルスチェックを定期的に行い、正常かどうかを判断する。
モニタリングサービスを使用しての運用
CloudWatch メトリクスAmazon CloudWatch を使用して、ロードバランサーとターゲットのデータポイントに関する統計情報を、メトリクスと呼ばれる時系列データの時間順のセットとして取得できる
アクセスログ
ロードバランサーに対して行われたリクエストの詳細情報をキャプチャし、Amazon S3 でログファイルとして保存できる。
リクエストのトレース
リクエストのトレースを使用して HTTP リクエストを追跡できる
CloudTrail ログ
Elastic Load Balancing API に対して行われた呼び出しに関する詳細情報をキャプチャし、Amazon S3 でログファイルとして保存できる
NLBとの違いはVPCフローログが適応していない点と、HTTPとHTTPSをプロトコルとして利用できるのでHTTPリクエストの追跡がある。
Connection Draining(登録解除の遅延)
スケールインの異常が発生した場合、リクエスト中のEC2インスタンスがELBから解除される場合やヘルスチェックで失敗になった場合に、急に接続を切るとアクセスできなくなる。
そのため、一定期間(5分~60分)は接続を切らず、処理中のリクエストが終わるまで待ってくれる機能。
スティッキーセッション
ALB(CLB)の機能。同じユーザから来たリクrストをすべて同じEC2インスタンスに送信する。
アプリケーション上でセッション情報や一時ファイルを同じEC2インスタンス側で保持したいという場合に使用する。
デフォルトで無効のため、有効にする。
セキュリティ機能
SSL復号の機能を持っている。
SSL復号をELBが担うことで、バックエンドインスタンスの負荷軽減や証明書の一元管理が可能になる。
HTTPS/SSL利用時のTSLサーバ証明書
AWS Certification Manager(ACM)を使用することで証明書のリクエスト、管理、更新、プロビジョニングが可能。
SSL/ TLS ターミネーション
クライアント→ELBまではHTTPSでアクセスするが、
ELB→EC2はHTTPでアクセスるなどの対応が可能
認証
ALBのコンテンツベースのルーティングには、Cognito認証アクションと、OIDC認証アクションの二つが存在する。
Cognito認証アクションは初めてのログインの場合に、Amazon Cognitoでの認証画面にリダイレクトされる。
OIDC認証アクションはAmazonやFacebookやGoogleなどのプロバイダーの認証を使用することができる。
AWS WAFとの連携
AWS WAFを使用することで以下が可能- リクエストレートによるアクセス権限
- 特定のIPアドレスや地域からのアクセスを制限
- クロスサイトスクリプティングやSQLインジェクションからの保護
- HTTPヘッダ、HTTP本文、URI文字列に対するサイズ制限や正規表現でのマッチング
Global Accelerratorとの連携
Global Accelerratorを使用することで、複数あるリージョンからより近いリージョンにアクセスすることが可能。
外部ELBと内部ELB
インターネット向けの外部ELBであるInterner-facingか、内部ELBとして利用するInternalのいずれかで動作する。外部ELBはパブリックサブネットに配置されている。バックエンドインスタンス(EC2)をパブリックサブネットに配置する必要なく、プライベートサブネット上に配置することができる。
内部ELBはプライベートサブネットのみ利用することができる。
両方ともプライベート上に配置してもOKだが、内部ELBはプライベートのみ。