これまでELBを使ってサービスを展開していましたが、比較的安価に柔軟なスケーリングができる反面、できないことも多いため、EC2+Poundで置き換えられないかと思い研究中です。
ELBの中身ってひょっとしてPoundなんじゃね?と思うほど仕様がよく似ていますので、移行自体は非常に簡単です。
また、Poundだけであれば非常に消費リソースも少ないので、そこそこのトラフィックもさばけそうです。
で、以下はPoundの設定ファイルとちょっとした注意点です。
インストールは普通にyumでできますので、省略します。
User "pound"
Group "pound"
Control "/var/lib/pound/pound.cfg"
LogLevel 3
Alive 30
ListenHTTP
Address 0.0.0.0
Port 80
RewriteLocation 0
Service
HeadRequire "Host: XXXXX.example.co.jp"
BackEnd
Address AAA.AAA.AAA.AAA
Port 80
End
BackEnd
Address BBB.BBB.BBB.BBB
Port 80
End
End
End
ListenHTTPS
Address 0.0.0.0
Port 443
Cert "/etc/sslkeys/example.co.jp.pem"
xHTTP 0
RewriteLocation 0
AddHeader "X-Forwarded-Proto: https"
AddHeader "X-Forwarded-By: SSL"
AddHeader "X-Forwarded-Host: SSL"
AddHeader "X-Forwarded-Port: 443"
HeadRemove "X-Forwarded-Proto"
HeadRemove "X-Forwarded-By"
HeadRemove "X-Forwarded-Host"
HeadRemove "X-Forwarded-Port"
Service
HeadRequire "Host: XXXXX.example.co.jp"
BackEnd
Address AAA.AAA.AAA.AAA
Port 80
End
BackEnd
Address BBB.BBB.BBB.BBB
Port 80
End
End
End
涙がでるほど簡単ですね。
幼稚園児でも一見して理解できるほど単純な構造です。
そして一見して分かる通り、SSL周りに関してはELBと全く同じ仕様をとっています。
80ポートアクセス時は通常通りの割り振り。
443ポートアクセス時は、ヘッダ類を付与した上でバックエンドに80ポート経由で割り振り。
なお、今回はまだ設定していませんが、ロードバランサレベルでの仮想ホストの設定も可能ですし、仮想ホストごとにバックエンドを振り分けることも可能です。
有能ですね、Poundさん。
ちなみに、うちの会社とサービス基準ですが、留意点は以下の3つです。
1. アクセス制御方法の取り扱い方法を決めておく
SecurityGroupは引き続きELBと同じものをEC2単位で使用可能ですが、それに加えて「iptables」「Poundのアクセス制御」の2つが使用可能になります。
iptablesは機能的にSecurityGroupと近いネットワーク層のセキュリティシステムで、Poundのアクセス制御はapacheのAllowDenyと近いアプリケーション層のセキュリティシステムです。
パターンに応じた柔軟なアクセス制御が実現できるようになるので、運用しているサービスに対応したアクセス制御方法を取り決めておく必要があります。
2. ログの出力先に注意する
もしyumで入れたり特に設定せずmakeした場合、ログの出力先は/var/log/messagesになってしまいます。後から変更するには、残念ながらsyslogを調整するしかないようです。
また、LogLevelとrotationも必要に応じて調整する必要があります。
3. 転送時の挙動を設定する
さり気なく先述のログサンプル内に書いてあった以下の部分がこれに相当します。
RewriteLocation 0
RewriteLocationの値と挙動は以下の通りです。
0 : RewriteLocationを一切無効にする
1 : Poundの設定通りに書き換える(デフォルト)
2 : バックエンドの設定通りに書き換えて、もしバックエンドから指定されていなければPoundの設定通りに書き換える
例えばバックエンド側で「このURLにリダイレクト!」と命令しても、デフォルトのままではPoundの設定を優先してしまうため、うまくリダイレクトが働かないことがあります。
うちのサービスでもApacheやCakePHPがバックエンド側からHTTP→HTTPSのリダイレクトをかけていましたが、何度やっても無限ループになってしまっていました。ドツボにはまっていたのでmanを確認していたところRewriteLocationに行き当たり、解決した次第です。
以上です。
今後はモニタリングとスケーリングの自動化について研究していきます。