ELB

【VPC内リージョンサービス】

ELB(Elastic Load Balancing)は、受信したトラフィックを複数のターゲットへ自動的に分散するマネージド型のロードバランサーです。

ACM(AWS Certificate Manager)を利用して証明書を自動管理でき、HTTPS通信を容易に設定できます。Auto Scalingと組み合わせることで、トラフィック量に応じた動的なスケーリングも可能です。

ALB(Application Load Balancer) は、L7(HTTP・HTTPS)で動作するロードバランサーです。WAF(Web Application Firewall)との連携にも対応しており、攻撃対策やアクセス制御も容易です。

Listener(リスナー)が特定のポート(例:80、443)でリクエストを受け取り、Rule(ルール)に基づいてリクエストをどのターゲットに転送するかを判断します。Ruleは、パスベースルーティングホストベースルーティングなどを設定できます。

トラフィックの転送先は Target Group(ターゲットグループ)と呼ばれ、EC2インスタンス、ECSタスク、Lambda関数などをターゲットとして登録できます。Target Group単位でHealth Check(ヘルスチェック)を設定し、不健全なターゲットを自動的に除外します。

Sticky Session(スティッキーセッション) 機能を有効にすると、同じクライアントからのリクエストを常に同じターゲットに転送でき、セッション維持が必要なアプリケーションに適しています。

NLB(Network Load Balancer)は、L4(TCP・UDP)で動作し、高スループット・超低レイテンシ通信を実現します。NLBは静的IPアドレスやAZ(Availability Zone)ごとの固定IPを利用でき、TLS Termination(TLS終端)にも対応しているため、暗号化通信を効率的に処理できます。

クロスゾーン負荷分散を有効にすると、異なるAZにあるターゲットにも、トラフィックを均等に分散することができます。

Connection Draining(コネクション・ドレイニング)または、Deregistration Delay(登録解除遅延)とは、ELBがターゲットを削除または停止する際に、すでに処理中の通信を途中で切断せず、完了するまで待機する仕組みのことです。

重要用語

関連サービス

ユースケース

Webサーバーの負荷分散複数台のEC2インスタンスにHTTP/HTTPSトラフィックを分散し、1台が故障しても他のインスタンスでサービスを継続できるようにする。
マイクロサービスへのパスベースルーティングApplication Load BalancerでURLパスごとにターゲットグループを切り替え、/api と /web など異なるバックエンドサービスに振り分ける。
内部システム用のプライベート負荷分散社内向けの業務システムやバックエンドAPIをプライベートサブネット内のELB(内部ALB/NLB)で負荷分散し、インターネット非公開で高可用性を実現する。

ベストプラクティス

マルチAZターゲット登録ターゲットは複数AZに分散して登録し、障害時もトラフィックを継続させる。
ヘルスチェックの適切な設定アプリに合わせたパス・ポート・しきい値に調整し、誤検知や遅延切り替えを防ぐ。
アクセスログの有効化S3にアクセスログを保存し、分析やセキュリティ調査に役立てる。

高可用性・バックアップ・リトライ

高可用性・バックアップ・リトライ設計のポイント
【デフォルト】AWS内部で冗長化
 ・コントロールプレーン
 ・各AZ内の複数のロードバランサーノード
 ・ロードバランサーノードの自動スケーリング
 ・各ノード内のプロセス
 ・DNS名前解決の複数IPアドレス
 ・ヘルスチェックシステム
 ・ネットワーク接続
マルチAZ(異なるAZに属する2つ以上のサブネットを選択することが必須要件)

セキュリティ

関連サービス設定内容
Subnet(公開リソースと内部リソースの分離)【公開ALB】【公開NLB】
 Publicの専用SubnetでマルチAZ構成
【内部ALB】【内部NLB】
 Privateの専用SubnetでマルチAZ構成
SG(リソース単位のアクセス制御)【公開ALB】【公開NLB】
 インバウンド:80(HTTP)
        443(HTTPS)
 アウトバウンド:すべて許可
【内部ALB】【内部NLB】
 インバウンド:80(HTTP)
        443(HTTPS)
 アウトバウンド:すべて許可
