2026年6月9日

2026年6月9日

Google Cloud DNS を使った DNS 移行手順|ゾーンファイルのインポート・照合・DNSSEC・ネームサーバー切り替え

ほかの DNS サービスから Google Cloud DNS へ移るときは、旧 DNS のレコードを BIND 形式のゾーンファイルにまとめ、gcloud dns record-sets import で一括登録し、Cloud DNS のネームサーバーへ直接問い合わせて照合してから、レジストラでネームサーバーを切り替えるのが基本の流れです。この記事では、gcloud コマンドを使った移行を、ゾーンファイルの整え方、インポート時の注意、照合の方法、DNSSEC の扱い、切り替え後の確認まで順に説明します。

ゾーンの作り方そのもの(公開ゾーンと限定公開ゾーンの違い、レコードの個別追加、サブドメインの委任)は、Cloud DNS のゾーン作成手順を扱った別記事で詳しく説明しています。ここでは「既存のドメインを止めずに移す」ことに絞ります。gcloud のフラグや Cloud DNS の機能は更新されることがあるため(2026年10月現在)、実行前に gcloud dns record-sets import --help などで手元のバージョンの説明を確認してください。

移行の前に決めておくこと

作業を始める前に、次の三つを決めます。

  • Google Cloud のプロジェクト:DNS のゾーンはプロジェクトに属し、課金と権限もプロジェクト単位で管理されます。本番のドメインは、検証用とは別のプロジェクトに置くのが一般的です。
  • 作業する人の権限:ゾーンとレコードの作成には DNS の管理者権限(roles/dns.admin など)が必要です。移行後の日常運用では、レコード変更だけを許す権限に絞ることも検討します。
  • 切り替えの日時:メールの送受信が少ない時間帯を選び、担当者が数時間は様子を見られる日にします。

Cloud DNS の API が有効になっていない場合は、最初に有効にします。

gcloud config set project your-project-id
gcloud services enable dns.googleapis.com

手順1:旧 DNS のレコードをゾーンファイルにする

旧 DNS の管理画面にゾーンファイルの書き出し機能があれば、それを使います。機能がない場合は、レコード一覧を見ながら BIND 形式のファイルを作ります。外部からのゾーン転送(AXFR)は多くのサービスで許可されていないため、dig でゾーン全体を取り出すことはできないと考えてください。

$ORIGIN example.com.
$TTL 3600
@        300  IN  A      203.0.113.10
www      300  IN  CNAME  example.com.
@        3600 IN  MX     10 mail.example.net.
@        3600 IN  TXT    "v=spf1 include:_spf.example.net ~all"
_dmarc   3600 IN  TXT    "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
selector1._domainkey 3600 IN CNAME selector1.dkim.example.net.
@        3600 IN  CAA    0 issue "letsencrypt.org"

書き出したファイルを使う前に、次の点を見直します。

  • SOA と頂点の NS:これらは Cloud DNS がゾーン作成時に自動で用意します。旧 DNS の値がファイルに含まれていても、そのまま使うものではありません(扱いは後述)。
  • 名前の末尾のドット:example.net. のように末尾にドットがある名前は完全な名前、ドットがない名前は $ORIGIN が付け足されます。CNAME や MX の値でドットを付け忘れると、mail.example.net.example.com. のような意図しない値になります。
  • TTL:切り替え直後に直せるよう、サイトの A や CNAME は 300 秒程度にしておきます。
  • 旧サービス固有の記法:一部のサービスは、独自の転送レコードや ALIAS のような標準外のレコードを書き出すことがあります。Cloud DNS に同じ種類がない場合は、A レコードに置き換えるなど別の形にします。

手順2:Cloud DNS にゾーンを作ってインポートする

公開ゾーンを作ります。--dns-name は末尾にドットを付けたドメイン名、ゾーン名(ここでは example-com)はプロジェクト内での識別名で、ドメイン名とは別に決めます。

gcloud dns managed-zones create example-com \
  --dns-name="example.com." \
  --description="example.com production" \
  --visibility=public

gcloud dns record-sets import example.com.zone \
  --zone=example-com \
  --zone-file-format

--zone-file-format を付けると、BIND 形式のファイルとして読み込みます。付けない場合は YAML 形式(gcloud dns record-sets export が既定で書き出す形式)として扱われます。

インポートで迷いやすいのが、ゾーン頂点の NS と SOA の扱いです。既定では、ファイルに含まれる頂点の NS レコードは取り込まれず、Cloud DNS が割り当てたネームサーバーが残ります。--replace-origin-ns を付けると頂点の NS もファイルの値で置き換えられますが、移行の場面で旧 DNS の NS を取り込むと委任が壊れる原因になるため、通常は付けません。--delete-all-existing は既存のレコードを消してから読み込むフラグで、やり直したいときに使えますが、すでにレコードを手で足したゾーンに使うと消えてしまうので注意します。

インポートが終わったら、登録内容を一覧で確認します。

gcloud dns record-sets list --zone=example-com

手順3:Cloud DNS のネームサーバーに直接問い合わせて照合する

