Amazon VPCで浮動IPアドレス的なことができないかのメモ

フェイルオーバーを実現する手法のひとつにVIP(Virtual IP、浮動IPアドレス)というものがあります。

Amazon VPCにてVIPができないか、ちょっと考えてみたのでそのメモです。

環境としては、10.0.0.0/16のVPCの中に、

  • 10.0.0.0/17のpublic subnet (AZはa)
  • 10.0.128.0/17のpublic subnet (AZはb)

というそれぞれ別のAvailability Zoneに属する2つのsubnetを作り、これらsubnetをまたいでVIP的なことができないか、という考察です。

思いついた方法としては以下の3つです。

  1. ENIを移動する - NICを移動する
  2. secondary private addressを移動する - IP Aliasする
  3. Routerの力を借りる

ほかにもいい方法があったら教えてください><

ENIを移動する - NICを移動する

VPCではENI(Elastic Network Interface)というものが使えるので、ENIにVirtual IP Addressを割り当てて、ENI ごと移動できないか?と考えました。

が、現在のAWSの仕様ではENIはAZを超えて移動できないので、この方法では実現できないようでした。

secondary private addressを移動する - IP Aliasする

EC2の中で、eth0にIP Aliasして(eth0:1とか)、subnet内の使っていないIPアドレスを割り振ることはできます。

しかし、このIPアドレスarp requestが当該ホストには届かず(これは仕様だそうです)、arpの解決ができず他ホストから通信できませんでした。

arpコマンドで静的にarpテーブルを指定すれば通信できるのは確認したのですが、全ホストでarpを静的に指定するのは運用的にめんどくさすぎるのであまり現実的な方法ではないでしょう。

さて、arp requestを受付しreplyするようにするには、EC2の設定でeth0のNetwork Interfaceのsecondary private addressにそのIP Addressを登録した上で、Linuxでeth0:1にそのアドレスを割り当ててあげればOKです。

が、EC2のWeb consoleでは、当該EC2インスタンスが属するsubnetのものではないIP Addressを登録することができませんでした。なので、この方法では同じIP Addressをsubnetをまたいで移動することはできませんでした。

Routerの力を借りる

これは、

に書かれている手法です。詳しくはそちらを参照ください。

一見、トリッキーな方法に見えますが、ロードバランサでDR (Direct Routing)するときと同じ仕組みですね。

この手法を使い、スタンバイ側のEC2でも予め、iptablesの-j DNAT(-j REDIRECTでもいけるんじゃないかと思います)やloにIPを振っておけば、RouterのTargetを変えるだけで、VIP的なことが実現できます。

Web consoleではTargetの変更は試したのですが、CUIでできるかどうかはまだ確認していません。(ご存じの方がいたら教えて欲しいです><)

というわけで、

最後のRouterを使う方法で、かつ、Targetの変更がCUIでできるならば、VIP的な仕組みが自動化できそうというのがわかりました。

ほかにもいい方法があるよ!とか実際こういう手法でVIP的なことを実現してるよ!という情報があればお知らせいただけると幸甚です!