一个代理跑完任务,它的密钥却留在了下一个任务里。日志上写着成功,数据却已经错了。这不是段子,是自托管多代理项目里反复被报出来的问题。
![]()
先说清楚什么叫「按范围发放的凭证」:每一次运行拿自己的钥匙,权限只够干这一件事,任务结束就过期。如果所有代理共用一把长期有效的钥匙,早晚会有一次运行顶着别人的身份干活,而日志依然显示它成功了。
这篇写给有在跑的产品、有自己的模型密钥、睡觉时还有几个代理在干活的技术型独立开发者。代理是你接的线,凭证的锅也得你背。
一次运行怎么就用上了别人的钥匙
翻一周自托管多代理项目的 issue 追踪器,同样的故事会在不同项目里反复出现:
- 一次运行启动,拿到自己的身份:一个 API 密钥、一个绑定该运行的令牌,有时两者都有,通常通过环境变量传进去。
- 运行过程中,某个比这次运行活得更久的东西被拉起来了:一个辅助守护进程、一个池化的代理对象、一个共享的模型客户端、一个缓存的会话。
- 这个长命的东西保留了它出生时的环境。
- 下一次运行挂到它上面,调用就带着上一次运行的身份发出去了。
症状各不相同。有时服务端发现身份不匹配,拒绝写入,于是状态变更和子任务悄悄失败,而这次运行仍被报告为成功。有时池化的代理在任务之间被「重置」,却还留着指向旧对话的指针,一个不相干的任务接着别人的线程往下跑。有时代理的写入被记成人类操作,自动化流程每小时把刚关掉的工作重新打开一次。
这些都不是粗心工程。项目有能力,维护者也有能力。问题出在结构上:凭证挂在进程上,而在代理系统里,进程比运行活得久。环境变量是传密钥的默认方式,而它会被你派生出的任何东西继承,一直继承下去。
当你一个人就是整个运维团队时,一次顶着错误身份的运行比一次崩溃更糟。崩溃会把你叫醒。错误身份下的「成功」只是让数据稍微错一点,你几周后才发现。
三个便宜的自查动作
不需要新工具,先做三件事:
- 给每个出站调用打上发起它的运行标记。随凭证一起发一个运行 id 头,接收方比对两者。密钥说是运行 A、头说是运行 B,这就是信号。大声记日志,并让这次调用失败。
- 把「成功但零工作量」当成失败。一次运行报告成功,却没调模型、没写任何东西,它就没成功。对这种情况告警。
- 写入要归属到操作者类型,而不只是一个 id。每次写入都应标明来自人、代理还是定时任务。如果你的自动化分不清代理的评论和你的评论,它迟早会跟自己吵起来。
这三条里任何一条在日志里触发,说明已经漏了。现在发现,比一个月后拿到悄悄错掉的数据再发现要便宜。
按范围发放的凭证该怎么落地
通用模式有五部分,换什么技术栈都能照搬:
- 按请求发凭证,不按代理发。代理需要访问时再申请,并说明理由。「只读访问订单表,用于统计本周报告的退款数」和「部署站点」拿到的应该是不同的钥匙。
- 把权限收窄到所述理由。任务只读就给只读。一张表、一个存储桶、一个仓库。手里的钥匙比理由宽,就别用。
- 过期时间按任务时长来定。多数运行一小时足够。随运行一起死掉的钥匙,漏不到下一次。
- 以文件形式交给运行去读,不要用继承的环境变量。文件可以只存在于那次运行的容器里,环境变量会被复制进每一个子进程。
- 信任之前先验证。用新钥匙做一次无害的读取,记录是否通过。发出去的钥匙和能用的钥匙不是一回事。
前三步缩小出错面,第四步切断跨运行 bug 的传播路径,第五步让你在运行基于错误前提继续搭建之前知道真相。
一次被拒绝的实例
这是本周我们自己的一次实操。
我们想要一份自托管代理工具中公开报告的失败模式清单,也就是这类文章的原料。一个研究代理接了活,申请访问代码托管 API 读公开 issue。
在 Organ 里,代理不持有长期钥匙。需要访问某个资源时,它向一个独立的安全代理申请,安全代理查看请求和可用凭证,发放最窄的那一把,并带过期时间。凭证以文件形式出现在该次运行的容器里,每次授权返回时标注为已验证、未验证或失败,取决于用它的无害测试调用是否真的成功。
那天手头那把钥匙是一个个人访问令牌,能写仓库和软件包。任务只需要读公开 issue,别的都不要。安全代理拒绝交出它,因为它的范围远宽于给出的理由。
这次拒绝是有代价的。代理退回到未认证 API,速率限制很低,只覆盖了一个项目,在数百的目标里拿回了几行可用数据。它说得很直白:大部分地方没看过,这和「那里什么都没有」是两回事。它没有凑数。
随后我们建了一个细粒度令牌,只能做一件事:读公开数据。下一次运行用这把钥匙,覆盖了约二十个项目,返回了几百行候选数据。什么都没写进去,因为钥匙没有写权限。
该带走的是:拒绝是系统在正常工作。任务卡在权限上时,最诱人的动作是把你的大钥匙递给代理,「就这一次」。那把大钥匙,恰恰就是三个运行之后被守护进程继承走的东西。
这套做法的代价
有真实成本,照搬之前该知道。按请求发凭证会给每次需要访问的运行多加一个步骤和几分钟,有时诚实的答案是「未验证」:钥匙发出去了,但证明不了它能用,代理得自己决定要不要继续。如果你只有一个代理、一台机器、跑自己的测试数据,文件里放一把限定范围的钥匙就够了,自托管 Paperclip 这类工具也是完全合理的选择。上面这套模式,要等你有了几个无人值守、对着生产环境跑的代理,才开始回本。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.