やりたいこと
ZEIT NowにデプロイしたアプリをGoogle Domainsで契約しているドメインに割り当てつつ、そのサブドメインをAWS API Gatewayに紐付ける。
例: sub.yourdomain.app
なお、Google Domains上のDNS設定ではネームサーバーが「カスタム ネームサーバーを使用する」とした上でZEITのものを設定しており、「カスタム リソース レコード」は設定しているもののおそらく参照されていない。
実現方法
※ 証明書の有効期限切れに伴う修正として実施。
おそらくACMの証明書は期間延長のようなことはできず、再度作り直す必要があると判断した。 削除しようとすると「証明書は使用中」エラーとなった。
証明書は使用中
証明書は sub.yourdomain.app (xxxxx) 使用中で(他の AWS リソースに関連付けられていて)削除することはできません。リスト内の各リソースからその証明書との関連付けを解除し、もう一度お試しください。
同じドメイン名の証明書を作成することはできるため、削除せず新しく証明書のリクエストを実行した。 API Gatewayのカスタムドメイン名から該当のものを削除することで対応した。もしかしたら削除する必要ないかも。 内部的な削除の完了までに15分ほど時間がかかるようなので注意。 これのあと、証明書のリクエストを進めると失敗した。
リクエストの失敗
この証明書のリクエストの状況は “失敗” です。CAA (Certificate Authority Authentication) エラーにより、1 つまたは複数のドメイン名の検証に失敗しました。
ZEITはデフォルトで認証局をletsencrypt.org
のみ許可しているので、AWSからは拒否される。 CAAレコードの状況はnow dns ls
で確認できる。1 以下のコマンドでもともとあるCAAレコードが上書きされ、AWSを許可できる。2
$ now dns add yourdomain.app @ CAA '0 issue "amazon.com"'
追記:上書きしてletsencrypt.org
の許可を失ったままにしたため、後日ZEITによる証明書の作成に失敗し、アクセス不可になった。 サブドメインはAWSだが、Webサイトはyourdomain.app
をNowに紐づけていたため 改めてletsencrypt.org
レコードをaddした。
反映は24時間〜48時間以内とあるが、すぐに有効となった。 改めて証明書のリクエストを行った。作成後すぐは更新資格が使用不可ステータスとなるが、問題ない。
API Gatewayのカスタムドメイン名で、先程消したものを作り直す。それに伴いターゲットドメイン名となるCloudFrontのドメインが新しいものになる。このときDNSの状況が参照されるため、古いCNAMEレコードのddddddddddddd.croudfront.net.
があるとエラーとなる。now dns rm
コマンドで削除してからAPI Gatewayのカスタムドメイン名を保存する。
ACM証明書「初期化しています…」となれば成功。この時点でCertificate Managerにおいて証明書の更新資格が使用可能ステータスになっている。ベースマッピングの設定も忘れず実施。
割り当てられたターゲットドメイン名をコピーし、以下の通りコマンドを実行してDNSにCNAMEレコードを登録。
$ now dns add yourdomain.app sub CNAME dddddddddddddd.cloudfront.net
ACM証明書の初期化が完了したのを確認して完了。