📝

IP フローティングとは

に公開

Floating IP pattern for HA between active–standby stateful servers - Real-Time Communication on AWS

The floating IP design pattern is a well-known mechanism to achieve automatic failover between an active and standby pair of hardware nodes (media servers).

ハードウェアのアクティブサーバーとスタンバイサーバー間で静的 IP アドレスの付け替えを行う設計が IP フローティングです。
AWS では EIP の付け替えが IP フローティングに該当します。

ユースケース

CDP:Floating IP Pattern - AWS-CloudDesignPattern

  • アクティブサーバーでの障害発生時にセカンダリサーバーに切り替える場合
  • サーバーの切り替えを自動化したい場合
  • DNS によるスワップよりも素早くスワップしてダウンタイムを最小限に抑えたい場合
  • 低予算でフェイルオーバーを実現したい場合

EC2 Auto Scaling との違い

Amazon EC2 Auto Scaling とは - Amazon EC2 Auto Scaling

Amazon EC2 Auto Scaling は、EC2 ヘルスチェックを使用してインスタンスのヘルスと可用性を自動的にモニタリングし、終了したインスタンスまたは障害が発生したインスタンスを置き換えて、希望するキャパシティを維持します。

EIP でのフローティングと EC2 Auto Scaling の主な違いは以下であると思われます。

  • マネージドかどうか
    • フローティング: IP アドレスの付け替え処理は作りこみが必要
    • Auto Scaling: 障害が発生したインスタンスは自動で置換される
  • 障害が発生したインスタンスの置換動作
    • フローティング: 自動的に置換されない
    • Auto Scaling: 自動的に置換される
  • ロードバランサーとの統合
    • フローティング: ネイティブに統合されていない
    • Auto Scaling: ネイティブに統合されている

IP フローティングと Auto Scaling のどちらを採用するかは要件次第ですが、運用負荷を抑えたい場合には Auto Scaling が適していると思われます。
一方で、Auto Scaling では実現できない要件がある場合には IP フローティングを検討する余地があると思われます。

IP フローティングの注意点

CDP:Floating IP Pattern - AWS-CloudDesignPattern

  • EIP の付け替えには数秒程度かかる
  • セキュリティ警告により切り替え後のサーバーに SSH 接続できない可能性がある
  • サーバーの障害検出はスクリプトやサードパーティツールで実装する必要がある
  • 障害が発生したサーバーへの接続は中断される

やってみた

Floating IP pattern for HA between active–standby stateful servers - Real-Time Communication on AWS
ドキュメントの手順を参考に IP フローティングを試してみました。

01. EC2 インスタンスの作成

以下の設定でプライマリとセカンダリの EC2 インスタンスを作成しました。

  • AMI: Amazon Linux 2023
  • キーペア: 不要
  • セキュリティグループ: 既存のセキュリティグループ
    • インバウンド、アウトバウンド全開放
  • IAM インスタンスプロファイル: AdministratorAccess 権限を付与したプロファイル
  • ユーザーデータ
    • プライマリとセカンダリでそれぞれ以下の通り
プライマリ
#!/bin/bash
set -eux

dnf update -y
dnf install -y httpd

systemctl start httpd
systemctl enable httpd

cat << 'EOF' > /var/www/html/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Primary Server</title>
</head>
<body>
  <h1>これはプライマリサーバーです。</h1>
</body>
</html>
EOF

chmod 644 /var/www/html/index.html
セカンダリ
#!/bin/bash
set -eux

dnf update -y
dnf install -y httpd

systemctl start httpd
systemctl enable httpd

cat << 'EOF' > /var/www/html/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Primary Server</title>
</head>
<body>
  <h1>これはセカンダリサーバーです。</h1>
</body>
</html>
EOF

chmod 644 /var/www/html/index.html

各 EC2 インスタンスの起動後にパブリック IPv4 アドレスにアクセスして以下のページが表示されることを確認します。

02. セカンダリプライベート IP アドレスの割り当て

プライマリの EC2 インスタンスに以下の設定でセカンダリプライベート IP アドレスを割り当てます。

  • プライベート IP アドレス: 自動割り当て
  • パブリック IP の自動割り当て: オン
  • セカンダリプライベート IPv4 アドレスの再割り当てを許可する: 許可

03. EIP の割り当て

手順 02 で割り当てたセカンダリプライベート IP アドレスに EIP を割り当てます。
EIP の再関連付けもオンにします。

この段階では EIP にアクセスするとプライマリサーバーにつながります。

$ curl http://13.114.145.213/
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Primary Server</title>
</head>
<body>
  <h1>これはプライマリサーバーです。</h1>
</body>
</html>

04. セカンダリプライベート IP アドレスの付け替え

手順 02 でプライマリインスタンスに割り当てたセカンダリプライベート IP アドレスをセカンダリインスタンスに付け替えます。

セカンダリプライベート IP アドレスの付け替えによって EIP もセカンダリインスタンスに紐づいたことがわかります。

この状態で再度 EIP にアクセスするとセカンダリサーバーにつながります。

$ curl http://13.114.145.213/
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Primary Server</title>
</head>
<body>
  <h1>これはセカンダリサーバーです。</h1>
</body>
</html>

IP フローティングによるサーバーの切り替えができました。
今回はコンソール上で実施しましたが、API を使用すれば自動化できるできる点は上述の通りです。

CloudTrail を確認した限りでは以下の API が記録されていました。

具体的な API 仕様については各 API のドキュメントをご参照ください。

まとめ

今回は IP フローティングについて紹介しました。
どなたかの参考になれば幸いです。

参考資料

Discussion