触发器不能正常触发函数执行怎么办?

问题现象

触发器无法调用函数执行。

问题原因

可能存在的原因如下。

  • 没有成功生成触发事件。

  • 不满足触发规则。

  • 触发器配置的角色不正确。

解决方案

方案一:确认是否成功生成触发事件

  • OSS触发器

    例如您的场景是将文件上传到OSS后触发函数执行,那么您要排查的步骤如下:

    您需要确认文件是否已上传到对应的Bucket中。

    • 如果文件已上传完成,需要确认函数计算是否有运行日志。

      • 如果有运行日志说明函数被触发了,只是函数运行失败了,需要根据日志调试代码逻辑。

      • 如果没有运行日志说明函数没有被触发,需要排查是否满足触发规则,具体见方案二:确认是否满足触发器的触发规则

    • 如果文件没有上传完成,则需要确保先把文件上传完成。

  • SLS触发器

    如果SLS触发器未触发函数执行,您可以从以下两个方面排查。

    • 确认在SLS触发器配置的Logstore是否有数据增量修改,当Shard数据有变化时会触发函数运行。

    • 查看函数运行日志是否有异常。

方案二:确认是否满足触发器的触发规则

常见触发器的触发规则示例如下。

  • 定时触发器

    请排查定时触发器设置的触发方式及对应的时间。如果您设置的触发方式为自定义CRON 表达式,默认是UTC时间,请确认触发时间是否正确。更多信息,请参见步骤一:创建定时触发器

    • 如果您设置的CRON表达式为0 0 4 * * *,表示UTC时间为每天04:00触发函数执行,转化为北京时间即每天12:00触发函数执行。

    • 如果您设置的CRON表达式为CRON_TZ=Asia/Shanghai 0 0 4 1 * *,表示北京时间每月1号的04:00触发函数执行。

  • OSS触发器

    • OSS的Bucket和函数必须在同一个地域。

    • 上传的文件前缀或者文件后缀必须和触发器设置的文件前缀或文件后缀一致。

      例如,您为触发器设置的文件前缀为ab,您分别上传文件a/b.zipab.zipabc.zip,只有上传文件ab.zipabc.zip能触发器函数执行。

    • OSS事件必须和触发器的触发事件完全一致。以下几种情况会被认为OSS事件与触发事件不匹配,无法触发函数执行。

      • 您使用OSS Browser工具分片上传文件,上传完成后的事件为oss:ObjectCreated:CompleteMultipartUpload。如果您为触发器设置的触发事件为oss:ObjectCreated:PutObject或者oss:ObjectCreated:PostObject,将不能触发函数执行。

      • 您使用控制台上传文件的事件为oss:ObjectCreated:PostObject,而您为触发器设置的触发事件为oss:ObjectCreated:PutObject。或者您调用oss:ObjectCreated:PutObjectAPI接口上传文件的事件为oss:ObjectCreated:PutObject,而您为触发器设置的触发器事件为oss:ObjectCreated:PostObject

    • OSS中开启版本控制的Bucket,删除Object时必须指定版本ID。

      使用OSS Browser工具删除Object时如果不指定版本ID,将不会触发oss:ObjectRemoved:DeleteObjectoss:ObjectRemoved:DeleteObjects事件。当前版本Object会被转为历史版本Object,并添加删除标记。更多信息,请参见常见问题

    • EventBridge类别的OSS触发器创建成功后不会立即生效,需要等待30s后才能触发函数。

  • Tablestore触发器

    必须为Tablestore实例的数据表开启Stream信息。具体步骤,请参见步骤一:为数据表开启Stream功能

方案三:确认触发器的角色是否正确

请确认您为触发器配置的角色是否被删除,或者角色权限是否不足,建议您为触发器配置标准的角色。

相关文档

如果您上传文件到OSS触发函数执行了多次,需要重新设置触发事件,具体请参见文件上传到OSS触发函数执行多次,要如何处理?