Vercelで使用しているドメインが、CAAレコードが原因でAWSで証明書発行できなかった
背景
Vercel はフロントエンドのプロジェクトをデプロイ先として非常に簡単で使いやすいですが、 AWS のサービスで似たようなものとして AWS Amplify Hosting が存在します。
Next.js のデプロイという観点でいうと同じ開発元のサービスである Vercel のほうが圧倒的に充実していますが、シンプルな静的サイトのデプロイ先として AWS Amplify Hosting は十分な機能を備えており、 AWS で一元管理できるメリットもあるので、簡単なサイトをひとつ移行しようとしていました。
Web サイトを無停止で移行する際、証明書の扱いがネックになりますが、 AWS で証明書を発行するときは検証用の DNS レコードを設定することによってドメインの所有権確認を行うため、ドメインの向き先を Vercel に設定したままでも証明書を発行できるはずでした。
CNAMEレコードを設定してドメインの所有権を確認する
ところが実際に設定したところ、以下のようなエラーが発生しました。(コンソール上の表示が崩れていますが...)
ドメインのアクティベーションに失敗
今回は AWS Amplify Hosting の設定上でエラーとなりましたが、 AWS Certificate Manager で設定した場合でも同様のエラーとなるはずです。
原因
ドメインまわりの設定は反映に時間がかかることもあるのでしばらく待ってみましたが、しばらく経って再試行してみても状況が変わりませんでした。
エラー内容をよく見ると CAA レコードというものが関連していそうなので nslookup
コマンドを使い設定を調べてみました。
CAA レコードの設定を確認
CAA レコードはこちらでは設定していないはずなのに、何やら結果が返ってきました。
CAA レコードが設定されていると証明書を発行できる認証局が制限されるため、この設定だと globalsign.com
と letsencrypt.org
以外は証明書を発行できません。
つまり AWS が証明書を発行できないというのは正しい挙動となります。
詳しくは以下のページの説明が参考になります。
結果をよく見ると canonical name = cname.vercel-dns.com
という内容が含まれるのが気になるのですが、確かに Vercel にドメインを追加するときは下の画像のように cname.vercel-dns.com
を CNAME レコードに追加するように促されます。
Vercel のドメイン設定画面
どうやらこのとき、 CNAME での参照先に CAA レコードが設定されていると、そちらも参照されてしまうようです。
解決方法
Vercel のサポート記事に CNAME レコードの代わりに A レコードを設定する方法が紹介されています。
こちらの方法に従い、 Amazon Route 53 などの DNS 設定で対象のドメインに対して CNAME レコードを設定する代わりに 76.76.21.21
の A レコードを設定します。
このとき AWS が指定する CAA レコードと Vercel が指定する "0 issue letsencrypt.org"
の両方を含むように CAA レコードを設定することも可能ですが、 CAA レコードと CNAME レコードは同時に設定できないので、今回のように AWS Amplify Hosting や CloudFront に移行する場合は結局削除することになるため、設定しないほうが無難かと思われます。
CAA レコードが設定されていない場合は証明書を発行する認証局は制限されないため、証明書を発行できるようになります。
まとめ
今回 AWS で証明書を発行できなかったのは、自分で設定したつもりのない CAA レコードが CNAME によって設定されているのが原因でした。
知らないエラーだったので焦りましたが、結果的には明確な原因がわかってスッキリと解決できました!
Discussion
証明書を発行でいるようになります。
でいる
指摘ありがとうございます!修正しました