华为云图片压缩实践:OBS 上传后,FunctionGraph 如何接着处理
商品后台上传一张原图后,列表页通常还需要一张尺寸更小的图片。如果把这一步接到 OBS 上传事件上,图片落入源桶后,FunctionGraph 就能读取原图、执行处理,再把结果写入目标桶。华为云学堂的图片压缩实验和官方最佳实践采用了这类流程,适合用来理解对象存储与事件函数如何配合。
这个实验的验证目标很具体:向源桶上传一张图片,在目标桶找到对应结果,并确认图片能打开、尺寸和文件大小符合要求。围绕这个目标看配置,桶、委托、函数和触发器之间的关系就容易理解了。
两个 OBS 桶分别接收什么
官方实践使用两个私有桶,示例名称为 your-bucket-input 和 your-bucket-output。实际创建时需要使用全局唯一的名称。源桶接收原图,目标桶保存处理结果;函数和两个桶放在同一区域。文档采用“OBS应用事件源”触发器,并列出了该触发器支持的区域,复现时应先核对当前控制台的区域支持情况。
把输入和输出分开,也让事件范围更清楚。触发器只监听源桶,函数写入目标桶就不会再次命中这条源桶规则。如果把结果写回正在监听的桶,并且结果对象仍满足触发条件,写入操作就可能再次调用函数。做目录调整时,需要一起检查触发器的对象名前缀和后缀,避免压缩结果反复进入同一处理过程。
假设上传对象名为 products/shoe.jpg,可以先在日志里记录源桶名和这个对象名,再记录实际生成的目标对象名。这样查看目标桶时能找到明确位置,也能判断文件是否写到了预期目录。对象名包含中文、空格时,还要核对事件中的名称是否经过编码,以及代码是否按对应规则处理。
委托和环境变量决定函数能读写哪里
FunctionGraph 收到事件后,还需要权限才能读取源图和写入结果。官方示例先在 IAM 创建云服务委托,将受委托服务选为 FunctionGraph,再把委托绑定到图片处理函数。代码通过运行环境提供的凭证访问 OBS,长期 AK/SK 不应写进代码包。
官方教学步骤使用了 OBS Administrator,授权范围较大。用于实际业务时,应根据读取源桶对象、写入目标桶对象等操作收紧权限,并结合代码确实使用的接口补充必要权限。如果日志出现访问拒绝,先核对函数绑定的委托以及相应对象的权限,修改图片处理参数通常无法解决这个阶段的问题。
示例代码使用两个环境变量。其中 output_bucket 填目标桶的真实名称,obs_endpoint 填 OBS 服务终端节点。北京四的文档示例是:
output_bucket = <实际目标桶名称>
obs_endpoint = obs.cn-north-4.myhuaweicloud.com
这里填写的是区域服务终端节点。换用其他区域时,要一并修改节点地址,并确认源桶、目标桶和函数的区域一致。复制教程后遗漏目标桶名,是很容易通过配置检查发现的问题。
先验证函数,再验证上传事件
官方页面提供图片处理代码包,示例运行时为 Python 3.6,公共依赖包为 Pillow 7.1.2,内存和超时示例分别为 256 MB、40 秒。这组参数属于该页面的示例环境。重新部署时,应核对当前可用运行时和依赖包的兼容性,特别是 Pillow 的原生扩展能否在所选环境中加载。出现导入错误时,优先检查依赖版本、运行时版本和打包环境。
图片文件大小不能直接代表处理时的内存占用。一张 6000×4000 的 RGB 图片,仅按每像素三字节计算,展开后的像素数据就约为 72 MB;处理时还可能同时保留原图、缩放结果和编码缓冲。因此,应使用业务可能接收的大图测试内存与耗时,再决定配置,不能只根据上传文件只有几兆就判断内存足够。
函数配置完成后,再添加“OBS应用事件源”触发器,并选择源桶。官方示例监听通过页面或 PUT 请求创建、覆盖对象,以及通过 POST 请求创建、覆盖对象的事件。生产程序若使用不同上传方式,需要核对所选事件是否覆盖该操作。前缀和后缀过滤也要与测试对象匹配,例如只匹配 uploads/ 时,上传到桶根目录的 shoe.jpg 就不满足这条规则。
验证时先选一张格式明确的小图片,通过 OBS 控制台上传到源桶。接着查看函数调用记录和日志,确认事件已经到达,再到目标桶检查输出。下载结果后检查能否正常解码、宽高是否符合页面需求,以及文件大小是否变化。缩小像素尺寸和降低编码质量会产生不同效果,验收时应把两者分开记录。
图片没有生成时,沿着日志找断点
源桶里有图片而函数没有调用记录,可以先查触发器绑定的桶、事件类型和过滤条件。如果函数已经被调用,却在读取对象时失败,就查看日志中的桶名、对象名、终端节点和权限错误。读取成功后才进入图片解码与处理,此时的失败可能与格式、依赖或内存有关。
如果处理阶段已经结束,目标桶仍找不到文件,应核对 output_bucket 和写入操作的返回结果。日志应记录写入是否成功及目标对象名,避免只打印“开始上传”就把整次执行当作成功。原图上传成功、函数调用成功和结果文件可用,分别对应流程中的不同位置。
进一步扩展这个实验时,可以给处理规则加入版本,例如在目标对象名中包含缩略图尺寸和规则版本。同一输入重新处理时,结果去向会更加明确;若允许覆盖源图,则还需要考虑输入版本变化,避免把旧结果误认为最新结果。观察调用次数与上传次数的关系,也有助于发现重试或意外重复触发。
跑通后,可以保留一份包含源对象名、目标对象名、输入输出宽高、文件字节数和函数执行结果的验证记录。下次调整尺寸、依赖或触发器条件,就用同一组图片回归检查,能够直接看出变化发生在哪一步。
本文依据华为云官方《使用 FunctionGraph 函数对 OBS 中的图片进行压缩》整理配置关系与排查方法,内存估算及验证建议为补充分析。运行时、依赖版本和区域支持请结合当前控制台核对。
- 点赞
- 收藏
- 关注作者
评论(0)