文档首页/ 内容分发网络 CDN/ 最佳实践/ 使用函数工作流服务实现定时刷新缓存功能
更新时间:2024-07-15 GMT+08:00
分享

使用函数工作流服务实现定时刷新缓存功能

方案概述

定时刷新功能是华为云CDN配合函数工作流,在函数工作流服务创建定时刷新函数,从而实现定时刷新功能。如果您的业务需要定时刷新CDN节点缓存,以保证用户能获取到最新的资源,您可以通过本方案实现

本文以Python3.9为例,为您介绍通过控制台创建FunctionGraph函数和Timer触发器,实现定时刷新CDN缓存的功能。

资源与成本规划

本实践所需资源请见下表。

资源

资源说明

每月费用

内容分发网络 CDN

流量:用户访问CDN节点产生的流量,可购买流量包抵扣。

具体的计费方式及标准请参考计费说明

函数工作流 FunctionGraph

请求次数费用、执行时间费用和其他费用,按需计费。

具体的计费方式及标准请参考函数工作流计费项

实施步骤

  1. 创建委托
    1. 登录华为云控制台,在左侧导航栏,选择管理与监管>统一身份认证服务
    2. 在左侧导航栏,选择“委托”页签,单击右上方的“创建委托”。
    3. 在创建委托页面,按照如下参数设置委托。
      • 委托名称:FG_TO_CDN001。
      • 委托类型:云服务。
      • 云服务:函数工作流FunctionGraph。
      • 持续时间:永久。

    4. 单击“下一步”,在“选择策略”页面勾选“CDN RefreshAndPreheatAccess”策略。
    5. 单击“下一步”,选择授权范围。可根据业务需求选择“所有资源”“全局服务资源”
    6. 单击“确定”,完成委托创建。
  2. 创建事件函数
    1. 登录华为云控制台,在左侧导航栏,选择计算>函数工作流”,region选择可根据业务情况自行选择。
    2. 单击右上方“创建函数”,进入创建函数界面,选择“空白模板”
      • 函数类型:事件函数。
      • 区域:默认。
      • 项目:默认。
      • 输入函数名称:cdn-auto-refresh(可自定义)。
      • 委托名称:选择已创建好的委托“FG_TO_CDN001” 。
      • 运行时语言:选择“Python 3.9”。
    3. 单击“创建函数”,进入代码编辑页面。
    4. 代码示例中的代码复制到代码窗,单击“部署”
    5. 部署完成后,可以单击“测试”手动触发函数,验证函数是否可用。
  3. 创建触发器。在函数界面,单击“创建触发器”,设置相关参数。
    • 触发器类型:定时触发器 (TIMER)。
    • 定时器名称:自定义的定时器名称,例如:Timer-0001。
    • 触发规则:固定频率或Cron表达式。
      • 固定频率:固定时间间隔触发函数,该类型下支持配置单位为分、时、天,每种类型仅支持整数配置,其中分钟支持范围(0,60],小时支持范围(0,24],天支持范围(0,30]。
      • Cron表达式:设置更为复杂的函数执行计划,例如:周一到周五上午08:30:00执行函数等,具体请参见函数定时触发器Cron表达式规则
    • 是否开启:开启。
  4. 配置完成后,将根据触发器设置的频率定时执行刷新任务。

代码示例

使用代码示例时请根据需要调整刷新类型(type)及需要刷新的URL(urls)。

# -*- coding:utf-8 -*-
import json
import requests
def handler (event, context):
    header = {"x-auth-token":context.getToken(),'content-type':'application/json;charset=utf-8'}
    data = {
        "refresh_task":{
            "type":"file",
            "urls":["https://example.com/1.txt"]
        }
    }
    url = 'https://cdn.myhuaweicloud.com/v1.0/cdn/content/refresh-tasks'
    result = requests.post(url=url,headers=header,data=json.dumps(data))
    context.getLogger().info(result.text)
    return {
        'statusCode': 200,
        'body': result.text,
        'isBase64Encoded': False,
        'headers': {
            'Content-Type': 'application/json'
        }
    }

相关文档