【初心者向け】WebサーバのAWS移行時のはまりどころ3選
オンプレミスで運用しているWebサーバー(Apache)をAWSに移行する際、一般的に採用される構成としてALB + EC2があります。
しかし、ALBとEC2の連携にはいくつかの注意点があり、設定を誤ると予期しない不具合が発生することがあります。
本記事では、私の経験した3つのはまりどころと、その解決方法をご紹介します。
1. Apacheログに記録するクライアントIPがALBのものになってしまう
ALBを経由したアクセスでは、Apacheのアクセスログに記録されるIPアドレスがALBのものになり、クライアントのIPアドレスが正しく取得できなくなってしまうことがあります。
これは、mod_remoteipモジュールを有効にすることで解決できます。
解決方法
mod_remoteipモジュールを有効にすることで解決できます。
mod_remoteipモジュールを使用すると、ALBから送信されるX-Forwarded-Forヘッダーを元に、クライアントのIPアドレスを取得することができます。
以下の設定をApacheの設定ファイルに追加します。
# 「mod_remoteip」モジュールの読み込み
LoadModule remoteip_module modules/mod_remoteip.so
# クライアントの本来のIPアドレスを X-Forwarded-For ヘッダーから取得
RemoteIPHeader X-Forwarded-For
# 信頼するプロキシのCIDRを指定
# ALBのIPが動的に変更されても動作するように、ALBが所属するサブネットのCIDRを指定
RemoteIPTrustedProxyList <サブネットのCIDR>
但し、「mod_remoteip」はApache2.4以降で使用可能なモジュールです。
それ以前のバージョンの場合は、「%h」や「%{REMOTE_ADDR}」といったクライアントIPを取得する為の環境変数を、「%{X-Forwarded-For}」に差し替える方法でも解決できます。
参考情報
- mod_remoteipの公式ドキュメント
- X-Forwarded-Forヘッダーとは?
- X-Forwarded-Forヘッダーは、クライアントの本来のIPアドレスを伝えるためのHTTPヘッダーです。
リバースプロキシやCDNを経由すると、サーバーが受け取る REMOTE_ADDR はプロキシのIPになってしまいます。
これを解決するためにX-Forwarded-Forヘッダーを使います。
- X-Forwarded-Forヘッダーは、クライアントの本来のIPアドレスを伝えるためのHTTPヘッダーです。
2. HTTPSリダイレクトループが発生する
移行前の環境で、Webサーバ側でTLS終端させているかつ、HTTPアクセスをHTTPSにリダイレクトさせる設定が存在するとします。
これをALB + EC2構成に移行し、ALB側でTLS終端させる場合、リダイレクトループが発生します。
具体的な動作のイメージは下記の通りです。
解決方法
一例として、Apache側の設定を削除し、ALB側でリダイレクト設定を行う方法があります。
また、HTTPSアクセスを条件に処理を行うような設定も実質無効となる為、X-Forwarded-Protoヘッダーを使用する等の修正が必要となります。
参考情報
- X-Forwarded-Protoヘッダーとは?
- X-Forwarded-Protoヘッダーは、ライアントが元々アクセスした プロトコル(HTTP/HTTPS)を伝えるためのHTTPヘッダー です。
X-Forwarded-Forヘッダーと共に、プロキシを経由する環境で使用されます。
- X-Forwarded-Protoヘッダーは、ライアントが元々アクセスした プロトコル(HTTP/HTTPS)を伝えるためのHTTPヘッダー です。
3. ALBからのアクセスがまれに502エラーになる
ALB + EC2構成のWebサーバーに対して、稀に502エラーが返却されることがあります。
このエラーの原因はさまざまですが、今回はApacheのkeepAlive設定が関与しているケースについて解説します。
具体的には、下記の条件で発生します。
- ApacheのKeepAliveTimeout値が、ALBのアイドルタイムアウト値よりも小さい場合
具体的な動作イメージは下記の通りです。
解決方法
これは、ApacheのKeepAliveTimeout値の設定をALBのアイドルタイムアウト値よりも大きい値にすることで解消します。
KeepAlive On
KeepAliveTimeout 65
但し、ApacheのKeepAliveTimeout値を大きくすることでサーバーの負荷が上がる為、注意が必要です。
参考情報
- ApacheのKeepAliveTimeout値
- クライアントとサーバ(Apache)間の接続を維持する時間の設定です。
- KeepAliveTimeout値を超過した場合、Apacheは接続を切ります。
- ALBのアイドルタイムアウト値
- ALBとターゲットの接続を維持する時間の設定です。
- アイドルタイムアウト値を超過した場合、Apacheは接続を切ります。
最後に
ALB + EC2(Apache)の構成は、AWSにおけるWebサーバー移行でよく採用される手法ですが、いくつかのポイントで注意が必要です。
移行前後の環境差異により思わぬ不具合が発生する可能性がある為、事前に調整が必要な箇所を洗い出すとともに、切り替え前に十分に動作確認を行うことが重要です。
本記事でご紹介した内容はその一例ですが、AWS移行を検討されている方の参考になれば幸いです。