Elido
1分で読了機能

カスタムドメインのショートリンク:DNS、TLS、エッジで動くもの

ブランデッドショートリンクの実際の仕組み:DNS検証、ACMEオンデマンドTLS発行、エッジリダイレクトのレイテンシー予算、そして本番環境でオペレーターが経験する3つの障害モード

Marius Voß
DevRel · edge infra
DNS hierarchy from root zone down to a branded subdomain terminating in the Elido redirect capsule

ブランデッドショートリンクの本質は、2つのインフラが結びついたものです:あなたのサブドメインがここにあるとインターネットに伝えるDNSレコードと、HTTPS接続が正当であることを証明するTLS証明書。個別に見れば、どちらも複雑ではありません。興味深い問いは、リダイレクトが解決した後のエッジで何が動いているかです - 何千ものテナントのカスタムドメインを処理するプラットフォームがオンデマンドで証明書を発行し、Let's Encryptのレート制限を回避し、15ms p95レイテンシー予算を守り、顧客のDNSチームがキャンペーン中にCNAMEを削除しても適切に回復する方法です。

この記事はそれについてです。

まとめ#

  • DNS検証はCNAMEまたはTXTチャレンジです。TLS発行は新しいホスト名が最初のリクエストを受けたときにトリガーされるACMEオンデマンドで行われます。
  • Let's Encryptは登録ドメインあたり週50枚の証明書を上限としています - つまり大規模では、単一のelido.meのサブドメインではなく、テナントごとに別の登録ドメインが必要です。
  • ECDSA P-256証明書はTLSハンドシェイク層でRSA-2048より大幅に速いです。Elidoはすべてのカスタムドメインに対してP-256を発行します。
  • 本番環境でカスタムドメインのセットアップを定期的に壊す3つのことがあります:DNS伝播の遅延、期限切れのCAAレコード、顧客が自身のCNAMEを削除すること。それぞれに具体的な回復パスがあります。

カスタムドメインショートナーの2つのパート#

カスタムドメインのショートリンクには、ドメインオーナーであるあなたから2つのことと、プラットフォームから2つのことが必要です。

あなたから:DNSの変更(サブドメインをプラットフォームのエッジに向けるCNAMEまたはALIASレコード)と所有権の証明(通常は、プラットフォームがサービスを提供することに同意する前にドメインを管理していることを確認するDNS TXTレコードまたはCNAMEチャレンジ)。

プラットフォームから:あなたのホスト名を認識してどのワークスペースのリンクを提供するかを知るルーティングルールと、ブラウザが警告の代わりに緑の南京錠を表示するためにあなたのホスト名に発行されたTLS証明書。

Elidoはこの後者2つをドメイン検証サービスで処理します。このサービスはDNS検証、証明書発行、ルーティングテーブルの更新を担当します。自動オンデマンドTLSを駆動し、ワークスペースマッピングを解決します。エッジサービス - リージョン内10ms未満のレイテンシー予算のあるもの - は証明書発行については何も知りません。それはすべてリクエストパスよりも前に行われます。

検証フローはシンプルです。サブドメインからb.elido.me(Businessティア)へのCNAMEを追加し、次にドメインを所有していることを証明するために_elido-verify.acme.example.com = "ws_abc123"のようなTXTレコードを追加します。ドメイン検証サービスがTXTレコードをポーリングし、確認し、ドメインを検証済みとしてマークし、TLS用に登録します。acme.example.comへの最初のHTTPSリクエストがオンデマンドTLS発行をトリガーします - 詳細は後ほど。

DNS:CNAMEとALIASとA#

使用できるDNSレコードの種類は、どのサブドメインを委任するかによって異なります。

CNAMEはアペックス以外の任意のサブドメインで機能します。links.example.com CNAME b.elido.me.が標準的なセットアップです。RFC 1034 §3.6.2は、ゾーンアペックス(ベアのexample.com)でのCNAMEレコードを禁止しています。そこに存在しなければならないSOAレコードとNSレコードと競合するためです。ほぼすべてのレジストラとDNSプロバイダーがこれを適用しています。

ALIAS / ANAMEレコードは、いくつかのDNSプロバイダーがアペックスの問題を解決するために実装している非標準の拡張です(Route 53 ALIASCloudflareのCNAMEフラット化DNSimple ALIAS)。構文的にはCNAMEのように動作しますが、背後でA/AAAAレコードに解決するため、DNSプロバイダーのネームサーバーが公開前にルックアップをフラット化します。どうしてもexample.comwww.example.comではなく)をリダイレクトする必要がある場合、ALIASがDNS仕様に準拠した唯一の選択肢です。DNSプロバイダーのドキュメントを確認してください - 相互運用性はなく、機能名も異なります。

