LocalStack 收费之后:本地 AWS 模拟器的偏差率才是真账单

2026-11-09T07:16:49+08:00 | 6分钟阅读 | 更新于 2026-11-09T07:16:49+08:00

@
LocalStack 收费之后:本地 AWS 模拟器的偏差率才是真账单

2026 年 3 月下旬,很多人的 CI 流水线在同一个地方红了。日志里没有堆栈,只有一行 401。

代码没动,依赖没升,变的是那个 localstack/localstack 镜像。从 3 月 23 日起,它要求一个 LOCALSTACK_AUTH_TOKEN。本地云模拟器这层的免费时代,到此结束。

Community 版被收进单镜像

LocalStack 这几年一直维护两条产品线:Apache 2.0 的 Community 版,和付费的 Pro 版。2025 年 12 月他们宣布合并,2026 年 3 月 23 日生效:只发一个统一镜像,用之前要注册账号、拿 token,CI 也一样。

创始人的解释是维护高保真模拟的复杂度和安全成本涨得太快,需要一个能直接接触用户的发行方式。这话不算假,但社区不买账。Reddit 上有人回:整个声誉都建立在开源上,现在管它叫「experiment」,有权这么做,别侮辱人。

GitHub 仓库还在,只是不再更新。功能和安全补丁只进新镜像。付费计划按年付是 39 美元一个席位一个月。

对一个把模拟器当测试基础设施的团队,这一刀砍在交付链上。本地开发勉强能忍,CI 里每次跑都烧额度就不能忍。

替代品一夜之间长出来

接下来几个月,GitHub 上冒出一批 MIT 或 AGPL 的替代品,全盯着同一个端口 4566,都自称 drop-in replacement:

  • floci:MIT,启动 24 毫秒,空闲内存 13MiB,镜像 90MB。同一个项目还顺手做了 Azure、GCP、OCI 三个兄弟。Lambda、RDS、ECS、EKS 这些拿真 Docker 跑。
  • fakecloud:单个二进制 19MB,300 毫秒启动,宣称用 AWS 自己的 Smithy 模型生成了 248,319 个测试变体且全部通过,AGPL。
  • localemu:pip 装,132 个服务。Lambda 用 AWS 官方 runtime 镜像,EC2 是真容器加真 VPC,安全组靠真实包过滤生效,IAM 可以开强制校验。
  • ministack:60 多个服务,把 12 位 access key 当账号、SigV4 region 当状态作用域,本地做多租户多区域;Bedrock 请求还能代理到 Ollama 或 vLLM。

这些数字都是各项目 README 里的自报,没有一个经过第三方核验,营销成分肯定有。但方向是真的:本地模拟这层没死,只是被拆成了很多份。

热闹的是许可证,难的是保真度

免费当然重要,可免费解决不了模拟器最根本的问题:它和真云不一样。这个「不一样」不是 bug,是这门生意的本质。你要在笔记本上复刻一个分布式的、有配额、有最终一致性、有几百个错误分支的系统,永远只能复刻一部分。

问题是大部分选型表只讲「支持多少个服务」。这是覆盖率口径,只说尝试了哪些,不说答对了多少。

有个叫 Parity Suite 的独立项目专门量这件事:拿一套 DynamoDB 一致性测试去打各家模拟器,分成三层。对 LocalStack 最新版本的记录是这样的:

  • Tier 1 核心:单条读写、建表、query、scan、batch。偏差 0.2%。
  • Tier 2 完整:事务、TTL、Streams、PartiQL、多属性键。偏差 13.5%,另有 47 个操作不支持。
  • Tier 3 严格:错误信息原文、校验顺序、配额与限制。偏差 36.5%。

细到操作级别更扎手:错误信息偏差 46.1%,校验顺序 57.1%,限制类 18.7%。向量检索和导出导入干脆不支持。

这个分布很说明问题。核心 CRUD 大家都做对了,因为做不对根本没法用。差的全在边缘语义上:报错文本长什么样、多个校验同时失败时先报哪个、超过限制时的具体行为。

