ドメイン名を使って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
が必要そうです。
というわけで、インフラ初心者が送る
スケールアウトで困った経験
の共有でございました。
参考
もっと詳しい解説