AレコードでElidoのIPを直接指定するのは最後の手段です。IPはPOPの追加やエッジクラスターの再アドレスで変更される可能性があり、エッジIPは安定したAPIサーフェスとは見なしていません。今日Aレコードを使用しているなら、CNAMEまたはALIASに移行してください。

オペレーターが見落とすもう1つのこと:アペックスのリダイレクトはしばしばメールDNSと衝突します。MX_dmarc_domainkey、SPFのTXTレコードはすべてアペックスにまたはその下に存在します。アペックスのALIASはそれらと競合しません - 異なるレコードタイプです - しかしいくつかのDNSプロバイダーのALIAS実装では、アペックスレコードの共存に関する文書化されていない制限があります。キャンペーンの前に確認してください。

カスタムドメインを委任する際にCNAME、ALIAS、Aレコードのどれを選択するかの決定図。名前がゾーンアペックスかどうかで分岐し、アペックスのメールDNSの注意点を示す。

TLS:ACME、レート制限、オンデマンド発行パターン#

すべてのカスタムドメインは独自の証明書を取得します。テナントドメインにはワイルドカード証明書を使用しません。RFC 8555 §8.4によるとワイルドカード証明書はDNS-01チャレンジを必要とし、これはすべてのテナントのドメインのDNSゾーンへの書き込みアクセスが必要です - そして私たちはそれを持っていません。HTTP-01チャレンジはシンプルで(HTTPの到達可能性のみ必要)、ホスト名ごとの証明書をカバーします。すべてのカスタムドメインにHTTP-01を使用します。

認証局はLet's Encryptです。彼らのレート制限は理解する必要がある主な運用上の制約です:登録ドメインあたり週50枚の証明書。「登録ドメイン」はeTLD+1(パブリックサフィックスのすぐ上の部分 - links.example.comの場合はexample.com)です。証明書の重複更新はこの制限にカウントされませんが、新しいドメインはすべてカウントされます。

これはマルチテナントプラットフォームにとって重要な意味を持ちます。すべてのユーザーが*.yourbrand.comの下にカスタムドメインを作成できる場合、週50枚の証明書予算はyourbrand.comのすべてのサブドメイン間で共有されます。意味のある規模では上限に達します。正しいアーキテクチャ - そしてElidoが独自のティアサブドメインに使用するもの - は、各テナントの検証済みカスタムドメインがテナント自身の登録ドメインのサブドメイン(links.example.com)であること。そうすればレート制限はプラットフォームごとではなくテナントごとに適用されます。

オンデマンドTLS発行はエッジがボリュームを処理する方法です。トラフィックが来る前に検証済みのすべてのドメインに証明書を事前発行するのではなく、そのホスト名への最初のリクエスト時に証明書を発行します。自動オンデマンドTLSは発行を試みる前に上流のエンドポイント(私たちの場合はドメイン検証サービス)にホスト名が許可されているかどうかを確認します。ドメイン検証サービスが200を返す(ドメインが検証済み)と、エッジはACME HTTP-01チャレンジで進み、証明書を取得し、キャッシュし、リクエストを提供します。ホスト名が不明な場合、エッジはTLSアラートを返し、接続は証明書がリクエストされる前に失敗します。

