用华为云 OBS + FunctionGraph 搭建无服务器图片缩略图服务
【摘要】 用华为云 OBS + FunctionGraph 搭建无服务器图片缩略图服务 背景在内容型应用中,用户上传原图后通常需要生成多种尺寸的缩略图。传统做法是在应用服务器上用 ImageMagick 处理,既占用计算资源,又难以弹性伸缩。借助华为云对象存储 OBS 的事件通知与函数工作流 FunctionGraph,可以用近乎零运维的方式实现「上传即处理」。 一、整体架构用户把原图 PUT 到 ...
用华为云 OBS + FunctionGraph 搭建无服务器图片缩略图服务
背景
在内容型应用中,用户上传原图后通常需要生成多种尺寸的缩略图。传统做法是在应用服务器上用 ImageMagick 处理,既占用计算资源,又难以弹性伸缩。借助华为云对象存储 OBS 的事件通知与函数工作流 FunctionGraph,可以用近乎零运维的方式实现「上传即处理」。
一、整体架构
- 用户把原图 PUT 到 OBS 桶的
images/前缀。 - OBS 触发 FunctionGraph 函数(PutObject 事件)。
- 函数下载原图,用 Pillow 生成 300×300 缩略图,回写到同一桶的
thumbnails/前缀。 - 业务系统直接读取
thumbnails/下的缩略图。
整个链路无服务器、按调用计费,空闲时不产生费用。
二、前置准备
- 在 OBS 控制台创建一个桶(如
my-img-bucket),并建立images/与thumbnails/两个目录。 - 在 FunctionGraph 创建一个 Python 3 运行时函数。
- 为函数配置「OBS 触发器」,事件类型选
PutObject,前缀指向images/。 - 建议给函数绑定访问 OBS 的委托(Agency),避免在前端或代码里硬编码 AK/SK。
三、函数代码
依赖:Pillow 与华为云 OBS Python SDK(esdk-obs-python)。在 FunctionGraph 中把依赖随函数包一起上传,或在函数里通过依赖管理安装。
import os
import io
from obs import ObsClient
from PIL import Image
ENDPOINT = os.environ["OBS_ENDPOINT"]
BUCKET = os.environ["BUCKET"]
THUMB_PREFIX = "thumbnails/"
THUMB_SIZE = (300, 300)
def handler(event, context):
client = ObsClient(
access_key_id=os.environ["AK"],
secret_access_key=os.environ["SK"],
server=ENDPOINT,
)
for rec in event.get("Records", []):
bucket = rec["obs"]["bucket"]["name"]
key = rec["obs"]["object"]["key"]
if key.startswith(THUMB_PREFIX):
continue
resp = client.getObject(bucket, key, loadStream=False)
img = Image.open(io.BytesIO(resp["body"].buffer))
img.thumbnail(THUMB_SIZE)
buf = io.BytesIO()
img.convert("RGB").save(buf, format="JPEG")
thumb_key = THUMB_PREFIX + os.path.basename(key)
client.putObject(bucket, thumb_key, buf.getvalue())
return {"status": "ok"}
四、配置触发器要点
- OBS 事件里的
key是 URL 编码的,文件名含中文时需用urllib.parse.unquote还原。 - 函数回写必须写入不同前缀(如
thumbnails/),否则会再次触发自身形成无限循环。 - 触发器默认具备重试能力,失败事件可投递到「死信队列」便于排查。
五、测试与验证
用 OBS 控制台或 SDK 上传一张图片到 images/,稍等几秒后到 thumbnails/ 查看是否生成了 300×300 缩略图。首次调用可能存在冷启动延迟(约 1–3 秒),属正常现象。
六、注意事项
- 依赖打包:Pillow 含原生扩展,需在与 FunctionGraph 相同运行环境的镜像里打包依赖。
- 超时与内存:图片处理建议把函数超时设为 10–30 秒、内存 256MB 起。
- 权限:使用 Agency 委托时,确认委托拥有该桶的
GetObject/PutObject权限。 - 大图防护:对超大图片先做尺寸/大小校验,避免内存溢出。
小结
OBS 事件 + FunctionGraph 的组合非常适合「对象存储上的轻量计算」场景:图片处理、文档转换、音视频转码触发、数据清洗等都能套用同一套模式。把触发器、函数、回写前缀三个关键点梳理清楚,就能在半小时内搭起一个可上线的无服务器处理管道。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)