AmplifyのHostingでカスタムドメインを設定しようとしたらハマりました。
AmplifyのHostingにカスタムドメインを追加する際、ドメインの検証(所有権の確認)が行われます。
Route53で取得したもの、もしくはネームサーバをRoute53に指定しているものであればDNSレコードを自動的に生成してAWSの内部で検証作業を完了させてくれるのですが、今回は外部のDNSサーバを使っていました。
そうするとカスタムドメインを設定した後、検証のために2つのレコードを設定する必要があります。
一つは証明書(ACM)用のレコードで、 acm-validations.aws.
で終わるドメイン向きのもの、もう一つは実際にHostingを行う上で必要な、ドメイン自身をAmplifyの内部の CloudFront に向けるものになります。
この検証なのですが、実際にどのようなレコードを設定するかについてはカスタムドメインを追加すし、しばらくすると分かります。
その内容にしたがってDNSレコードを設定するとAWSがレコードを確認し、正しい値が指定されていれば追加が完了…となるはずなのですが、出来ませんでした。
検証が完了しない場合、画面に「再検証」のボタンが現れます。普通に考えると指定された内容に従ってDNSを変更し、「再検証」を押せば検証されるかと思われますが、内部的にはカスタムドメインを再度指定し直したような挙動になっており、CloudFrontのアドレス(ホスト名)が変わります。
そのため、更に新しいものになっているため検証に失敗して… というループになってしまいます。
- カスタムドメインの追加
- (AWS) DNSレコードの決定
- (AWS) 検証中…
- (自分) DNSレコードの設定
- (AWS) 検証の失敗
- (自分) 再検証(以下ループ)
そうするといくら設定してもいたちごっこのように変わってしまい、カスタムドメインの追加が完了しませんでした。
しばらく困っていたのですが、通信ログを見ると最初の検証中の間にも通信をしているようで、その間になんとか変更できないか、と考えました。
解決策
まずはドメインのTTLを最小値(60)に設定しました。こうすることで可能な限り早く反映されます。
その後、DNSの検証中が進んでいる間にできるだけ早く内容を変更しました。
そうすることで再検証が出る前に検証が完了し、うまく追加することができました。
その他
この後、Amplifyでもう一度同じような現象に遭遇しました。
カスタムドメインを追加しようとした際に下記のようなエラーメッセージになっています。
One or more aliases specified for the distribution includes an incorrectly configured DNS record that points to another CloudFront distribution. You must update the DNS record to correct the problem. For more information, see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html#alternate-domain-names-restrictions (Service: AmazonCloudFront; Status Code: 409; Error Code: CNAMEAlreadyExists; Request ID: ; Proxy: null)
結論として原因は「DNSレコードを表示」から表示されるCNAMEを早く追加してしまっていたことが原因のようでした。
Amplifyが、ドメインが正しく接続されていることの検証は
- 該当ドメインがどこのCloudFrontにも接続されていない
- 該当ドメインが指定のCloudFrontに向けてCNAMEを正しく設定している
という二段階で行われるようで、早めに設定してしまうと最初の段階でエラーが出てしまうようです。たしかにエラーメッセージにそう書かれているのですが、正しく設定したつもりでいたためハマってしまいました。
解決方法は一度CNAMEのレコードエントリを削除し、しばらく待ってから追加し直すとうまくいきました。