ドメイン名を使って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 を貼っていました。

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

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

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 を振ることは出来ない のです。

少々長いですが、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 を使おう、という結論に落ち着きました.

元々は使用していなかったサービスが一つ追加で必要になってしまいましたが、無事目的を達成出来ました。
まとめ
ELBにはEIPなどのAレコードを関連付けることが出来ず、ドメインとサーバーを結びつけるには提供されるCNAMEを使う必要がありますサブドメイン無しのドメイン名 (zone apex)には、CNAMEレコードを貼ることはできません。ELBを使ったスケールアウトを考えているなら、zone apexではなく、サブドメインで運用すると簡単ですzone apxを使って運用する場合、スケールアウトには、route 53が必要そうです。
というわけで、インフラ初心者が送る スケールアウトで困った経験の共有でございました。
参考
もっと詳しい解説