用 FunctionGraph + OBS 搭一个无服务器图片缩略图服务
【摘要】 用华为云 FunctionGraph + OBS 搭无服务器图片缩略图服务:上传即触发函数自动缩放并回存,零运维、按量计费。含函数代码、OBS 触发器配置与四个易踩点。
用 FunctionGraph + OBS 搭一个无服务器图片缩略图服务
最近有个小需求:把用户上传到对象存储的图片,自动生成一份缩略图存起来。这种「事件触发、跑完即走」的场景,用函数工作流(FunctionGraph)配合对象存储服务(OBS)最合适——不用管服务器,按调用次数计费,量小基本等于免费。
下面把搭建过程记下来,给也想省掉一台常驻机器的朋友参考。
一、整体思路
- 准备两个 OBS 桶:一个放原图(source),一个放缩略图(thumb);
- 写一个函数:收到「原图上传」事件后,下载原图、用 Pillow 缩放、再把结果上传到 thumb 桶;
- 给函数挂一个 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)