本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
OSS与函数计算集成后,OSS事件能触发相关函数执行,实现对OSS中的数据的自定义处理。本文介绍函数计算支持的OSS触发器的使用限制、事件类型及触发规则。
背景信息
OSS和函数计算通过OSS触发器实现无缝集成,您可以编写函数对OSS事件进行自定义处理,当OSS捕获到指定类型的事件后,OSS事件触发相应的函数执行。例如,您可以设置函数来处理PutObject事件,当您调用OSS的PutObject接口上传图片到OSS后,相关联的函数会自动被触发来处理该图片。
OSS和函数计算集成后,您可以自由地调用各种函数处理图像或音频数据,再把结果写回到多种存储服务中。整个架构中,您只需要专注于函数逻辑的编写,系统将以实时的、可靠的、大规模并行的方式处理海量的数据。
OSS触发器使用限制
仅EventBridge类别的OSS触发器支持配置多个文件前缀和文件后缀。
原生OSS触发器和EventBridge类别的OSS触发器配置的文件前缀和文件后缀都不支持正则匹配。
仅EventBridge类别的OSS触发器支持在一个Bucket内关联超过10个以上的OSS触发器。
一般情况下,不推荐一个Bucket下关联10个以上的触发器,建议您创建新的Bucket,并基于新的Bucket创建触发器。
OSS事件定义
当OSS系统捕获到相关事件后,会将事件信息编码为JSON字符串,传递给事件处理函数。OSS事件通知格式的详细信息,请参见消息通知。
已支持的OSS事件定义如下表所示。一种事件类型对应一个ObjectCreated、ObjectRemoved或ObjectModified类型的API,调用某个API并执行成功后会触发函数执行一次。
事件类型 | 事件名称 | 说明 |
ObjectCreated | oss:ObjectCreated:PutObject | 调用PutObject接口上传文件。更多信息,请参见PutObject。 |
oss:ObjectCreated:PutSymlink | 调用PutSymlink接口针对OSS上的TargetObject创建软链接,您可以通过该软链接访问TargetObject。更多信息,请参见PutSymlink。 | |
oss:ObjectCreated:PostObject | 调用PostObject接口使用HTML表单上传文件到指定的Bucket。更多信息,请参见PostObject。 | |
oss:ObjectCreated:CopyObject | 调用CopyObject接口拷贝一个在OSS上已经存在的对象。更多信息,请参见CopyObject。 | |
oss:ObjectCreated:InitiateMultipartUpload | 使用MultipartUpload模式传输数据前,必须先调用InitiateMultipartUpload接口来通知OSS初始化一个MultipartUpload事件。更多信息,请参见InitiateMultipartUpload。 | |
oss:ObjectCreated:UploadPart | 初始化一个MultipartUpload事件之后,可以根据指定的对象名和Upload ID来分块(Part)上传数据。更多信息,请参见UploadPart。 | |
oss:ObjectCreated:UploadPartCopy | UploadPartCopy通过从一个已存在的Object中拷贝数据来上传一个Part。更多信息,请参见UploadPartCopy。 | |
oss:ObjectCreated:CompleteMultipartUpload | 在将所有数据Part都上传完成后,必须调用CompleteMultipartUpload接口来完成整个文件的MultipartUpload。更多信息,请参见CompleteMultipartUpload。 | |
oss:ObjectCreated:AppendObject | 调用AppendObject接口以追加写的方式上传文件。更多信息,请参见AppendObject。 | |
oss:ObjectCreated:* | 调用任何上述ObjectCreated类型的API执行成功后都会触发函数。 | |
ObjectRemoved | oss:ObjectRemoved:DeleteObject | 调用DeleteObject接口删除某个对象。更多信息,请参见DeleteObject。 |
oss:ObjectRemoved:DeleteObjects | 调用DeleteMultipleObjects接口批量删除文件。更多信息,请参见DeleteMultipleObjects。 | |
oss:ObjectRemoved:AbortMultipartUpload | 调用AbortMultipartUpload接口可以根据用户提供的Upload ID终止其对应的MultipartUpload事件。更多信息,请参见AbortMultipartUpload。 | |
ObjectModified | oss:ObjectModified:UpdateObjectMeta | 调用UpdateObjectMeta接口修改某个对象的属性。 说明 目前,支持该事件的地域包括:华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华北3(张家口)、华北5(呼和浩特)、华南1(深圳)和西南1(成都)。 |
ObjectReplication | oss:ObjectReplication:ObjectCreated | 数据复制过程涉及的写入操作。 |
oss:ObjectReplication:ObjectModified | 数据复制过程涉及的覆盖操作。 | |
oss:ObjectReplication:ObjectRemoved | 数据复制过程涉及的删除操作。 |
OSS触发器触发规则
避免循环触发
使用OSS触发器时,请注意避免循环触发。例如,一个典型的循环触发场景是OSS的某个Bucket上传文件事件触发函数执行,此函数执行完成后又生成了一个或多个文件再写回到OSS的Bucket里,这个写入动作又触发了函数执行,形成了链状循环。
为了避免循环触发函数产生不必要的费用,建议您配置文件前缀或文件后缀,例如将触发函数的文件的文件前缀设置为src
,函数执行完成后生成文件的文件前缀设置为dst
,生成的文件将不会再次触发函数。如果不设置文件前缀和文件后缀,表示匹配任意文件前缀和文件后缀。具体操作,请参见步骤一:创建OSS触发器。
原生OSS触发器配置规则
为了避免在同一个Bucket下创建重复的触发器导致单个事件同时触发多个触发器,函数计算限制单个Bucket下触发器配置必须满足以下条件:
触发事件、文件前缀和文件后缀组成的组合必须唯一。
新建触发器只有在其“触发事件 + 文件前缀 + 文件后缀”组合与已有触发器不冲突时,才能成功创建。
以下通过具体示例说明原生OSS触发器的配置规则:
已有触发器 | 新建触发器 | 新建触发器是否成功 | 说明 | ||||
触发事件 | 文件前缀 | 文件后缀 | 触发事件 | 文件前缀 | 文件后缀 | ||
oss:ObjectCreated:PutObject | source | zip | oss:ObjectCreated:* | source | zip | 不成功 | oss:ObjectCreated:*是所有ObjectCreated类型事件的全集。新建触发器的事件oss:ObjectCreated:*匹配已有相同文件前后缀的触发器的事件oss:ObjectCreated:PutObject。 |
source1 | zip1 | 成功 | 新建触发器和已有触发器的事件类型和文件前缀匹配,但文件后缀不匹配。 | ||||
oss:ObjectCreated:PutObject | source | zip | 不成功 | 新建触发器与已有触发器的事件类型、文件前缀和文件后缀都匹配。 | |||
source | 1zip | 不成功 | |||||
source1 | zip | 不成功 | |||||
source | 无 | 不成功 | 新建触发器与已有触发器的事件类型和文件前缀匹配,文件后缀不设置则包含了后缀为zip的对象,即文件后缀也匹配。 | ||||
无 | zip | 不成功 | 新建触发器与已有触发器的事件类型和文件后缀匹配,文件前缀不设置则包含了前缀为source的对象,即文件前缀也匹配。 | ||||
source1 | zip1 | 成功 | 新建触发器与已有触发器的事件类型和文件前缀匹配,但文件后缀不匹配。 | ||||
1source | 1zip | 成功 | 新建触发器与已有触发器的事件类型和文件后缀匹配,但文件前缀不匹配。 | ||||
oss:ObjectCreated:PostObject | source | zip | 成功 | 新建触发器与已有触发器的事件类型不匹配。 |
文件前缀匹配原则为前向匹配,文件后缀匹配原则为后向匹配。
以下介绍两种冲突类型,两种冲突同时存在,则新建触发器不成功,两种冲突都不存在或只存在其中一种冲突,新建触发器可以成功。
事件类型冲突
已有触发器事件类型 | 新建触发器事件类型 | 冲突说明 |
|
|
|
|
|
路径匹配冲突
已有触发器路径 | 新建触发器路径 | 冲突说明 |
|
| 前缀不匹配,后缀匹配,路径不冲突 |
|
| 前缀匹配,后缀不匹配,路径不冲突 |
|
| 前缀匹配,后缀匹配,路径冲突 |
如果您希望一个OSS事件类型可以触发不同的函数进行不同的处理,即为不同的函数配置相同的OSS触发器,可以创建EventBridge类别的OSS触发器。
常见问题
相关文档
配置触发器
关于如何配置和使用原生OSS触发器和EventBridge类别的OSS触发器,请参见配置原生OSS触发器和配置EventBridge类别的OSS触发器。
触发器相关问题
如果您希望查看函数的执行触发了哪个事件,可以手动在代码逻辑中打印事件类型日志,具体请参见日志记录。
如果您希望在函数中调用另一个函数,可以使用API调用指定函数,具体请参见函数可以相互调用吗?。
触发器实践教程
如果您需要实现解压上传到OSS的ZIP文件,请参见使用函数计算实现自动解压上传到OSS的ZIP文件。