AWSRoute 53CloudFrontACMDNSCustom DomainSSL/TLS

如何在 CloudFront 中使用通过 Amazon Route 53 注册的域名

Sloth255
Sloth255
·5 min read·1,099 words

引言

要在 Amazon CloudFront 中使用通过 Amazon Route 53 注册的域名,首先需要确认 Route 53 一侧的托管区域,然后在 AWS Certificate Manager (ACM) 中签发 SSL 证书,最后在 CloudFront 中配置自定义域名。
本文以前主域名和子域名使用不同源站的架构为前提,说明如何分别将它们分配到不同的 CloudFront 分发中。

前提条件

本文基于以下前提展开。

  • 主域名和子域名使用不同的源站
  • 主域名和子域名分别使用不同的 CloudFront 分发进行运维
  • CloudFront 分发本身以及源站的基础配置已经完成
  • Route 53 的托管区域由同一个 AWS 账户管理

如果你使用相同的源站,也可以选择在一个 CloudFront 分发上配置多个备用域名 (CNAME) 的方式。不过本文不讨论这种情况。

整体流程

  1. 在 Amazon Route 53 中购买域名
  2. 确认 Amazon Route 53 自动创建的托管区域
  3. 在 AWS Certificate Manager (ACM) 中签发 SSL 证书
  4. 在 Amazon CloudFront 中配置自定义域名
  5. 在 Amazon Route 53 中创建主域名记录
  6. 在 Amazon Route 53 中创建子域名记录
  7. 进行验证

ACM、Route 53 和 CloudFront 的关系

在本次架构中,Amazon Route 53 负责 DNS 管理,AWS Certificate Manager (ACM) 负责签发 HTTPS 证书,Amazon CloudFront 则分别作为主域名和子域名的分发入口。

graph LR
  U[用户浏览器]
  R[Route 53 DNS管理]
  CM[CloudFront 主域名用]
  CS[CloudFront 子域名用]
  OM[源站 S3 或 Web 服务器]
  OS[源站 S3 或 Web 服务器]
  A[ACM SSL/TLS 证书]

  U -->|访问 example.com| R
  U -->|访问 cdn.example.com| R
  R -->|A / AAAA 别名| CM
  R -->|A / AAAA 别名| CS
  CM -->|通过 HTTPS 分发| U
  CS -->|通过 HTTPS 分发| U
  A -->|关联证书| CM
  A -->|关联证书| CS
  CM -->|获取内容| OM
  CS -->|获取内容| OS

关键点在于,Amazon Route 53 中的 DNS 记录分别引用主域名和子域名对应的 CloudFront 分发,并为每个分发配置 ACM 证书,这样就可以通过自定义域名提供 HTTPS 服务。

1. 在 Amazon Route 53 中购买域名

首先,从 AWS Management Console 打开 Amazon Route 53,购买你要使用的域名。