而线上事故恰恰长在边缘。你的重试逻辑判断的是错误码和消息,你的降级分支靠的是「哪种情况会先抛异常」,你的幂等设计依赖的是事务失败时的具体表现。这些地方模拟器和真云不一致,本地测试全绿,上线才炸。这不是模拟器的锅,是你把「本地通过」当成了「逻辑正确」。

偏差率下降,可能只是不做了

Parity Suite 页面上有句话值得单独拎出来:偏差率下降,可能只是因为目标不再尝试它以前做错的操作,所以偏差率和覆盖率必须一起看。

这句是整套方法论里最值钱的一句。它同样适用于自己团队的测试报告:通过率涨了、覆盖率掉了,先问是不是把难跑的用例删了。

拿这个口径看那些替代品。fakecloud 说 Smithy 变体 248,319 个全过,这是覆盖率加严格比对;floci 说要跑真 Docker,那是把保真度外包给上游容器。两条路都对,含义不同:前者保证接口形状,后者保证行为真实。你要哪一种,取决于你怕的是调用方式写错,还是行为假设写错。

一个团队的真实选择:从三种模拟器收敛到一种

日本一家做现场管理 SaaS 的团队写过一篇复盘,仓库里同时躺着 LocalStack、RustFS、Moto 三种模拟器,各有历史原因:LocalStack 管本地开发和 E2E,RustFS 管场景测试的 S3,Moto 管单测里签名 POST 策略那种细活。

每一个决定在当时都合理,三个凑一起就成了心智负担。LocalStack 收费的公告成了契机,他们最后统一到 Moto。

有意思的是他们没选功能最强的那个。复盘里真正卡住的交叉点是 STS 加 IAM,因为签 POST 策略得先 AssumeRole;单功能模拟器没有一个能同时覆盖这两个,而覆盖面最广的那个又背上了许可证和成本。最后赢的是「够用,而且少一个脑子」。

哪些层必须真,哪些可以假

看过这些实现,能看出一个挺清楚的判断框架:真实性是可开关的参数,不是厂商标签。

看它们怎么设计就明白:

  • fakecloud 的 SigV4 校验和 IAM 策略评估默认关,可以开成 soft 或 strict,要真就真,不要就省。
  • localemu 的 IAM_ENFORCEMENT 默认关,开了策略就真的拒绝。
  • ministack 把 access key 当租户、region 当状态作用域,这是主动选择「身份必须真」。

按这个思路,我会这样分:

必须真,错一次就白测:权限拒绝路径、网络可达性、容器里的真实 runtime、并发与限流行为、最终一致性的时序。

可以假,差一点不致命:计费与账单、控制面 API 的字段完整性、日志与监控格式、区域数量。

最常见的坑是方向搞反:在「可以假」的地方死磕字段一模一样,又默认权限和限流本来就是真的。

我的判断

模拟器买的是迭代速度,卖的是保真度。这笔账不在本地结,在线上结。所以它适合当开发回路的加速器,不适合当生产预演。这两件事分开,选型就没那么纠结。

个人和小团队:一个模拟器足够,别追服务数量。真正值钱的是发布前那一次真云 smoke,只跑关键路径,五分钟能跑完。它比本地一千个单元测试更能兜住「本地绿线上炸」。

团队:维护一份自己的偏差清单。哪个服务、哪条路径、哪个错误分支在本地是假的,写下来,标在对应测试用例旁边。这份清单比任何选型对比表都有用,因为它只记录你们真的踩过的坑。

整个生态:这层不会被消灭,只会被商品化。免费替代品会继续冒,也大概率重复同一条路径,先开源换信任,再收口换收入。能长期立住的不是服务数量,是可以被第三方复现的一致性测试集。Parity Suite 那种独立测度,比任何 README 里的对比表都可信。

下次有人给你看「支持 132 个 AWS 服务」,可以补一句:核心之外的偏差率是多少,覆盖率又是多少。两个数一起看,才知道买的是加速器还是安慰剂。


参考来源

Me

Cut out summary from your post content here.

The remaining content of your post.