AWS_CDN cloudfront使用记录
2023-05-05 12:46:36

本文链接: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