
【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 | アクセスログの保存 |
| ACM | SSL/TLS証明書の取得と管理 |
| WAF | Web Application Firewallルールの適用 |
ログ・監視
| ログ出力先 | ログの種類 |
|---|---|
| CloudWatch Logs | ALB 【S3からLambdaで転送】 アクセスログ NLB アクセスログ |
標準メトリクス(ALB)
| メトリクス名 | 説明 |
|---|---|
| RequestCount | 受信リクエスト数 |
| RequestCountPerTarget | ターゲットあたりのリクエスト数 |
| TargetResponseTime | ターゲットの応答時間 |
| HTTPCode_ELB_4XX_Count | ELBレベル4xxエラー数 |
| HTTPCode_ELB_5XX_Count | ELBレベル5xxエラー数 |
| HTTPCode_Target_4XX_Count | ターゲット4xxエラー数 |
| HTTPCode_Target_5XX_Count | ターゲット5xxエラー数 |
| HealthyHostCount | ヘルシーなターゲット数 |
| TargetConnectionErrorCount | ターゲット接続エラー数 |
| TargetTLSNegotiationErrorCount | TLSネゴシエーションエラー数 |
| UnHealthyHostCount | アンヘルシーなターゲット数 |
| ELBAuthError | 認証エラー数(OIDC/Cognito連携など) |
| ELBAuthFailure | 認証失敗数 |
| ELBAuthSuccess | 認証成功数 |
標準メトリクス(NLB)
| メトリクス名 | 説明 |
|---|---|
| ActiveFlowCount | アクティブなフロー数 |
| ActiveFlowCount_TCP | TCPフロー数 |
| ActiveFlowCount_UDP | UDPフロー数 |
| NewFlowCount | 新規フロー数 |
| ProcessedBytes | 処理バイト数 |
| HealthyHostCount | ヘルシーなターゲット数 (NLBターゲットグループ) |
| TCP_Client_Reset_Count | クライアントリセット件数 |
| TCP_ELB_Reset_Count | ELBリセット件数 |
| TCP_Target_Reset_Count | ターゲットリセット件数 |
| TLSNegotiationErrorCount | TLSネゴシエーションエラー数 |
| UnHealthyHostCount | アンヘルシーなターゲット数 |
制限値(固定値/ハードリミット/ソフトリミット)
| ハードリミット | 制限値 |
|---|---|
| ターゲットグループあたりのヘルスチェック | 1 |
| ソフトリミット | 制限値 |
|---|---|
| Application Load Balancer数/リージョン | 50 |
| Network Load Balancer数/リージョン | 50 |
| Gateway Load Balancer数/リージョン | 50 |
| ターゲット数/ALB | 1,000 |
| ターゲットグループ数/リージョン | 3,000 |
| リスナー数/ALB | 50 |
| ルール数/ALB | 100 |
| 証明書数/ALB | 25 |
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のサンプルコード
料金計算
| 課金項目 | 説明 |
|---|---|
| ロードバランサー時間 | ロードバランサーの稼働時間 |
| LCU | Load Balancer Capacity Units(処理量ベース) |
| データ転送 | ロードバランサー経由のデータ転送 |