オンプレにあったプロダクトをクラウドに移行させました
移行させるのは今までも何度かやってきたので、プロダクト自体が動くところまではそこそこできましたが、今回問題となったのは、オンプレで機能していたリダイレクトの設定や、プロキシの設定などです。クライアントのリクエストがオンプレ側で使われていたプロキシサーバーだったりしていたので、その辺りの部分を、AWSのアーキテクチャに沿って整える必要がありました。具体的に言えば、オンプレでやっていたプロキシの部分をALBにやらせる設定に寄せて上げるということです。
mod_rpaf
設定でALBに寄せて上げなくてはならないモジュールがこれでした。このモジュールの機能は、
mod_rpafを使うと、ヘッダのIPアドレスを取得して、httpdの内部のリモートIPアドレスを保持している変数(REMOTE_ADDR)に上書きしてくれます。これにより、正しいアクセス元IPアドレスがアクセスログに記録されます。
ということだそうです。
ALBやApacheにはリクエストヘッダをいじくれるヘッダがあります。X-Forwardと名のつくヘッダがこれに当たります。こいつを使って、アクセスログに利用されたIPをログに取り、アクセスされているIPをhttpd側に取得させます。
apacheとalbに用意されているヘッダ
- Apacheのmod_proxy_httpのヘッダ
X-Forwarded-For: {クライアントが送ってきた X-Forwarded-For リクエストヘッダ値 + クライアントのIPアドレス}
X-Forwarded-Host: {クライアントが送ってきた X-Forwarded-Host リクエストヘッダ値 + クライアントが送ってきた Host リクエストヘッダ値}
X-Forwarded-Server: {クライアントが送ってきた X-Forwarded-Server リクエストヘッダ値 + リバースプロキシサーバーのホスト名. ServerNameで指定}
- ELBのヘッダ
X-Forwarded-For: {クライアントが送ってきた X-Forwarded-For リクエストヘッダ値 + クライアントのIPアドレス}
X-Forwarded-Port: {クライアントが接続してきたリバースプロキシサーバーのポート番号}
X-Forwarded-Proto: {クライアントが使用したプロトコル. 典型的には http や https}
mod_rpafのインストール
mod_rpafのインストールに伴い、まず、ビルドに必要なパッケージを落としてきます。
# yum install gcc
# yum install httpd httpd-devel
wgetを使って落っことしてきます。amazon-linuxに落っことしてきます。
$ mkdir mod_rpaf-0.6
$ cd mod_rpaf-0.6
$ wget https://raw.github.com/ttkzw/mod_rpaf-0.6/master/mod_rpaf-2.0.c
$ sudo /usr/sbin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
mod_rpafのディレクティブ
-
RPAFenable
On設定すると、このモジュールの機能が有効になる。 -
RPAFsethostname
On設定すると、リバースプロキシが付与するヘッダX-Forwarded-HostあるいはX-Hostの値をHostヘッダの値として設定する。
- RPAFproxy_ips
リバースプロキシのIPアドレスをスペース区切りで列挙する。オリジナルにはない付加機能として"10."や"172.16."のようなドットで終わるサブネットの記法も使える。なお、この範囲を可能な限り限定してください。リバースプロキシを経由しないアクセス経路があるときには、X-Forwarded-Hostヘッダの偽装の影響を受ける恐れがある。
- RPAFheader
リバースプロキシが付与するアクセス元IPアドレスを格納しているヘッダ名を記述する。デフォルトではX-Forwarded-Forが使われる。
confへどう書いたか?
RPAFenable On
RPAFsethostname On
RPAFproxy_ips ここにALBのDNS名を追加
RPAFheader X-Forwarded-For
こんな感じでALBのドメイン名を直書きでできました。カスタムログで確認して、ALBHealthCheckerのログが残っていればOKです。