📖

CloudFrontでカスタムドメインを利用 / ACM設定・代替ドメイン設定

2025/01/16に公開

発生した問題

状況:(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