全部产品
云市场

CDN 事件触发器

更新时间:2020-01-07 16:32:57

CDN 事件触发器(CDN events trigger)

阿里云内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上、由分布在不同区域的边缘节点服务器群组成的分布式网络。替代传统以Web Server为中心的数据传输模式,将源站资源缓存到阿里云全国各地的边缘服务器,供用户就近快速获取,提升用户体验,降低源站压力。阿里云内容分发网络和函数计算无缝集成,用户可以为CDN的各种事件设置处理函数,并允许用户通过事件中的域名等参数进行过滤,只接收自己感兴趣的domain的数据。当CDN系统捕获到指定类型的、满足过滤条件的事件后,会自动调用函数处理。例如,用户可以设置函数来处理“www.taobao.com” 域名的资源刷新事件。

CDN事件触发器使用的主要场景:

  1. CDN在预热(CachedObjectsPushed)和刷新(CachedObjectsRefreshed )用户数据后,通过触发器通知用户函数。避免用户不断轮询列表查询最新状态,可以及时得知资源预热刷新的状态并进行下一步处理。
  2. 当在CDN上发现违禁内容(CachedObjectsBlocked )时,通过触发器通知用户函数直接去源站删除资源。用户不需要等待CDN团队响应,可以及时去源站删除资源。
  3. 日志文件生成后(LogFileCreated ),通过触发器通知用户函数处理日志。用户不需要长时间等待日志,可以及时转存或处理日志。

CDN事件定义

当CDN系统捕获到相关事件后,会将事件信息编码为json字符串,传递给函数进行处理。CDN事件触发器当前支持的事件及版本如下表所示:

事件名称 事件版本 过滤参数 备注
CachedObjectsRefreshed 1.0.0 domain CDN刷新资源
CachedObjectsBlocked 1.0.0 domain CDN封禁资源
CachedObjectsPushed 1.0.0 domain CDN预热资源
LogFileCreated 1.0.0 domain 离线日志文件生成
CdnDomainStarted 1.0.0 domain CDN域名上线
CdnDomainStopped 1.0.0 domain CDN域名下线
CdnDomainAdded 1.0.0 domain CDN域名下线
CdnDomainDeleted 1.0.0 domain 删除已添加的加速域名

CDN事件格式示例:

CachedObjectsRefreshed,CachedObjectsPushed和CachedObjectsBlocked事件格式:

  1. {
  2. "events": [
  3. {
  4. "eventName": "CachedObjectsRefreshed",//事件类型
  5. "eventVersion": "1.0.0", // 事件版本,目前都是1.0.0版本
  6. "eventSource": "cdn", // 事件源名称
  7. "region": "cn-hangzhou", // 区域,默认为"cn-hangzhou"
  8. "eventTime": "2018-03-16T14:19:55+08:00",//事件发生时间
  9. "traceId": "cf89e5a8-7d59-4bb5-a33e-4c3d08e25acf",//事件源传递过来的id, 用于排查问题
  10. "resource": {
  11. "domain": "example.com"//资源所在的域名
  12. },
  13. "eventParameter": {
  14. "objectPath": [
  15. "/2018/03/16/13/33b430c57e7.mp4",//资源标识
  16. "/2018/03/16/14/4ff6b9bd54d.mp4"//资源标识
  17. ],
  18. "createTime": 1521180769,//刷新开始时间
  19. "domain": "example.com",//资源所在的域名
  20. "completeTime": 1521180777,//刷新结束时间
  21. "objectType": "File", //刷新类型,取值为FileDirectory
  22. "taskId": 2089687230 //资源刷新任务ID
  23. },
  24. "userIdentity": {
  25. "aliUid": "1xxxxxxxxxx" //用户ID
  26. }
  27. }
  28. ]
  29. }

LogFileCreated事件格式:

  1. {
  2. "events": [
  3. {
  4. "eventName": "LogFileCreated",//事件类型
  5. "eventSource": "cdn",//事件源名称
  6. "region": "cn-hangzhou",//区域,默认为cn-hangzhou
  7. "eventVersion": "1.0.0",//事件版本
  8. "eventTime": "2018-06-14T15:31:49+08:00",//事件发生时间
  9. "userIdentity": {
  10. "aliUid": "1xxxxxxxxxxxx" //用户ID
  11. },
  12. "resource": {
  13. "domain": "example.com"//域名
  14. },
  15. "eventParameter": {
  16. "domain": "example.com",//域名
  17. "endTime": 1528959900,//日志文件的结束时间
  18. "fileSize": 1788115,//日志文件大小
  19. "filePath": "http://cdnlog.cn-hangzhou.oss.aliyun-inc.com/www.aliyun.com/2017_12_27/www.aliyun.com_2017_12_27_0800_0900.gz?OSSAccessKeyId=xxxx&Expires=xxxx&Signature=xxxx",//日志文件地址
  20. "startTime": 1528959600//日志文件的起始时间
  21. },
  22. "traceId": "c6459282-6a4d-4413-894c-e4ea39686738" //事件源传递过来的id, 用于排查问题
  23. }
  24. ]
  25. }

配置CDN事件触发器:

触发器示例:cdn_events_trigger.yml

  1. triggerConfig:
  2. eventName: "LogFileCreated"
  3. eventVersion: "1.0.0"
  4. notes: "cdn events trigger test"
  5. filter:
  6. domain: ["www.taobao.com","www.tmall.com"]

触发器参数说明

  • eventName 为CDN端触发函数执行的事件,一经创建不能更改
  • eventVersion为CDN端触发函数执行事件的版本,一经创建不能更改
  • notes备注
  • filter 过滤器(至少需要一个过滤器)

