IPフローティングを試してみた

9 min read読了の目安(約8600字

以前、
IPフローティングって何だろ?
という記事を書いたときに、実際の挙動が気になっていたので試してみました。

構成図

今回はシンプルに以下のような構成で試してみようと思います。
EIPの付け替えはAPIを使えば自動化できますが、今回は手動で付け替えます。

image.png
CDP:Floating IPパターン - AWS-CloudDesignPatternより

前提

Route 53にドメインを登録している前提で進めますので、ドメインがない方はRoute 53で登録するか(有料)、サードパーティの無料ドメインや低価格ドメインを取得してRoute 53に登録してください。
登録方法についてはググるといっぱい出てきますのでそれらを参考にしてください。

EC2インスタンスを構築する

EC2インスタンスの構築手順から紹介しますが「そんなの知ってる」という方は
EIPを手動で付け替えてみるまでスキップして頂いても構いません。

まずはEC2インスタンスをWebサーバーとして起動します。
マネジメントコンソールからEC2コンソールに移動します。
image.png

インスタンスを起動をクリックします。
image.png

今回は無料枠のLinux 2を使用します。
image.png

インスタンスタイプも無料枠のt2.microにします。
image.png

インスタンスの詳細は以下のように設定しました。
購入のオプション:スポットインスタンスのリクエスト
VPC:作成済みのVPC
サブネット:作成済みのパブリックサブネット
キャパシティーの予約:なし
image.png

ユーザーデータでは以下のようにApacheをインストールしてWebサーバーにするよう設定しています。

#!/bin/bash
yum update -y
yum -y install httpd
chkconfig httpd on
service httpd start

その他のIAMロールやモニタリングの設定はデフォルトのままです。
image.png

ストレージの設定はデフォルトのままとします。
image.png

タグはPrimaryとしました。
image.png

セキュリティグループは作成済みのグループを使用します。
とりあえずHTTPとSSHのマイIPを許可していればいいと思います。
image.png

以上の設定でEC2インスタンスを起動します。
image.png

キーペアは作ってなかったので新しく作りました。
image.png

作成リクエストを送信します。
image.png

スポットインスタンスで起動したのでこの画面です。
image.png

インスタンス一覧からパブリックIPをコピペしてアクセスしてみます。
image.png

Apacheのデフォルトページが表示されました。
接続がうまくいかない場合はセキュリティグループでHTTPを許可しているか、サブネットがパブリックか、EC2インスタンスにパブリックIPが付与されているかなどをご確認ください。
image.png

表示内容を変更

後ほど作成するセカンダリーのEC2インスタンスと区別がつくように、表示を変えておこうと思います。
Tera Termでインスタンスに入りますがお好きなソフトをお使いください。

ホストにEC2インスタンスのパブリックIPを入力します。
image.png

続行をクリックします。
image.png

ユーザー名はデフォルトのec2-userを入力し、ダウンロードしたキーペアを指定して接続します。
image.png

入れました。
接続がうまくいかない場合はセキュリティグループでSSH接続を許可しているかなどをご確認ください。
image.png

以下のコマンドで管理者権限でindex.htmlを作成していきます。

sudo su
cd /var/www/html
nano index.html

image.png

<h1>This is Primary</h1>と入力しておきます。
あとはCtrl + XYEnterで保存すると元の画面に戻ります。
image.png

ファイルができてるかlsコマンドで確認しておきます。
image.png

表示も確認しておきます。
image.png

セカンダリーのEC2インスタンスを構築

プライマリーと同じ手順でセカンダリーのEC2インスタンスも構築しますが、同じ手順なので変更点だけ書いておきます。
・サブネット:セカンダリーはap-northeast-1cにしました。
・タグ:Secondary
・htmlファイル:<h1>This is Secondary</h1>
image.png

プライマリーにEIPをアタッチ

プライマリーのEC2インスタンスに固定IPであるEIPをアタッチしていきます。

EC2ダッシュボードからElastic IPをクリックします。
image.png

Elastic IP アドレスの割り当てをクリックします。
image.png

タグにFloating-Testと付けて、あとはデフォルトのまま割り当てをクリックします。
image.png

EC2インスタンスへの関連付けを行います。
image.png

プライマリー用のEC2インスタンスとプライベートIPアドレス(自動入力)を設定し、再関連付けにチェックを付けておきます。
image.png

関連付けされたら試しにEIPでのアクセスもしておきます。
プライマリー側が表示されればOKです。
image.png

Route 53でドメインとEIPの紐づけ

Route 53のコンソールに移動します。
image.png

作成済みのホストゾーンに移動します。
image.png

登録済みのドメインをクリックします。
image.png

レコードを作成します。
image.png

レコード名をにfloatingと入力し、値にEIPを入力します。
TTLは試しに0秒にしてみました。
image.png

floating.<ドメイン名>でアクセスし、プライマリーが表示されることを確認します。
image.png

EIPを手動で付け替えてみる

プライマリーにアタッチしているEIPをセカンダリーに手動で切り替えてみます。

EIPのコンソールから関連付けを変更していきます。
image.png

セカンダリーのEC2インスタンスを選択します。
image.png

ドメイン名でアクセスしてみました。
2~3秒でプライマリーからセカンダリーに切り替わりました。
image.png

TTLを変えてみる

先ほどはRoute 53でTTLを0秒に設定していましたが、60秒に変更してみます。
EIPの付け替えだけならTTLの影響は受けないはずなので、切り替わりもすぐ行われるはずです。
image.png

セカンダリーのEIPをプライマリーに付け替えます。
image.png

先ほどと同様にすぐ切り替わり、TTLの影響を受けていないことが確認できました。
image.png

Route 53のヘルスチェックを用いたフェイルオーバーもやったことありますが、あちらは切り替えに1分~2分ほどかかり、なおかつブラウザのキャッシュにも影響されていたので、切り替え時間だけならIPフローティングの方が速そうです。

まとめ

今回は、IPフローティングを試してみました。
切り替え時間が予想以上に速かったのが印象的でした。ただし、ダウンタイムが0という保証はない点には注意が必要です。
今回は手動での付け替えだったので、実務で使う場合はAPIを使って自動化するのが良いと思いました。
どなたかの参考になれば幸いです。

課金に関する注意点

構築したEC2インスタンスは不要な場合削除しましょう。
また、EIPは関連付けを外して解放しましょう。EIPはアタッチされていない時間や停止したインスタンスに関連付けられていると課金されてしまいます。EC2インスタンスも停止だけだとEBSの料金がかかりますので、不要な場合は削除しておきましょう。