AWS でELB もRoute53 も使わずにHTTPS サイトの冗長化構成を取る

鈴木です。

MODDにとって通常とは異なる対応をしなくてはならない案件があったので、久しぶりに記事を書いてみます。ELB(Elastic Load Balancer) を使えない場合に、AWS(Amazon Web Service) で可用性を担保する方法についてです。

Floating IPパターン

結論から言いますと、Floating IPパターンを利用するだけです。

CDP:Floating IPパターン - AWS-CloudDesignPattern
f:id:su-zuki:20160920193849p:plain

リンク先だけ見れば、必要なことはほぼすべて書いてありますね…。

HTTPSに対応

ひとつのEC2インスタンスで複数のウェブサイト(HTTPS) をホスティングしたい場合には、ENI(Elastic Network Interface) を複数枚差しするか、接続元の環境を(ガラケー等)ある程度切り捨てられるならSNI(Server Name Indication) を利用してもよいと思います。
ただしインスタンスタイプあたりのENIには最大数の制限があるようです。
docs.aws.amazon.com

スケールアウト

Floating IPパターンをそのまま利用すると、中規模以上のサイトであればすぐにパフォーマンスが問題になると思います。
またスケールアウトする際に、管理するEIP(Elastic IP Address) が倍掛け(ホストしているサイト数×サーバー台数)で増えていくので、その場合は、リバースプロキシを置いて、アプリケーションサーバーと分離します。

リバースプロキシには以下の仕事に注力してもらいます。

  1. L7層でのルーティング
  2. SSLオフロード
  3. キャッシュの保持

CPUやメモリはアプリケーションサーバーほど必要ない場合が多いと思いますので、インスタンスタイプは小さめでも良いかもしれません。
リバースプロキシの数がアプリケーションサーバーを上回ることは普通のウェブサイトではまずないですよね。

CLIによる自動化

EIPの付け替えを自動化するには以下のCLI(AWS コマンドラインインターフェイス) を利用します。Get系のコマンドは、InstanceId, AssociationId, NetworkInterfaceId, AllocationId を取得するために必要です。

docs.aws.amazon.com

Elastic IP アドレスの関連付けを解除する

  • disassociate-address(AWS CLI)
  • Unregister-EC2Address(AWS Tools for Windows PowerShell)


Elastic IP アドレスをインスタンスまたはネットワークインターフェイスに関連付ける

  • associate-address(AWS CLI)
  • Register-EC2Address(AWS Tools for Windows PowerShell)


1 つ以上の Elastic IP アドレスについて説明する

  • describe-addresses(AWS CLI)
  • Get-EC2Address(AWS Tools for Windows PowerShell)

構成図

EIPを割り当てるサーバーを冗長化する場合には、一つのホスト名に対して複数のAレコードを設定して、DNSラウンドロビン的な感じにしても良いと思います。
構成図は以下の通りです。

f:id:su-zuki:20160921100444p:plain

サーバーの停止時は、予備のサーバーを立ち上げてEIPを付け替えてもよいですし、正常な別のサーバーにENIを付け替えてもよいです。
サーバーの起動からIPアドレスの設定までスクリプトを書いて自動化してもよいですし、何でもありだと思います。
コストや許容できるダウンタイムと相談です。

まとめ

記事にはしましたが、Floating IPパターンを採用するようなサイトであれば、ミニマム構成であるコストメリットを享受したいでしょうし、パフォーマンスを求めるサイトであれば、技術的にはELBを使わない選択肢がなさそうですし、Route53を使えるのであればALIASレコードを利用して「Zone ApexをCNAMEにマッピング出来ない問題」も解消できますので、出番はごくごく限定的ですね…