用华为云 OBS + FunctionGraph 搭建无服务器图片缩略图服务

举报
yd_297054392 发表于 2026/11/08 03:31:03 2026/11/08
【摘要】 用华为云 OBS + FunctionGraph 搭建无服务器图片缩略图服务 背景在内容型应用中,用户上传原图后通常需要生成多种尺寸的缩略图。传统做法是在应用服务器上用 ImageMagick 处理,既占用计算资源,又难以弹性伸缩。借助华为云对象存储 OBS 的事件通知与函数工作流 FunctionGraph,可以用近乎零运维的方式实现「上传即处理」。 一、整体架构用户把原图 PUT 到 ...

用华为云 OBS + FunctionGraph 搭建无服务器图片缩略图服务

背景

在内容型应用中,用户上传原图后通常需要生成多种尺寸的缩略图。传统做法是在应用服务器上用 ImageMagick 处理,既占用计算资源,又难以弹性伸缩。借助华为云对象存储 OBS 的事件通知与函数工作流 FunctionGraph,可以用近乎零运维的方式实现「上传即处理」。

一、整体架构

  1. 用户把原图 PUT 到 OBS 桶的 images/ 前缀。
  2. OBS 触发 FunctionGraph 函数(PutObject 事件)。
  3. 函数下载原图,用 Pillow 生成 300×300 缩略图,回写到同一桶的 thumbnails/ 前缀。
  4. 业务系统直接读取 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)

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

全部回复

上滑加载中

设置昵称

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

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

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