没有 AWS 账号也能测 agent:200+ 服务搬到本地,及格线只有 56.6%

42,857 个测试过 24,243 个——听起来不及格,但它给了 agent 最缺的东西:一个会按 AWS 的方式报错、而且免费随便重置的回路。

分享
没有 AWS 账号也能测 agent:200+ 服务搬到本地,及格线只有 56.6%

没有 AWS 账号,不花一分钱,200 多个 AWS 服务在你的笔记本上跑。CLI 和 SDK 都指向它,你的代码一行都不用改。资源放在内存里,进程一停就全没了——这正是测试想要的行为。

这是 AWS 在 2026-11-12 发布的 AWS Emulator(本地 AWS API 仿真器)。最不寻常的地方不是"又一个 LocalStack",而是:它的代码是 agent 写的,连评审都是 agent 做的。

而它的及格线也摆得很诚实:42,857 个保真度测试,通过 24,243 个,56.6%。

一、它到底是什么

一个无头的本地程序,对外提供一个 AWS API 端点,你通过环境变量把 CLI 或 SDK 指过去。资源放在内存,短命。

它的"像"不是感觉上的像,而是错误信息逐字一致:官方文档里那个 DynamoDB 例子——用 2 个字符的表名建表,返回的 ValidationException 文本和真 AWS 一模一样。

官方给的关键数字:

项 值
规模 从 438 个 AWS API 模型生成,覆盖 200+ 服务;每个服务一个 Rust crate
运行环境 Linux x86_64/aarch64(RPM 或 Debian 包);macOS/Windows 用 Docker,内存上限 2 GiB
源码构建 需要 ≥100 GB 空闲磁盘 + Rust 工具链 + C 编译器
默认端点 HTTPS 127.0.0.1:9297(自签证书)
许可 CC0 1.0(vendor/ 下 Apache 2.0)
费用 免费,不需要厂商 token,不需要账号

二、agent 是怎么把它写出来的

起点很朴素:给 Kiro 一句 prompt,15 分钟就出来一个能用的 Amazon SQS 仿真器。

然后 AWS 把活拆给三组 agent:

角色 干什么
测试作者 从公开的 Smithy API 模型推导场景,并拿真 AWS 验证每个场景
问题发现者 把这些测试回放到仿真器上,把失败登记成 issue
修复者 一次只领一个 issue,提交一个补丁

每个补丁都要过合并闸:构建、代码评审、安全、保真度。还有几个安全 agent 专门做对抗性评审。按项目方的说法,是数百个并发 agent、每天修掉数千个 issue。

发布流水线跑在 AWS Developer Tools 上,CodeCommit 才是 agent 的仓库,代码最后才同步到 GitHub。这个细节有意思:它把"agent 产出的东西先进内部闸门"写进了流水线结构里。

三、四条跑起来的路

路径 怎么做 适合
Linux 包 装 RPM / Debian 包,跑 aws-emulator 最快
Docker 用 AWS 的 Dockerfile 自己 build,限 2 GiB macOS / Windows
Rust embedded 作为 dev-dependency 引入,每个测试一个隔离实例 Rust 项目单测
coding agent aws agent-toolkit add-skill --skill-name aws-emulator(需要 AWS CLI ≥2.35.0) 让 agent 自己起环境

源码构建和 embedded 模式第一次都要付编译代价(同一个 100 GB 磁盘门槛)。

四、保真度:分清楚"哪一层像"

v1.0.322 的分数(scores.json,2026-11-11 评分):

维度 通过 / 总数 比例
总体 24,243 / 42,857 56.6%(另有 80 个跳过)
单步级(step) 49,810 / 68,007 73.2%
跨服务工作流 2,752 / 6,569 41.9%

分服务看,差距是数量级的:

服务 保真度
AWS KMS 93.9%(291/310)
Amazon SQS 89.8%
Amazon S3 79.1%
DynamoDB 77.3%
SNS 73.9%
Lambda 46.4%
EC2 41.5%
CloudFormation 15.8%(414/2,612)

官方自己说了口径:控制平面 API 最像;数据平面、CloudFormation、Terraform、CDK 的支持因服务而异。没实现的操作返回 HTTP 501 NotImplemented(不是假装成功——这一点很重要)。测试套件公开在 aws-emulator-evaluation-suite 里,连失败的一起放。

4.1 agent 的常见工具面,落到这个保真度上够不够

你要测的东西 依赖服务 保真度 够不够
对象存储读写、预签名 URL S3 79.1% 够,但版本控制/事件通知的细节要实测
表格读写、条件写、分页 DynamoDB 77.3% 够做冒烟;事务与 GSI 建议单项验证
队列、去重、FIFO SQS 89.8% 最稳的一个,可当第一个用例
发布/订阅扇出 SNS 73.9% 够
加密、KMS 别名 KMS 93.9% 够,适合用来做冒烟基准
函数调用链 Lambda 46.4% 只测控制面(创建/配置/权限),别指望运行时行为
虚机、安全组、网络 EC2 41.5% 不够,涉及网络拓扑的场景别用
整套基础设施声明 CloudFormation 15.8% 不要用(Terraform / CDK 同样因服务而异)

4.2 决定用不用它之前,先回答五个问题

  1. 我要验的是控制面还是数据面?—— 控制面才像。
  2. 测试路径涉及 IAM 权限语义吗?—— 涉及就不行,它不求值策略。
  3. 需要多区域/多账号吗?—— 单区单账号,隔离是假象。
  4. 我的 agent 会不会读到上一个测试残留的内存状态?—— 它会,所以每个用例一个实例,或至少用 --idle-timeout。
  5. 我的 CI 能接受 2 GiB 的容器上限吗?—— 不能就说明 agent 在内存里堆了太多东西,这本身就是个信号。

