CDP:Floating IPパターン
提供:AWS-CloudDesignPattern
IPアドレスの動的な移動
目次 |
解決したい課題
サーバーにパッチを当てたり、(処理能力を上げるために)サーバーをアップグレードしたりする場合、サーバーの停止が必要となる。サーバーの停止はそのままサービスの停止につながるので、システム提供者としては、停止時間をできるだけ短くなるようにしなければならない。
Webサーバーの場合は、DNSの仕組みを使ってサーバーを切り替えることがある。ただその場合も、一般にTTL(Time to Live)値より切り替え時間を短くできないので、即座に切り替えを行うには不向きである。
クラウドでの解決/パターンの説明
従来の物理サーバーの場合、サーバーの停止に備えて予備サーバーを用意しておくことがある。本番用サーバーが停止した後、予備サーバーを立ち上げて(本番用サーバーの)IPアドレスを設定することで処理の代行が可能になる。
クラウドではこれと同等のことが、はるかに短い時間に簡単に実施できる。マシンイメージを用意しておけば必要なときに必要な仮想サーバーを起動できる。また、IPアドレスを指定するAPIも用意されているので、サーバーの起動からIPアドレスの設定までスクリプトを用いて自動化することも可能である。
実装
AWSで利用できる固定IPアドレスを「EIP(Elastic IP Address)」という。これを利用することでIPアドレスを付け替えられる。既存EC2インスタンスのEIPをデタッチし、それを別のEC2インスタンスにアタッチすれば、サービス提供する仮想サーバーを切り替えることができる。
(手順)
- EC2インスタンスに対してEIPを割り振る。
- 障害発生時やアップグレード時に、新たなEC2インスタンスを起動する。起動する際はStampパターンなどを利用してもよい。また、より迅速に切り替えるために、別のEC2インスタンスを起動しておくのもよい。
- インスタンス起動後に、今のEC2インスタンスからEIPをデタッチし、新たなEC2インスタンスにアタッチする。
構造
利点
- EIPを付け替えるだけなので、DNSのTTLに影響されずサーバーを切り替えられる。
- アップグレードの際、仮に切り替え先のサーバーでエラーが発生しても、即座に元のサーバーにEIPを付けることでフォールバックできる。
- EIPは異なるAZをまたがっても適用できるので、万が一AZレベルで障害があっても異なるAZのサーバーにEIPを付け替えることが可能である。
注意点
- EIPの切り替えには通常数秒程度の時間がかかる。
- VPCの場合、ネットワークインターフェース(ENI)に固定のプライベートIPアドレスを割り当てることができる。ネットワークインターフェース(ENI)を別のEC2インスタンスに付与できるので、プライベートネットワーク下でもこのパターンを適用できる。ただし、VPCではサブネットを超えてアドレスを付け替えることができない点に注意する。
- 現在、ネットワークインターフェース(ENI)には複数のIPアドレスを付与することができ、二つ目以降のIPアドレスは動的に追加/削除することができるので、ネットワークインターフェース(ENI)を付け替えなくても、IPアドレスのつけ替えだけで同様のことが可能となる。[関連ブログ 1]
- 該当EIPにSSH接続している場合は同じIPでサーバが入れ替わることになるので、なりすましの可能性が警告されログインできないことがあります。[関連ブログ 2]
その他
- 障害検知を行う際は、HeartBeatやNagios、Zabbixといった監視ソフトを利用してもよい。EIPの付け替えはプログラムから実行できるので、監視ソフトと組み合わせれば自動化を行うこともできる。[関連ブログ 3]
- Server Swappingパターンと併用することで、EIPを付け替えるとともに、EBSも付け替えてデータを引き継ぐことも可能である。
- 予備サーバへの切り替えはEIPを用いず、ELBを利用してヘルスチェックファイルの追加/削除で行う手段もある。[関連ブログ 4]
関連ブログ
- ↑ suz-lab - blog の「"Floating IPパターン"をENIの"Secondary IP"で試してみた」( http://blog.suz-lab.com/2012/12/cdp-floating-ip-eipenisecondary-ip-10.html )
- ↑ suz-lab - blog の「EIP付け替えたときのSSH接続のなりすまし警告対策」( http://blog.suz-lab.com/2012/08/eipssh.html )
- ↑ suz-lab - blog の「Heartbeat(Pacemaker)でEIPの付け替え」( http://blog.suz-lab.com/2012/04/heartbeatpacemakereip.html )
- ↑ suz-lab - blog の「ELBとHeartbeatでアクティブ/スタンバイ構成」( http://blog.suz-lab.com/2012/10/cdp-floating-ip-heartbeatpacemaker.html )