全部产品
云市场

定时触发函数

更新时间:2019-06-20 10:42:56

定时触发器(Time Trigger)

函数计算支持定时触发器(Time Trigger),即在指定的时间点触发函数的执行。本文分两部分对定时触发器进行介绍:

  • 定时触发器的配置方式与参数设置;
  • 定时触发器的使用方式,包括通过控制台创建定时触发器,通过 fcli 创建定时触发器,与通过调用 sdk 创建定时触发器三种方式。

定时触发器配置

  1. {
  2. payload:"payload"
  3. cronExpression: "cronExpression"
  4. enable: true|false
  5. }
  • payload: 代表触发器事件本身的输入内容,用户可以自定义
  • cronExpression: 函数被触发的时间,支持两种设置
    • @every
    • cron表达式

cronExpression的设置

注意:定时触发器目前允许的最小触发时间间隔为1分钟。下面两种cron表达式中如果时间间隔小于分钟会被认为是非法输入,请不要使用。

@every

@every Value Unit其中,value是一个正整数,Unit为"ns", "us" (or "µs"), "ms", "s", "m", "h",表示每隔Value Unit的时间触发一次函数

Example Expression
每5分钟触发一次函数运行 @every 5m
每1.5小时触发一次函数运行 @every 1.5h
每2小时45分钟触发一次函数运行 @every 2h45m

cron expression

cron(Seconds Minutes Hours Day-of-month Month Day-of-week ),即标准的cron表达式的形式

注意:Cron以UTC时间运行,即北京时间减去8个小时

字段名 允许的值 允许的特殊字符
Seconds 0-59
Minutes 0-59 , - * /
Hours 0-23 , - * /
Day-of-month 1-31 , - * ?/
Month 1-12 or JAN-DEC , - * /
Day-of-week 1-1 or SUN-SAT , - * ?

特殊字符的描述

字符名 定义 例子
* 表示任一,每一 在Minutes字段中表示每分钟的0秒都执行
, 表示列表值 在Day-of-week字段中MON,WED,FRI,表示星期一,星期三和星期五
- 表示一个范围 在小时字段中使用10-12,表示UTC时间从10到12点
? 表示不确定的值 与其他指定值一起使用。例如,如果指定了一个特定的日期,但你不在乎它落在星期几,那么Day-of-week字段就可以使用
/ 表示一个值的增加幅度,n/m表示从n开始,每次增加m 在minute字段3/5表示从3分开始,每隔5分钟执行

以下表格给出了cron expression的常用示例

下表的第一列为北京时间,第二列为相应的北京时间对应的UTC时间(即北京时间减去8小时),例如,北京时间12:00即为UTC时间的4:00,所以对应的cron表达式为0 0 4 * * *

示例(北京时间) 示例(UTC时间) 表达式
每天12:00触发函数 每天4:00触发函数 0 0 4 * * *
每天12:30触发函数 每天4:30触发函数 0 30 4 * * *
每小时的26分,29分,33分执行 每小时的26分,29分,33分执行 0 26,29,33 * * * *
周一到周五的每天12:30触发函数 周一到周五的每天4:30触发函数 0 30 4 ? * MON-FRI
周一到周五的每天12:00-14:00每5分钟触发函数 周一到周五的每天4:00-6:00每5分钟触发函数 0 0/5 4-6 ? * MON-FRI
一到四月每天12:00触发函数 一到四月每天4:00触发函数 0 0 4 ? JAN,FEB,MAR,APR *

Event格式

定时触发器会按照下面的 Event 格式来触发函数。您的函数可以根据 Event 做相应处理。

  1. {
  2. "triggerTime":"2018-02-09T05:49:00Z",
  3. "triggerName":"my_trigger",
  4. "payload":"awesome-fc"
  5. }
  • triggerTime 为 trigger 应该被触发的时间,一个 trigger 在一个应该被触发的时间可能会被触发多次,用户可以用这个值做去重处理
  • triggerNametrigger 的名称
  • payload 是用户在触发器配置里自定义的输入参数

使用方法

可以通过 函数计算控制台推荐)、 Fun推荐)、命令行工具fclisdk 三种方式设置函数的定时器,下面对这三种方式分别进行介绍

创建定时触发器配置不需要指定SourceArnInvocationRole

控制台(推荐)

您可以在新建函数时,创建定时触发器。

新建函数

您也可以定时触发已存在的函数。首先点击函数属性页,点击触发器页面,创建定时触发器。

定时触发已存在函数

通过命令行工具 Fun(推荐)

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

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

  1. ROSTemplateFormatVersion: '2015-09-01'
  2. Transform: 'Aliyun::Serverless-2018-04-03'
  3. Resources:
  4. FunDemo:
  5. Type: 'Aliyun::Serverless::Service'
  6. timedemo:
  7. Type: 'Aliyun::Serverless::Function'
  8. Properties:
  9. Handler: index.handler
  10. Runtime: nodejs8
  11. CodeUri: './'
  12. Events:
  13. TmTrigger:
  14. Type: Timer
  15. Properties:
  16. Payload: "awesome-fc"
  17. CronExpression: "0 0 8 * * *" # utc 时间,北京时间减8小时
  18. Enable: true

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

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

更多的配置规则 请参考

Fun 的更多教程 请参考

通过命令行工具 fcli

  • 首先,需要创建一个包含 TimeTrigger Config 的 yaml 文件,例如,每隔 5 个小时触发一次的输入参数为 “awesome-fc” 的函数触发器的 timeTriggerConfig.yaml 文件内容如下
    1. triggerConfig:
    2. payload: "awesome-fc"
    3. cronExpression: "0 0 0/5 * * ?"
    4. enable: true
  • 创建触发器(在对应的function目录下)mkt serviceName/functionName -t timer -c timeTriggerConfig.yaml

通过SDK调用

fc-python-sdk 为例,函数计算还提供 fc-nodejs-sdkfc-java-sdk

  1. import fc2
  2. client = fc2.Client(
  3. endpoint = '<Your Endpoint>',
  4. accessKeyID = '<Your AccessKeyID>',
  5. accessKeySecret = '<Your AccessKeySecret>')
  6. service_name = '<service_name>'
  7. function_name = '<function_name>'
  8. trigger_name = '<trigger_name>'
  9. trigger_type = 'timer'
  10. trigger_config = {
  11. 'payload': 'awesome-fc',
  12. 'cronExpression': '0 0 0/5 * * ?',
  13. 'enable': True
  14. }
  15. client.create_trigger(service_name, function_name,
  16. trigger_name, trigger_type, trigger_config, None, None)

函数代码

  1. import json
  2. import logging
  3. LOG = logging.getLogger()
  4. def handler(event, context):
  5. LOG.info('event: %s', event)
  6. evt = json.loads(event)
  7. triggerName = evt["triggerName"]
  8. triggerTime = evt["triggerTime"]
  9. message = evt["payload"]
  10. creds = context.credentials
  11. LOG.info('access_key_id: %s', creds.access_key_id)
  12. LOG.info("message = %s", message)

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