RFC 8555に基づくACMEフロー:

  1. エッジはACMEサーバー(Let's Encrypt)に新しい注文をリクエストします。
  2. Let's Encryptは HTTP-01チャレンジで応答します:「http://acme.example.com/.well-known/acme-challenge/<token>にトークンを配置してください。」
  3. エッジはそのトークンをインメモリのHTTPハンドラーに配置し、Let's Encryptに通知します。
  4. Let's EncryptはプレーンなHTTP(ポート80)でトークンを取得し、検証し、証明書を発行します。
  5. エッジはストレージ層に証明書を保存し、元のHTTPSリクエストを提供します。

ステップ1〜5は新しく検証されたドメインからの最初のリクエストにレイテンシーを追加します。通常1〜3秒です。以降のすべてのリクエストはキャッシュされた証明書に対応し、観察可能なオーバーヘッドはありません。

パフォーマンス:TLSハンドシェイクの計算#

証明書が発行されると、リクエストごとのコストはTLSハンドシェイクとリダイレクトロジックです。

完全なTLS 1.3ハンドシェイクは1 RTTです。欧州のクライアントから私たちのリージョン内のEU POPまで、約10〜20msです。TLS 1.3セッション再開(チケットまたはセッションID)は後続の接続を0-RTTまたは0.5-RTTにします - クライアントは最初のフライトでアプリケーションデータを送信できます。ショートリンクでは、HTTPリクエストは小さく、レスポンスはLocationヘッダーを持つ302です。再開されたセッションはクライアントの視点からほぼ瞬間的に感じられます。

証明書アルゴリズムは重要です。ECDSA P-256証明書の署名は約70バイトです。RSA-2048証明書は約256バイトの署名に加え、はるかに大きな公開鍵を持ちます。低速なモバイル接続ではバイトの差は軽微ですが、RSA署名検証のCPUコストはそうではありません:RSA-2048署名の検証は、同等のセキュリティレベルでのECDSA P-256署名の検証の約30〜50倍のCPUサイクルを必要とします。何千もの同時接続を提供するエッジにとって、そのCPUの差は積み重なります。ElidoはすべてのカスタムドメインにP-256を発行します。Cloudflareの本番環境でのECDSAとRSAの分析は同じ結論に達しており、独自のTLS終端を管理している場合は読む価値があります。

ハンドシェイク後、リダイレクト自体はホットパスに位置します:インプロセスのLRUルックアップ(L1)、見つからない場合はインメモリキャッシュ(L2)にフォールスルー、最後の手段としてgRPC経由でオリジンにフォールスルー。L1キャッシュヒットの場合 - リンクが温まっている場合のトラフィックの圧倒的多数を占める - リダイレクトはハンドシェイクを除いてエッジでエンドツーエンドでリージョン内10ms未満(p50)に解決します。15ms p95の予算はL2ヒットとコールドトラフィックの少数を対応します。完全なキャッシュアーキテクチャと無効化メカニクスについては、スマートリンクの詳細解説をご覧ください。

TLSハンドシェイクとElidoエッジリダイレクトのシーケンス

本番環境で何が壊れるか#

カスタムドメインのセットアップは予測可能な方法で失敗します。最もよく見る3つと、それぞれに何をすべきかを示します。

3つのカスタムドメイン障害モードと回復パスの対応:DNS伝播の遅延、期限切れまたは不一致のCAAレコード、キャンペーン中に顧客がCNAMEを削除するケース。

DNS伝播の遅延。 CNAMEを追加し、ダッシュボードで確認し、それでも一部のユーザーにリンクが解決されない。多くのレジストラが管理するゾーンのDNS TTL値のデフォルトは3600秒 - 1時間の潜在的な陳腐化です。ダッシュボードのドメインステータスは、ドメイン検証サービスがEUリージョンから正しいDNS回答を見られるかどうかを反映します。「検証済み」と表示されているが、他の地域のユーザーがまだ古い遷移先を受け取る場合、それらのユーザーは以前の回答をキャッシュしたリゾルバーにヒットしています。近道はありません。TTLが消えるまで待ちます。次回のための修正は、変更を行う前にTTLを300〜600秒に下げ、その後元に戻すことです。

期限切れまたは不一致のCAAレコード。 Certification Authority Authorization(CAA)レコードはどのCAがドメインに証明書を発行することが許可されているかをCAに伝えます。DNSアドミンが以前にexample.com CAA 0 issue "digicert.com"を追加した場合、Let's Encryptはlinks.example.comに証明書を発行することを拒否します。links.example.comはアペックスのCAAポリシーを継承するためです。エラーはACMEレスポンスのurn:ietf:params:acme:error:caaです。修正はlinks.example.com CAA 0 issue "letsencrypt.org"を追加するか(またはセキュリティポリシーが適切であればアペックスCAA制限を削除する)。ドメイン検証サービスのステータスエンドポイントはエラーボディにCAAエラーを返すため、エッジのログを掘り下げることなく診断できます。

顧客がキャンペーン中にCNAMEを削除する。 これが痛いものです。顧客側のDNSアドミンがCNAMEを削除または変更します - おそらくドメインのマイグレーションの一部として、おそらく誤って - そのカスタムドメインからのすべてのリダイレクトが失敗し始めます。エッジがそれを提供できなくなるか、さらに悪い場合、次の60日間の更新ウィンドウでTLSの証明書更新がサイレントに失敗して証明書が期限切れになります。Elidoのドメイン検証サービスはすべての検証済みドメインで定期的なDNSヘルスチェックを実行し、CNAMEが期待されるターゲットに解決されなくなった場合にドメインをdegradedとマークします。ワークスペースオーナーに通知が届き、ドメインがsuspendedに移行する前に7日間のグレースピリオドがあります。グレースピリオド中は、リクエストは最後の有効な証明書から引き続き提供されます。回復方法:CNAMEを復元し、伝播を待ち、次のヘルスチェックサイクル(15分ごとに実行)でドメインステータスは自動的にアクティブに戻ります。

簡単なウォークスルー#

白紙の状態から始まるエンドツーエンドのセットアップの様子を示します。

ステップ1:DNSレコードを追加する。 DNSプロバイダーのコントロールパネルで:

acme.example.com   CNAME   b.elido.me.
_elido-verify.acme.example.com   TXT   "ws_01HXK4..."

ws_01HXK4...の値はあなたのワークスペース検証トークンで、ダッシュボードの設定 → カスタムドメイン → ドメインを追加で表示されます。

ステップ2:APIでドメインを登録する。 ダッシュボードでも行えますが、マルチテナントのセットアップを自動化する場合 - たとえば新しいクライアントをオンボーディングするエージェンシー - APIの方がクリーンです:

curl -X POST https://api.elido.app/v1/workspaces/{workspace_id}/domains \
  -H "Authorization: Bearer $ELIDO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "hostname": "acme.example.com",
    "tier": "business"
  }'

