前言
首先介绍下在本文出现的几个比较重要的概念:
函数计算(Function Compute): 函数计算是一个事件驱动只需编写代码并上传。函数计算准备计算资源,以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息 参考。
Fun: 是一个用于支持 Serverless 部署工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考。
通过本文的示例,你将了解:Fun 如何使用 OSS 触发器连接 OSS 和函数计算。
事件源服务
事件源服务是可以触发函数的服务的集合,例如对象存储 OSS,日志服务,API 网关,定时器(Timer)和 HTTP 请求等。事件发生时,承载触发器的事件源服务决定是否运行您的函数。例如,当您创建一个 OSS PutObject 触发器后,上传对象到指定的 OSS Bucket 就是一次事件,继而触发对应函数,这个过程中 OSS 就是事件源服务。函数计算具有丰富的事件源来实现您的各种自定义化的需求。如需了解更多,请参照链接。
Fun 配置并部署 OSS 触发器
函数计算触发器描述了一组规则,当某个事件满足这些规则,事件源就会触发相应的函数。阿里云对象存储和函数计算无缝集成。您可以为各种类型的事件设置处理函数,当OSS系统捕获到指定类型的事件后,会自动调用函数处理。
Fun 通过一个资源配置文件(template.yml),协助您进行开发、构建、部署。所以我们在 yml 中按照规范去描述 OSS 触发器:
Events:
oss-trigger-name:
Type: OSS # trigger type
Properties:
BucketName: coco-superme # oss bucket name
Events:
- oss:ObjectCreated:*
- oss:ObjectRemoved:DeleteObject
Filter:
Key:
Prefix: source/
Suffix: .png
- oss-trigger-name:为用户自定义的 触发器(trigger)名称,名称不允许重复.
- Type:为事件源集合中的一种,表示事件源类型。Fun 支持的类型请参阅。本 yml 为 OSS。
- BucketName: oss bucket name,创建 OSS bucket,参考
- Events:为 OSS 事件类型。
-
Filter:filter为 OSS 对象过滤参数,满足过滤条件的 OSS 对象才可以触发函数,包含如下属性:
-
Key:过滤器支持过滤对象键(Key),包含如下属性:
- Prefix:匹配前缀
- Suffix:匹配后缀
-
一个被存入OSS的文件,如果它是以 source/
为前缀,并且后缀是 .png
的文件,并且由用户自定义的事件(evens)触发后,OSS 就会自动的调用相应的函数进行处理。示例完整代码。
执行 fun deploy
,即可创建、配置并部署好相关服务:
using region: cn-shanghai
using accountId: ***********8320
using accessKeyId: ***********mTN4
using timeout: 10
Waiting for service oss-test-service to be deployed...
Waiting for function oss-test-function to be deployed...
Waiting for packaging function oss-test-function code...
package function oss-test-function code done
Waiting for OSS trigger oss-trigger-name to be deployed...
function oss-trigger-name deploy success
function oss-test-function deploy success
service oss-test-service deploy success
PS D:\fun\examples\oss-trigger>
然后我们去函数计算控制台查看我们刚刚定义的 OSS 触发器:
可见,名为 oss-trigger-name 的 OSS 触发器已经创建成功,是不是既简单又方便。
注意事项
配置混淆
当我们部署时,出现如下日志:
说明在 fc 控制台中配置的触发器 oss 触发器名称与本地配置不匹配。即:FC 控制台配置的触发器集合不在本地配置的触发器之内。fun 不会修改这个触发器。你可以通过控制台删除这个必要时通过 FC 控制台手动触发。
循环触发
使用 OSS 触发器一定要避免 循环触发。一个典型的循环触发场景是 OSS 的某个 Bucket 上传文件触发函数执行,这个函数又生成了一个或多个文件,又写回到 OSS 的 Bucket 里,这个写入动作又触发了函数执行,形成了链状循环。
上述过程类似于一个无限递归,为了避免这种循环触发函数产生不必要的费用,强烈建议您配置前/后缀,例如将触发函数的 Bucket 目录前缀设置成 src/
,生成的文件写入的目录前缀设置为 dst/
,这样生成的文件就不会再次触发函数。
总结
- 在 yml 文件定义 OSS 触发器,所有属性为必填。
- 当 OSS 系统捕获到相关事件后,会将事件信息编码为 JSON 字符串,传递给事件处理函数,您可以在代码中获取事件信息。此处相关本文不做赘述,感兴趣的同学可以查看相关文档。
- 只要配置无误,您只需要专注于函数逻辑的编写,系统将以实时的、可靠的、大规模并行的方式处理海量的数据