使用腾讯云函数在更新COS时自动刷新CDN缓存

title: 使用腾讯云函数在更新COS时自动刷新CDN缓存

categories:

  • [后端开发, NodeJS开发]
  • [系统与运维]
    abbrlink: 8693d6cf
    date: 2019-11-09 17:03:48
    tags:

0x01.背景介绍

最近因为服务器资源变动,把之前的Wordpress博客迁移到了Hexo中。Hexo博客的使用形式和Wordpress相差很多,并不是动态网站,而是自行存储博客源内容(Git仓库或其他硬盘存储方式均可以),最终使用 hexo-cli 工具将博客的内容生成静态网页资源,部署到Apache等HTTP服务中即可访问。经过一番调研,最后决定将Hexo生成的静态网页资源放到了腾讯云的COS(对象存储服务)中,COS支持静态网站功能,而且提供每月的免费空间和免费流量的资源就足够使用了。同时,为了优化使用体验,开启了腾讯云的CDN服务。不过在开启之后发现博客内容在更新到COS之后,由于CDN中的缓存并没有来得及刷新,所以实际通过域名访问到的博客页面并不是最新的,经过一番折腾后,决定使用腾讯云提供的云函数功能,自动来更新CDN缓存。

0x02. 云函数介绍

云函数是运行在腾讯云提供的容器环境中,按照程序的执行时间来进行收费的一种服务,非常的方便,只需要编写你的业务代码,然后上传即可使用。而且还支持根据腾讯云中其他服务的一些事件来触发执行你编写的云函数,本场景就是使用了腾讯云提供的【根据COS中的PUT文件事件来触发执行云函数】功能来进行的。

云函数现在已经很成熟,支持多种编程语言,如Golang、Python、Java、NodeJS等,因为之前的项目,在电脑上还有NodeJS版本的腾讯云SDK,所以本次实践直接采用的是NodeJS语言来编写代码。

具体的云函数介绍请见腾讯云官网介绍:

https://cloud.tencent.com/document/product/583

腾讯云SDK下载地址

https://cloud.tencent.com/document/sdk

0x03. 开始实践

首先,我们进入腾讯云控制台,搜索并进入云函数功能,然后点击【新建】按钮,来创建一个新的云函数

腾讯云云函数控制台

接下来,在基础信息界面中,我们选择NodeJS语言进行开发,同时,我们并不需要腾讯云提供的函数模板,所以直接选择了空白模板。当然这里假如读者需要其他语言,那么根据自身情况直接进行选择即可。

修改云函数基本配置

点击下一步按钮后,进入函数配置界面,修改了描述信息后,其他的选项我们无需改变,直接点击页面最下方的完成按钮即可

函数配置界面

点击完成后,回到已创建的云函数列表,点击我们刚刚创建的云函数的名称,进入云函数编辑界面

云函数列表页

在云函数编辑界面,进入触发方式选项卡,点击添加触发方式按钮

触发方式选项卡

在添加出发方式界面中,我们选择COS触发,然后选择要监听的COS Bucket,事件类型选择Put方法创建(由于我使用的是hexo-cos-deploy插件,其上传文件方式为PUT,所以我使用的是PUT方法创建选项,读者根据自身情况可以自行选择)

由于每次上传文件都会触发云函数的执行,也就是说,博客一旦更新涉及到了10个文件改动,那么就会触发10次云函数的执行,这并不是我们想要的,一次更新不管更新几个文件,最后执行一次触发即可,所以最终我选择了只有根目录中index.html文件被上传的时候才触发云函数,这样就能控制了一次更新,只执行一次触发。

20191109173049.png

接下来,我们编写代码,首先,在本地创建一个文件夹,把腾讯云的SDK复制到该文件夹中,然后创建 index.js 文件,我们的代码就在index.js中写,代码我就不具体讲解了,读者需要的话自行去复制修改。(读者记得修改代码中的secretID和secretKey,还有要刷新的CDN目录。)

'use strict';

exports.main_handler = (event, context, callback) => {
    const tencentcloud = require('./tencent-cloud-sdk/')
    const CdnClient = tencentcloud.cdn.v20180606.Client;
    const models = tencentcloud.cdn.v20180606.Models;

    const Credential = tencentcloud.common.Credential;
    const ClientProfile = tencentcloud.common.ClientProfile;
    const HttpProfile = tencentcloud.common.HttpProfile;

    let cred = new Credential("secretID", "secretKey");
    let httpProfile = new HttpProfile();
    httpProfile.endpoint = "cdn.tencentcloudapi.com";
    let clientProfile = new ClientProfile();
    clientProfile.httpProfile = httpProfile;
    let client = new CdnClient(cred, "ap-beijing", clientProfile);

    let req = new models.PurgePathCacheRequest();

    let params = '{"Paths":["https://blog.lemonit.cn/"],"FlushType":"delete"}'
    req.from_json_string(params);

    console.log('start')
    client.PurgePathCache(req, function(errMsg, response) {

        if (errMsg) {
            console.log('failed')
            console.log(errMsg);
            return;
        }
        console.log('success')
        console.log(response.to_json_string());
    });
};

我们把整个文件夹打包,然后在控制台中上传zip文件,最后控制台效果如下

云函数控制台最终效果

确认没问题后,我们点击保存按钮即可。

回到我们电脑中,编写完新的博客内容后,使用 hexo d 命令上传新博客内容到COS中

上传博客到COS

这时候,我们去腾讯云的云函数控制台可以看到,我们的云函数已经触发成功,可以在右侧看见本次触发云函数所执行的所有日志

云函数触发成功

我们再去腾讯云的CDN控制台,可以看到我们通过云函数提交的刷新CDN缓存任务已经执行完毕啦

CDN控制台

好啦,我们去博客首页看一下,我们本篇文章已经更新到首页啦

博客首页

0x04. 总结

云函数是腾讯云基于ServerLess理念新提出的服务,配合微信小程序等其他腾讯云提供的服务,可以发挥出更大的威力,用户无需关注环境的部署,以及后续运维的问题,更无须投入很大费用去购买云服务器资源。

COS是对象存储服务,根据用户上传的各种数据,配置云函数的各种自动触发功能,相信大家可以打造出更多有趣的实践内容,欢迎读者自行实验,分享给大家。