简单几步,利用Serverless,让COS中文件变更自动刷新CDN

背景

这几天遇到这样的一个场景,相信也是大多数的站长会遇到的一个问题:

自己的一个个人站点使用了COS作为前端静态资源的存储(JS、CSS、图片等等),同时开启了CDN作为资源的加速分发,为了最大的达到加速效果,把这些资源的缓存时间设置30天及以上。某一天,自己的站点需要变更一下css样式,修改完之后扔到COS中,发现站点中的样式仍没有生效。最后想起是命中了CDN的缓存,因此需要到 CDN控制台 进行URL刷新。

现状

目前COS(对象存储)控制台是没有提供这样一个功能:当启用了CDN,COS中文件变更时(上传、删除)自动去刷新CDN的选项。

分析

世界是由懒人创造的。

上面提到的刷新的工作,一次还好,但每次更新站点的静态文件都需要去执行这样的操作,这样重复性的功能是一定要得到解决的,谁让我懒...

想了下,COS文件变更的场景分为 2 种:

  • API上传
  • GUI上传(控制台、COS Browser...)

要实现自动刷新CDN,则需要用到CDN的 刷新URL的API

API上传

如果你是在代码里去上传静态资源的,那么你是能够知道文件上传的时刻的,在文件传完后去调用CDN的API则完成工作。

但是,如果你也同时通过COS控制台来上传文件,那这样的场景则覆盖不了,因此这种做法并不全面。在此也不做多的描述了。

GUI上传

首先,会遇到一个难题,COS本身没有提供设置文件更变之后的回调的功能,如果能拿到这个的回调,则不管是通过什么方式的上传,均能被覆盖到。

既然写了这篇东西,也不卖关子了,直接介绍下我们的主角:SCF(无服务器云函数),简单说,SCF能实现事件式的触发,让你的一段代码跑在云上,无需自己去搭建服务器。而这里我们要利用他很重要的一个能力:COS文件上传/删除的触发器。

下面我们就一步步来实现我们要的功能:

注意: 地域需要选择与COS中存放静态资源的Bucket同个地域的,这里以我广州的 Bucket 为例,创建广州的函数

image_1ccfkdc6jp0uif0o1pmhti79.png

起个名字叫 cdn_refresh, 环境的话,我选择 Nodejs(这里推荐大家选 Nodejs 就行,因为我的这段demo是用的node,你需要使用的话,不懂node也没关系,改一下配置就行)

image_1ccfkj8gsc2o5fg6jdbmv98nm.png
  • 2、修改 demo 配置

下载我这个 demo的代码,解压后修改里面的几个配置信息,包括secretId、secretKey、以及你的cdn域名

把写好的代码压缩成 zip 包,通过本地上传 zip 包选项传上去,执行方法不用修改

image_1ccfl3ds1mjafae2mi8oqd161g.png
  • 3、添加触发方式,完成创建

选择 COS 触发,Bucket选择静态资源存储的bucket,事件类型我们选择文件上传,点击保存,完成函数创建

image_1ccfl90dp1502on76371v6jsa1t.png
  • 4、再次添加文件删除的触发方式,完成配置

上面我们支持了文件上传的触发方式,这里再添加上文件删除的触发,这样才是完整的文件变更

f2lgr7n23f.png
j459xgva37.png

测试效果

以上,我们就完成了 SCF 侧函数的配置,那下面我们直接看效果就行

我在控制台上传了文件 nba.jpg

image_1ccflpknt1st2r01dv3cq11mqd3k.png

我们在 SCF 控制台能看到调用相关的日志

image_1ccfltj6q15ft1iim17hmfacihe41.png

最后,因为 CDN刷新是异步刷新,我们可以去 CDN控制台 查看刷新记录

image_1ccfm0fu81c4a8o33es9ha1per4e.png

结语

至此,我们就完成了 COS 文件中变更到自动刷新 CDN 的流程。

最后再附上这个demo的下载地址:https://galenye-1251496585.cos.ap-guangzhou.myqcloud.com/scf_about_cdn_refresh.zip

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏葡萄城控件技术团队

渐进式Web应用(PWA)入门教程(下)

渐进式Web应用程序需要使用HTTPS连接。虽然使用HTTPS会让您服务器的开销变多,但使用HTTPS可以让您的网站变得更安全,HTTPS网站在Google上的...

910
来自专栏Jerry的SAP技术分享

微信程序开发系列教程(四)使用微信API创建公众号自定义菜单

大家可能经常看到一些微信公众号具有功能强大的自定义菜单,点击之后可以访问很多有用的功能。

981
来自专栏前端儿

在浏览器客户端进行爬虫开发

在Node环境下,可以用Request模块请求一个地址,得到返回信息,再用正则匹配数据,或者用Cheerio模块包装-方便定位相关的标签项

3281
来自专栏Objective-C

Xcode 清理存储空间

3955
来自专栏卡少编程之旅

fiddler抓包工具(windows)

71615
来自专栏吴伟祥

Fiddler是位于客户端和服务器端的HTTP代理(目前最常用的http抓包工具之一)

抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark.为什么使用fiddler?原因如下:

1364
来自专栏mySoul

浏览器推送 comet

服务器端的推送事件的方式为客户端在创建一个EventSource对象时会建立一个到服务器的连接,服务器会保持这个连接处于打开的状态,当发生一个事件的时候,服务器...

1113
来自专栏北京马哥教育

Vim 新手节省时间的 10 多个小技巧

Vim 是很多开发者的首选编辑器,通过设置正确的命令和快捷方式,它可以帮你更快的完成工作。这篇文章我们为 Vim 新手提供一些快捷键等方面的小技巧,帮你提升工作...

3807
来自专栏自由而无用的灵魂的碎碎念

解决每次从cmd进入sqlplus,都得重新设置pagesize、linesize的问题

如上图,经过测试,主要需要更改屏幕缓冲区大小,这里更改宽度为130。为防止每次进入cmd都调节窗口的大小,这里设置窗口大小,宽度为与缓冲区一致。

892
来自专栏V站

Speed丨如何快速给网站添加Pjax?

Pjax是一种很多网站( facebook,  twitter)都支持的浏览方式, 当你点击一个站内链接的时候, 不是做页面跳转, 而是只是站内页面刷新。设置后...

2504

扫码关注云+社区