CDN触发器配置完成后,每当CDN服务在指定的加速域名下生成一个离线日志文件,CDN事件就会触发函数计算转存CDN离线日志。本文介绍如何在函数计算控制台上为目标函数配置CDN触发器,包括创建触发器、配置入口参数以及编写函数代码并测试。
示例场景
阿里云CDN支持的源站类型包括OSS域名、IP地址、源站域名和函数计算域名。每种源站类型都支持配置多个源站地址,多源站场景下,支持设置源站的主备优先级和权重,实现负载均衡。
本文以OSS作为源站,您需要在OSS控制台创建一个存储空间,获取域名作为源站,然后为源站添加加速域名。如需变更源站类型,请参见配置源站。
前提条件
步骤一:创建CDN触发器
- 登录函数计算控制台,在左侧导航栏,单击服务及函数。 
- 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务操作列的函数管理。 
- 在函数管理页面,单击目标函数名称。 
- 在函数详情页面,单击触发器管理页签,从版本或别名下拉列表选择要创建触发器的版本或别名,然后单击创建触发器。 
- 在创建触发器面板,填写相关信息。然后单击确定。 - 参数 - 操作 - 本文示例 - 触发器类型 - 选择CDN。 - CDN - 名称 - 填写自定义的触发器名称。 - cdn-trigger - 版本或别名 - 默认值为LATEST,如果您需要创建其他版本或别名的触发器,需先在函数详情页的版本或别名下拉列表选择该版本。关于版本和别名的简介,请参见管理版本和管理别名。 - LATEST - 触发事件 - 选择一个触发事件类型。 - 如何选择触发事件类型,请参见CDN事件定义。 - CdnDomainStarted - 触发事件版本 - 触发事件的版本号。 说明- 目前仅支持1.0.0事件版本。 - 1.0.0 - 域名 - 填写加速域名。 - bucket*******.oss-cn-chengdu-internal.aliyuncs.com - 描述 - 填写域名的描述。 - cdntrigger - 角色名称 - 选择AliyunCDNEventNotificationRole。 说明- 如果您第一次创建该类型的触发器,单击确定后,则需在弹出的对话框中选择立即授权。 - AliyunCDNEventNotificationRole - 创建完成后,在触发器名称列表中显示已创建的触发器。如需对创建的触发器进行修改或删除,具体操作,请参见触发器管理。 
步骤二:配置函数的入口参数
- 在函数详情页面,单击函数代码页签,然后单击测试函数右侧  图标,从下拉列表中,选择配置测试参数。 图标,从下拉列表中,选择配置测试参数。
- 在配置测试参数面板,选择创建新测试事件或编辑已有测试事件页签,填写事件名称和事件内容。然后单击确定。 - event是函数计算的入口参数,具体格式如下。其中,对于不同的CDN事件类型,eventParameter中包含的键值对不同。 - LogFileCreated事件的event示例。 - 替换 - filePath为您CDN日志的路径,或任何测试文件。- { "events": [ { "eventName": "LogFileCreated", "eventSource": "cdn", "region": "cn-hangzhou", "eventVersion": "1.0.0", "eventTime": "2018-06-14T15:31:49+08:00", "traceId": "c6459282-6a4d-4413-894c-e4ea3968****", "userIdentity": { "aliUid": "164901546557****" }, "resource": { "domain": "example.com" }, "eventParameter": { "domain": "example.com", "endTime": 1528959900, "fileSize": 1788115, "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", "startTime": 1528959600 } } ] }- event参数中不同属性字段的解释如下表所示。 - 参数 - 类型 - 示例值 - 描述 - eventName - String - LogFileCreated - 事件类型。 - eventSource - String - cdn - 事件源名称。 - region - String - cn-hangzhou - CDN所在地域,默认为cn-hangzhou。 - eventVersion - String - 1.0.0 - 事件触发版本。 - eventTime - String - 2018-06-14T15:31:49+08:00 - 事件发生时间。 - traceId - String - c6459282-6a4d-4413-894c-e4ea3968**** - 事件源传递的ID,用于排查问题。 - userIdentity - Map - 用户属性。 - aliUid - String - 164901546557**** - 阿里云账号ID。 - resource - Map - 资源信息。 - domain - String - example.com - 域名。 - eventParameter - Map - 事件参数。 - domain - String - example.com - 域名。 - endTime - String - 1528959900 - 日志文件的结束时间。 - fileSize - String - 1788115 - 日志文件大小。 - filePath - String - 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 - 日志文件地址。 - startTime - String - 1528959600 - 日志文件的起始时间。 
- CachedObjectsRefreshed和CachedObjectsPushed事件的event示例。 - { "events": [ { "eventName": "CachedObjectsRefreshed", "eventVersion": "1.0.0", "eventSource": "cdn", "region": "cn-hangzhou", "eventTime": "2018-03-16T14:19:55+08:00", "traceId": "cf89e5a8-7d59-4bb5-a33e-4c3d08e2****", "resource": { "domain": "example.com" }, "eventParameter": { "objectPath": [ "/2018/03/16/13/33b430c57e7.mp4", "/2018/03/16/14/4ff6b9bd54d.mp4" ], "createTime": 1521180769, "domain": "example.com", "completeTime": 1521180777, "objectType": "File", "taskId": 2089687230 }, "userIdentity": { "aliUid": "164901546557****" } } ] }- event参数中不同属性字段的解释如下表所示。 - 参数 - 类型 - 示例值 - 描述 - eventName - String - CachedObjectsRefreshed - 事件类型。 - eventSource - String - cdn - 事件源名称。 - region - String - cn-hangzhou - CDN所在地域,默认为cn-hangzhou。 - eventVersion - String - 1.0.0 - 事件触发版本。 - eventTime - String - 2018-06-14T15:31:49+08:00 - 事件发生时间。 - traceId - String - c6459282-6a4d-4413-894c-e4ea3968**** - 事件源传递的ID,用于排查问题。 - resource - Map - 资源信息。 - domain - String - example.com - 域名。 - eventParameter - Map - 事件参数。 - objectPath - String - /2018/03/16/13/33b430c57e7.mp4 - 资源标识。 - createTime - String - 1521180769 - 刷新开始时间。 - domain - String - example.com - 域名。 - completeTime - String - 1521180777 - 刷新结束时间。 - objectType - String - File - 刷新类型,取值说明如下: - File:文件。 
- Directory:文件夹。 
 - taskId - String - 2089687230 - 资源刷新任务ID。 - userIdentity - Map - 用户属性。 - aliUid - String - 164901546557**** - 阿里云账号ID。 
