すのふら

すのふら

日々の備忘録

Elastic Load Blancingについて勉強

AWS 認定ソリューションアーキテクト – アソシエイトを受けるため、改めてAmazon Web Service(AWS)の勉強をする。

今回もこの本を一読したうえで機能単位で勉強していく。


Elastic Load Blancing(ELB)とは

EC2や特定IPアドレスへの通信トラフィックを分散するロードバランシングサービス。

ELBを使用することでスケーラブルで高い可用性持ったシステムを構築できる。

ELBの特徴

  • スケーラブル
  • 安価な従量課金
  • マネージドサービスのため運用管理が楽
  • 豊富な連携機能


スケーラブル

ELB自体も負荷に応じてキャパシティを自動増減(スケール)する。

NLB以外のALBやCLBがスケールする場合は、IPアドレスが変更されるためDNS名でELBへアクセスることが必要

DNSへ登録することで独自ドメインへの接続も可能になる。

豊富な連携機能

AutoScalingやRoute53、CloudFormationなどと連携ができるのに加え、


ロードバランシング機能に複数のEC2インスタンスやECSコンテナに対してもロードバランシング機能を使用して負荷分散をすることができる。


高可用性

可用性とは

システムが正常に継続して動作し続ける能力を指す。可用性の指数はパーセンテージで表す。いわゆる稼働率稼働率を高めるにはいかにシステムやサーバを単一ではなく複数で構成する冗長化を行っていくか。

障害が発生しても別のサーバなどにフェイルオーバーするかを考えたアーキテクチャを考えるのが一般的。


リソースの冗長化

障害が発生するとシステム全体が使用不能なる単一障害点をなくすための冗長化
2台以上で構成されるEC2をELBで負荷分散することで冗長化する。
RDSをマスタースレーブ構成にする。


地理的に離れた場所で冗長化

リソースの冗長化インスタンス等分散していても、データセンター規模で障害が発生してしまっては元も子もない。

そのため、複数アベイラビリティゾーン構成にすることで、片方のアベイラビリティゾーンでデータセンター規模で障害が起こったとしても可用性を維持することができる。


システムを疎結合で構成する

単一障害点にならないためにそれぞれシステムやコンポーネントを独立させることが重要。

ELBとSQSを利用した疎結合構成。

dev.classmethod.jp

ELBで負荷分散しつつ、SQSでバッファリングして処理を並列化させることで大量データの処理が可能になる。

ELBとSQSはAWS内部で冗長化されているので意識する必要はない。

ELBの種類

種類は大きく分けて3種類存在する。

blog.serverworks.co.jp


Classic Load Blancer(CLB)

OSI参照モデルのL4とL7ロードバランサー
プロトコルはHTTPとHTTPSTCPSSL

初期に提供されたELBであり、現在は新規に作成する場合はこちらは推奨されていない。

標準的なロードバランシングを提供。
TCPリクエストをバックエンドインスタンへ振り分け、指定されたポートへ通信トラフィックを転送する。



Application Load Blancer(ALB)

OSI参照モデルのL7のコンテントベースのロードバランサー
プロトコルとしてはHTTPとHTTPS

CLBでできなかったものができるようになっているELB。

URLパスに応じたルーティングが可能なパスベースルーティングが可能になった。(URLに応じてどこにアクセスするのかを決めることができるようになった)


1インスタンスに対して複数ポートを登録可能になった。
EC2をターゲットグループに割り当てるときに複数ポートを個別のターゲットとして登録することが可能。
これにより複数ポートを利用するコンテナサービス(ECS)をロードバランシング可能になった。

ターゲットグループでのヘルスチェックが可能になる。

任意のセキュリティグループを指定することが可能。

Webにおいて双方向通信を低コストで行うWebSoketはALBのみ対応している。

uorat.hatenablog.com

hayashier.com


AWS Lambda関数をターゲットに指定することも可能



Network Load Blancer(NLB)

OSI参照モデルのL4のコンテントベースのロードバランサー
プロトコルとしてはTCPUDPTLS

揮発性ワークロードを処理し、毎秒数百万リクエストに対応できる能力を持つ。
これにより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)をスケールしておくことが必要。

  • Pre-Warming(暖機運転)の申請をAWSに行う
  • 自前で負荷をかけて急激なリクエストが発生する前にスケールさせておく


監視

ELBは正常なターゲットのみにトラフィックをルーティングする。
設定値にもどつきターゲットに対してヘルスチェックを定期的に行い、正常かどうかを判断する。


モニタリングサービスを使用しての運用

CloudWatch メトリクス
Amazon CloudWatch を使用して、ロードバランサーとターゲットのデータポイントに関する統計情報を、メトリクスと呼ばれる時系列データの時間順のセットとして取得できる

アクセスログ
ロードバランサーに対して行われたリクエストの詳細情報をキャプチャし、Amazon S3 でログファイルとして保存できる。

リクエストのトレース
リクエストのトレースを使用して HTTP リクエストを追跡できる

CloudTrail ログ
Elastic Load Balancing API に対して行われた呼び出しに関する詳細情報をキャプチャし、Amazon S3 でログファイルとして保存できる

docs.aws.amazon.com

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認証アクションはAmazonFacebookGoogleなどのプロバイダーの認証を使用することができる。

AWS WAFとの連携

AWS WAFを使用することで以下が可能


Global Accelerratorとの連携

Global Accelerratorを使用することで、複数あるリージョンからより近いリージョンにアクセスすることが可能。


外部ELBと内部ELB

インターネット向けの外部ELBであるInterner-facingか、内部ELBとして利用するInternalのいずれかで動作する。

外部ELBはパブリックサブネットに配置されている。バックエンドインスタンス(EC2)をパブリックサブネットに配置する必要なく、プライベートサブネット上に配置することができる。

内部ELBはプライベートサブネットのみ利用することができる。

両方ともプライベート上に配置してもOKだが、内部ELBはプライベートのみ。