CNAMEが登録できないトラブル
こんにちは。かじです。
今回はDNSでCNAMEレコードが他のレコードと共有できない問題について書いていきたいと思います。
以前、AWSでEC2、ALBを使用したwebシステムの開発を行ったのですが、ネームサーバーは既に稼働しているAWS以外のサービスを使用していました。
その際にルートドメインに既にレコードがあるため、ALBのDNS名をCNAMEレコードに登録することができませんでした。
どうして登録できないかというと、CNAMEレコードは他のレコードと共存できないというルールのため。なぜそんなルールがあるかというと、RFCで定められてるからのようで、その先の理屈的な理由までは、分かりませんでした。
ネームサーバーがRoute53であれば、ALIASレコードを設定することでこの問題を回避できるようですが、あいにく今回使用しているネームサーバーにはそのような機能はありませんでした。
また、AレコードにALBのグローバルIPアドレスを登録するにしても、ALBは、IPアドレスが自動で変わるため、この策もダメです。
このように使用するインフラサービスが複数に跨って困難が生まれる時こそエンジニアの腕の見せ所かと思います。まあ、考えられる方法を出して提案するところまでしかできないのですが。
いくつか方法を書いていきたいと思います。
解決方法
それでは解決方法を書いていきたいと思います。シンプルなものから書いていきたいと思います。シンプルだからといっても、リーダーや関係者を説得する必要があるので骨が折れるかもしれませんが。
1.ルートドメインの使用をやめてwwwなどのサブドメインを使用する
一つ目は単純にルートドメインの使用をしないことです。ルートドメインがメール用などのレコードが登録されている場合、wwwなどWEBアプリ用のみで使用されるサブドメインを割り当てることです。
割り当てたサブドメインのCNAMEにALBのDNS名を登録することで完了するので、一番早く解決できます。
ルートドメインをどうしても使いたいという場合を除いてこれで解決します。僕のケースもこの方法で落着しました。
2.ネームサーバーをRoute53に移行しALIASレコードを使用する
続いてより面倒くさい方法としては、ドメインのネームサーバーをRoute53に移行して、ALIASレコードを変更するということです。まあ、レコードを全部入れ替えるので影響範囲や作業から変更の反映までに時間がかかり、トラブルが発生した場合は、システムにダウンタイムが発生してしまうのであまりお勧めしません。ただ、ネームサーバーを入れ替えるだけですので、後の二つに比べると、運用費用が大きく追加されることはないかと思います。もちろん既存のネームサーバーサービスによりけりですが。
3.WEBサーバーをパブリックサブネットに配置しElastic IPを使用する
続いての方法としては、WEBサーバー用のEC2をパブリックサブネットに配置してElastic IPを割り当てることが挙げられるかと思います。
割り当てたElastic IPをネームサーバーのAレコードに登録することで、解決します。
これはALBを使用しなくなるという点、またDBとWEBサーバーが共存している場合、WEBサーバーを切り分けなければいけないので、システムの構成をそもそも変える必要があります。
Elastic IPの料金については時間あたりUSD0.005で月720時間あたり、USD3.6となりますが、もし、DBサーバーとWEBサーバーを切り分けるとなると、追加のインスタンス料金もかかってしまいます。
また、ALBであれば簡単に設定できたhttpsの設定も少しの手間が必要です。一応下記にElastic IPでhttps通信を設定する方法を紹介しておきます。
4.Network Load BalancerかGlobal Acceleratorを使用してグローバルIPを固定する
最後は、ALBの前にNetwork Load BalancerかGlobal Acceleratorを配置して固定されたIPアドレスを使用可能にする方法です。
料金は、ALB+NLBの構成であれば、場合時間あたり「USD0.0225(ALB)+ USD 0.0225(NLB)」、Global Acceleratorの構成であれば、時間あたり「USD0.0225(ALB) + USD 0.025(Global Accelerator)」ほどかかってしまいます。それぞれ、月720時間に換算するとUSD32.4とUSD34.2になります。
今回は、CNAMEを登録できない現象について、Route53を使用していない場合の解決方法を述べてみました。皆様に参考になれば幸いです。