五、和 LocalStack / Moto / Floci 比

项 AWS Emulator LocalStack Moto Floci
许可 CC0 1.0 商业分档 Apache-2.0 MIT
价格 免费 Hobby $0(非商用)/ Base $39 / Ultimate $89 每 license 每月(年付) 免费 免费
覆盖 200+ 服务 / 438 API 模型 30+ / 55+ / 110+(按档) README 未披露 README 未汇总
需要厂商 token 否 是 否 未披露
默认端点 HTTPS 127.0.0.1:9297 4566 5000 4566
进程内测试模式 Rust dev-dependency 未披露 Python @mock_aws 未披露
公开保真度分数 有,每版发布 无 无 无

最后一行才是真正的差别:只有它把"自己像不像"当成发布产物。

六、五条不能用的场景(AWS 自己列的)

  1. 不评估 IAM。 身份策略和资源策略不按 AWS 的方式求值——别拿它做安全测试;
  2. 只有 1 个区域、1 个账号。 它接受任意 ID,但不按 ID 隔离资源;
  3. 只在 us-west-2 验证过,全局服务在 us-east-1 检查;
  4. 内存态、短命。 没针对长跑和压测验证过,记得用 --idle-timeout 收尾;
  5. 遥测默认开着。

七、自己复核保真度:别只看结论

这篇最有用的部分不是 56.6%,而是它可被复核:

  • 每个版本都发一个 scores.json,里面是逐测试的结果;
  • 评估套件公开,包括失败的用例;
  • 官方把“总体 / 单步 / 跳服务工作流”三个维度分开报,因为它们的含义完全不同:56.6% 的“总体”里,单步能到 73.2%,而跳服务工作流只有 41.9%——你要测的恰恰经常是后者。

(另外还有 80 个被跳过的测试。跳过不等于通过,自己取数时记得看一眼这一栏。)

八、接进 CI 的四条纪律

  1. 一个测试一个实例。 资源在内存里、不去数据——共用实例会让上一条用例的副作用污染下一条,而且这种失败复盘起来极贵。Rust 的 embedded 模式本来就是“每个测试一个隔离实例”的设计。
  2. 一定要设 --idle-timeout。 它短命是特性,不自动退出就是 CI 里的僵尸进程。
  3. 把 501 当断言。 NotImplemented 是诚实的信号:它告诉你“这个操作还没有”,比静默返回空数组好得多。把它写进测试,能在升级版本时自动告诉你“刚才不管你、现在管了”。
  4. 遥测默认开着。 容器里如果不想要任何出网行为,记得显式关掉。

九、它解决的是 agent 最缺的那一环

写 agent 的人都有过这个场面:本地没有云,测试要么 mock 得过于干净(永远返回 success),要么连上真 AWS(慢、贵、脏、还不敢乱删)。

mock 的问题是"太顺"——agent 的 bug 恰恰出在错误路径上:限流、404、参数校验、幂等重放。一个会返回 ValidationException、会 501、会按服务不同而"半真半假"的假云,比一个永远成功的 mock 有价值得多。

什么场景值得用

场景 为什么合适
agent 的工具链冒烟 让工具调用打到 9297,验证 schema、重试、错误处理
CI 里的集成测试 无账号、无网络、随便重置,跑完就扔
提示词/工具契约调优 501 是最好的提示:告诉你"这个操作还没有"
教学与演示 不用给学员发 AWS 账号

什么时候别用

  • 权限与安全测试:不评估 IAM,测出来的"通过"没有意义;
  • 多账号/多区域架构:单区单账号,隔离假象;
  • IaC 链路:CloudFormation 15.8%,Terraform/CDK 因服务而异,别把它当 IaC 验证环境;
  • 性能与长跑:内存态、短命,官方没为压测背过书。

我们自己的用法(三条)

  1. 冒烟只挑高保真的那几个服务:KMS 93.9%、SQS 89.8%、S3 79.1%、DynamoDB 77.3%——这四个覆盖了大多数 agent 的工具面;
  2. 把"这个操作用 501"当断言写进测试:它是"未实现"的诚实信号,比静默成功好一百倍;
  3. CI 里放 Docker 路线,2 GiB 上限当预算:超了就说明 agent 在内存里堆了太多状态,这本身是个信号。

顺带一个观察:这个项目和它周边的发布节奏,正好说明了 2026 年下半年的一件事——"让 agent 干活"已经不稀奇,稀奇的是给 agent 装上闸门(合并闸、保真度评分、公开失败测试)。这和我们 11-03 那篇《AI 写的代码越多,审查越像盖章》 说的是同一件事的两面。

十、三步动作

  1. 今天:用 Docker 起一个,把 AWS_ENDPOINT_URL 指到 https://127.0.0.1:9297,跑你 agent 最常用的 3 个工具调用;
  2. 本周:把这 3 个调用的错误路径(参数校验失败、404、幂等重放)补成用例——这是 mock 永远测不出来的部分;
  3. 下次评审:把"哪些操作返回 501"列成清单,决定是绕开还是等它实现。

本文由 Software 2.0 编译整理,转载请注明出处。

Sources

同主题阅读

参考支柱:AI 基建 / 评测 / 安全、本地 & 自托管 LLM。