WAF(アプリケーション層の脅威に対する防御)【CloudFrontを使用しない場合】
 ALBにWAFをアタッチすることを推奨
Shield(DDoS攻撃からのリソース保護)Shield Standardは常時有効
【CloudFrontを使用しない場合】
 Shield Advancedの有効化を推奨
ACM(SSL/TLS証明書の自動管理)HTTPS利用時はACM証明書が必須
リージョン:VPCのあるリージョン
CloudTrail(操作履歴の記録・監査・追跡)【自動記録】
作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI)
データ操作は追跡できない(データプレーンAPI)
Config(リソースの構成状態・設定変更を記録)【Configが有効な場合】
リスナー/セキュリティポリシー/アクセスログ/ターゲット設定の変更履歴・準拠評価
GuardDuty(脅威を自動検出)【GuardDutyが有効な場合】
ロードバランサ設定変更のAPI異常検知
ELB が使用する SLR の連携パターン
SLR名 : AWSServiceRoleForElasticLoadBalancing
SLR が操作するサービス用途
EC2ロードバランサー用のENI作成と管理
Auto Scalingターゲットグループへのインスタンス自動登録
CloudWatchロードバランサーメトリクスの送信
S3アクセスログの保存
ACMSSL/TLS証明書の取得と管理
WAFWeb Application Firewallルールの適用
権限設計の原則

ログ・監視

ログ出力先ログの種類
CloudWatch LogsALB
【S3からLambdaで転送】
アクセスログ

NLB
アクセスログ
CloudWatch Logs優先の原則
標準メトリクス(ALB)
メトリクス名説明
RequestCount受信リクエスト数
RequestCountPerTargetターゲットあたりのリクエスト数
TargetResponseTimeターゲットの応答時間
HTTPCode_ELB_4XX_CountELBレベル4xxエラー数
HTTPCode_ELB_5XX_CountELBレベル5xxエラー数
HTTPCode_Target_4XX_Countターゲット4xxエラー数
HTTPCode_Target_5XX_Countターゲット5xxエラー数
HealthyHostCountヘルシーなターゲット数
TargetConnectionErrorCountターゲット接続エラー数
TargetTLSNegotiationErrorCountTLSネゴシエーションエラー数
UnHealthyHostCountアンヘルシーなターゲット数
ELBAuthError認証エラー数(OIDC/Cognito連携など)
ELBAuthFailure認証失敗数
ELBAuthSuccess認証成功数
標準メトリクス(NLB)
メトリクス名説明
ActiveFlowCountアクティブなフロー数
ActiveFlowCount_TCPTCPフロー数
ActiveFlowCount_UDPUDPフロー数
NewFlowCount新規フロー数
ProcessedBytes処理バイト数
HealthyHostCountヘルシーなターゲット数
(NLBターゲットグループ)
TCP_Client_Reset_Countクライアントリセット件数
TCP_ELB_Reset_CountELBリセット件数
TCP_Target_Reset_Countターゲットリセット件数
TLSNegotiationErrorCountTLSネゴシエーションエラー数
UnHealthyHostCountアンヘルシーなターゲット数

制限値(固定値/ハードリミット/ソフトリミット)

ハードリミット制限値
ターゲットグループあたりのヘルスチェック1

ソフトリミット制限値
Application Load Balancer数/リージョン50
Network Load Balancer数/リージョン50
Gateway Load Balancer数/リージョン50
ターゲット数/ALB1,000
ターゲットグループ数/リージョン3,000
リスナー数/ALB50
ルール数/ALB100
証明書数/ALB25

AWS CLIのサンプルコード

SG を作成する(VPC ID 指定)
aws ec2 create-security-group \
  --group-name web-alb-sg \
  --vpc-id vpc-xxxxxxxxx \
  --tag-specifications 'ResourceType=security-group,Tags=[{Key=Name,Value=web-alb-sg}]'
SG ID を表示する
aws ec2 describe-security-groups
インバウンドルールを追加する(SG ID 指定)
aws ec2 authorize-security-group-ingress \
  --group-id sg-xxxxxxxxx \
  --protocol tcp \
  --port 443 \
  --cidr 0.0.0.0/0
