hypermkt blog

ELB導入時に躓いた件

May 23, 2016

先日ELBを導入したんですが、事前の調査不足もあり思った以上に影響がでてしまい障害となってしまった(反省)。というのも、ELBというAWSのロードバランサー配下にWebサーバーを入れた場合に、クライアントのIPアドレス取得方法が今までと変わる。*Elastic Load Balancing の X-Forwarded ヘッダー - Elastic Load Balancing

にあるように「X-Forwarded-Forヘッダー」にクライアントIPアドレスが入るようになり 環境変数の REMOTE_ADDR では取得できないようになる。(知らなかった〜)

これが地味に影響範囲が広く

  • フレームワーク内のIPアドレス取得メソッド

  • Apacheのconfファイル内のIPアドレス制限

  • .htaccess内のIPアドレス制限

に影響があり、アプリケーション全体で盛大に誤動作してしまった・・・。

フレームワーク内のIPアドレス取得メソッド

PHPであれば $_SERVER[‘HTTP_X_FORWARDED_FOR’];で取得できる。但し複数IPアドレスが入る場合もあるので要注意。 refs : PHP - PHP ロードバランサ経由のクライアントのIP取得ができない(131)|teratail

.htaccess内のIPアドレス制限

海外のボットなど気軽にIPアドレス制限をかけたい場合に、.htaccessは大変便利なわけなのですが、記述の変更が必要です。 SetEnvIfでIPアドレスを指定する際は正規表現で指定できるのですが、複数個のIPアドレスをパイプでつなげると可読性が悪いので、個人的には下記の記法が好みです。

ELB非利用時

order allow,deny allow from all deny from xxx.xxx.xxx.xxx deny from xxx.xxx.xxx.xxx

ELB利用時

order allow,deny allow from all

SetEnvIf X-Forwarded-For “xxx.xxx.xxx.xxx” deny_ip_addresses SetEnvIf X-Forwarded-For “xxx.xxx.xxx.xxx” deny_ip_addresses

deny from env=deny_ip_addresses

とネット上ではありふれた情報であるのですが、最初は結構戸惑ったので自分用のメモとしてまとめました。どうにか導入できてよかった。これでグーグルクローラーに本気で来られても大丈夫だろう。


都内で働くWebアプリケーションエンジニア。主にサーバーサイド。最近はRuby/Railsでコードを書くのが楽しい。