ゾーンに割り当てられたネームサーバーを確認します。ns-cloud- で始まる名前が4つ返るのが一般的です。

gcloud dns managed-zones describe example-com \
  --format="value(nameServers)"

レジストラを変更する前に、このネームサーバーへ直接問い合わせ、旧 DNS と同じ答えが返るかを比べます。

#!/bin/bash
# records.txt には「名前 種類」を1行ずつ書く(例: www.example.com CNAME)
OLD=ns1.old-dns.example          # 旧DNSのネームサーバー名
NEW=ns-cloud-a1.googledomains.com # describe で確認した名前に置き換える
while read -r name type; do
  a=$(dig +short @"$OLD" "$name" "$type" | sort)
  b=$(dig +short @"$NEW" "$name" "$type" | sort)
  [ "$a" = "$b" ] || printf '差分: %s %s\n  旧: %s\n  新: %s\n' "$name" "$type" "$a" "$b"
done < records.txt

差分は、この段階でゾーンファイルを直して再インポートするか、個別のレコードを修正して解消します。まだ誰も Cloud DNS を参照していないので、何度修正しても影響はありません。TXT は引用符の付き方やスペースの違いだけで差分に見えることがあるため、値そのものが同じかを目で確かめます。

手順4:DNSSEC の扱いを決める

旧 DNS で DNSSEC を使っていて、レジストラに DS レコードが登録されている場合は、ネームサーバーを切り替える前に方針を決めます。DS が旧 DNS の鍵を指したまま Cloud DNS へ切り替えると、DNSSEC を検証する公開 DNS からは名前解決に失敗します。

一般的に安全なのは、いったん DNSSEC を外す方法です。

  1. レジストラで DS レコードを削除する
  2. DS の TTL(TLD によって異なり、1日程度のことが多い)が過ぎるまで待つ
  3. ネームサーバーを Cloud DNS に切り替える
  4. 切り替えが安定したら、Cloud DNS で DNSSEC を有効にし、新しい DS をレジストラに登録する
# 移行後に DNSSEC を有効にする
gcloud dns managed-zones update example-com --dnssec-state=on

# レジストラに登録する DS レコードの値を表示する(KSK の ID は list で確認)
gcloud dns dns-keys list --zone=example-com
gcloud dns dns-keys describe KSK_ID --zone=example-com \
  --format="value(ds_record())"

Cloud DNS には、署名を途切れさせずに移行するための状態(--dnssec-state=transfer)も用意されていますが、旧 DNS 側で新しい鍵を扱えることが前提になり、手順も複雑です。使う場合は Google Cloud の公式ドキュメントの移行手順を読み、検証用のドメインで試してから本番に適用してください。

手順5:レジストラでネームサーバーを切り替える

レジストラの管理画面で、ネームサーバーを手順3で確認した Cloud DNS の4つの名前に変更します。末尾のドットを入力欄が受け付けない場合は、ドットを外して入力します。

# TLD のサーバーが Cloud DNS のネームサーバーを返すか
dig example.com NS +trace

# 公開DNSで答えを確認
dig @1.1.1.1 example.com A +short
dig @8.8.8.8 example.com MX +short

上位のレジストリが持つ NS レコードのキャッシュが切れるまで、1〜2日程度は旧 DNS にも問い合わせが届きます。この間は旧 DNS のゾーンを消さず、Cloud DNS 側でレコードを変更した場合は旧 DNS にも同じ変更を入れておきます。

切り替え後に確認すること

  • サイトとメール:WordPress のフロントと管理画面の表示、外部とのメールの送受信、受信メールのヘッダーにある SPF・DKIM・DMARC の判定結果
  • 証明書の自動更新:DNS 認証(DNS-01)で証明書を更新している場合、更新の仕組みが旧 DNS の API に依存していないか。Cloud DNS に切り替えるなら、ACME クライアントの設定とサービスアカウントの権限も見直します
  • TTL を戻す:安定したら、短くしていたサイトの TTL を 3600 などに戻します
  • 旧 DNS の停止:上位の NS の TTL を十分過ぎ、問題がないことを確かめてから停止します。契約の解約と同時にゾーンが消えるサービスもあるため、解約の時期も計画に入れます

最後に、移行直後の状態を gcloud dns record-sets export example.com.zone --zone=example-com --zone-file-format で書き出して保管しておくと、後で誤って消したときの復元に使えます。

まとめ

  • 旧 DNS のレコードを BIND 形式のゾーンファイルにし、末尾のドットと TTL を見直してから gcloud dns record-sets import --zone-file-format で登録します。
  • 頂点の NS と SOA は Cloud DNS が用意するものを使い、通常は --replace-origin-ns を付けません。
  • レジストラを触る前に、Cloud DNS のネームサーバーへ dig で直接問い合わせて旧 DNS と照合します。
  • DNSSEC を使っている場合は、DS を外して待ってから切り替え、安定後に Cloud DNS で有効にして新しい DS を登録するのが安全です。
  • gcloud のフラグや機能は更新されるため、--help と公式ドキュメントで手元の環境の動作を確認してください。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