版数: 1.1  |  更新日: 2026-06-09  |  対象: Phase 1-4(Named Tunnel + DNS 移管)

Phase 1-4 ナレッジ

Phase 1-4(Named Tunnel + DNS 移管)を進める過程で発生した疑問・エラー・判断を、後から読んでも再現できるよう丁寧に残した資料です。

開発ログは「いつ・何を実行したか」の時系列。本ページは「なぜそうなったか」「どう調べて・何を直して解消したか」を中心に記述します。

この資料の読み方

見出し意味
きっかけ質問が生まれた背景、またはエラーに気づいた状況
経緯試したこと・判明したこと・次に何をしたか(解決までの流れ)
結論最終的な理解・正しい操作・再発防止
Tips現場のインフラ担当が伝えそうな助言(第3者視点)

目次

ID テーマ 種別
K-01 Named Tunnel と Quick Tunnel の違い 設計理解
K-02 --token--url の競合によるタイムアウト エラー解消
K-03 ドメイン管理の5層モデル(所有権 vs DNS 管理) 設計理解
K-04 「ドメイン移管」と「DNS 管理移行」の違い 設計理解
K-05 DNS 移行前のリスク評価(Google Workspace への影響) 運用
K-06 Public Hostname 設定が必要な理由 設計理解
K-07 修正後のデータ転送フロー全体像 まとめ

K-01   Named Tunnel と Quick Tunnel の違い

Phase 1-2 では Quick Tunnel(--url)で外部公開できた。Phase 1-4 で Named Tunnel(--token)に切り替えた理由が分からなかった。

Quick Tunnel はコンテナ再起動のたびに URL が変わる仕様(例: occur-thompson-theorem-bracket.trycloudflare.com)。継続的なテストや本番運用には URL が固定されている Named Tunnel が必要と判明。Named Tunnel は Cloudflare ダッシュボードで事前に作成し、トークンで認証する方式。

Quick Tunnel: URL が毎回変わる。PoC 初期の「繋がるか確認する」用途に最適。設定不要で即使える。
Named Tunnel: URL 固定。本番用ドメインへの紐付け・継続テストに必須。事前にダッシュボードでトンネル作成が必要。

「Quick Tunnel は開発者の動作確認ツール。本番に使うものではない。Named Tunnel を使うなら、ダッシュボードでの設定が必ず必要になる。この2つを混同すると後でハマる。」

K-02   --token--url の競合によるタイムアウト

https://api.your-domain.com/ping にアクセスすると ERR_CONNECTION_TIMED_OUT が発生。DNS 解決(CNAME)は正常で、Tunnel 接続も確立されているのにリクエストが届かない。

docker-compose.ymlcloudflared 起動コマンドに --token(Named Tunnel 用)と --url(Quick Tunnel 用)を同時に指定していた。Named Tunnel では転送先は Cloudflare ダッシュボードの「Public Hostname」設定で決まるため、--url は無視される。結果として転送先が未定義のままタイムアウトとなった。

# 誤った設定例
command: tunnel --no-autoupdate run --token <TOKEN> --url http://api:8000

--url を削除し、転送先は Cloudflare ダッシュボードの Public Hostname 設定で行う。

# 正しい設定例
command: tunnel --no-autoupdate run --token <TOKEN>

「Named Tunnel の --token を使う場合、ingress(転送先)の設定はダッシュボード側で完結している。--url を追加しても効かないどころか、混乱の元になる。コマンドはシンプルに保つのが鉄則。」

K-03   ドメイン管理の5層モデル(所有権 vs DNS 管理)

Cloudflare ダッシュボードで Public Hostname を設定しようとしたが、ドメイン(your-domain.com)が選択肢に出てこなかった。Cloudflare アカウントは持っているのに、なぜ使えないのか分からなかった。

調査の結果、Named Tunnel の Public Hostname 機能は「対象ドメインが Cloudflare の DNS ゾーンで管理されている」場合のみ利用可能と判明。当時はドメインの所有権も DNS 管理も Squarespace(実体は Google Cloud DNS)にあったため、Cloudflare からは「管理外のドメイン」として扱われていた。

ドメインには「所有権(レジストラ)」と「DNS 管理(ネームサーバー)」の2つの概念がある。Cloudflare の機能を使うには DNS 管理を Cloudflare に移す必要がある。

Layer 5: アプリケーション層  ← ブラウザが URL を入力する
Layer 4: DNS 解決層         ← 名前を IP アドレスに変換する
Layer 3: DNS 管理層         ← DNSレコードを誰が管理するか(ネームサーバー)★今回の問題
Layer 2: ドメイン登録層     ← ドメイン名の所有権を誰が持つか(レジストラ)
Layer 1: ルート DNS 層      ← .com / .jp 等を管理するインターネットの根幹

