函数计算的正确使用姿势——CDN 触发器

  1. 云栖社区>
  2. 阿里云 Serverless Computing>
  3. 博客>
  4. 正文

函数计算的正确使用姿势——CDN 触发器

孙飞宇 2019-04-30 14:24:46 浏览923

前言

首先介绍下在本文出现的几个比较重要的概念:

函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息 参考

Fun: 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考

CDN: 阿里云内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上、由分布在不同区域的边缘节点服务器群组成的分布式网络。替代传统以Web Server为中心的数据传输模式,将源站资源缓存到阿里云全国各地的边缘服务器,供用户就近快速获取,提升用户体验,降低源站压力。CDN 更多信息 参考

准备

Fun 配置并部署 CDN 触发器

1556446468552_b6a7f169_2045_41c7_998f_5bc991d31b0c

阿里云内容分发网络和函数计算无缝集成,用户可以为 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即可发布:
fun_deploy

然后我们去函数计算控制台查看我们刚刚定义的 CDN 触发器:

console

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。