お金を積めばdevドメインを優先的に取得できるEarly Access Programが終了して、2/28から年額12ドルの正規料金で取得できるようになったので3月の初めにdevドメインを購入しました。
もともと独自ドメインで運用していたこのブログをdevドメインに移行してみたので手順をまとめておきます。

Google Domainsでドメイン購入

本当はa1.devを取得したかったのですが2文字のプレミアムドメイン扱いのため¥81,780/年と高額すぎるため妥協してa-1.devを取得しました。今使っているドメインが¥3,000/年ぐらいなので¥1,400/年はお財布にやさしいです。

ちなみに、devドメインはhttpsでしか使えないと説明が書いてあるので購入前にちゃんと理解しておきましょう。

Netlifyに新しいプロジェクト追加してカスタムドメインを設定する

旧ドメイン名で稼働させているブログは残しつつ、新しいドメインでブログを立ち上げるため 新しいプロジェクトを作成しました。独自ドメインを設定するためにCustom domainsからAdd custom domainします。

カスタムドメインにはblog.a-1.devというサブドメインを指定しました。

なぜサブドメインを指定するのか

もともとgyoza.beerというApexドメインでブログを運用していたのですが、ドキュメントをよく読んでみるとCNAMEで運用した方が良いみたいなのでサブドメインを指定しました。

https://www.netlify.com/blog/2017/02/28/to-www-or-not-www/

Apexドメインを指定する場合、NetlifyのロードバランサーのIPアドレスを指定する必要があります。 かたやCNAMEの向き先にNetlifyのドメインを指定しておけば、Netlify側でアクセスをうまくさばいてくれるのでCDNのメリットを最大限活かすことができます。

DNSを設定する

カスタムドメインを設定しましたが、Check DNS configurationと表示されてDNSの設定が終わらないと使えませんので設定していきます。

どう設定するかはドキュメントに書いてあって、CNAMEの向き先をnetlify.comに向けるだけです。

DNSはGoogle Domainを使用しました。CNAMEの設定を追加してちょっと待つと反映されます。

SSL証明書を設定する

DNSの反映が済んだらデフォルトで使えるLet’s Encryptの証明書を設定します。少し時間がかかりますが証明書が発行されます。

config.tomlのbaseURLを書き換え

HugoのbaseURLを新しいドメインに書き換えておきます。

baseURL = "https://blog.a-1.dev/"

ここまで設定すると新しいドメインでアクセス出来るようになりました。

旧ドメインから新ドメインにリダイレクトさせる

下記のようにnetlify.tomlを設定して旧ドメインへのアクセスを新ドメインに301でリダイレクトするようにします。

[[redirects]]
from = "https://gyoza.beer/*"
to = "https://blog.a-1.dev/:splat"
status = 301
force = true

ついでにnetlify.comへアクセスがきたら独自ドメインにリダイレクトするよう設定しました。まあ、こっちにアクセスされることはないのですが。

[[redirects]]
from = "https://angry-euclid-67959a.netlify.com/*"
to = "https://blog.a-1.dev/:splat"
status = 301
force = true

HSTSプリロードリストへの登録

https://hstspreload.org/

HSTSに登録しようとしたらすでに登録されているとのことでした。

Google Chromeからchrome://net-internals/#hstsで確認しても確かに有効なようです。

下記のプリロードリストを見るとドメインレベルでforce-https有効になっているようで個別に登録は不要なようです。devドメインをhttps縛りなのはこの設定で実現しているようです。他にもGoogleっぽいドメインが並んでいます。

// gTLDs and eTLDs are welcome to preload if they are interested.
    { "name": "android", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "app", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "bank", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "chrome", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "dev", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "foo", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "gle", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "google", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true, "pins": "google" },
    { "name": "insurance", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "new", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "page", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "play", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
    { "name": "youtube", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },

おわりに

しばらくの間、Google検索すると旧ドメインがヒットしていましたが、現在では新ドメインに入れ替わっているので旧ドメインの方は閉鎖しようかと思っています。割とスムーズに移行できました。