オンプレのApache構成
典型的な大規模システムのApache構成は以下のようになっている。
# SSL
LoadModule ssl_module modules/mod_ssl.so
SSLEngine On
SSLCertificateFile /etc/ssl/certs/server.crt
# 圧縮
LoadModule deflate_module modules/mod_deflate.so
AddOutputFilterByType DEFLATE text/html text/css application/javascript
# URLリライト
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteRule ^/old-path(.*)$ /new-path$1 [R=301,L]
# 静的コンテンツ
DocumentRoot /var/www/html
Alias /static/ /var/www/static/
# IP制限
<Location /admin>
Require ip 192.168.1.0/24
</Location>
# Tomcat連携
LoadModule jk_module modules/mod_jk.so
JkMount /app/* tomcat-worker
Apacheの機能を分解する
AWSに移行するときに重要なのは「Apacheを1つのサービスに置き換える」のではなく、Apacheが担っていた各機能を適切なAWSサービスに分散させるという発想だ。
| Apache機能(モジュール) | AWS対応サービス | 備考 |
|---|---|---|
| mod_ssl(SSL終端) | CloudFront / ALB + ACM | PART 01参照 |
| mod_rewrite(URL書き換え・リダイレクト) | ALBリスナールール / CloudFront Functions | 複雑なルールはLambda@Edge |
| 静的ファイル配信(DocumentRoot) | S3 + CloudFront | APサーバーの負荷ゼロ化 |
| mod_deflate(gzip圧縮) | CloudFront(自動) | 設定不要で有効化される |
| IP制限(Require ip) | WAF IPセット / Security Group | WAFはL7、SGはL4 |
| レート制限(mod_ratelimit) | WAF レートベースルール | 5分あたりのリクエスト数で制限 |
| Basic認証(.htpasswd) | Cognito / Lambda@Edge | IAM認証も選択肢 |
| VirtualHost(複数ドメイン) | ALBホストベースルーティング | 1つのALBで複数ドメイン対応 |
| アクセスログ | ALBアクセスログ → S3 | S3から Athena / OpenSearch へ連携可 |
| mod_jk(Tomcat連携) | 不要(ALBがコンテナに直接転送) | PART 03参照 |
静的コンテンツ配信の切り出し
オンプレでは画像・CSS・JSファイルをApacheのDocumentRootに置いてTomcatと同じサーバーから配信することが多い。AWSではこれをS3 + CloudFrontに完全に分離できる。
【オンプレ】
クライアント → Apache(静的 + 動的を一緒に処理)
└── 静的: DocumentRoot /var/www/html
└── 動的: mod_jk → Tomcat
【AWS】
クライアント
├── 静的リクエスト(/static/*, *.css, *.js)
│ → CloudFront → S3
│ (Apacheもサーバーも不要)
│
└── 動的リクエスト(/api/*, /app/*)
→ CloudFront → ALB → ECS
💡 静的分離のメリット
APサーバー(ECS)は動的リクエストだけを処理すればよくなり、オートスケールの判断がシンプルになる。S3 + CloudFrontのキャッシュにより、APサーバーへの到達リクエスト数自体が大幅に減る。
URLルーティング(mod_rewrite → ALBルール)
mod_rewriteで実装していたURLのリダイレクト・書き換えは、ALBのリスナールールで実現できる。
| mod_rewriteのパターン | ALBリスナールール |
|---|---|
RewriteRule ^/old(.*)$ /new$1 [R=301] |
条件: パスが /old/* に一致 → アクション: リダイレクト (301) → /new/#{path} |
| パスプレフィックスによる振り分け | 条件: パスが /api/* → ターゲットグループA 条件: パスが /app/* → ターゲットグループB |
| VirtualHost によるホスト別振り分け | 条件: ホストヘッダが api.example.com → ターゲットグループA |
⚠️ 複雑なRewriteルールはCloudFront Functionsへ
ALBリスナールールでは正規表現が使えず、条件もパス・ホスト・HTTP メソッド・ヘッダー・クエリ文字列に限られる。複雑なURL書き換えが必要な場合はCloudFront Functions(軽量JavaScript)またはLambda@Edge(Node.js/Python)に実装する。
アクセス制御(IP制限・レート制限)
ApacheのRequire ipやmod_ratelimitに相当するアクセス制御は、WAFで実現する。
WAF WebACL
├── IPセットルール(IP制限)
│ 許可IPリスト: 203.0.113.0/24, 10.0.0.0/8
│ アクション: 一致しないリクエストをブロック
│
├── レートベースルール(レート制限)
│ 閾値: 同一IPから5分間で2000リクエスト
│ アクション: 超過したIPをブロック(5分間)
│
├── AWS マネージドルール(SQLインジェクション等)
│ AWSManagedRulesCommonRuleSet
│ AWSManagedRulesSQLiRuleSet
│
└── カスタムルール(ヘッダー検査等)
条件: X-Forwarded-For が特定のレンジ外
アクション: ブロック
Nginxサイドカーを置くべきケース
多くの場合、ALB + WAF + CloudFrontの組み合わせでApacheの機能はカバーできる。ただし、以下のケースではECSコンテナ内にNginxサイドカーを置くことを検討する。
| ケース | 判断 |
|---|---|
| リクエストボディの大きなアップロード(数十MB)のバッファリング | Nginxサイドカー検討 |
| コンテナ単位の独立したアクセスログ管理 | Nginxサイドカー検討 |
| レスポンスのマイクロキャッシュ(数秒単位) | Nginxサイドカー検討 |
| 単純なパスルーティング・ヘルスチェックのみ | ALBで十分・Nginx不要 |
| IP制限・レート制限 | WAFで十分・Nginx不要 |
対比表
| Apache機能 | オンプレ | AWS |
|---|---|---|
| URL書き換え | mod_rewrite(httpd.conf) | ALBリスナールール / CloudFront Functions |
| 静的コンテンツ | Apache DocumentRoot | S3 + CloudFront |
| gzip圧縮 | mod_deflate | CloudFront(自動) |
| IP制限 | Require ip / .htaccess | WAF IPセット |
| レート制限 | mod_ratelimit | WAF レートベースルール |
| 複数ドメイン対応 | VirtualHost | ALBホストベースルーティング |
| アクセスログ | /var/log/httpd/access_log | ALBアクセスログ → S3 |
ハマりポイント
⚠️ ALBリスナールールの優先度に注意
ALBは複数のリスナールールを優先度順に評価する。デフォルトルール(全リクエストを転送)を誤った位置に置くと、特定パスのルーティングが機能しない。優先度の数値が小さいほど先に評価される。
✅ 次の記事では…
PART 03 では Apache の mod_jk / AJP という「最も大きな変化」に焦点を当てる。AWSではAJPが完全に不要になり、セッション管理の設計も根本的に変わる。