配置CDN触发器

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

示例场景

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

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

前提条件

步骤一:创建CDN触发器

  1. 登录函数计算控制台,在左侧导航栏,单击服务及函数

  2. 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务操作列的函数管理

  3. 函数管理页面,单击目标函数名称。

  4. 在函数详情页面,单击触发器管理页签,从版本或别名下拉列表选择要创建触发器的版本或别名,然后单击创建触发器

  5. 在创建触发器面板,填写相关信息。然后单击确定

    参数

    操作

    本文示例

    触发器类型

    选择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事件的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函数代码为例。

    # -*- 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}"   
  2. 单击函数代码页签的测试函数

    执行完成后,您可以在函数代码页签的上方查看执行结果。

更多信息

除了函数计算控制台,您还可通过以下方式配置触发器:

  • 通过Serverless Devs工具配置触发器。更多操作,请参见Serverless Devs

  • 通过SDK配置触发器。更多操作,请参见SDK列表

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