filter格式:

  1. filter:
  2. 过滤参数1: [过滤参数值a,过滤参数值b]
  3. 过滤参数2: [过滤参数值c,过滤参数值d]

使用示例

可以通过函数计算控制台命令行工具fcliSDK三种方式设置函数的CDN事件触发器,下面对这三种方式分别进行介绍:

示例1: 控制台新建CDN事件触发器(推荐)

本示例展示了使用控制台设置CDN事件触发器的方式。可以在创建函数的时候设置触发器,也可以在函数创建完成后再设置触发器。对触发器和创建触发器有困惑的同学可以参考文档使用事件源服务创建触发器

首先登录 函数计算管理控制台,选择相应的区域和服务。如果还未新建服务,请参考创建服务

在创建函数时设置触发器

  1. 单击 创建函数,进入创建函数页面,选择 空白函数,单击下一步
  2. 选择CDN事件触发器,并按下图进行配置createFunctionTrigger
  3. 创建函数,填写相应信息,选择 在线编辑,并粘贴以下 python runtime的函数示例代码,单击 下一步
  1. import json
  2. import logging
  3. LOG = logging.getLogger()
  4. def handler(event, context):
  5. logger = logging.getLogger()
  6. eventObj = json.loads(event)["events"]
  7. logger.info("EventCount: %d" % len(eventObj))
  8. logger.info("eventName: %s" % eventObj[0]["eventName"])
  9. logger.info("eventVersion: %s" % eventObj[0]["eventVersion"])

4.(可选)配置权限,单击 下一步, 核对信息无误后,单击 创建

在函数创建完成后设置触发器

  1. 选中已有的函数,单击 触发器 > 创建触发器
  2. 在创建触发器页面,按下图配置CDN事件触发器,单击 确定createTrigger

示例2: Fun 新建、更新 CDN 事件触发器(推荐)

Fun 提供了 CDN 触发器 的支持,可以实现函数触发器的创建与更新。下面,我们介绍使用 Fun 配置 CDN 触发器的步骤。

在项目根目录创建一个 template.yml 文件,并将内容填充为:

  1. ROSTemplateFormatVersion: '2015-09-01'
  2. Transform: 'Aliyun::Serverless-2018-04-03'
  3. Resources:
  4. FunDemo:
  5. Type: 'Aliyun::Serverless::Service'
  6. cdndemo:
  7. Type: 'Aliyun::Serverless::Function'
  8. Properties:
  9. Handler: index.handler
  10. Runtime: nodejs8
  11. CodeUri: './'
  12. Events:
  13. cdn-trigger-name: # trigger name
  14. Type: CDN # trigger type
  15. Properties:
  16. EventName: CachedObjectsRefreshed
  17. EventVersion: '1.0.0'
  18. Notes: cdn events trigger test
  19. Filter:
  20. Domain: ['ide.fc.aliyun.com']

在项目根目录创建一个 index.js,然后编写相应的逻辑代码就可以了。代码编写完成,直接执行 fun deploy 即可实现部署。完整的示例请参考

如果想在本地单步调试、运行函数,可以参考 开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试

更多的配置规则 请参考

Fun 的更多教程 请参考

示例3: fcli新建CDN事件触发器

首先,创建一个包含Trigger Config的yaml文件。以domain为www.taobao.com 和 www.tmall.com 离线日志文件生成事件为例,对应的yaml文件内容如下:

  1. triggerConfig:
  2. eventName: "LogFileCreated"
  3. eventVersion: "1.0.0"
  4. notes: "cdn events trigger test"
  5. filter:
  6. domain: ["www.taobao.com","www.tmall.com"]

在对应的function目录下创建触发器:

  1. mkt triggerName -t cdn_events -r acs:ram::account_id:role/AliyunCDNEventNotificationRole -s acs:cdn:*:account_id -c TriggerConfig.yaml

更多fcli使用,请参考fcli开发指南

示例4: SDK编程新建CDN事件触发器

fc-python-sdk为例演示如何通过SDK新建CDN事件触发器。函数计算还提供fc-nodejs-sdkfc-java-sdk.

新建触发器代码

  1. client = fc2.Client(
  2. endpoint='<Your Endpoint>',
  3. accessKeyID='<Your AccessKeyID>',
  4. accessKeySecret='<Your AccessKeySecret>')
  5. service_name = 'serviceName'
  6. function_name = 'functionName'
  7. trigger_name = 'triggerName'
  8. trigger_type = 'cdn_events'
  9. source_arn = 'acs:cdn:*:<Your Account ID>'
  10. invocation_role = 'acs:ram::<Your Account ID>:role/<Your Invocation Role>'
  11. trigger_config = {
  12. 'eventName': 'LogFileCreated',
  13. 'eventVersion': '1.0.0',
  14. 'notes': 'notes',
  15. 'filter': {
  16. 'domain' : ['www.taobao.com'],
  17. }
  18. }
  19. client.create_trigger(service_name, function_name, trigger_name, trigger_type, trigger_config, source_arn, invocation_role)

函数代码

  1. import json
  2. import logging
  3. LOG = logging.getLogger()
  4. def handler(event, context):
  5. logger = logging.getLogger()
  6. eventObj = json.loads(event)["events"]
  7. logger.info("EventCount: %d" % len(eventObj))
  8. logger.info("eventName: %s" % eventObj[0]["eventName"])
  9. logger.info("eventVersion: %s" % eventObj[0]["eventVersion"])

如有疑问可留言,或加入函数计算官方客户群(钉钉群号:11721331)