そのワイルドカード必要ですか?CloudFront の CNAME でワイルドカード指定時の制限を理解する

CloudFront の CNAME にワイルドカードを使用した場合、どのような制限を受けるかについて紹介します。
2018.10.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、CloudFront は利用されてますか?CloudFront を独自ドメインでアクセスする場合、CNAME の設定が必要となりますよね。通常は実際に使用するドメイン名(例えば、www.example.com)のように指定すると思いますが、よく解らずにワイルドカードを使っていることはないでしょうか?ワイルドカード指定でもアクセスそのものに問題はないので、あまり気にせず使用されているケースは少なくないかもしれません。今回は、CNAME にワイルドカードを指定した場合の制限について、ご紹介したいと思います。

CNAME の例

まず、基本のおさらいとして、ワイルドカードを使わない例です。

アカウント A で CNAME に example.com を指定していたとします。この場合、別のディストリビューションで同じドメイン名 example.com を設定することは出来ません。図では別の AWS アカウントになっていますが、もちろんアカウント A 内の他のディストリビューションでも設定することは出来ません。(ちなみに、example.com のような Zone Apex を CNAME に設定する場合、Route 53 の エイリアスリソースレコードセットをご利用ください。その他の DNS では、対応している・していないをご確認ください。)

アカウント B で重複しない CNAME www.example.com は設定することが可能です。

CNAME にワイルドカードを指定した例

次に、ワイルドカードを指定した例です。

例えばアカウント A で CNAME にワイルドカードで *.example.com を指定したディストリビューションが存在していたとします。この場合、他の AWS アカウントでは、example.com ドメイン内の CNAME を指定することは出来ません。www.sub.example.com などのサブドメインも含めて指定出来ません。設定しようとした場合は、以下のように CNAMEAlreadyExistsException のエラーが表示されます。

com.amazonaws.services.cloudfront.model.CNAMEAlreadyExistsException:
One or more of the CNAMEs you provided are already associated with a different resource.
 (Service: AmazonCloudFront; Status Code: 409; Error Code: CNAMEAlreadyExists; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

公式のガイドでは、以下の記載がこの制限に該当します。

*.example.com などのワイルドカードの代替ドメイン名には、example.com のような別の代替ドメイン名を、両方が同じ CloudFront ディストリビューション、または同じ AWS アカウントを使用して作成されたディストリビューションにあるかぎり含めることができます。

「同じ AWS アカウントを使用して作成されたディストリビューションにあるかぎり」、つまり既にワイルドカードを使用しているディストリビューションが存在する場合、別の AWS アカウントでは同ドメインの CNAME は利用できないということです。この制限を知らないまま、なんとなくワイルドカードを指定していると、例えば同じ社内の別部署で異なる AWS アカウントを取得し、CloudFront を利用しようとしたところ 「あれ?ウチのドメイン指定できない。。」 ということが起こります。

CNAMEAlreadyExistsException 時の対処

ワイルドカードに限らずですが、CNAMEAlreadyExistsException のエラーになる場合の対処についてご紹介します。まずは、所属組織内の他の AWS アカウントで CloudFront の利用を確認してください。CloudFront の利用が確認できた場合は、所属組織内で CNAME 設定を重複しないように調整すれば解決できますね。(例えば、ワイルドカードを廃止して特定の FQDN に変更してもらう、など)

次に、所属組織内での利用は確認できず、第3者によって使用されている場合。どこの誰かも判らないのでは調整のしようがありません。この場合は、TXT レコードを使ってドメイン所有者である証拠を AWS に示す必要があります。手順は以下の公式 FAQ がありますので、万が一、そのようなケースに遭遇した場合は、参考にしてください。

さいごに

いかがだったでしょうか? CloudFront の CNAME にワイルドカードを指定した場合の制限について、理解したうえで設定されていますでしょうか?単一の AWS アカウントで利用されている場合、あまり気にする必要はないかと思いますが、部門ごと、サービスごとに AWS アカウントを分けられているケースも少なくないと思います。複数の AWS アカウントを利用する場合、不用意なワイルドカード利用は避けたほうが良いでしょう。また、「あれ? CNAME の設定できないぞ、、」という時は、この記事を思い出し、参考にしていただければと思います!

以上!大阪オフィスの丸毛(@marumo1981)でした!