打开网易新闻 查看精彩图片

开源AWS模拟器MiniStack刚刚放出v1.1.2,这是自发布以来最大的一次更新。644个测试全部通过,Docker泄漏归零,Cognito和EC2的部分支持终于落地——对于每天要在本地跑AWS服务的开发者来说,这组数字意味着不用再给LocalStack交保护费了。

MiniStack的定位很直白:一个端口、无需账号、不要许可证,LocalStack核心服务收费后的平替。这次更新把用户喊了最久的Cognito补全了,还顺手修了20轮测试就能攒出30多个孤儿卷的问题。

644个测试,一个文件,全绿

644个测试,一个文件,全绿

测试重构是这次最枯燥也最重要的工作。团队把之前分散的QA文件并进了主套件,边并边修,最终定格在644个测试覆盖25个服务,单文件管理,全部通过。

这个数字的含金量在于:它堵住了"本地模拟器不可靠"的嘴。很多开发者不敢用开源AWS模拟器,怕的是本地过了、上云崩了。MiniStack的做法是用测试密度换信任——每个AWS操作的行为都被锁定,你本地调通的代码,行为模式和真AWS一致。

测试文件的结构也变了。以前散落在各处的边界 case 现在集中管理,新增服务时必须补测试成为硬性规则。这对贡献者不算友好,但对用户是保险。

Docker泄漏:20轮测试,30个孤儿卷

Docker泄漏:20轮测试,30个孤儿卷

一个藏了多版本的bug被挖了出来。RDS的CreateDBInstance和ElastiCache的CreateCacheCluster都会拉起真实Docker容器,而postgres和mysql镜像默认声明了VOLUME /var/lib/postgresql/data——容器删了,匿名卷留着。

跑20轮测试下来,系统里飘着30多个 dangling volumes,吃掉600MB+空间。开发者的机器就这样被 slowly poisoned,直到某天磁盘报警。

修复后的数据对比很直观:

修复前:3轮测试 → 32个孤儿卷

修复后:始终只有2个卷(ministack + redis,有意保留)

解决方案是给每个容器打上ministack=true标签,配合make purge命令精准清理。这个命令只碰带标签的容器和卷,你本地跑的其他Redis、Postgres、MySQL实例不会被误伤。

打开网易新闻 查看精彩图片

开源工具最容易忽视的就是"退出体验"——能跑起来不算本事,能干净地关掉才是尊重用户。

Cognito:用户池+身份池,JWT能骗过SDK

Cognito:用户池+身份池,JWT能骗过SDK

这是v1.1.2的头号需求。完整支持了Cognito的两个平面:

User Pools(cognito-idp)——用户注册、登录、属性管理

Identity Pools(cognito-identity)——临时凭证、角色映射

技术细节在于JWT的处理。MiniStack没有实现真加密,而是生成结构合法的stub token——base64url编码,能通过大多数SDK的格式校验。对于本地开发来说,这够用了。你要测的是"我的代码在拿到token后怎么处理",而不是"AWS的签名算法对不对"。

代码演示很直白:三行配置指向localhost:4566,创建用户池、注册、确认、登录,拿到AccessToken。和真AWS的区别只有endpoint_url那一行。

这种"一行切换"的设计是MiniStack的核心竞争力。LocalStack社区版把Cognito放进付费墙后,开发者要么掏钱,要么在本地和云端之间来回切换配置。MiniStack给出的选项是:改个URL,继续跑。

EC2和EMR:部分支持,够用主义

EC2和EMR:部分支持,够用主义

EC2只开了个头,EMR同理。团队没有追求API覆盖率,而是挑了最高频的操作先实现。这种策略在资源有限的开源项目里很现实——与其做个100%覆盖但bug一堆的EC2,不如把RunInstances、DescribeInstances做稳。

EMR的支持也是类似逻辑。大数据开发者本地测试时,最痛苦的不是跑完整Spark作业,而是"我的IAM角色配置对不对""集群能不能拉起来"。MiniStack解决的是这部分验证成本。

部分支持不是缺陷,是产品决策。当你说"支持EC2"时,用户默认期待的是完整模拟;但MiniStack的文档会告诉你具体哪些API通了,哪些还没动。这种诚实反而降低了预期管理成本。

基础设施:那些看不见的重构

基础设施:那些看不见的重构

打开网易新闻 查看精彩图片

除了功能更新,v1.1.2有一堆"让日常运行更干净"的改动。Compose文件调整了依赖顺序,健康检查更精确,启动失败时的日志也更可读。

一个典型优化:之前某些服务启动时会竞争端口,导致随机失败。现在加了显式等待和重试,CI环境里跑MiniStack的稳定性明显提升。

这些改动不会出现在Release Note的标题里,但决定了你是"配一次用半年"还是"每周都要去GitHub搜issue"。

版本号跳了两次(1.1.0→1.1.2),中间跳过的1.1.1是个hotfix,修了凭证验证的一个边界 case。有用户反馈README里的示例代码在某些region配置下会失败,团队24小时内发了补丁。

这种响应速度在开源项目里不算多见。MiniStack的维护者似乎很清楚自己的对手是谁——LocalStack有全职团队、有融资、有企业销售;MiniStack能打的牌只有"快"和"不收费"。

但"不收费"本身正在变成越来越强的卖点。LocalStack的Pro版定价对个体开发者不算友好,而AWS官方推出的LocalStack替代品(如SAM Accelerate)又绑定了SAM框架。MiniStack卡在中间:无框架绑定、无账号要求、无功能阉割。

风险也不是没有。AWS的API更新频率很高,MiniStack的25个服务覆盖只是冰山一角。S3、DynamoDB、Lambda这些核心服务已经比较稳,但像Kinesis、SQS的高级特性、Step Functions的状态机,都还是空白。

团队的路线图没有公开时间表,从提交记录看,优先级由用户issue决定。Cognito能排第一,纯粹是喊的人多。

这种民主化优先级也有副作用:基础设施类的改进(比如这次测试重构)会被拖后,直到技术债开始影响开发速度。v1.1.2能花大力气修测试和Docker泄漏,说明维护者已经感受到了压力。

对于观望中的开发者,现在的MiniStack到了一个可用性拐点。644个测试、Cognito完整支持、Docker清理机制——这三件事加在一起,意味着你可以把它放进CI流水线而不必担心随机失败或磁盘爆炸。

但企业级采用还早。没有SLA、没有商业支持、API覆盖有限,这三道坎挡在前面。MiniStack目前的最佳场景是个人项目、初创团队、或者大公司的边缘系统——那些"本地能跑就行"的场合。

LocalStack的收费策略客观上给MiniStack腾出了空间。如果LocalStack社区版没有收缩,一个个人维护的替代方案很难获得关注。但现在,每个月省下的订阅费,就是MiniStack最好的广告。

下一步会是什么?从issue列表看,SQS的FIFO队列、S3的对象标签、Lambda的并发控制都是高频需求。但维护者的精力显然有限,v1.1.2的开发周期比预期长了不少。

开源AWS模拟器这个赛道,最终可能走向分化:LocalStack吃企业客户,MiniStack守住个人开发者,AWS官方工具绑定自己的生态。三种方案各有代价,没有通吃。