前言
首先介绍下在本文出现的几个比较重要的概念:
函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息 参考。
Fun: 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考。
CDN: 阿里云内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上、由分布在不同区域的边缘节点服务器群组成的分布式网络。替代传统以Web Server为中心的数据传输模式,将源站资源缓存到阿里云全国各地的边缘服务器,供用户就近快速获取,提升用户体验,降低源站压力。CDN 更多信息 参考。
准备
- 假定您以及开通了阿里云函数计算服务和阿里云内容分发网络服务。
- 您需要了解的一些名词,如源站,CNAME 域名等,请参照。
- 添加 CDN 加速域名,添加完加速域名后,需前往域名解析(DNS)服务商添加 CNAME 记录。
Fun 配置并部署 CDN 触发器
阿里云内容分发网络和函数计算无缝集成,用户可以为 CDN 的各种事件设置处理函数,并允许用户通过事件中的域名等参数进行过滤,只接收自己感兴趣的 domain 的数据。当 CDN 系统捕获到指定类型的、满足过滤条件的事件后,会自动调用函数处理。通过本文的示例,你将了解:Fun 如何使用 CDN 触发器连接 CDN 和函数计算。
1.编写函数
使用 CDN 触发器需要用户在函数代码中作出相应的调整,按照CDN的事件格式来编写handler。示例简单 demo:
exports.handler = function(event, context, callback) {
var eventObj = JSON.parse(event.toString());
console.log("event: " + event);
console.log('context: ', JSON.stringify(context));
console.log('eventName: '+ eventObj.events[0].eventName);
console.log('eventVersion: '+ eventObj.events[0].eventVersion);
console.log('eventSource: '+ eventObj.events[0].eventSource);
console.log('region: '+ eventObj.events[0].region);
console.log('eventParameter: '+ JSON.stringify(eventObj.events[0].eventParameter,null,4))
// cdn trigger 事件格式请参考 https://help.aliyun.com/document_detail/73333.html
callback(null, 'hello cdn_trigger');
};
2.描述 CDN 触发器
Fun 通过一个资源配置文件(template.yml),协助您进行开发、构建、部署。所以我们在 yml 中按照规范去描述 CDN 触发器:
Events:
cdn-trigger-name: # trigger name
Type: CDN # trigger type
Properties:
EventName: CachedObjectsRefreshed
EventVersion: '1.0.0'
Notes: cdn events trigger test
Filter:
Domain: ['cdn-trigger.sunfeiyu.top']
触发器参数说明:
-
EventName
为 CDN 端触发函数执行的事件,一经创建不能更改 -
EventVersion
为 CDN端触发函数执行事件的版本,一经创建不能更改 -
Notes
触发器的备注信息 -
Filter
过滤器(至少需要一个过滤器) -
Domain
CDN 服务中管理的域名,类型为数组。
在上面的示例中,我们定义了一个名为 cdn-trigger-name 的 CDN 触发器,触发事件 CachedObjectsRefreshed 表示资源刷新事件,在域名下触发将会强制 CDN 节点回源拉取最新的文件。完整的 template.yml 可以 参考。
CDN 事件触发器当前支持的事件及版本如下表所示:
事件名称 | 事件版本 | 过滤参数 | 备注 |
---|---|---|---|
CachedObjectsRefreshed | 1.0.0 | domain | CDN刷新资源 |
CachedObjectsBlocked | 1.0.0 | domain | CDN封禁资源 |
CachedObjectsPushed | 1.0.0 | domain | CDN预热资源 |
LogFileCreated | 1.0.0 | domain | 离线日志文件生成 |
3.部署
通过fun deploy
即可发布:
然后我们去函数计算控制台查看我们刚刚定义的 CDN 触发器:
CDN 事件格式
当 CDN 系统捕获到相关事件后,会将事件信息编码为 json 字符串,传递给函数进行处理。
下面以 CachedObjectsRefreshed,CachedObjectsPushed 和 CachedObjectsBlocked 事件格式为例。其它事件格式详情 参考。
{
"events": [
{
"eventName": "CachedObjectsRefreshed", // 事件类型
"eventVersion": "1.0.0", // 事件版本,目前都是1.0.0版本
"eventSource": "cdn", // 事件源名称
"region": "cn-shanghai", // 区域,默认为"cn-hangzhou"
"eventTime": "2018-03-16T14:19:55+08:00", // 事件发生时间
"traceId": "cf89e5a8-7d59-4bb5-a33e-4c3d08e25acf", // 事件源传递过来的id, 用于排查问题
"resource": {
"domain": "cdn-trigger.sunfeiyu.top" // 资源所在的域名
},
"eventParameter": {
"objectPath": [
"/2018/03/16/13/33b430c57e7.mp4", // 资源标识
"/2018/03/16/14/4ff6b9bd54d.mp4"
],
"createTime": 1521180769,
"domain": "cdn-trigger.sunfeiyu.top",
"completeTime": 1521180777,
"objectType": "File", // 刷新类型,取值为File,Directory
"taskId": 2089687230 // 资源刷新任务ID
},
"userIdentity": {
"aliUid": "1xxxxxxxxxx" // 主账号的账号 id
}
}
]
}
将 event 收起,更直观:
{
"events":Array[1]
}
总结
- 加速域名不能作为您 CDN 的源站。否则会造成循环解析,无法回源。
- 以 Function 为单位,定义在 Function 的 CDN 触发器一旦创建 eventName,eventVersion 不可修改。
- 预热适合文件首次发布到 CDN;刷新适合文件内容修改后,主动更新 CDN 中的文件到最新版本。
- 刷新支持 URL 刷新和文件夹刷新。原因:当 CDN 已经命中过文件后,CDN 会记录每个文件夹下面有哪些文件,就可以得出每个文件的 URL,文件夹刷新本质上是 URL 刷新的包装了一层壳。
- 阿里云 CDN 拥有先进的分布式系统架构,全球节点 2500+,六大洲覆盖。稳定高效的性能指标:95%+ 命中率,ms 级响应时间,视频 95%+ 流畅率,且国内节点数最多的云 CDN。