概要
Application Load Balancer(ALB)のリスナー機能を使用して、複数のドメインに対してSSL通信を設定する方法を解説します。証明書の管理からリスナールールの設定まで、実際の構築手順を詳しく説明します。
目次
はじめに
現代のWebアプリケーションでは、複数のドメインやサブドメインを使用したサービス提供が一般的になっています。例えば、メインサイトがexample.com
、APIエンドポイントがapi.example.com
、管理画面がadmin.example.com
といった構成です。
これらすべてのドメインでSSL通信を実現する場合、従来は複数のロードバランサーを用意する必要がありました。しかし、AWS Application Load Balancer(ALB)のリスナー機能を使用すれば、1つのALBで複数ドメインのSSL通信を効率的に処理できます。
ALBのリスナーとは
ALBのリスナーは、指定されたプロトコルとポートで接続要求をチェックし、設定されたルールに基づいて適切なターゲットグループにリクエストを転送する機能です。
リスナーの主な特徴:
- プロトコル対応:HTTP、HTTPS、gRPCに対応
- ポート指定:1つのALBに複数のリスナーを設定可能
- ルールベース:ホストヘッダー、パス、HTTPメソッドなどの条件で転送先を決定
- SSL終端:ALBでSSL/TLS処理を行い、バックエンドには平文で転送可能
AWS公式ドキュメントによると、『リスナーは、設定したプロトコルとポートを使用して接続要求をチェックするプロセスです』( https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html )と説明されています。
複数ドメインSSL通信の概要
ALBで複数ドメインのSSL通信を実現する方法は主に2つあります:
1. ワイルドカード証明書を使用
*.example.com
のワイルドカード証明書を使用し、すべてのサブドメインに対応する方法です。
メリット:
- 証明書管理が簡単
- 新しいサブドメイン追加時の作業が不要
デメリット:
- 異なるドメイン(example.comとother.com)には対応不可
- セキュリティ上、必要以上の権限を持つことになる
2. 複数証明書を使用
ドメインごとに個別の証明書を取得し、ALBに複数の証明書を関連付ける方法です。
メリット:
- 異なるドメインに対応可能
- 必要最小限の権限で運用可能
- 証明書の更新を個別に管理可能
デメリット:
- 証明書管理が複雑
- ドメイン追加時に証明書の追加作業が必要
今回は、より実用的な「複数証明書を使用する方法」を中心に解説します。
実装手順
4.1 SSL証明書の準備
まず、AWS Certificate Manager(ACM)で各ドメインの証明書を取得します。
# example.com用の証明書をリクエスト
aws acm request-certificate \
--domain-name example.com \
--validation-method DNS \
--region us-east-1
# api.example.com用の証明書をリクエスト
aws acm request-certificate \
--domain-name api.example.com \
--validation-method DNS \
--region us-east-1
# admin.example.com用の証明書をリクエスト
aws acm request-certificate \
--domain-name admin.example.com \
--validation-method DNS \
--region us-east-1
注意点:
- ALBと同じリージョンで証明書を取得する必要があります
- DNS検証を使用する場合は、Route 53での自動検証が便利です
- 証明書の発行には数分から数時間かかる場合があります
4.2 ALBの作成
次に、ALB本体を作成します。
# ALBの作成
aws elbv2 create-load-balancer \
--name multi-domain-alb \
--subnets subnet-12345678 subnet-87654321 \
--security-groups sg-12345678 \
--scheme internet-facing \
--type application \
--ip-address-type ipv4
セキュリティグループでは、以下のポートを開放する必要があります:
- 80番ポート:HTTP通信(HTTPSへのリダイレクト用)
- 443番ポート:HTTPS通信
4.3 リスナーの設定
ALBにHTTPSリスナーを作成し、デフォルト証明書を設定します。
# HTTPSリスナーの作成
aws elbv2 create-listener \
--load-balancer-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/multi-domain-alb/1234567890123456 \
--protocol HTTPS \
--port 443 \
--certificates CertificateArn=arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012 \
--default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/default-tg/1234567890123456
追加の証明書を関連付けるには、以下のコマンドを使用します:
# 追加証明書の関連付け
aws elbv2 add-listener-certificates \
--listener-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:listener/app/multi-domain-alb/1234567890123456/1234567890123456 \
--certificates CertificateArn=arn:aws:acm:us-east-1:123456789012:certificate/87654321-4321-4321-4321-210987654321 \
CertificateArn=arn:aws:acm:us-east-1:123456789012:certificate/11111111-2222-3333-4444-555555555555
4.4 リスナールールの作成
各ドメインを適切なターゲットグループに振り分けるルールを作成します。
# api.example.com用のルール
aws elbv2 create-rule \
--listener-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:listener/app/multi-domain-alb/1234567890123456/1234567890123456 \
--priority 100 \
--conditions Field=host-header,Values=api.example.com \
--actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/api-tg/1234567890123456
# admin.example.com用のルール
aws elbv2 create-rule \
--listener-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:listener/app/multi-domain-alb/1234567890123456/1234567890123456 \
--priority 200 \
--conditions Field=host-header,Values=admin.example.com \
--actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/admin-tg/1234567890123456
ルールの優先度について:
- 数字が小さいほど優先度が高い
- 1から50000までの範囲で設定可能
- デフォルトルール(優先度最低)は自動的に作成される
動作確認
設定完了後、以下の方法で動作を確認できます:
1. DNS設定の確認
各ドメインがALBのDNS名に正しく向いているか確認します:
# DNSレコードの確認
nslookup example.com
nslookup api.example.com
nslookup admin.example.com
2. SSL証明書の確認
ブラウザまたはコマンドラインツールで証明書が正しく配信されているか確認します:
# SSL証明書の確認
curl -I https://example.com
curl -I https://api.example.com
curl -I https://admin.example.com
3. 振り分け動作の確認
各ドメインが正しいターゲットグループに振り分けられているか確認します:
# レスポンスの確認
curl -H "Host: example.com" https://ALB_DNS_NAME/
curl -H "Host: api.example.com" https://ALB_DNS_NAME/
curl -H "Host: admin.example.com" https://ALB_DNS_NAME/
料金とベストプラクティス
料金について
ALBの料金は以下の要素で構成されます:
項目 | 料金(東京リージョン) |
---|---|
ALB時間料金 | 約$0.0243/時間 |
LCU(Load Balancer Capacity Unit)料金 | 約$0.008/LCU時間 |
ACM証明書 | 無料 |
LCUについて:
LCUは以下の4つのメトリクスの最大値で計算されます:
- 新規接続数(25接続/秒 = 1LCU)
- アクティブ接続数(3000接続 = 1LCU)
- 処理帯域幅(1GB/時 = 1LCU)
- ルール評価数(1000評価/秒 = 1LCU)
ベストプラクティス
-
証明書の自動更新
- ACMを使用すると証明書の自動更新が可能
- 外部証明書を使用する場合は更新スケジュールを管理
-
セキュリティ設定
- 最新のSSL/TLSプロトコルを使用
- 不要な古いプロトコルは無効化
-
モニタリング
- CloudWatchでALBのメトリクスを監視
- アクセスログを有効化して詳細な分析を実施
-
リスナールールの整理
- 優先度を適切に設定
- 不要なルールは削除してパフォーマンスを向上
AWS公式ドキュメントでは、『SSL/TLS証明書の管理にはAWS Certificate Managerを使用することを強く推奨します』( https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html )と記載されています。
終わりに
ALBのリスナー機能を使用することで、1つのロードバランサーで複数ドメインのSSL通信を効率的に処理できます。この方法により、インフラストラクチャのコストを削減しながら、柔軟なWebサービスの構築が可能になります。
次のステップとして:
- WAF(Web Application Firewall)との連携
- CloudFrontとの組み合わせによるパフォーマンス向上
- Route 53 Health Checkを使用したフェイルオーバー設定
これらの機能を組み合わせることで、より堅牢で高性能なWebアプリケーション基盤を構築できます。
参考文献・参考サイト
AWS公式ドキュメント
- 「Application Load Balancer のリスナー」AWS Documentation, https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html
- 「HTTPS リスナーの作成」AWS Documentation, https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html
- 「リスナールール」AWS Documentation, https://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener-rules.html
- 「AWS Certificate Manager ユーザーガイド」AWS Documentation, https://docs.aws.amazon.com/acm/latest/userguide/
- 「Application Load Balancer の料金」AWS Documentation, https://aws.amazon.com/elasticloadbalancing/pricing/
参考記事
- 「Application Load Balancer でのマルチドメイン SSL 証明書の使用」AWS Blog, https://aws.amazon.com/blogs/aws/new-application-load-balancer-sni/
- 「Elastic Load Balancing のベストプラクティス」AWS Documentation, https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/best-practices.html