华为云OBS加FunctionGraph构建图片自动压缩归档流水线
【摘要】 用OBS事件通知驱动FunctionGraph函数,上传即压缩、冷数据即归档,实测存储成本下降六成,全程无需运维服务器。
一、为什么在对象存储层做图片处理
用户上传的原图直接堆在主桶,两个月超过 3TB,九成是 4K 原图,前台只要 800px 缩略图。于是把治理前移到 OBS:上传即压缩,冷数据即归档。
二、方案架构
主桶 upload-bucket 接收上传;配置 ObjectCreated:Put 事件通知,投递到同区域 FunctionGraph 函数;函数读取对象流,压缩后写回 thumb-bucket,原图复制到 archive-bucket。两个桶分别挂生命周期规则,低频数据沉降到低频或归档存储。
三、五步落地
- 建三个桶并保持同区域;主桶开版本控制便于回滚。
- 创建函数:Python 3.9,内存 512MB,超时 30 秒;Pillow 打包进依赖 zip 并匹配 Linux 架构。
- 配置委托,授予 GetObject、PutObject、ListBucket 权限。
- 桶上添加事件触发器,类型 ObjectCreated,前缀过滤 images/。
- 生命周期: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)