华为云 FunctionGraph 函数实践:OBS 对象上传事件驱动的轻量处理
# 华为云 FunctionGraph 函数实践:OBS 对象上传事件驱动的轻量处理 ## 背景 在实际业务里,"对象一上传就做点事"是非常常见的需求:图片上传后生成缩略图、日志文件上传后转储归档、报表文件上传后自动解析入库。传统做法是跑一个常驻服务监听队列或轮询桶,架构重、成本高、还得自己处理可用性。华为云 FunctionGraph 函数服务提供的事件触发器正好解决这类问题——把处理逻辑写成函数,把 OBS 桶的事件直接挂上去,全程无服务器、按量计费。 ## 方案架构 整体链路非常简单: 1. 客户端/业务服务上传对象到 OBS 桶; 2. OBS 产生对象创建事件(ObjectCreated:*); 3. FunctionGraph 触发器按规则匹配事件,拉起函数实例; 4. 函数读取对象、执行业务逻辑、写结果回桶或下游服务。 不需要常驻进程,函数实例空闲即释放,只在实际有事件时才产生费用。 ## 创建函数 控制台进入 FunctionGraph,选择"创建函数 → 事件函数",运行时按技术栈选择(Python 3.10 / Node.js 18 等)。一个最小示例: ```python import json import obs def main(): # FunctionGraph 事件函数入参,具体结构以控制台模板为准 event = json.loads(main.event) body = json.loads(event["body"]) for record in body.get("records", []): bucket = record["s3"]["bucket"]["name"] key = record["s3"]["object"]["key"] # 这里放你的处理逻辑:下载对象、解析、写结果 print(f"process {bucket}/{key}") return "ok" ``` 注意两点:一是函数入参结构和触发类型有关,写代码前先按控制台提供的"代码示例"对齐字段;二是如果函数里要访问 VPC 内的资源(RDS、DCS 等),需要在函数配置里绑定 VPC 并配置安全组,否则网络不通。 ## 配置 OBS 触发器 在函数详情里添加"触发器 → OBS",选择源桶、事件类型(一般勾对象创建/上传)、前缀/后缀过滤。过滤规则建议在触发器层面就把范围收窄,比如只处理 `images/` 前缀、`jpg/png` 后缀,能显著减少无效拉起。 触发器权限上,FunctionGraph 需要能读源桶、写目标桶。最小权限原则:只给函数绑定的角色授予对应桶、对应路径的读写策略,不要图省事给整桶 FullAccess。 ## 几个实际踩过的坑 1. **批量事件按条处理**。一次批量上传可能把多条对象塞进同一个事件,函数里一定要遍历 records 逐条处理,只取第一条是很多初版代码的 bug。 2. **幂等设计**。事件投递在极端情况下可能重复,处理逻辑要做幂等(基于对象 etag/版本号去重),否则会出现重复计费、重复入库。 3. **超时与内存**。函数默认执行时长有限,重逻辑(大文件转码等)要么拆分任务、要么提高超时和内存规格,别指望一个函数干所有事。 4. **日志**。控制台"日志流"默认接 FunctionGraph 日志,排障时先看函数执行日志再怀疑触发器,事件到底有没有触发是二分法的第一步。 5. **冷启动**。首次拉起或缩容到零后的首次调用会有冷启动延迟,对时延敏感的场景可保留最小实例数(有额外费用)。 ## 适用场景与边界 这套"OBS 事件 + 函数"的组合适合:单文件粒度、处理时长分钟级以内、并发量有波峰波谷的异步任务。不适合超长任务或需要复杂状态编排的场景——后者用 CCE 容器或工作流服务更合适。 成本方面,函数按调用次数和执行时长计费,触发器本身免费,日常低频事件几乎零成本,比常驻最小规格 ECS 便宜一个量级,这也是无服务器方案的核心价值。 ## 小结 用 FunctionGraph 的 OBS 事件触发器做"上传即处理",链路短、成本可控、免运维。落地时把幂等、超时、权限和日志四件事做扎实,就能稳定跑起来。
- 点赞
- 收藏
- 关注作者
评论(0)