
AWS发布官方本地模拟器,仅用于开发测试
来源标题:AWS made an official local emulator
AWS推出官方本地模拟器,开发者可通过CLI、SDK或IaC工具在本地调用API进行开发和测试。该工具没有控制台,官方明确警告不要用于生产或安全测试,且资源端口不校验请求签名。作者指出它对SDK和IaC集成测试有用,可替代成本高昂的真实AWS测试环境。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Luka Kladarić 2026年11月12日 2 1 分享 一个可以用来练手的小型云。但也仅限于练手。
AWS 昨天发布了自己的本地模拟器。我当时正在准备 cfnrain 的新版本发布——那是我维护的 CloudFormation CLI——于是顺手试了试。
它已经足够应付 SDK 和 IaC 的接线,同时也存在一些在第一天就能理解的明显缺口。
我关心这件事,是因为针对 AWS 的集成测试太贵了。cfnrain 的真 AWS 测试套件需要一个专用账户、来自 GitHub 的 OIDC 信任、护栏策略,以及一整套流程来保护它和我自己。
它不是免费的 AWS。没有控制台,只有一个 API 端点,所以你得通过 CLI、SDK 或 IaC 工具来驱动它。README 对其余部分说得很直接:“AWS Emulator 用于构建和测试。不要用于生产工作负载,也不要用来测试安全性。”
AWS 的隔离性它一概没有。根据安全页面所述,你交给它的函数代码“以你的用户权限运行,可以读取和更改你的文件”,同一台机器上的其他用户可以访问它的端口,而且它为资源打开的端口“不校验请求签名”。
在 CI 中最需要注意的是:“如果未设置 AWSENDPOINT_URL,你的代码会用它能找到的任何凭据去调用 AWS。”我的 CI 任务会清除所有继承来的 AWS* 变量,并且除非 sts get-caller-identity 返回模拟器的账户 000000000000,否则拒绝继续。
AWS Emulator 已正式可用、免费,并以 CC0 发布。它是一个本地二进制文件,由 AWS 发布的 438 个 API 模型生成,每个模型对应一个端点。每个服务实际能用的部分差异很大,任何未实现的功能都会返回 501。AWS 表示全部代码都由 agent 编写:“我们的团队没有编写或审查过任何代码。”
CC0 对 AWS 来说并不寻常,它通常使用 Apache 2.0 或 MIT-0。它严格来说不是一种许可证,而是一种公有领域奉献:AWS 放弃其版权,因此你可以无条件、无需署名地复制、fork、嵌入或分发代码。原因在于 agent。The New Stack 报道称,AWS 不确定它能否对没有人类编写的代码主张版权,也不想主张可能并不存在的权利。有两点需要注意:vendor/ 目录——agent 构建所依赖的框架——仍归 Apache 2.0 之下;而 CC0 不涉及专利和商标权,所以你得不到 Apache 2.0 会给予你的专利授权。
安装只需几分钟。Linux 包为 163 MiB,无需 root 即可运行。它大约 23 毫秒就绪,在 localhost 上以自带凭据和 CA 提供 HTTPS 服务。cfnrain 使用的是 AWS SDK for Go v2,无需改动代码就能与它通信,只需设置环境变量。
一切都存在内存中,重启即丢失;Region 和账户不做隔离,所以每个 Region 要跑一个模拟器;遥测默认开启。AWS 每次发布都会公布保真度分数。CloudFormation 通过了其 4,206 个测试单元中的 795 个,文档称 IaC 支持“因服务而异”。
三轮测试:先是 cfnrain 自身的工作流,然后是一个生产形态的 VPC,上面跑 Aurora 和 Fargate,最后是为 18 个服务各建一个最小栈,每个都执行创建、更新和删除。每个资源都通过其自身服务的 API 读回验证。退出码和栈状态从未被当作证据。
CloudFormation 核心表现稳固。创建、更新和删除,变更集先预览再执行,一次失败的更新会回滚并在事件中给出真实原因,终止保护,构件上传到 S3。Express 模式和 Early Validation——AWS 今年推出的两个 CloudFormation 特性——行为与真实账户中一致。
CREATE_COMPLETE,背后却空无一物。
r/aws 上一位评论者说“不太清楚边界在哪里”,玩过之后我同意:人类很难分辨哪些是预期能用的,哪些不是。
不存在的东西也报成功。CloudWatch 告警、ElastiCache、CloudFront、负载均衡器和 ECS 服务都报告 CREATE_COMPLETE,而它们的服务 API 里什么都没有。CloudFront 和负载均衡器甚至返回看似合理的 DNS 名称。一个 Aurora 集群也报告完成,直到它的实例以“cluster not found”失败。
能创建,但不能更新。API Gateway、ECR 和 WAFv2 的栈能正常创建,但在第一次更新时就以 NotImplemented 回滚。我在任何带有互联网网关附件的栈上尝试的每次更新也是如此——而大多数 VPC 都有这个。
没有权限检查。“模拟器从不会拒绝用自身密钥签名的请求”,所以权限 bug 始终不可见。一位评论者说得直白:“对 IAM 不现实可用,这很扫兴。”
Lambda 无法访问大部分 AWS。其运行时只为少数几个服务构建 SDK 客户端。我的函数需要的 SNS 不在其中,S3 也不在。调用仍返回 HTTP 200,错误被标记为“Unhandled”。
真实模板会撞上真实 bug。一个普通的 VPC 模板在 !GetAtt 一个 Elastic IP 时失败,解析结果为空。位于已关闭的 Fn::If 分支中的导入仍会被解析。ACM DNS 验证和 StackSet 实例未实现。
我向上游提交了七个 issue,每个都附有纯 CloudFormation 和 AWS CLI 的复现步骤。目前没有一个得到 AWS 回应。公布的分数充其量只是粗略参考,无论哪个方向都没能很好地预测我的结果。
r/aws 上一位评论者点明了用例:“比把 CloudFormation 部署到个人测试账户快得多。”
cfnrain 的真 AWS 套件在 main 上运行:每次推送、每周一次,以及维护者打上标签的 pull request。这些测试不易并行安全,并发运行间的清理本身就会成为问题。模拟器让每个 pull request 都能拥有自己隔离的、一次性的 AWS。
把每个集成测试标记为 emulator-safe 或仅限真 AWS。RDS、ECS、IAM 以及任何会更新 API Gateway 的测试都留在真 AWS 上。
在每次 pull request 上运行 emulator-safe 集合。我的是 36 项检查,在标准 GitHub runner 上不到三分钟跑完,无需 AWS 凭据,仓库权限为只读。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。