没有 AWS 账号也能测 agent:200+ 服务搬到本地,及格线只有 56.6%
42,857 个测试过 24,243 个——听起来不及格,但它给了 agent 最缺的东西:一个会按 AWS 的方式报错、而且免费随便重置的回路。
没有 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 决定用不用它之前,先回答五个问题
- 我要验的是控制面还是数据面?—— 控制面才像。
- 测试路径涉及 IAM 权限语义吗?—— 涉及就不行,它不求值策略。
- 需要多区域/多账号吗?—— 单区单账号,隔离是假象。
- 我的 agent 会不会读到上一个测试残留的内存状态?—— 它会,所以每个用例一个实例,或至少用
--idle-timeout。 - 我的 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 自己列的)
- 不评估 IAM。 身份策略和资源策略不按 AWS 的方式求值——别拿它做安全测试;
- 只有 1 个区域、1 个账号。 它接受任意 ID,但不按 ID 隔离资源;
- 只在 us-west-2 验证过,全局服务在 us-east-1 检查;
- 内存态、短命。 没针对长跑和压测验证过,记得用
--idle-timeout收尾; - 遥测默认开着。
七、自己复核保真度:别只看结论
这篇最有用的部分不是 56.6%,而是它可被复核:
- 每个版本都发一个
scores.json,里面是逐测试的结果; - 评估套件公开,包括失败的用例;
- 官方把“总体 / 单步 / 跳服务工作流”三个维度分开报,因为它们的含义完全不同:56.6% 的“总体”里,单步能到 73.2%,而跳服务工作流只有 41.9%——你要测的恰恰经常是后者。
(另外还有 80 个被跳过的测试。跳过不等于通过,自己取数时记得看一眼这一栏。)
八、接进 CI 的四条纪律
- 一个测试一个实例。 资源在内存里、不去数据——共用实例会让上一条用例的副作用污染下一条,而且这种失败复盘起来极贵。Rust 的 embedded 模式本来就是“每个测试一个隔离实例”的设计。
- 一定要设
--idle-timeout。 它短命是特性,不自动退出就是 CI 里的僵尸进程。 - 把 501 当断言。
NotImplemented是诚实的信号:它告诉你“这个操作还没有”,比静默返回空数组好得多。把它写进测试,能在升级版本时自动告诉你“刚才不管你、现在管了”。 - 遥测默认开着。 容器里如果不想要任何出网行为,记得显式关掉。
九、它解决的是 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 验证环境;
- 性能与长跑:内存态、短命,官方没为压测背过书。
我们自己的用法(三条)
- 冒烟只挑高保真的那几个服务:KMS 93.9%、SQS 89.8%、S3 79.1%、DynamoDB 77.3%——这四个覆盖了大多数 agent 的工具面;
- 把"这个操作用 501"当断言写进测试:它是"未实现"的诚实信号,比静默成功好一百倍;
- CI 里放 Docker 路线,2 GiB 上限当预算:超了就说明 agent 在内存里堆了太多状态,这本身是个信号。
顺带一个观察:这个项目和它周边的发布节奏,正好说明了 2026 年下半年的一件事——"让 agent 干活"已经不稀奇,稀奇的是给 agent 装上闸门(合并闸、保真度评分、公开失败测试)。这和我们 11-03 那篇《AI 写的代码越多,审查越像盖章》 说的是同一件事的两面。
十、三步动作
- 今天:用 Docker 起一个,把
AWS_ENDPOINT_URL指到https://127.0.0.1:9297,跑你 agent 最常用的 3 个工具调用; - 本周:把这 3 个调用的错误路径(参数校验失败、404、幂等重放)补成用例——这是 mock 永远测不出来的部分;
- 下次评审:把"哪些操作返回 501"列成清单,决定是绕开还是等它实现。
本文由 Software 2.0 编译整理,转载请注明出处。
Sources
- 原文:Asif Razzaq《AWS Releases AWS Emulator: A Local Copy of 200+ AWS Services Built by AI Agents》,MarkTechPost,2026-11-12 https://www.marktechpost.com/2026/11/12/aws-emulator-local-aws-api-emulator-ai-agents/
- 代码与分数:https://github.com/aws/aws-emulator、评估集
aws-emulator-evaluation-suite(含失败用例)
同主题阅读
参考支柱:AI 基建 / 评测 / 安全、本地 & 自托管 LLM。