SG を削除する(SG ID 指定)
aws ec2 delete-security-group \
  --group-id sg-xxxxxxxxx

ALBを作成する(マルチAZのSubnet ID、SG ID 指定)
aws elbv2 create-load-balancer \
  --name my-alb \
  --subnets subnet-xxxxxxxxx subnet-xxxxxxxxx \
  --security-groups sg-xxxxxxxxx \
  --scheme internet-facing \
  --type application \
  --ip-address-type ipv4 \
  --tags Key=Name,Value=MyALB Key=Environment,Value=Production
ALBのARNを表示する
aws elbv2 describe-load-balancers
ALBを削除する(ALBのARN 指定)
aws elbv2 delete-load-balancer \
  --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/my-alb/1234567890abcdef

ターゲットグループを作成する(VPC ID 指定)
aws elbv2 create-target-group \
  --name my-target-group \
  --protocol HTTP \
  --port 80 \
  --vpc-id vpc-xxxxxxxxx \
  --health-check-protocol HTTP \
  --health-check-path / \
  --health-check-interval-seconds 30 \
  --health-check-timeout-seconds 5 \
  --healthy-threshold-count 2 \
  --unhealthy-threshold-count 2 \
  --target-type instance \
  --tags Key=Name,Value=my-target-group
ターゲットグループのARNを表示する
aws elbv2 describe-target-groups
ターゲットグループを削除する(ターゲットグループのARN 指定)
aws elbv2 delete-target-group \
  --target-group-arn arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-target-group/xxxxx

リスナー(デフォルトアクションの定義は必須)を作成する
(ALBのARN、ターゲットグループのARN 指定)
aws elbv2 create-listener \
  --load-balancer-arn arn:aws:elasticloadbalancing:region:account-id:loadbalancer/app/my-alb/xxxxx \
  --protocol HTTP \
  --port 80 \
  --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-target-group/xxxxx
リスナーのARNを表示する(ALBのARN 指定)
aws elbv2 describe-listeners \
  --load-balancer-arn arn:aws:elasticloadbalancing:region:account-id:loadbalancer/app/my-alb/xxxxx
リスナーを削除する(リスナーのARN 指定)
aws elbv2 delete-listener \
  --listener-arn arn:aws:elasticloadbalancing:region:account-id:listener/app/my-alb/xxxxx/xxxxx

パスベース用のルールを追加する(リスナーのARN、ターゲットグループのARN 指定)
aws elbv2 create-rule \
  --listener-arn arn:aws:elasticloadbalancing:region:account-id:listener/app/my-alb/xxxxx/xxxxx \
  --priority 10 \
  --conditions Field=path-pattern,Values='/api/*' \
  --actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:account-id:targetgroup/api-target-group/xxxxx \
  --tags Key=Name,Value=api-rule
ホストベース用のルールを追加する(リスナーのARN、ターゲットグループのARN 指定)
aws elbv2 create-rule \
  --listener-arn arn:aws:elasticloadbalancing:region:account-id:listener/app/my-alb/xxxxx/xxxxx \
  --priority 10 \
  --conditions Field=host-header,Values='api.site.com' \
  --actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:account-id:targetgroup/api-target-group/xxxxx \
  --tags Key=Name,Value=api-rule
ルールのARNを表示する(リスナーのARN 指定)
aws elbv2 describe-rules \
  --listener-arn arn:aws:elasticloadbalancing:region:account-id:listener/app/my-alb/xxxxx/xxxxx
ルールを削除する(ルールのARN 指定)
aws elbv2 delete-rule \
  --rule-arn arn:aws:elasticloadbalancing:region:account-id:listener-rule/app/my-alb/xxxxx/xxxxx/xxxxx

ターゲットの健全性確認(ターゲットグループのARN 指定)
aws elbv2 describe-target-health \
  --target-group-arn arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-target-group/xxxxx

CloudFormationのサンプルコード

Terraformのサンプルコード

料金計算

課金項目説明
ロードバランサー時間ロードバランサーの稼働時間
LCULoad Balancer Capacity Units(処理量ベース)
データ転送ロードバランサー経由のデータ転送
料金計算ツール

公式ページ

AWSドキュメント ELB