CloudFrontでカスタムドメインを利用 / ACM設定・代替ドメイン設定
発生した問題
状況:(aaaa
はマスク)
- CloudFrontディストリビューション作成(オリジン、ビヘイビアなど)
- stg.aaaa.comのホストゾーンを作成
- stg.aaaa.comのAレコードで、CloudFrontのディストリビューションドメイン名を指定
- stg.aaaa.comのnsレコードはaaaa.comにひも付いている
- .aaaa.comのACM証明書は正しく設定されている
これらの状況で、cloudfrontのディストリビューションにはacm・代替ドメインは未設定のまま、「https://stg.aaaa.com」にアクセスすると、.aaaa.comの証明書が利用されてリダイレクトが発生(作成したcloudfrontフロントのオリジンにはアクセスされない)
結論
結論からいうと、CloudFrontのディストリビューションで、ACMの設定と代替ドメイン名の設定が必要です。
Route53 の A レコード設定だけでは不十分な理由
「Route53 の A レコードで stg.aaaa.com を CloudFront ディストリビューションのドメイン (例: xxxxx.cloudfront.net) に紐づけたら、もう終わりでは?」と思われがちですが、これだけでは不十分です。
CloudFront 自体が “その独自ドメインを取り扱う” と認識していない
代替ドメイン名を設定しない限り、CloudFront は「stg.aaaa.com というホスト名で来るリクエスト」は想定外として扱うため、正しい証明書を返せません。
結果として、HTTPS アクセスした時に、CloudFront に紐づいていないドメイン名として扱われ、デフォルトの証明書 (*.cloudfront.net など) しか返せず、ブラウザ側で「証明書がドメインと一致しない」エラーが発生します。
HTTPS(SSL/TLS) 通信で使う証明書は、CloudFront 側の設定で必要
HTTPS 通信を行う際には、サーバー(今回だと CloudFront) が「自分が応答するドメイン」に合った証明書を提示する必要があります。
CloudFront ディストリビューションに stg.aaaa.com を含む証明書を正しく設定していない場合、たとえ Route53 で名前解決は成功しても、CloudFront は該当ドメインに合う証明書を提示できず、証明書エラーになります。
ALBの証明書設定とCloudFrontの証明書設定の違い
ALBでもリスナーにACM証明書を設定可能ですが、代替ドメインは不要です。
では、何故CloudFrontは代替ドメインの設定が必要なのでしょうか?
CloudFrontは
「大量のディストリビューションが 1つのエッジサーバー基盤を共有」する特性上、どのホスト名がどのディストリビューションに紐づくかを設定(代替ドメイン)する必要があります。
さらに HTTPS の場合は正しい証明書を返すために、証明書(ACM) と代替ドメイン設定を CloudFront 側でセットしなければならない。
ALB
┌───────────────────────────────────────┐
│ Client │
│ (ブラウザなどが「https://myapp.example.com」へアクセス)
└───────────────────────────────────────┘
|
v ①DNS問い合わせ
┌───────────────────────────────────────┐
│ Route53 │
│ Aレコード(エイリアス): │
│ myapp.example.com -> xxx.elb.amazonaws.com
└───────────────────────────────────────┘
|
v ②名前解決結果 (ALBのDNS)
┌───────────────────────────────────────┐
│ ALB │
│ (xxx.elb.amazonaws.com のDNS名を持つ) │
│ - リスナー (HTTPS/443 など) │
│ - 証明書 (SSL/TLS) │
└───────────────────────────────────────┘
|
v
┌───────────────────────────────────────┐
│ EC2/ECS/Lambda/その他のターゲット │
└───────────────────────────────────────┘
CloudFront
┌───────────────────────────────────────┐
│ Client │
│ (ブラウザなどが「https://cdn.example.com」へアクセス)
└───────────────────────────────────────┘
|
v ①DNS問い合わせ
┌───────────────────────────────────────┐
│ Route53 │
│ Aレコード(エイリアス): │
│ cdn.example.com -> xxxxx.cloudfront.net
└───────────────────────────────────────┘
|
v ②名前解決結果 (xxxxx.cloudfront.net)
┌───────────────────────────────────────┐
│ CloudFront CDN │
│ (xxxxx.cloudfront.net のDNS名を持つ) │
│ - Alternate Domain Name: │
│ cdn.example.com (設定必須) │
│ - 証明書(SSL/TLS) in ACM │
└───────────────────────────────────────┘
|
v
┌───────────────────────────────────────┐
│ S3/ALB/EC2/他のオリジン (バックエンド) │
└───────────────────────────────────────┘
Discussion