AWS_CDN cloudfront使用记录
2026-07-06 20:06:13

本文链接:https://blog.tanglu.me/cloudfront

一、前言

之前帮别人富强套CDN的时候了解的cloudfront,当时就感觉它和国内主流的CDN有些不同

这几天再次尝试了cloudfront,体验过后感觉cloudfront与国内CDN确实有很大不同,很多功能需要自己设置,对新手不是很友好,当然自定义性更强

本文主要记录使用cloudfront时 设置自定义host的配置记录

另外提一下,本文只是闲着无聊 提供一种思路,个人不建议使用cft 账单更新不及时,即使设置了WAF感觉破产的风险还是挺大的

二、简介

image

回源协议、回源端口、支持的tls版本可以根据需要自行设置

三、案例演示

例如我用cft给 blog.tanglu.cf 站点加速,让用户在浏览器访问 blog.tanglu.cf 时就是cloudfront返回源站的页面

我会展示一些可能遇到的问题

1、在源站配置 blog.tanglu.cf 的页面内容

image

2、申请证书

在搜索栏搜索 AWS Certificate Manager (ACM) 来到证书申请/上传页面,申请/上传证书,我这里为 *.tanglu.cf 申请一个泛域名证书(申请的证书只能在aws内部使用,无法下载)

image

image

image

大概一分钟后就自动颁发成功了

image

3、在 cloudfront 页面创建服务 Create distribution

image

①输入解析记录为源站IP的域名,例如 origin-ip.tanglu.cf

image

image

当我直接访问 origin-ip.tanglu.cf 时,显示我源服务器nginx的默认界面

这是因为我没有在nginx配置文件 为origin-ip.tanglu.cf 配置服务,源服务器默认返回nginx默认页面

image

②在 Alternate domain name (CNAME) - optional 填入你需要加速的域名

image

③设置缓存规则

创建资源时出现如下提示,说明我们要在 Cache key and origin requests 设置一个缓存规则,我测试用所以设置的不缓存

image

image

④然后就添加好了CDN

将 blog.tanglu.cf 指向这个CNAME域名,当然你也可以自选IP

image

image

⑤访问试试

可以看到访问 http://blog.tanglu.cf 展示的是默认页面,访问 https://blog.tanglu.cf 直接报错

这个问题我猜测是cloudfront默认去掉了客户端的host,用的 origin-ip.tanglu.cf 作为回源host

image
image

我测试在源服务器配置了 origin-ip.tanglu.cf 的nginx配置后,再次访问就是 origin-ip.tanglu.cf 的页面证实了cft使用 Origins domain 作为回源 host

image

image

image

⑥允许客户端传递host

为解决第⑤小节中的问题,我最开始是做法将 blog.tanglu.cf 作为 Origins domain ,然后选择另一个域名 blogcft.tanglu.cf 并CNAME到cft给的CNAME域名,让客户端通过 blogcft.tanglu.cf 去访问,但是这样肯定不是我们需要的。

之后查看了 官方文档 才知道需要手动设置来解决这一问题

1、简短描述

要将您的分配配置为将主机标头转发到源,请执行以下操作之一:

  • 创建缓存策略和源请求策略。
  • 编辑分配中现有行为的设置。

**重要提示:**对于 Amazon Simple Storage Service (Amazon S3) 源,不支持基于主机标头的缓存。有关更多信息,请参阅选择用作缓存基础的标头。

2、解决方法

创建缓存策略和源请求策略

  1. 按照以下步骤使用 CloudFront 控制台创建缓存策略。
  2. 在 Cache key settings(缓存密钥设置)下,为 Headers(标头)选择 Include the following headers(包括以下标头)。从 Add header(添加标头)下拉列表中,选择 Host(主机)。
  3. 根据要将策略附加到的行为的要求,完成缓存策略的所有其他设置,然后选择 Create(创建)。
  4. 创建缓存策略后,请按照以下步骤将策略附加到 CloudFront 分配的相关行为。

编辑现有行为的设置

  1. 打开 CloudFront 控制台,然后选择您的分配。
  2. 选择 Behaviors(行为)选项卡,然后选择将主机标头转发到的路径。
  3. 选择 Edit(编辑)。
  4. 在 Cache key and origin requests(缓存键和源请求)下,确认已选择 Legacy cache(旧缓存)设备。如果未选中,请按照上一节中的步骤创建一个缓存策略。如果选择 Legacy cache settings(旧缓存设置),请完成以下步骤:
    对于 Headers(标头),选择 Include the following headers(包括以下标头)。
    从 Add header(添加标头)下拉列表中,选择 Host(主机)。
  5. 选择 Save Changes(保存更改)。

image

image

保存后再次F5刷新后就可以传递客户端的host给cft了

image

⑦清除缓存

如果F5强制刷新后还是显示的之前的页面,可能是相关资源cloudfront给你缓存了,你可以用 这个工具 查看资源是否被缓存(记得请求两次哈)

image

