先看现象。把对象存储的签名 URL 传给多模态接口,图片是私有读,签名有效期 5 分钟,批量任务排队超过 5 分钟后模型侧抓图返回 403,报错是 failed to download image。
这类报错背后常见的原因有几处,逐个排除就行。签名 URL 在模型抓取前就过期。少数情况下是队列排队时间超过签名有效期。
少数情况下是模型侧出口 IP 不在白名单。
不容易想到的是,URL 里的查询参数被日志截断。
先用 curl 验证链接当前是否可读
curl -s -o /dev/null -w '%{http_code}' "$SIGNED_URL"
再往下把有效期延长到 1 小时
python sign_url.py --bucket prod --key img/1.jpg --expires 3600
提交前重新生成一次签名
python refresh_sign.py --in tasks.jsonl --out tasks_fix.jsonl
末了抓取失败时回退到 base64 直传
python to_base64.py --file img/1.jpg --max-mb 20
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
怎么算真的好了,看的是同一批现象。批量任务里的图片全部被抓取成功,返回 200,日志里不再出现 failed to download。
提醒一点。签名有效期要覆盖排队加推理的总时间,最稳的做法是提交前现签,而不是提前批量签好。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
