
DNS切り替えを含むリリースの段取り|TTL短縮と切り戻しの手順
新しいサーバーの準備は終わった。データも移した。動作確認も通った。 あとは、DNSのAレコードを新しいIPに書き換えるだけ——。
作業そのものは1行です。それなのに、保存ボタンの上でマウスが止まる。この感覚、たぶん一度は味わったことがあると思います。
止まる理由ははっきりしています。DNSの切り替えは、押した瞬間から自分の手を離れるからです。反映のタイミングを決めるのは、世界中のキャッシュDNSと、利用者のブラウザと、社内システムのライブラリです。しかも困ったことに、戻すときも同じだけ時間がかかります。「押してダメなら戻せばいい」が、そのままでは通じません。
だからこの記事では、DNS切り替えを「一発勝負」から「段取りのある作業」に変えます。難しい技術は使いません。いつ何をやるかの順番を決めるだけです。
結論:DNS切り替えは、次の5つをこの順番で通します。①切り替えの「今のTTL以上前」にTTLを短くしておく → ②hosts や curl --resolve で、DNSを触らずに新環境を通しで確認する → ③切り替え後は権威DNSとキャッシュDNSを分けて確認する → ④二重稼働の時間を前提に、データの行き先を1つに寄せておく → ⑤旧環境をしばらく生かしたまま残し、落ち着いたらTTLを元に戻す。とくに効くのは①と④です。切り戻しの本命はDNSを戻すことではなく、旧環境を落とさずに置いておくこと——ここだけ押さえておけば、あとは落ち着いて進められます。
なお、以下はあくまで進め方の型です。レコードの編集画面・TTLの下限・使えるレコード種別は、DNSサービスやレジストラによってかなり違います。本番で実行する前に、必ずご利用中のサービスの公式ドキュメントで確かめてください。
何が起きているか:「浸透」という言葉が、話をわかりにくくしている
DNSの切り替えを説明するとき、「浸透するまで待つ」という言い方をよく見かけます。霧が広がるように、じわじわと世界に伝わっていくイメージです。
でも実際に起きていることは、もっと単純で、もっと予測できます。
キャッシュDNSは、一度受け取った答えを、TTLで指定された秒数だけ覚えているだけです(RFC 1035)。TTLが3600なら、そのキャッシュは1時間、古いIPを返し続けます。1時間経てば、次の問い合わせで新しい答えを取りに行きます。
つまり、こうなります。
- じわじわ広がるのではなく、キャッシュごとに「期限が来た瞬間」に切り替わる。
- 誰かが「まだ古いほうを見ている」のは、そのキャッシュの期限が残っているだけ。
- 期限の長さは、切り替える前に自分で決められる。
ここが大事なところです。「浸透待ち」は運任せに聞こえますが、実体はタイマーです。タイマーは、事前に短くしておけます。 DNS切り替えの段取りは、ほぼこの一点に集約されます。
もうひとつ、知っておくと気が楽になることがあります。
切り戻しも、同じタイマーに縛られます。 切り替えて問題が出たので慌ててレコードを戻しても、すでに新しいIPをキャッシュした相手は、TTLが切れるまで新環境を見続けます。DNSの切り戻しは、即効薬ではありません。 だから本当の備えは別のところにあります(後述の手順5)。
手順1:TTLを、切り替えの「今のTTL以上前」に短くする
いちばん効く一手であり、いちばん忘れられやすい一手です。
やることは単純で、切り替えの前にTTLを短い値(300秒=5分など)に変更しておくこと。ただし、タイミングに条件があります。
TTLを短くする作業は、「今設定されているTTLの秒数」以上前に済ませておく必要があります。
理由は、すでに配られてしまった答えです。キャッシュDNSが昨日受け取った答えには、昨日時点のTTL(たとえば86400秒)がくっついています。今日あなたがTTLを300に変えても、昨日配った答えの期限が短くなるわけではありません。その相手は、あと数時間は古い設定のまま動きます。
具体的にはこうなります。
| 今のTTL | いつまでにTTLを短くしておくか |
|---|---|
| 86400秒(24時間) | 切り替えの24時間以上前 |
| 3600秒(1時間) | 切り替えの1時間以上前 |
| 300秒(5分) | 切り替えの5分以上前(実質そのままでよい) |
現在のTTLは dig で確認できます。
# 権威DNSに直接聞いて、設定されているTTLを見る
dig @ns1.example-dns.jp example.com A +noall +answer
# キャッシュ側(残り秒数が返る)
dig @8.8.8.8 example.com A +noall +answer
ANSWER SECTION の左から2つ目の数字がTTLです。権威DNSに直接聞いたときは設定値そのもの、キャッシュDNSに聞いたときは「残り秒数」が返る、という違いだけ覚えておけば十分です。同じコマンドを2回打って数字が減っていたら、それはキャッシュを見ています。
短くしたTTLは、切り替えが終わるまで戻さない
「前日に短くして、当日の朝に戻す」はやりません。切り戻しが必要になったとき、短いTTLが命綱になります。元に戻すのは、切り替えが落ち着いてからです(手順5)。
ネームサーバー(NS)ごと移す場合は、別物として扱う
Aレコードを書き換えるのと、レジストラでネームサーバーそのものを変えるのは、難易度がまったく違います。
NSの切り替えは、上位(レジストリ側)が持つNSレコードのTTLに従います。これは自分では短くできません。ドメインによっては1〜2日かかると見ておく必要があります。
対処は決まっています。新旧どちらのネームサーバーにも同じ内容のゾーンを用意しておき、どちらを見ても正しく答えられる状態にしてから切り替える。 そうすれば、待ち時間が長くても事故になりません。「移行のついでにDNSサービスも乗り換える」ときは、この2つを同じ日にやらないのが安全です。
手順2:DNSを触らずに、新環境を通しで確認する
切り替える前に、新環境が本当に動くかを確かめます。ここでDNSを使ってしまうと後戻りできないので、自分の端末だけが新環境を見る状態を作ります。
方法A:hostsファイルに書く
# /etc/hosts (Windows は C:\Windows\System32\drivers\etc\hosts)
203.0.113.45 example.com
203.0.113.45 www.example.com
自分のPCだけが新IPを見るようになります。確認が終わったら必ず消してください。消し忘れると、切り替え後に「自分だけ何をやっても表示が変わらない」という不思議な現象に悩むことになります。
ひとつ注意があります。最近のブラウザはセキュアDNS(DNS over HTTPS)が有効だと、hostsを見ないことがあります。 「hostsを書いたのに切り替わらない」ときは、ブラウザ設定でセキュアDNSを一時的にオフにしてください。
方法B:curl で名前解決先だけ差し替える(こちらが確実)
# example.com という名前のまま、接続先IPだけ新サーバーにする
curl -I --resolve example.com:443:203.0.113.45 https://example.com/
hostsを書き換えずに済み、消し忘れも起きません。ブラウザの挙動にも左右されないので、コマンドで確認できるものはこちらが確実です。
何を確認するか
トップページが出た、で終わらせないのがコツです。
- HTTPSでちゃんとつながるか(証明書のエラーが出ないか)
- ログインできるか(セッションが保持されるか)
- フォームの送信ができるか(問い合わせメールが届くか)
- リダイレクトが正しいか(www有無・http→httpsが旧IPに戻っていないか)
- 管理画面が開くか(IP制限をかけているなら、新環境にも設定が引き継がれているか)
- 定期処理(cron)が新環境で動くか(旧と新の両方で動いて二重実行にならないか)
証明書は「切り替え前」に新環境へ用意しておく
見落としやすいのがここです。切り替えた瞬間に証明書エラーが出ると、利用者から見れば障害と変わりません。
Let's Encrypt を使っている場合、HTTP-01 という検証方式は、本番のDNSが新サーバーに向いていないと通りません(実際にそのドメインへアクセスして確認する方式のため)。切り替え前に新環境で証明書を取りたいときは、次のどちらかになります。
- DNS-01 方式で取得する:TXTレコードを置いて証明書を発行する方式です。DNSが旧環境を向いたままでも取得できます。
- 旧環境で取得済みの証明書と秘密鍵を、新環境にコピーする:有効期限内であればそのまま使えます。ファイルのパーミッションだけは慎重に扱ってください。
そのうえで、切り替え後に新環境側の自動更新が正しく動くかを、あらためて確認します。証明書の期限管理そのものはSSL/TLS証明書の期限切れを防ぐ更新と監視にまとめています。
手順3:切り替えたら、権威DNSとキャッシュDNSを分けて確認する

