67428


heroku などでは、アプリケーションを作成するたびに、そのドメイン (herokuapp.com のサブドメイン) が生成されます。

# 質問

**Q1: これは、どのように実現されていますか?**

  * ssl の `*` によるマッチのようなことは可能ですか?

**Q2: このようなことを自前のサーバーで実装する場合に、よく利用されるサーバー・サービスなどはありますか?**

  * heroku 以外でも、例えば slack なども似たようなことを実現していたと思っており、同じような仕組みを他にも見る気がするので、これはよくある実装のプラクティスがあるのでは、と思っていますが、それを実現するツールなどがあれば知りたいと思っています。


CC BY-SA 4.0
2020-06-08T13:27:55.147
67422
2020-06-09T00:16:15.573
754
question
network dns
heroku などの、プログラムでのサブドメインの生成は、どのように実現されている?


Q1  
DNSについてはワイルドカードを利用する場合と、DNSサービスのAPIを用いてレコードを生成する2パターンがありえます。

・ワイルドカード方式  
・マルチドメイン方式

一般的なDNSサービスであればワイルドカードが利用可能です。  
<https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/DomainNameFormat.html#domain-
name-format-asterisk>  
<https://support.google.com/domains/answer/4633759?hl=ja>

ですがワイルドカードを利用したDNSの利用に関しては、いくつか問題点があり、  
本来存在しえないサブドメインを生成することになるので、  
ドメイン非存在の証明ができない。→Spamメール等への影響  
ネットワーク量の増大→存在しないドメインもサーバに到達することになるのでネットワークコストが増加します。  
が引き起こされます。

詳しくは  
この辺りを読むとよいでしょう。  
<https://jprs.jp/tech/material/DNS-wildcard-20031008.pdf>

それらリスクへの対応が難しい場合はマルチドメイン方式を採用して、DNSサービスのAPIを用いて、都度都度レコードを発行するという仕組みを作ることになりますが、もちろん開発コストもさることながらそれぞれのDNSサービスの許容量のレコードの調査、キャッシュやDNS浸透のラグへの対応なども考慮に入れる必要があります。

質問についてはネットワークに関することのようですが、  
ロードバランサーやWebサーバもワイルドカードやマルチドメインへの対応が必要ですし、  
アプリケーション側もワイルドカード方式であれば、ドメインとアカウントを紐づける処理であったり、存在しないドメインや有効でないドメインの際のエラー表示などで対応することが必要になります。

個人的にはワイルドカード方式を選択することがほとんどです。  
マルチドメイン方式についてはAPIの連携コストとキャッシュやDNS浸透ラグがドメイン発行や削除時のサーバ再起動などを考えるとなかなか難しい印象です。  
もちろん、DNSはマルチドメインでapacheはワイルドカードみたいなミックス型の方法をとることもあります。

Q2  
ワイルドカード方式で構築する場合であれば一般的にどのサービスでも利用できると思いますので、Route53でもGoogleDomainsでもBindを自前で立ててでも問題ないでしょう。  
ですが今はほとんどの場合APIが充実しており、ほかサービスとの親和性が高いので利用しているPaaSのドメインサービスを利用することをお勧めします。

またマルチドメイン方式で構築する場合はDNSサービスにAPIがあると格段にコストが下がるので、PaaSのドメインサービスを利用するべきでしょう。さすがにZoneファイルを毎回生成するのは、神経も手間もかかります。

正直いまDNSサーバを自前で立てるメリットは非常に少なくなってきています。  
なぜなら  
そこまでコストは高くない。  
ほとんどのサービスで障害率は低く、SLAも高めに設定されている。  
DNSの脆弱性の頻繁で、保守コストがそれなりにかかる。

もちろん要求や要件に沿った選択は必要でしょうが、これらのサービスを正しく捉えてリスクとコストのバランスをとる必要があると思います。


CC BY-SA 4.0
2020-06-09T00:16:15.573
67428
2020-06-09T00:16:15.573
22665
67422
answer