对象存储服务OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高可靠的云存储服务。OSS与函数计算集成后,OSS事件能触发相关函数执行,实现对OSS中的数据进行自定义处理。
背景信息
OSS和函数计算通过OSS事件触发器实现无缝集成,您可以编写函数对OSS事件进行自定义处理,当OSS系统捕获到指定类型的事件后,OSS事件触发相应的函数执行。例如,您可以设置函数来处理PutObject事件,当您调用OSS的PutObject API接口上传图片到OSS后,相关联的函数会自动被触发来处理该图片。
OSS和函数计算集成后,您可以自由的调用各种函数处理图像或音频数据,再把结果写回到多种存储服务中。整个架构中,您只需要专注于函数逻辑的编写,系统将以实时的、可靠的、大规模并行的方式处理海量的数据。
地域限制
- 英国(伦敦)
- 马来西亚(吉隆坡)
OSS事件定义
当OSS系统捕获到相关事件后,会将事件信息编码为JSON字符串,传递给事件处理函数。OSS事件通知格式的详细信息,请参见消息通知。已支持的OSS事件定义如下表所示。
事件名称 | 说明 |
---|---|
oss:ObjectCreated:PutObject | 调用PutObject接口上传文件,更多信息,请参见PutObject。
API执行成功后触发函数。 |
oss:ObjectCreated:PutSymlink | 调用PutSymlink接口针对OSS上的TargetObject创建软链接,您可以通过该软链接访问TargetObject,更多信息,请参见PutSymlink。
API执行成功后触发函数。 |
oss:ObjectCreated:PostObject | 调用PostObject接口使用HTML表单上传文件到指定的Bucket,更多信息,请参见PostObject。
API执行成功后触发函数。 |
oss:ObjectCreated:CopyObject | 调用CopyObject接口拷贝一个在OSS上已经存在的对象,更多信息,请参见CopyObject。
API执行成功后触发函数。 |
oss:ObjectCreated:InitiateMultipartUpload | 使用MultipartUpload模式传输数据前,必须先调用InitiateMultipartUpload接口来通知OSS初始化一个MultipartUpload事件,更多信息,请参见InitiateMultipartUpload。
API执行成功后触发函数。 |
oss:ObjectCreated:UploadPart | 初始化一个Multipart Upload之后,可以根据指定的对象名和Upload ID来分块(Part)上传数据,更多信息,请参见UploadPart。
API执行成功后触发函数。 |
oss:ObjectCreated:UploadPartCopy | UploadPartCopy通过从一个已存在的Object中拷贝数据来上传一个Part,更多信息,请参见UploadPartCopy。
API执行成功后触发函数。 |
oss:ObjectCreated:CompleteMultipartUpload | 在将所有数据Part都上传完成后,必须调用CompleteMultipartUpload接口来完成整个文件的MultipartUpload。更多信息,请参见CompleteMultipartUpload。
API执行成功后触发函数。 |
oss:ObjectCreated:AppendObject | 调用AppendObject接口以追加写的方式上传文件,更多信息,请参见AppendObject。
API执行成功后触发函数。 |
oss:ObjectCreated:* | 任何上述ObjectCreated类型的API执行成功后都会触发函数。 |
oss:ObjectRemoved:DeleteObject | 调用DeleteObject接口删除某个对象,更多信息,请参见DeleteObject。
API执行成功后触发函数。 |
oss:ObjectRemoved:DeleteObjects | 调用DeleteObjects接口批量删除文件。
API执行成功后触发函数。 |
oss:ObjectRemoved:AbortMultipartUpload | 调用AbortMultipartUpload 接口可以根据用户提供的Upload ID中止其对应的MultipartUpload事件,更多信息,请参见AbortMultipartUpload。
API执行成功后触发函数。 |
触发规则
使用OSS触发器一定要避免循环触发。一个典型的循环触发场景是OSS的某个Bucket上传文件触发函数执行,这个函数又生成了一个或多个文件,写回到OSS的Bucket里,这个写入动作又触发了函数执行,形成了链状循环。
上述过程类似于一个无限递归,为了避免这种循环触发函数产生不必要的费用,强烈建议您配置前缀或后缀,例如将触发函数的Bucket目录前缀设置成src/,生成的文件写入的目录前缀设置为dst/,这样生成的文件就不会再次触发函数。
一个Bucket的不同触发器如果指定了相同的事件类型,则前缀和后缀不能重复。假如一个触发器配置了oss:ObjectCreated:PutObject事件,source前缀和zip后缀。下表列出了是否可以给该Bucket配置其它触发器。
事件 | 前缀 | 后缀 | 是否合法 | 说明 |
---|---|---|---|---|
oss:ObjectCreated:PutObject | source | zip | 否 | 前后缀一样 |
oss:ObjectCreated:PutObject | source | 无 | 否 | 前缀重合,后缀不设置包含了后缀为zip的对象。 |
oss:ObjectCreated:PutObject | 无 | zip | 否 | 后缀重合,前缀不设置包含了前缀为source的对象。 |
oss:ObjectCreated:PutObject | source1 | 1zip | 是 | 不重合 |
oss:ObjectCreated:PutObject | source | zip1 | 是 | 后缀不重合 |
oss:ObjectCreated:PutObject | 1source | zip | 是 | 前缀不重合 |
oss:ObjectCreated:PostObject | source | zip | 是 | 事件不同 |
如果您需要让一个触发器触发多个函数,可以结合使用函数计算和Serverless工作流服务。先通过触发器触发一个函数,该函数启动Serverless工作流流程,在流程里您可以调用多个函数。更多信息,请参见示例。