レコードを書き換えたら、2種類の確認を分けて行います。ここを分けられると、トラブルの原因がすぐ絞れます。
確認1:権威DNSに直接聞く(設定が入ったか)
dig @ns1.example-dns.jp example.com A +noall +answer
ここで新しいIPが返らなければ、そもそも設定が保存されていないか、編集したゾーンが違います。キャッシュのせいではありません。まずここを見ます。
確認2:パブリックなキャッシュDNSに聞く(外から見えるか)
dig @8.8.8.8 example.com A +noall +answer
dig @1.1.1.1 example.com A +noall +answer
権威では新IPなのにこちらが古いままなら、それはTTLの残りを待っている状態です。異常ではありません。返ってくるTTLの数字が、あと何秒古いままかを教えてくれます。
確認3:親からたどって、経路そのものを見る
dig example.com A +trace
ネームサーバーごと変えたときや、「どこで古い答えが出ているのか分からない」ときに効きます。
確認4:実際にアクセスする
curl -I https://example.com/
応答コードと、新環境のアクセスログの両方を見ます。新環境のログに自分のアクセスが記録されていれば、切り替わっています。
このあたりの調べ方をもう少し詳しく知りたいときは、名前解決できない障害の切り分け|DNSを疑う順番と確認手順に基本の道具立てをまとめています。
「自分の環境で切り替わった」は「全員切り替わった」ではない
これは何度でも言う価値があります。自分のPCが新環境を見たとしても、それは自分が使っているキャッシュDNSの期限が切れただけです。社内の別のネットワーク、利用者の自宅回線、携帯回線は、それぞれ別のタイミングで切り替わります。
だから、切り替え直後に旧環境を落としてはいけません。ここが次の手順につながります。
手順4:二重稼働の時間を前提に、データの行き先を1つに寄せる
DNS切り替えでいちばん怖いのは、実は表示が切り替わらないことではありません。新旧の両方が同時に動いていて、どちらにも書き込みが起きることです。
TTLが5分でも、その5分の間に注文が入るかもしれません。問い合わせフォームが送信されるかもしれません。旧環境のDBに入ったそのデータは、新環境からは見えません。気づくのは数日後、「送ったはずの問い合わせが届いていない」という連絡で、というのがよくある流れです。
対策は3つあり、上から順に安全です。
A. データの置き場所を1つに寄せる(いちばん安全)
切り替え前に、旧環境のアプリも新しいDBを見るように設定を変えておきます。こうすると、どちらのサーバーにアクセスが来ても、書き込み先は1か所です。二重稼働そのものが問題でなくなります。
アプリとDBを一緒に移す構成なら、「先にDBだけ移して旧アプリから新DBを参照させる → 数日おいてアプリを切り替える」と2段階に分けると、リスクがぐっと下がります。
B. 旧環境を読み取り専用、またはメンテナンス画面にする
切り替えと同時に、旧環境側を書き込めない状態にします。まだ旧環境を見ている人には「ただいまメンテナンス中です」と出るので、データが割れるより誠実です。告知画面の用意はメンテナンス告知の出し方とメンテナンス画面の用意にまとめています。
C. 旧環境のログを見張り、落とすタイミングを判断する
AもBも取れない場合は、旧環境のアクセスログを見て、まだ実利用のアクセスが来ているかを確認します。監視botや自分のアクセスを除いて、実際の利用が止まったのを見てから次に進みます。
メール(MXレコード)を含むときは、さらに慎重に
Webと同じ感覚でMXレコードを切り替えると、切り替え中に届いたメールが旧サーバーのメールボックスに入ったままになります。Webと違い、利用者はそれに気づけません。
- 旧サーバーのメールボックスを、切り替え後もしばらく開けるようにしておく(消さない)
- 旧サーバーから新サーバーへ転送する設定を入れておく
- SPFレコードの送信元IPを、新サーバーのぶんに更新する(これを忘れると、送信メールが迷惑メール判定されやすくなります)
送信側の設定はメールが届かない障害の切り分け|SMTP・SPF・DKIMの確認、なりすまし対策まで含めた考え方はDMARCの設定にまとめています。MXの切り替えは、Webの切り替えとは別日に分けるのが、一人運用ではいちばん楽です。
手順5:切り戻しの本命は、旧環境を落とさないこと
ここが、この記事でいちばんお伝えしたいところです。
切り替えたあと、新環境で問題が見つかったとします。慌ててDNSを旧IPに戻す——それ自体は正しい対応です。ただし、戻した効果が全員に行き渡るまでには、またTTLぶんの時間がかかります。TTLを300秒にしておけば5分ですが、86400のままだったら丸1日です。
だから、DNS切り替えにおける本当の切り戻し手段はこうなります。
旧環境を、動いたまま残しておくこと。
新環境が不調でも、旧環境が生きていれば、まだ旧を見ている人には何も起きていません。DNSを戻せば、残りの人も順次戻ってきます。旧環境を落とさない限り、サービス全体が止まることはない——この状態を作っておくのが、段取りの目的です。
保持期間の目安はこのくらいです。
- 最低1〜2週間:TTLを守らない機器や、長くキャッシュを持つアプリがまだ残っているため
- 月次処理があるなら1か月:月末バッチが旧環境で動いていた、というのは本当によくある話です
- 消す前に、旧環境のアクセスログを一度見る:まだ誰かが来ていないか確認してから
一部のアプリケーションは、TTLを無視して起動中ずっと同じIPを覚え続けることがあります(Javaの一部設定などが有名です)。連携先が社内システムなら、切り替え後に「そちらのシステム、再起動をお願いできますか」と一言添えるだけで解決することが多いです。
落ち着いたら、TTLを元に戻す
そして最後の1手。短くしたTTLを、元の値(3600など)に戻します。
これを忘れると、権威DNSへの問い合わせが増え続けます。さらに、権威DNSに障害が起きたときの影響が大きくなります。TTLが長ければ、キャッシュがしばらく答えを返し続けてくれる(=耐えられる)からです。TTLが短いということは、その余裕がないということでもあります。
切り替えから1〜2週間、問題が出ないことを確認できたら戻します。「TTLを戻す」をカレンダーに入れておくのが、いちばん確実です。
戻す判断そのものの型はすぐ戻せるリリース設計|ロールバック手順の用意、記録の残し方は変更管理台帳の付け方が使えます。
具体例:会社サイトと問い合わせフォームを、一人で移設した週
社内システムと会社サイトを兼務で見ている担当者の例で、時間の流れを追ってみます。旧サーバーがEOLを迎えるための移設で、Webと問い合わせフォームのみ、メールは別サービスなのでMXは触りません。
- 切り替えの3日前:現在のTTLを
digで確認したところ 86400(24時間)。まずTTLを300に変更し、変更管理台帳に1行記録。ここで24時間以上の余裕を取る。 - 2日前:新環境で証明書を DNS-01方式で取得。
curl --resolveでトップ・ログイン・フォーム送信・リダイレクトを確認。フォーム送信で「送信元が旧サーバー設定のまま」なのを発見して修正。ここで見つかったのが大きかった。 - 前日:旧環境のアプリの参照先DBを、新環境のDBに変更。旧を見ている人の書き込みも新DBに入る状態にした。旧環境で1件テスト送信し、新DBに入ることを確認。
- 当日(利用の少ない木曜の21時):Aレコードを新IPに変更。所要1分。
- 当日+2分:
dig @権威で新IPを確認。dig @8.8.8.8はまだ古いIP(残りTTL 180秒)。慌てない。予定どおり。 - 当日+7分:
dig @8.8.8.8も新IPに。curl -Iが新環境のログに記録されたことを確認。 - 当日+30分:新環境のエラーログを確認。1件だけ画像パスの404が出ていたので修正。旧環境のアクセスログを見ると、まだ数件のアクセスあり。旧環境はそのまま起動しておく。
- 翌朝:新環境のログとアクセス数を確認。問い合わせフォームからの送信が1件、新DBに入っていた。旧環境へのアクセスはほぼゼロに。
- 2週間後:TTLを300から3600に戻す。旧環境をシャットダウン(削除はせず、イメージだけ1か月保持)。台帳に完了を記録。
この流れで効いたのは、高度な技術ではありません。3日前にTTLを短くしたことと、前日にDBの行き先を1つに寄せたこと。この2つだけです。当日の作業は1分で、あとは確認の時間でした。
段取りが効いている作業は、当日が退屈になります。退屈な切り替えが、いい切り替えです。
影響:段取りを決めると、何が変わるか
- 当日の作業時間が短くなる。 準備が前倒しされるぶん、切り替え当日は1分と確認だけになります。深夜作業の拘束時間が減ります。
- 戻せる幅が広がる。 TTL 300と旧環境の保持がそろっていれば、「まずい」と思ってから全員が戻るまでが数分です。判断に踏み切りやすくなります。
- 問い合わせが減る。 二重稼働中のデータの行き先が1つなら、「送ったのに届いていない」が起きません。あとから調査する手間もなくなります。
- 説明しやすくなる。 「反映には最大5分かかります」と事前に言えると、上司や依頼者の不安が減ります。「浸透待ちです」より、ずっと伝わります。
- 次回が楽になる。 一度この順番で通しておくと、手順書として残せます。リリース手順書の作り方の形でまとめておくと、次の切り替えは読むだけで済みます。
一方で、増える手間もあります。準備が数日前から始まるので、「今日中に切り替えたい」という依頼には応えにくくなります。ここは正直なところです。
ただ、TTLが86400のまま切り替えて問題が出た1回は、丸1日の不安定さになります。数日の前倒しのほうが、ずっと安く済みます。
明日やること:TTLを見るところから
切り替えの予定がなくても、今日できることがあります。5分で終わります。
- 管理しているドメインのTTLを、
digで1回見てみる。
dig example.com A +noall +answer
数字が86400なら、いざというとき丸1日かかる設定だ、と知っておくだけで違います。
- 権威DNSがどこか、レジストラのログイン方法をメモに1行残す。
切り替えのとき、いちばん時間を取られるのが「どこの管理画面で編集するんだっけ」です。この1行はサーバー構成ドキュメントに置いておくと、引き継ぎでもそのまま使えます。
- 切り替え予定があるなら、「TTL短縮日」を逆算してカレンダーに入れる。
今のTTLの秒数を日数に直して、切り替え日から引き算するだけです。86400なら1日前、余裕を見て2〜3日前。
この3つは、サーバーの状態を1ミリも変えません。今日からでも安全に始められます。
DNS切り替えチェックリスト
全部そろえる前提ではありません。上から優先順位で並べています。
切り替えの数日前
- 現在のTTLを
digで確認したか - TTLを短くしたか(切り替えの今のTTL以上前に実施したか)
- 変更するレコードを書き出したか(A・AAAA・CNAME・MX・TXTの過不足)
- ネームサーバー(NS)ごと変えるのか、レコードだけ変えるのかを区別したか
- 新環境の証明書を用意したか(切り替え前に取得できる方式を選んだか)
- 新環境の自動更新が動く状態になっているか
前日まで
-
curl --resolveまたは hosts で、新環境を通しで確認したか(ログイン・フォーム・リダイレクト) - 二重稼働中のデータの行き先を1つに寄せたか(またはメンテ画面を用意したか)
- cronなどの定期処理が新旧で二重に動かないよう整理したか
- 切り戻しの手順(戻すレコードの値)をメモに書いたか
- 関係者へ切り替え日時と「反映まで最大◯分」を共有したか
当日
- 利用の少ない時間帯を選んだか
- レコード変更後、権威DNSに直接聞いて新IPが返ることを確認したか
- キャッシュDNS(8.8.8.8 など)でも新IPが返ることを確認したか
- 実際にアクセスして、新環境のログに記録されたことを確認したか
- HTTPSでエラーが出ないことを確認したか
- 新環境のエラーログを、切り替え後しばらく見たか
- hostsに書いた行を消したか
後日
- 旧環境を1〜2週間(月次処理があれば1か月)起動したまま残したか
- 旧環境のアクセスログを見て、実利用が止まったことを確認してから停止したか
- 短くしたTTLを元の値に戻したか
- 変更管理台帳に、日時・変更内容・確認結果を記録したか
「切り替えの数日前」の最初の2つが埋まっていれば、多くの場面で戻れます。残りに○が付かない日があっても大丈夫です。
よければ、こちらも
DNS切り替えは、前後の手順とつなげると一段楽になります。
- サーバー移行チェックリスト|塩漬けサーバーを一人で安全に移す:切り替えの前段、棚卸しから複製までの流れです。
- すぐ戻せるリリース設計|ロールバック手順の用意:戻す判断をいつ下すか、を先に決めておく話です。
- 名前解決できない障害の切り分け|DNSを疑う順番と確認手順:切り替え後に「つながらない」となったときの調べ方です。
- リリース後に必ず見る確認項目|動作・監視・問い合わせ:切り替えた後、どこまで見るかの目安です。
- 本番反映前チェックリスト|作業前バックアップの取り方:反映そのものの型を、もう少し広く扱っています。

DNSの切り替えで手が止まるのは、慎重さが足りないからではありません。押したあとの時間を自分で握れないと分かっているからです。その感覚は、正しい怖がり方だと思います。
ただ、その時間は、実は事前に短くしておけます。TTLを300にした瞬間、「戻れない1日」は「戻れる5分」に変わります。怖さを消す必要はありません。戻り道の長さだけ、先に縮めておけば大丈夫です。
明日、自分が管理しているドメインに dig を1回打つところからで十分です。今の数字を知っておくだけで、次の切り替えはずいぶん違う顔になります。
ほかの実務ヒントは記事一覧からどうぞ。保守運用の小さな備えを、メールでも少しずつお届けしています。