华为云OBS加FunctionGraph构建图片自动压缩归档流水线

举报
yd_253000176 发表于 2026/10/24 09:06:36 2026/10/24
【摘要】 用OBS事件通知驱动FunctionGraph函数,上传即压缩、冷数据即归档,实测存储成本下降六成,全程无需运维服务器。

一、为什么在对象存储层做图片处理

用户上传的原图直接堆在主桶,两个月超过 3TB,九成是 4K 原图,前台只要 800px 缩略图。于是把治理前移到 OBS:上传即压缩,冷数据即归档。

二、方案架构

主桶 upload-bucket 接收上传;配置 ObjectCreated:Put 事件通知,投递到同区域 FunctionGraph 函数;函数读取对象流,压缩后写回 thumb-bucket,原图复制到 archive-bucket。两个桶分别挂生命周期规则,低频数据沉降到低频或归档存储。

三、五步落地

  1. 建三个桶并保持同区域;主桶开版本控制便于回滚。
  2. 创建函数:Python 3.9,内存 512MB,超时 30 秒;Pillow 打包进依赖 zip 并匹配 Linux 架构。
  3. 配置委托,授予 GetObject、PutObject、ListBucket 权限。
  4. 桶上添加事件触发器,类型 ObjectCreated,前缀过滤 images/。
  5. 生命周期:archive-bucket 第 30 天转低频、第 180 天转归档;thumb-bucket 长期在线。

四、核心代码

from obs import ObsClient
from PIL import Image
import io, os
client = ObsClient(os.getenv("AK"), os.getenv("SK"),
        server="https://obs.cn-east-3.myhuaweicloud.com")
def handler(event, context):
    for rec in event.get("Records", []):
        b, k = rec["obs"]["bucket"]["name"], rec["obs"]["object"]["key"]
        img = Image.open(io.BytesIO(client.getObject(b, k).body))
        img.thumbnail((800, 800))
        buf = io.BytesIO()
        img.convert("RGB").save(buf, "JPEG", quality=82, optimize=True)
        client.putContent("thumb-bucket", k.rsplit(".",1)[0] + ".jpg", buf.getvalue())
        client.copyObject(b, "archive-bucket", k)
    return "ok"

五、实测与踩坑

压测 2000 张 8MB 原图:单图 1.4 秒,输出 210KB,月存储费从 340 元降到 126 元。踩坑三点:内存低于 256MB 处理 4K 图会 OOM,需 512MB;key 含中文要编码,否则 404;同一 key 高频覆盖会重复执行,用 hash 做幂等。

六、小结

事件通知加函数计算,把存量治理变成流量治理:不改业务代码、不维护服务器,图片、日志这类沉淀型数据在上传那一刻就完成瘦身。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。