步骤

  1. 在 Amazon Route 53 控制台中打开“已注册域名”或“域名注册”
  2. 搜索你想注册的域名(例如:example.com

Route 53 域名搜索界面

  1. 如果可用,则加入购物车并继续购买流程
  2. 填写联系人信息和注册年限,然后完成购买
  3. 打开发送到注册邮箱的确认邮件,并点击正文中的验证链接
    • 主题示例:Verify your email address.
  4. 在 Amazon Route 53 控制台中打开“域名”→“请求”,确认新申请域名的状态为“Successful”

购买完成后,除了域名注册之外,Amazon Route 53 也会进入可管理该域名名称服务器的状态。

2. 确认 Amazon Route 53 自动创建的托管区域

在 Amazon Route 53 中注册域名时,通常会自动创建一个同名的公共托管区域。首先确认这一状态。

步骤

  1. 在 Amazon Route 53 控制台中打开“托管区域”
  2. 确认存在与已购买域名同名的托管区域(例如:example.com
  3. 确认托管区域中已自动创建以下记录
NS
SOA

如果需要,也可以一并确认 NS 记录中显示的名称服务器。

ns-xxx.awsdns-xx.com
ns-xxx.awsdns-xx.net
ns-xxx.awsdns-xx.org
ns-xxx.awsdns-xx.co.uk

3. 在 AWS Certificate Manager (ACM) 中签发 SSL 证书

为了能够通过 HTTPS 访问,需要在 AWS Certificate Manager (ACM) 中签发 SSL 证书。

步骤

  1. 将区域切换为 us-east-1

ACM 区域选择界面

  1. 在 ACM 控制台中点击“请求证书”

在 ACM 中请求证书的界面

  1. 选择“请求公有证书”

ACM 公有证书选择界面

  1. 在完全限定域名中输入要使用的域名
    • 使用主域名时:example.com
    • 使用子域名时:*.example.com
    • 如果希望一张证书同时覆盖两者:同时添加 example.com*.example.com
  2. 验证方式选择“DNS 验证”
  3. 点击“请求”

ACM 证书请求提交界面

完成 DNS 验证

  1. 在证书详情页面点击“在 Route 53 中创建记录”
  2. 如果 Route 53 托管区域由同一个 AWS 账户管理,可以自动创建 CNAME 记录
  3. 如果没有显示自动创建入口,则将 ACM 显示的 CNAME 记录手动添加到 Route 53
  4. 几分钟后,验证完成

验证完成后,状态会变为“Issued”。

4. 在 Amazon CloudFront 中配置自定义域名

证书签发完成后,将自定义域名添加到 CloudFront 分发中。

步骤

  1. 在 CloudFront 控制台中选择主域名对应的分发
  2. 点击“Edit”
  3. 在“Alternate domain name (CNAME)”中添加要使用的域名
    • 为主域名分发添加 example.com
  4. 在“Custom SSL certificate”中选择刚才创建的证书
  5. 点击“Save changes”
  6. 接着,对子域名对应的分发执行同样的步骤
    • 为子域名分发添加 cdn.example.com
    • 确认证书中包含 cdn.example.com*.example.com
  7. 点击“Save changes”

每个分发都需要等待数分钟到约 15 分钟,直到部署完成。

5. 在 Amazon Route 53 中创建主域名记录

如果希望 example.com 也访问到 CloudFront,需要创建 A/AAAA 别名记录。

步骤

  1. 在 Amazon Route 53 的托管区域详情页面点击“Create record”
  2. 输入以下信息:
    • 记录名称:留空(根域名)
    • 记录类型:A - IPv4 地址
    • Alias:On
    • Route traffic to
      • Alias to CloudFront distribution
      • 选择主域名对应的 CloudFront 分发
  3. 点击“Create records”
  4. 同样再创建一个 AAAA - IPv6 地址记录

6. 在 Amazon Route 53 中创建子域名记录

创建将子域名(例如:cdn.example.com)指向 CloudFront 的记录。

步骤

  1. 在 Amazon Route 53 的托管区域详情页面点击“Create record”

在 Route 53 中创建记录的界面

  1. 输入以下信息:
    • 记录名称:子域名前缀(例如:cdn
    • 记录类型:A - IPv4 地址
    • Alias:On
    • Route traffic to
      • Alias to CloudFront distribution
      • 选择子域名对应的 CloudFront 分发
  2. 点击“Create records”

为 CloudFront 创建记录后的界面

  1. 同样也创建以下记录。
    • 记录类型:AAAA - IPv6 地址
    • 其余项与步骤 2 相同

7. 验证

完成全部配置后,在浏览器中访问以下 URL 进行验证。

https://example.com
https://cdn.example.com

如果分别显示了预期源站的内容,则说明基本路由已成功。

1. 检查 DNS

可以使用以下命令确认主域名和子域名是否指向 CloudFront。

nslookup example.com
nslookup cdn.example.com

虽然不会直接返回 CloudFront 的域名本身,但可以确认名称解析正常,并且 Route 53 的别名记录配置正确。

2. 检查 HTTPS 响应

接下来确认 HTTPS 是否正常响应。

curl -I https://example.com
curl -I https://cdn.example.com

至少应检查以下几点。

  • 返回了符合预期的 HTTP 状态,例如 HTTP/1.1 200 OK301 Moved Permanently
  • 响应中包含 server: CloudFront
  • 跳转到了预期的目标地址

3. 检查证书和备用域名

在浏览器中访问各个 URL,确认证书签发对象和锁标记。

  • 访问 example.com 时不会出现证书错误
  • 访问 cdn.example.com 时不会出现证书错误
  • 不会被重定向到非预期的域名

4. 确认源站是否正确拆分

如果主域名和子域名使用的是不同源站,也要确认它们分别指向不同的分发目标。

  • https://example.com 上显示主域名源站的内容
  • https://cdn.example.com 上显示子域名源站的内容
  • 一侧的更新不会混到另一侧

故障排查

如果无法访问:

  1. 确认 CloudFront 部署是否已经完成
  2. 确认 Route 53 中的 A/AAAA 别名记录是否配置正确
  3. 确认目标域名是否已经添加到 CloudFront 的“Alternate domain name (CNAME)”中
  4. 确认 ACM 证书中是否包含 example.comcdn.example.com
  5. 确认 ACM 证书状态是否为“Issued”
  6. 确认源站侧的 Host 头处理或 HTTPS 重定向设置没有导致问题
  7. 检查 DNS 传播情况(nslookup example.com / nslookup cdn.example.com

总结

本文介绍了如何在 Amazon CloudFront 中使用通过 Amazon Route 53 注册的域名。要点如下。

  • 通过 Amazon Route 53 注册的域名通常不需要再修改名称服务器
  • 如果域名支持隐私保护,可以防止个人信息暴露在 WHOIS 中
  • 应先签发 ACM 证书,再在 CloudFront 中配置自定义域名
  • 如果主域名和子域名使用不同源站,分别使用不同的 CloudFront 分发会更容易管理
  • 主域名和子域名都需要通过各自的 A/AAAA 别名记录关联到 CloudFront
  • ACM 证书必须在 us-east-1 区域中创建

通过这种配置,可以实现高速内容分发和灵活的 DNS 管理。

参考链接