用 FunctionGraph + OBS 搭一个无服务器图片缩略图服务

举报
岚枫 发表于 2026/10/13 06:38:37 2026/10/13
【摘要】 用华为云 FunctionGraph + OBS 搭无服务器图片缩略图服务:上传即触发函数自动缩放并回存,零运维、按量计费。含函数代码、OBS 触发器配置与四个易踩点。

用 FunctionGraph + OBS 搭一个无服务器图片缩略图服务

最近有个小需求:把用户上传到对象存储的图片,自动生成一份缩略图存起来。这种「事件触发、跑完即走」的场景,用函数工作流(FunctionGraph)配合对象存储服务(OBS)最合适——不用管服务器,按调用次数计费,量小基本等于免费。

下面把搭建过程记下来,给也想省掉一台常驻机器的朋友参考。

一、整体思路

  1. 准备两个 OBS 桶:一个放原图(source),一个放缩略图(thumb);
  2. 写一个函数:收到「原图上传」事件后,下载原图、用 Pillow 缩放、再把结果上传到 thumb 桶;
  3. 给函数挂一个 OBS 触发器:当 source 桶出现 ObjectCreated:Put 事件时自动调用函数。

整条链路没有一台常驻服务器,全是托管服务。

二、创建函数

在函数工作流控制台新建一个 Python 3.x 函数。因为要处理图片,需要 Pillow 依赖——在函数配置里添加「依赖包」(选择 Pillow 在线依赖即可,不用自己打 zip)。内存给 256MB、超时设 30 秒,对普通图片足够。

三、函数代码

import io, os
from PIL import Image

def handler(event, context):
    # 事件里带的是 OBS 通知,取出桶名和对象名
    records = event.get("Records", [])
    for rec in records:
        bucket = rec["obs"]["bucket"]["name"]
        key = rec["obs"]["object"]["key"]
        if key.lower().endswith((".png", ".jpg", ".jpeg")) is False:
            continue

        s3 = boto3.client("s3")  # 实际指向 OBS 内网端点,按控制台文档配 AK/SK 或委托
        obj = s3.get_object(Bucket=bucket, Key=key)
        img = Image.open(io.BytesIO(obj["Body"].read()))

        img.thumbnail((300, 300))  # 最长边 300px,保持比例
        buf = io.BytesIO()
        img.save(buf, format="JPEG", quality=85)

        thumb_key = "thumb/" + os.path.basename(key)
        s3.put_object(Bucket=bucket, Key=thumb_key,
                      Body=buf.getvalue(),
                      ContentType="image/jpeg")
    return {"status": "ok"}

说明:上面用的是通用 SDK 写法,实际在 FunctionGraph 里访问 OBS 推荐走「函数委托」(给函数授予 OBS 读写权限的委托),比在代码里硬编码密钥更安全,也省去配置端点。

四、配置 OBS 触发器

在函数触发器页添加「OBS 触发器」,事件源选 source 桶,事件类型勾选「Put」(即上传对象),后缀过滤填 .jpg,.png,避免其他类型误触发。保存后,往 source 桶传一张图,几秒后 thumb 桶就会出现同名缩略图。

五、几个容易踩的点

  • 临时目录:函数运行环境的磁盘只有 /tmp 可写,大图建议直接在内存里用 BytesIO 处理,别落盘;
  • 冷启动:首次调用会有冷启动延迟,对缩略图这种非实时场景无影响;
  • 递归触发:务必把缩略图写到另一个前缀或另一个桶,否则「上传缩略图」又会触发函数,形成死循环;
  • 依赖:Pillow 通过函数依赖包引入,本地调试时 pip install Pillow 对齐版本即可。

六、小结

FunctionGraph + OBS 这套组合,把「上传即处理」做成了零运维:没有服务器要管,不用为偶发的上传高峰预留机器。类似的玩法还能延伸到图片水印、文档格式转换、日志归档等,思路都是「OBS 事件 → 函数处理 → 写回 OBS」。对小团队和个人项目,性价比很高。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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