ドメイン名を使ってEC2を運用していたら、ELBのスケールアウトで苦労した話

2014年5月14日 13時00分 修正 タイトルが誤解を招くものだったので、「なぜ URL に www を付けるのか。または、サブドメインなしでは CNAME が使えない件」から変更致しました。併せて、画像に Public IP と Private IP の明記を行いました。

皆さん、こんにちは。MUGENUP の osada です。 今回は、スケールアウト時にELB(Amazon Elastic Load Balancer) を使うときの注意点についての記事です。 といっても、インフラ・エンジニアには自明のことと思いますので、読者の対象は インフラ・エンジニアではないけど、インフラもやるというベンチャーならではのエンジニア向けです。

要旨

  • ELBにはEIPなどのAレコードを関連付けることが出来ず、ドメインとサーバーを結びつけるには提供されるCNAMEを使う必要があります
  • サブドメイン無しのドメイン名 (zone apex) には、CNAMEレコードを貼ることはできません。
  • ELB を使ったスケールアウトを考えているなら、zone apex ではなく、サブドメイン で運用すると簡単です
  • zone apx を使って運用する場合、スケールアウトには、route 53 が必要そうです。

弊社 のインフラは AWS です。

まず弊社のインフラをお話すると、AWS(Amazon Web Service)を使用しており、CTO の伊藤がメイン・オペレーションを担当しています (彼は TCP/IP や WebSocket の RFP などを嬉々として語る通信系のツワモノです)。 しかし、それでは CTO が 単一障害点(Single Point of Failure, SPOF) となってしまうため、 社員全員が AWS へのアクセス権を持ち、一通りオペレーションができる状態となっています。

スケールアウトの頓挫

さて、先日、ご好評いただいている弊社のゲーム攻略サイトみなゲー(β版)が アクセス増のため、スケールアウトが必要となりました。

サーバ1台だったものを、ロードバランサーを使って、2台構成にする という、とても単純な作業です。 ……と、その時はまだ思っていたのです。

元々は、サーバ1台に対して、IP を使って DNS を貼っていました。

f:id:mgnup:20140514121236p:plain

そこで、ELBに従来のIPを設定し、ELBから、新しい2台のサーバに振り分けることを計画しました。

f:id:mgnup:20140514121239p:plain

ところが、AWSロードバランサーである、ELB (Elastic Load Balancing) には、 IP を振ることができなかったのです。

ELB が IP を持たない理由

SPOF(単一障害点) の話を上述しましたが、これはロードバランサーにおいても同じです。 もしロードバランサー1台が壊れてしまったら、どのサーバにもアクセスできなくなってしまいます。 ELBはそれを避けるため、複数台のロードバランサーを1つとして扱っているようです。 そのため、ELB 自体には、DNS が振られるのであって、IP を振ることはできません。

f:id:mgnup:20140514121241p:plain

IP を振る とは? [DNS の設定]

DNS とは、ドメイン名(mina-game.com など)を扱うサービスです。

ドメイン名の扱い方には複数ありますが、 本稿では、IPアドレスと結びつけるAレコードと、別名を付けるCNAMEレコードを取り上げます

レコード名 役割
A (Adress) レコード IPアドレスと結びつける mina-game.com => 123.456.78.90
CNAME レコード ドメイン名に別名を付ける mina-game.com => www.mina-game.com

今まで、mina-game.com にアクセスすると、123.456.78.90 のサーバにアクセスできていたのは、 Aレコード が付いていたからです。

ところが、ELB には IP を付けられない ため、Aレコードを貼ることができません。

よって、この場合、 CNAME を貼る ことが正解となります。

……そう、その時は、それで解決すると思っていたのです。

CNAME には、サブドメイン(ホストドメイン)が必須

ところが、ドメインmina-game.com に対して、CNAME を振ることは出来ない のです。

f:id:mgnup:20140514121244p:plain

少々長いですが、AWS から引用します。

ドメイン名を登録する際は、ドメイン名自体だけでなく、一連のサブドメイン名全体も予約することになります。例えば、example.com をカスタムドメイン名として登録する場合、foo.bar.example.com や foo.myLB.example.com などのサブドメイン名を作成することができます。この一連のドメインサブドメイン名は、ゾーンと呼ばれます。予約した example.com などのドメイン名は、ゾーンの階層の最上部にあるため、Zone Apex と呼ばれます。 DNS ルールでは Zone Apex(example.com など)での CNAME レコードの作成が許可されていません。例えば、example.com というドメイン名を所有している場合、CNAME レコードはサブドメイン名である foo.example.com には使用できますが、Zone Apex である example.com には使用できません。 http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/using-domain-names-with-elb.html

mina-game.comゾーンの階層の最上部にある、Zone Apex であり、それには CNAME を使用する事ができないのです。

もし、www.mina-game.com などの サブドメイン を指定してあったなら、 cname の差し替えで期待どおりの処理が終わっていたことでしょう。 しかし、今回は zone apex で運用していたため、ELB を使ったスケールアウトをすることはできませんでした。

Route 53 を使用する

zone apex で運用を始めてしまった以上、ELB でのスケールアウトは無理なのでしょうか?

AWSのヘルプの続きに、こう書いてあります。

Zone Apex とロードバランサーDNS 名を関連付ける場合は、次のオプションを使用します。 Option 2: DNS サービス Amazon Route 53 はホストゾーンのドメインに関する情報を格納するため、Amazon Route 53 を使用してドメインを作成します。

あ、Route 53 使えば良いんですね。

まるでこのために作られたのではないかと思えるくらい、 完璧なお膳立てで、AWS 製の DNS Amazon Route 53 を案内されてしまいました。

というわけで、zone apex を使って AWS ELB でスケールアウトするには、route 53 を使おう、という結論に落ち着きました.

f:id:mgnup:20140514121247p:plain

元々は使用していなかったサービスが一つ追加で必要になってしまいましたが、無事目的を達成出来ました。

まとめ

  • ELBにはEIPなどのAレコードを関連付けることが出来ず、ドメインとサーバーを結びつけるには提供されるCNAMEを使う必要があります
  • サブドメイン無しのドメイン名 (zone apex) には、CNAMEレコードを貼ることはできません。
  • ELB を使ったスケールアウトを考えているなら、zone apex ではなく、サブドメイン で運用すると簡単です
  • zone apx を使って運用する場合、スケールアウトには、route 53 が必要そうです。

というわけで、インフラ初心者が送る スケールアウトで困った経験の共有でございました。

参考

もっと詳しい解説