清除cloudfront的缓存步骤如图所示,/* 或者 * 是清楚全部缓存

这个清除只是临时行为(似乎还收费),想对特定文件设置不缓存建议设置对应的规则,下节会继续提到

image

image

三、自定义缓存

在开始自定义host之前,先接着上节的清楚缓存写一下如何自定义缓存以及设置缓存时间

本节默认选择的 Legacy cache settings 且已经设置了’允许携带客户端host’

当然这个对缓存行为不影响,但是可能影响用户访问行为

image

缓存相关设置主要有:设置缓存路径、设置缓存时间、设置优先级

1、设置缓存(不缓存)路径

在 cloudfront Distributions > select your id > Behaviors >> create behavior

例如对所有png文件进行设置

image

2、设置缓存时间

这里的三个TTL我暂时都不是很懂是什么意思,我是直接都设置的一样且很大的一个数(知道的大佬可以告知一下) :)

或许这个对你有帮助:https://stackoverflow.com/questions/51073731/what-is-cloudfront-minimum-ttl-for

如果全设置为0就是不缓存

image

——

image

3、设置优先级

优先级从上到下开始匹配,建议最广的全局规则放到最下面(和 cloudflare的WAF防火墙规则 类似)

比如针对 blog.tanglu.cf 站点,缓存设置为:对所有png图片进行缓存、对所有html不缓存、对blog.tanglu.cf/test/下的png图片不缓存

则优先级应该设置为:

  • 优先级0 不缓存 /test/*.png
  • 优先级1 缓存 /*.png
  • 优先级2 缓存 /*.html
  • 优先级3 全局默认配置

image

image

4、删除已有缓存

清除cloudfront已有缓存步骤如图所示,/* 或者 * 是清楚全部缓存,你根据需要自己设置

这个清除只是临时行为

官方价格:每月前 1,000 个文件的删除请求不收取额外费用;高于此级别,每增加一个文件就将收取 0.005 美元的费用(注意 /* 往往包含很多个文件)

image

5、更多缓存策略

比如还可以根据设备类型配置缓存,根据查看者的语言配置缓存,根据查看者的位置配置缓存,根据请求的协议配置缓存

具体可以参考官方文档:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html

https://repost.aws/zh-Hans/knowledge-center/waf-apply-rate-limit

四、自定义回源host

这节原本是打算使用 Lambda 函数修改回源host,但是能力不够 尝试了一下访问报错了,有知道的老哥可以发邮件教教我。

我参考的:https://stackoverflow.com/questions/73024633/cloudfront-forward-host-header-to-lambda-function-url-origin

https://medium.codaisseur.com/use-a-lambda-function-to-send-a-custom-host-header-to-an-origin-from-cloudfront-8f2e1b3e3d04

https://stackoverflow.com/questions/53796032/why-do-i-get-execution-role-must-be-assumable-error-when-trying-to-deploy-to-l

不过问题不大,使用cloudfront自定义回源请求头中的host字段效果类似于反代,最简单的方法其实在之前的例子中已经提到了:

之前例子中的origin-ip.tanglu.cf 就是一个自定义host,你可以将其换为你需要(反代)的任何资源,比如你可以设置为 存储桶域名 ,之前已经证明过cloudfront回源host就是你在面板设置的 Origin domain

这个满足了大多数场景,不过有还是有少部分场景未能满足,比如域名的实际IP并没有指向你需要的服务器等等。所以想着用 Lambda函数试试,但是最终失败了 :(

⑤访问试试

可以看到访问 http://blog.tanglu.cf 展示的是默认页面,访问 https://blog.tanglu.cf 直接报错

这个问题我猜测是cloudfront默认去掉了客户端的host,用的 origin-ip.tanglu.cf 作为回源host

image
image

我测试在源服务器配置了 origin-ip.tanglu.cf 的nginx配置后,再次访问就是 origin-ip.tanglu.cf 的页面证实了cft使用 Origins domain 作为回源 host

image

image

image

还是演示个小例子

比如我想用 blog.tanglu.cf 这个域名反代已经存在的站点 blog.tanglu.me,即让客户端访问 blog.tanglu.cf 得到的内容是我博客的内容

image

image

五、禁用客户端对cloudfront_CNAME *.cloudfront.net 的访问

个人用cloudfront的应该不多这里就不做展示了(主要是搞了一天的使用Lambda自定义回源host 失败了 有点伤),感觉挺适合企业的自定义性很强

这个可以参考:https://stackoverflow.com/questions/45589416/how-to-disable-access-to-cloudfront-via-the-cloudfront-net-url

需要注意web ACL 和 Lambda函数都是计费的

六、杂谈

cloudfront支持CC速率限制等规则,不过是计费的 可在web_ACL中设置,我个人用不到就暂不展示了,有需要可以评论 我后期补上

需要了解cloudfront价格可以参考 Luminous 大佬的教程:https://luotianyi.vc/5994.html

Prev
2026-07-06 20:06:13
Next