AWS Well-Architected Framework の観点(信頼性・セキュリティ・パフォーマンス・コスト・運用)に沿って、ALB を設計・運用する際の主なポイントをまとめる。
目次
1. 設計・アーキテクチャ
ALB を選ぶべきケース
| 要件 | 推奨 |
|---|
| HTTP/HTTPS、パス・ホストベースのルーティング | ALB |
| TCP/UDP、超低レイテンシ、固定IP、TLSパススルー | NLB |
| サードパーティのアプライアンス(FW/IDS)挿入 | GWLB |
| gRPC、WebSocket、HTTP/2 | ALB(対応済み) |
- 固定 IP が必要な場合は NLB → ALB(ALB タイプのターゲットグループ)構成や AWS Global Accelerator を検討する。
マルチ AZ 構成
- 最低 2 つ以上(推奨 3 つ)の AZ にサブネットを割り当てる。
- 各 AZ にターゲットを均等に配置する(AZ 障害時の容量を確保)。
- ALB 用サブネットは /27 以上(空き IP 8 個以上)を確保する。ALB はスケール時に IP を追加消費するため、余裕を持たせる。
- クロスゾーン負荷分散は ALB ではデフォルト有効。ターゲット数が AZ 間で偏る場合は有効のままにする。
内部 / インターネット向けの分離
- 外部公開用(internet-facing)と内部用(internal)の ALB を分ける。
- internet-facing ALB はパブリックサブネット、ターゲットはプライベートサブネットに配置する。
2. セキュリティ
通信の暗号化
- HTTPS リスナーを基本とし、HTTP(80) は HTTPS(443) へリダイレクトするルールを設定する。
- 証明書は AWS Certificate Manager (ACM) で発行・自動更新する。
- セキュリティポリシーは最新の TLS 1.2 / 1.3 対応ポリシーを選択する(例:
ELBSecurityPolicy-TLS13-1-2-2021-06 系)。古い TLS 1.0/1.1 を許可するポリシーは避ける。
- コンプライアンス要件がある場合は FIPS 対応ポリシーやポスト量子暗号対応ポリシーを検討する。
- ALB → ターゲット間も機密性が求められる場合は HTTPS でバックエンド通信を行う。
- クライアント証明書認証が必要な場合は mTLS(相互 TLS) 機能とトラストストアを利用する。
セキュリティグループ
- ALB の SG:必要なポート(443/80)のみ、必要な送信元からのみ許可する。
- ターゲットの SG:送信元を ALB の SG ID に限定する(CIDR ではなく SG 参照)。
- CloudFront 経由のみ許可したい場合は、CloudFront のマネージドプレフィックスリストを ALB の SG に設定し、さらにカスタムヘッダーで検証する。
AWS WAF / Shield
- internet-facing ALB には AWS WAF を関連付ける。
- AWS マネージドルール(Core rule set、Known bad inputs、SQLi、IP reputation など)から始める。
- レートベースルールで過剰なリクエストを制限する。
- 新規ルールはまず Count モードで影響を確認してから Block に切り替える。
- DDoS 対策が重要なシステムでは AWS Shield Advanced を検討する。
その他の設定
- 削除保護(Deletion protection)を有効化する。
- 無効なヘッダーフィールドの削除(
routing.http.drop_invalid_header_fields.enabled)を有効化する。
- Desync 緩和モードは
defensive(デフォルト)または strictest に設定し、HTTP リクエストスマグリング対策を行う。
X-Forwarded-For の扱い(append / preserve / remove)をアプリケーションの要件に合わせて明示的に設定する。
- 認証が必要なアプリは ALB の認証機能(Amazon Cognito / OIDC) の利用を検討し、アプリ側の実装負荷を下げる。
3. 信頼性
ヘルスチェック
- 専用のヘルスチェックエンドポイント(例:
/health)を用意する。
- 軽量で高速に応答すること。
- 依存先(DB 等)の障害でターゲット全体が異常判定されないよう、浅いチェック(liveness)と深いチェック(readiness)を使い分ける。依存先障害で全ターゲットが落ちると ALB は全ターゲットにフェイルオープンするため、意図した挙動か確認しておく。
- 主なパラメータの目安:
| パラメータ | 目安 |
|---|
| 間隔(Interval) | 10〜30 秒 |
| タイムアウト | 間隔より短く(例: 5 秒) |
| 正常しきい値 | 2〜3 |
| 異常しきい値 | 2〜3 |
| 成功コード | 200(必要に応じて 200-399) |
- ターゲットグループの ヘルス要件設定(DNS フェイルオーバー / ルーティングフェイルオーバーの最小正常ターゲット数) を設定し、AZ 単位の劣化時に適切に切り離す。
登録解除の遅延(Deregistration delay)
- デフォルトは 300 秒。アプリのリクエスト処理時間に合わせて短縮(例: 30〜60 秒)するとデプロイが速くなる。
- 長時間接続(WebSocket、ファイルアップロード等)がある場合は十分な値を確保する。
スロースタート
- JIT コンパイルやキャッシュウォームアップが必要なアプリでは スロースタートモード(30〜900 秒)を設定し、新規ターゲットへの急激な負荷を避ける。
タイムアウトの整合性
- ALB のアイドルタイムアウト(デフォルト 60 秒) < バックエンドの Keep-Alive タイムアウトとなるよう設定する。逆になると 502 エラーの原因になる。
- 例: ALB 60 秒、Nginx/アプリ側
keepalive_timeout 65〜75 秒。
- 長時間処理が必要な API は、アイドルタイムアウトを延ばすより非同期処理化を検討する。
自動復旧・ゾーンシフト
- Auto Scaling グループでは ELB ヘルスチェックを有効化し、異常インスタンスを自動置換する。
- AZ 障害に備え Amazon Application Recovery Controller のゾーンシフト / ゾーンオートシフトを有効化しておく。
急激なトラフィック増加
- ALB は自動スケールするが、急激なスパイク(セール・イベント等)が予測される場合は LCU 予約(キャパシティ予約) や事前のスケール要請を検討する。
4. パフォーマンス
ルーティング
- ホストベース・パスベース・ヘッダー・クエリ文字列・送信元 IP などリスナールールを活用し、1 つの ALB で複数サービスを集約する(ALB 数の削減)。
- ルールの優先度を整理し、よく使われるルールを上位に配置する。
- 固定レスポンスやリダイレクトはアプリまで届かせず ALB のアクションで返す。
負荷分散アルゴリズム
| アルゴリズム | 用途 |
|---|
| ラウンドロビン(デフォルト) | リクエスト処理時間が均一な場合 |
| 最小未処理リクエスト(LOR) | 処理時間にばらつきがある場合 |
| 加重ランダム + 異常緩和(Automatic Target Weights) | 一部ターゲットの異常を自動で回避したい場合 |
その他
- HTTP/2 はクライアント側でデフォルト有効。バックエンドで gRPC を使う場合はプロトコルバージョンを
gRPC に設定する。
- 静的コンテンツは CloudFront でキャッシュし、ALB へのリクエスト数を削減する。
- スティッキーセッションは負荷の偏りを生むため、可能ならセッション情報を ElastiCache / DynamoDB 等へ外出しして使わない設計にする。
5. 監視・ロギング
CloudWatch メトリクス(アラーム推奨)
| メトリクス | 監視ポイント |
|---|
HTTPCode_ELB_5XX_Count | ALB 起因の 5xx(502/503/504) |
HTTPCode_Target_5XX_Count | アプリ起因の 5xx |
TargetResponseTime | レイテンシ(p90/p99 で監視) |
UnHealthyHostCount / HealthyHostCount | ターゲットの正常性 |
RejectedConnectionCount | 接続上限到達 |
TargetConnectionErrorCount | ターゲットへの接続失敗 |
RequestCount | トラフィック傾向・異常検知 |
ConsumedLCUs | コスト・スケール傾向 |
- エラー件数だけでなく エラー率(Metric Math) でアラームを設定すると誤検知が減る。
- CloudWatch Anomaly Detection の活用も有効。
ログ
- アクセスログを S3 に出力する(デフォルト無効)。
- Amazon Athena でクエリできるようにテーブルを定義しておく。
- S3 ライフサイクルで古いログを低コストストレージへ移行・削除する。
- 接続ログ(mTLS 利用時等)や ヘルスチェックログ も必要に応じて有効化する。
- 設定変更の監査には AWS CloudTrail を利用する。
トレーシング
- ALB が付与する
X-Amzn-Trace-Id ヘッダーをアプリのログに出力し、ALB ログとアプリログを突合できるようにする。
- AWS X-Ray や OpenTelemetry と組み合わせて分散トレーシングを行う。
6. デプロイ戦略
- 加重ターゲットグループを使い、ブルー/グリーンやカナリアリリースを ALB のリスナールールで実現する(例: 新 90% / 旧 10%)。
- ECS では ECS ネイティブのブルー/グリーンデプロイ や CodeDeploy と連携する。
- 切り替え中は 5xx 率・レイテンシを監視し、閾値超過で自動ロールバックする。
- 登録解除の遅延とヘルスチェック間隔を適切に設定し、デプロイ時のエラーを防ぐ。
7. コスト最適化
- ALB の料金は 時間料金 + LCU(新規接続数・アクティブ接続数・処理バイト数・ルール評価数の最大値)。
- ホスト/パスベースルーティングで ALB を集約し、台数を減らす。
- 不要な ALB(ターゲットなし・リクエストなし)を定期的に棚卸しする(Trusted Advisor で検出可能)。
- CloudFront によるキャッシュで処理バイト数・リクエスト数を削減する。
- パブリック IPv4 アドレスは課金対象のため、デュアルスタック / IPv6 対応やパブリック IPv4 不要の構成(CloudFront VPC オリジン等)を検討する。
- ルール数が多いと LCU のルール評価が増えるため、不要なルールを整理する。
8. 運用・IaC
- ALB・リスナー・ルール・ターゲットグループは CloudFormation / CDK / Terraform でコード管理する。
- タグ付け(環境・システム名・オーナー・コストセンター)を徹底する。
- AWS Config ルールで設定のドリフトを検知する(例:
elb-deletion-protection-enabled、alb-http-to-https-redirection-check、alb-waf-enabled、elb-logging-enabled)。
- AWS Security Hub の基本的なベストプラクティス標準で ELB 関連のコントロールを継続チェックする。
チェックリスト
セキュリティ
信頼性
運用
参考資料