「ドメインを『買った』だけでは Cloudflare の機能は使えない。DNS を Cloudflare に向ける(NS レコードを変更する)ことが必須。この区別を知らないと、設定画面でドメインが出てこない理由が永遠に分からない。」

K-04   「ドメイン移管」と「DNS 管理移行」の違い

「DNS を Cloudflare に移す」と調べると「ドメイン移管」という言葉が出てきた。移管は複雑でリスクがあると聞き、本当にやる必要があるのか不安になった。

調査の結果、今回必要なのは「ドメイン移管(Transfer)」ではなく「DNS 管理移行(Connect a domain)」と判明。前者はレジストラ(所有権)ごと変更する大がかりな手続きだが、後者はネームサーバー(NS)レコードを変更するだけで完了する。

ドメイン移管(Transfer): 所有権ごと別レジストラへ。手続きが複雑・リスクあり。今回は不要。
DNS 管理移行(Connect a domain): 所有権はそのまま、DNS 管理のみ Cloudflare へ委譲。NS レコードを変更するだけ。今回はこちらを採用。

「ドメイン移管と DNS 移行は全く別物。混同している人は多い。NS レコードを変えるだけなら30分以内に終わる作業。ただし既存の DNS レコード(MX・TXT 等)を事前に書き写しておかないと、メールが止まる事故になる。」

K-05   DNS 移行前のリスク評価(Google Workspace への影響)

DNS 管理を Cloudflare に移行する際、既存のメール設定(Google Workspace)に影響が出ないか心配だった。

移行前に PowerShell で現在の DNS レコードを確認した。

# MX レコード(メール受信)
Resolve-DnsName -Name "your-domain.com" -Type MX

# TXT レコード(SPF/DKIM 等)
Resolve-DnsName -Name "your-domain.com" -Type TXT

# A レコード(ウェブサイト)
Resolve-DnsName -Name "your-domain.com" -Type A

確認の結果、MX レコードが存在せず、SPF レコードも -all(全拒否)だったため、メールシステムへの影響はないと判断。

DNS 移行前に必ず MX・TXT(SPF/DKIM/DMARC)・A レコードを確認する。今回は影響なしと判断し安全に移行を実施。Cloudflare 側でも既存レコードを手動で再登録することで継続性を担保する。

「DNS 移行で一番怖いのはメールが止まること。MX レコードと SPF/DKIM を移行先に正しく設定できているか、移行後 24〜48 時間は監視するのが基本。今回はそもそもメール設定がなかったので問題なかったが、本番環境では必ずチェックリストを作って臨むこと。」

K-06   Public Hostname 設定が必要な理由

Named Tunnel を作成してトークンを取得したのに、api.your-domain.com にアクセスしてもタイムアウトになった。Tunnel は動いているのに、なぜリクエストが届かないのか分からなかった。

Cloudflare ダッシュボードの Tunnel 設定を確認すると、「Public Hostname」タブに何も設定されていなかった。Named Tunnel は「どのホスト名のリクエストをどのローカルサービスに転送するか」をダッシュボードで明示的に設定する必要がある。

Named Tunnel を使う場合、以下の2つがセットで必要:

  1. Cloudflare ダッシュボード → Zero Trust → Networks → Tunnels → 対象 Tunnel → Public Hostname タブ → ホスト名(api.your-domain.com)と転送先(http://api:8000)を設定
  2. docker-compose.ymlcloudflared コマンドから --url を削除し --token のみにする

「Named Tunnel は『トンネルを掘る』部分と『どこに繋ぐか』の設定が分離している。トークンはトンネルを確立するだけ。どのドメインのリクエストをどのサービスに流すかは、ダッシュボードの Public Hostname で設定する。この2段階を理解しないと永遠にハマる。」

K-07   修正後のデータ転送フロー全体像

全ての設定が完了した後、リクエストがどのように流れているのか全体像を整理したかった。

【ユーザー(ブラウザ / curl)】
    │  https://api.your-domain.com/ping にアクセス
    ▼
【Cloudflare DNS(Layer 3)】
    │  api.your-domain.com → Cloudflare エッジ IP に解決
    ▼
【Cloudflare エッジサーバー】
    │  Public Hostname 設定に基づき your-tunnel-name にルーティング
    ▼
【cloudflared コンテナ(Raspberry Pi 上)】
    │  トンネル経由でリクエストを受信
    │  http://api:8000 へ転送(Docker 内部ネットワーク)
    ▼
【FastAPI コンテナ(api:8000)】
    │  {"message":"pong"} を生成して返却
    ▼
【ユーザー】  ← レスポンス受信

「このフローを頭に入れておくと、どこで詰まっているかを素早く特定できる。DNS 解決の問題か、Tunnel 接続の問題か、Public Hostname 設定の問題か、FastAPI コンテナの問題か——それぞれ確認ポイントが違う。フローを書き出すことが障害対応の第一歩。」