- CdnDomainStarted和CdnDomainStopped事件的event示例。 - { "events": [ { "eventName": "CdnDomainStarted", "eventVersion": "1.0.0", "eventSource": "cdn", "region": "cn-hangzhou", "eventTime": "2018-03-16T14:19:55+08:00", "traceId": "cf89e5a8-7d59-4bb5-a33e-4c3d08e2****", "resource": { "domain": "example.com" }, "eventParameter": { "domain": "example.com", "status": "online" }, "userIdentity": { "aliUid": "164901546557****" } } ] }- event参数中不同属性字段的解释如下表所示。 - 参数 - 类型 - 示例值 - 描述 - eventName - String - CdnDomainStarted - 事件类型。 - eventSource - String - cdn - 事件源名称。 - region - String - cn-hangzhou - CDN所在地域,默认为cn-hangzhou。 - eventVersion - String - 1.0.0 - 事件触发版本。 - eventTime - String - 2018-06-14T15:31:49+08:00 - 事件发生时间。 - traceId - String - c6459282-6a4d-4413-894c-e4ea3968**** - 事件源传递的ID,用于排查问题。 - resource - Map - 资源信息。 - domain - String - example.com - 域名。 - eventParameter - Map - 事件参数。 - domain - String - example.com - 域名。 - status - String - online - 域名状态。 - userIdentity - Map - 用户属性。 - aliUid - String - 164901546557**** - 阿里云账号ID。 
- CdnDomainAdded和CdnDomainDeleted事件的event示例。 - { "events": [ { "eventName": "CdnDomainAdded", "eventVersion": "1.0.0", "eventSource": "cdn", "region": "cn-hangzhou", "eventTime": "2018-03-16T14:19:55+08:00", "traceId": "cf89e5a8-7d59-4bb5-a33e-4c3d08e2****", "resource": { "domain": "example.com" }, "eventParameter": { "domain": "example.com" }, "userIdentity": { "aliUid": "164901546557****" } } ] }- event参数中不同属性字段的解释如下表所示。 - 参数 - 类型 - 示例值 - 描述 - eventName - String - CdnDomainAdded - 事件类型。 - eventSource - String - cdn - 事件源名称。 - region - String - cn-hangzhou - CDN所在地域,默认为cn-hangzhou。 - eventVersion - String - 1.0.0 - 事件触发版本。 - eventTime - String - 2018-06-14T15:31:49+08:00 - 事件发生时间。 - traceId - String - c6459282-6a4d-4413-894c-e4ea3968**** - 事件源传递的ID,用于排查问题。 - resource - Map - 资源信息。 - domain - String - example.com - 域名。 - eventParameter - Map - 事件参数。 - domain - String - example.com - 域名。 - userIdentity - Map - 用户属性。 - aliUid - String - 164901546557**** - 阿里云账号ID。 
 
步骤三:编写函数代码并测试
完成创建CDN事件触发器后,您可以开始编写函数代码并测试以验证代码的正确性,在实际操作过程中当发生CDN事件时,触发器会自动触发函数的执行。
- 在函数详情页面,单击函数代码页签,在代码编辑器中编写代码,然后单击部署代码。 - 本文以Python函数代码为例。 - # -*- coding: utf-8 -*- import logging import json logger = logging.getLogger("cdn-sample") def handler(event, context): evt = json.loads(event) eventObj = evt["events"][0] eventName = eventObj['eventName'] info = "" eventParam = eventObj['eventParameter'] domain = eventParam['domain'] if eventName == "CachedObjectsRefreshed" or eventName == "CachedObjectsPushed": objPathList = eventParam['objectPath'] info = ",".join(objPathList) elif eventName == "LogFileCreated": info = eventParam['filePath'] elif eventName == "CdnDomainStarted" or eventName == "CdnDomainStopped": # 对应业务逻辑 pass elif eventName == "CdnDomainAdded" or eventName == "CdnDomainDeleted": # 对应业务逻辑 pass return f"eventName:{eventName}, domain: {domain}, info: {info}"
- 单击函数代码页签的测试函数。 - 执行完成后,您可以在函数代码页签的上方查看执行结果。 
更多信息
除了函数计算控制台,您还可通过以下方式配置触发器:
- 通过Serverless Devs工具配置触发器。更多操作,请参见Serverless Devs。 
- 通过SDK配置触发器。更多操作,请参见SDK列表。 
如需对创建的触发器进行修改或删除,具体操作,请参见触发器管理。