📝

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

2021/04/20に公開約8,600字

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

https://zenn.dev/mn87/articles/112b07f8f269ed

構成図

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

image.png

前提

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 の料金がかかりますので、不要な場合は削除しておきましょう。

Discussion

ログインするとコメントできます