先日AWSのCloudFrontを使うにあたって、以下のエラーに遭遇した。
Resolve Cloudfront Error "CNAMEAlreadyExists"
状況的には、あるドメインへのアクセスをDNSの設定変更で複数のCloudFrontディストリビューションに振り分けたい、といったものだった。
これは、CloudFrontの仕様上実現できない。
CloudFrontに独自のドメインでアクセスするためには、CloudFrontディストリビューションにそのドメインをCNAME設定する必要があるのだが、あるドメインは1つのディストリビューションにしか設定できない。
「仕様だから」で済ませばそれで良いと言えば良いのだが「何故そういう仕様なのか?」を考えてみると中々趣き深かった。
CNAME設定が必要な理由
まず、なぜCNAME設定が必要なのか?
これは、CloudFrontが動作しているホストが、複数のCloudFrontディストリビューションを処理していると考えれば分かりやすい。
HTTPでは「IPアドレス」を指定してホストにアクセスする。 この際「Hostヘッダ」にどのドメインへアクセスしたいのか? をホストに知らせる。
したがって、あるIPアドレスで動作しているCloudFrontがどのディストリビューションにアクセスされたのか? を判断するには、このHostヘッダとディストリビューションに設定されたCNAMEを突き合わせる必要があるのだ。
転じて重複できない理由
仮に、複数のCloudFrontディストリビューションに同じドメインをCNAME設定できたとする。
そうすると、あるHostヘッダが指定されたアクセスがあった場合に、どのディストリビューションへのアクセスを意図したものなのか? を判断することができない。
であるから、CloudFrontではあるドメインを複数のディストリビューションに指定できないという仕様になっているのだろう。
ここまで考えて、私はその仕様が腑に落ちた。
余談
ちょいちょい仕事や趣味上での気づきをBlog記事にしていきたいと思う。
「そんな事あったりまえだろ?」でもいいし「気づきを共有」できたら最高だ。
Qiitaとかの方がいいのかなぁ?
でも、サービス沢山使うのって大変そうなんだよね。 プラモもプログラムも愚痴も全部入りの闇鍋Blogを志向したい。