📝

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

2021/04/20に公開

以前、以下の記事を書いたときに、実際の挙動が気になっていたので試してみました。

IP フローティングとは

構成図

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

前提

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

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

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

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

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

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

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

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

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

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

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

タグは Primary としました。

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

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

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

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

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

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

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

表示内容を変更

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

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

続行をクリックします。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

レコードを作成します。

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

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

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

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

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

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

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

TTL を変えてみる

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

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

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

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

まとめ

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

課金に関する注意点

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

参考資料

Discussion