CDN触发器配置完成后,每当CDN服务在指定的加速域名下生成一个离线日志文件,CDN事件就会触发函数计算转存CDN离线日志。本文介绍如何在函数计算控制台上为目标函数配置CDN触发器,包括创建触发器、配置入口参数以及编写函数代码并测试。

示例场景

阿里云CDN支持的源站类型包括OSS域名、IP地址、源站域名和函数计算域名。每种源站类型都支持配置多个源站地址,多源站场景下,支持设置源站的主备优先级和权重,实现负载均衡。

本文以OSS作为源站,您需要在OSS控制台创建一个存储空间,获取域名作为源站,然后为源站添加加速域名。如需变更源站类型,请参见配置源站

前提条件

步骤一:创建CDN触发器

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 服务列表页面,找到目标服务,在其右侧操作列单击函数管理
  5. 函数管理页面,单击目标函数名称。
  6. 在函数详情页面,单击触发器管理页签,从版本或别名下拉列表选择要创建触发器的版本或别名,然后单击创建触发器
  7. 在创建触发器面板,填写相关信息。然后单击确定
    参数 操作 本文示例
    触发器类型 选择CDN CDN
    名称 填写自定义的触发器名称。 cdn-trigger
    版本或别名 默认值为LATEST,如果您需要创建其他版本或别名的触发器,需先在函数详情页的版本或别名下拉列表选择该版本。关于版本和别名的简介,请参见管理版本管理别名 LATEST
    触发事件 选择一个触发事件类型。

    如何选择触发事件类型,请参见CDN事件定义

    CdnDomainStarted
    触发事件版本 触发事件的版本号。
    说明 目前仅支持1.0.0事件版本。
    1.0.0
    域名 填写加速域名。 bucket*******.oss-cn-chengdu-internal.aliyuncs.com
    描述 填写域名的描述。 cdntrigger
    角色名称 选择AliyunCDNEventNotificationRole
    说明 如果您第一次创建该类型的触发器,单击确定后,则需在弹出的对话框中选择立即授权
    AliyunCDNEventNotificationRole

    创建完成后,在触发器名称列表中显示已创建的触发器。如需对创建的触发器进行修改或删除,具体操作,请参见触发器管理

步骤二:配置函数的入口参数

  1. 在函数详情页面,单击函数代码页签,然后单击xialatubiao图标,从下拉列表中,选择配置测试参数
  2. 配置测试参数面板,选择创建新测试事件编辑已有测试事件页签,填写事件名称和事件内容。然后单击确定

    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和CachedObjectsBlocked事件的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事件时,触发器会自动触发函数的执行。

  1. 在函数详情页面,单击函数代码页签,在代码编辑器中编写代码,然后单击保存并部署

    本文以Python函数代码为例。

    import json
    import oss2
    import requests
    
    def handler(event, context):
        creds = context.credentials
        auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
        bucket = oss2.Bucket(auth, 'your endpoint', 'your bucket name')
    
      # Parse the event to get the source object info.
      eventObj = json.loads(event)["events"]
      fileUrl = eventObj[0]["eventParameter"]["filePath"]
      file = requests.get(fileUrl)
      result = bucket.put_object("your log name", fileUrl)
    
      return result.status                       
  2. 单击函数代码页签的测试函数
    执行完成后,您可以在函数代码页签的上方查看执行结果。

更多信息

除了函数计算控制台,您还可通过以下方式配置触发器:
  • 通过Serverless Devs工具配置触发器。更多操作,请参见Serverless Devs
  • 通过SDK配置触发器。更多操作,请参见SDK列表

如需对创建的触发器进行修改或删除,具体操作,请参见触发器管理