レスポンスにはverification_tokenpending_verificationstatusが含まれます。statusverifiedに移行するまでGET /v1/workspaces/{id}/domains/{domain_id}をポーリングするか、ダッシュボードを確認します。

ステップ3:最初のリクエストで証明書が発行される。 検証済みになると、acme.example.comへの任意のHTTPSリクエストが証明書がまだキャッシュされていない場合はオンデマンドTLSをトリガーします。その最初のリクエストはACMEエクスチェンジが完了する間2〜3秒かかる場合があります。以降のすべてのリクエストはp95で15ms以下です。

ステップ4:カスタムドメインでリンクを作成する。 リンク作成時にdomain_idを渡します:

curl -X POST https://api.elido.app/v1/workspaces/{workspace_id}/links \
  -H "Authorization: Bearer $ELIDO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "domain_id": 17,
    "slug": "spring-launch",
    "destination_url": "https://example.com/landing/spring"
  }'

リンクはすぐにhttps://acme.example.com/spring-launchで解決されます。このセットアップをインフラストラクチャアズコードとして管理している場合は、Terraformプロバイダーの記事をご覧ください - elido_custom_domainelido_linkリソースにチェーンできるデータソースです。

カスタムドメインを使わない場合#

カスタムドメインがすべての状況に利益をもたらすわけではなく、追加には両側にセットアップコストが伴います。

内部ツールとステージングリンク。 ショートリンクが社内の人間のみがクリックする場合 - 内部ドキュメント、ステージング環境のポインター、Slackで共有されたリソース - カスタムドメインはブランドの恩恵ゼロでDNS管理のオーバーヘッドを追加します。f.elido.meまたはs.elido.meのワークスペースを使用して次に進んでください。

48時間の有効期限がある使い捨てのキャンペーンリンク。 DNS伝播ウィンドウだけで最大1時間かかる可能性があります。明日キャンペーンが始まり、まだDNSレコードが設置されていない場合、カスタムドメインは負担です。プラットフォームサブドメインを使用してキャンペーンを開始し、次のためのロードマップにカスタムドメインを追加してください。

サブドメイン委任を承認していないエンタープライズSSOの購入者。 成熟したITセキュリティの体制を持つ企業では、サードパーティSaaSへのサブドメイン委任にセキュリティレビュー - 場合によっては正式なリスク評価 - が必要です。レビューには数週間かかることがあります。調達の動きがすでに長い承認待ちの場合、カスタムドメインのセットアップで取引を塞き止めないでください。プラットフォームドメインで開始し、ポストセールスのオンボーディングの一部としてカスタムドメインへの移行を提供します。Elidoは既存のリンクを壊すことなくドメインの移行をサポートしており、エージェンシーのソリューションページにはこの移行をクリーンにするホワイトラベル設定についての詳細があります。

カスタムドメインはBusinessとEnterpriseプランで利用可能です。FreeとProティアはプラットフォームが提供するサブドメインを使用します。機能を評価している場合、ダッシュボードではトライアルパスとしてProで1つの検証済みドメインを追加できます - 正確な制限については価格ページの現在のプラン比較を確認してください。

CAAレコードの推奨事項、すべてのドメインエンドポイントのAPIリファレンス、ドメインヘルスチェックのレスポンススキーマを含む完全な設定ガイドは/docs/guides/custom-domainsにあります。カスタムドメイン機能ページでは、カスタムドメインでのモバイルディープリンクのApple App Site AssociationとUniversal Link / App Linkフローについて説明しています。


Marius VoßはElidoのDevRel + エッジインフラ担当です。エッジリダイレクトとドメイン検証サービスを担当しています。

ブログの関連記事#

Elidoを試す

URLを貼り付けて短縮リンクを取得

登録不要。リンクは30日間有効。永久に保存するには登録してください。

Free、登録不要 · 1日あたり2件

Elidoを試す

EUホスティングのURL短縮サービス。カスタムドメイン、詳細な分析、オープンAPI付き。無料プラン - クレジットカード不要。

タグ
custom domain short link
branded short links
short url custom domain
dns short link
tls
acme

続きを読む