命令行工具
floci-io/floci avatar
floci-io/floci

Floci 评测:本地 AWS 模拟器的轻量替代,但 83 项服务的覆盖并非免费

Floci 在本地计算机上模拟选定的 AWS 服务,因此无需远程帐户即可开发和测试云应用程序。

24,290 个 Star2,611 个 ForkJavaMIT

秒懂

它是什么?
Floci 是一个开源的本地 AWS 模拟器,无需账号即可在 localhost:4566 提供 83 项服务,但真实 Docker 执行与存储模式的选择决定了它的适用边界。
适合谁用?
Floci 适合那些需要快速在本地或 CI 中模拟 AWS 服务、但不想为 LocalStack 社区版付费或忍受其认证令牌的开发者。若你的项目依赖 S3、DynamoDB、SQS、Lambda 等常见服务,并且能接受 4566 端口的固定入口,Floci 值得一试。
能商用吗?
可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库在最近一天内有新的提交。
用什么语言写的?
主要是 Java(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

为什么需要另一个本地 AWS 模拟器

本地 AWS 模拟器解决的是一个具体问题:在开发或测试时,你不想为每个环境创建真实的 AWS 账号,也不想为每次运行支付云费用。LocalStack 社区版曾是主流选择,但根据 Floci 的 README,LocalStack 社区版在 2026 年 3 月停止维护,要求认证令牌,且安全更新冻结。Floci 直接回应了这个痛点:不需要账号,不需要令牌,没有付费功能门。它把自己定位为 LocalStack 的替代品,目标是让现有 AWS 工具链,包括 SDK、CLI、Terraform、CDK、OpenTofu,都能指向 localhost:4566 继续工作。这个定位很清晰,但它的价值取决于实际覆盖的服务质量和保真度,而不是单纯的数量。

一次启动,所有服务共用 4566 端口

Floci 的架构是单一进程监听 4566 端口,通过 HTTP 路由分发请求。根据 README 中的架构图,路由层基于 JAX-RS 和 Vert.x。请求被分为无状态服务和有状态服务两类。无状态服务,如 SSM、SQS、SNS、IAM、STS、KMS、Cognito、EventBridge,直接在进程内处理。有状态服务,如 Lambda、RDS、Neptune、ElastiCache、MSK、ECS、EC2、EKS、OpenSearch,则使用真实 Docker 容器执行,而不是浅层 mock。这意味着你获得的不是模拟响应,而是实际运行这些服务的容器。这种设计是双刃剑:它提高了保真度,但增加了资源消耗和启动复杂度。对于 CI 环境,这可能是决定性的因素。

启动命令与配置:从 CLI 到 Docker Compose

最快的启动方式是使用官方 CLI。安装后运行 floci start,然后执行 eval $(floci env) 导出环境变量。之后你可以直接用 aws s3 mb s3://my-bucket 创建桶,或者用 aws dynamodb create-table 建表。所有服务都在 localhost:4566,任何区域都可用,凭证可以是任意非空值,除非你显式启用更严格的服务特定认证检查。如果你偏好 Docker Compose,只需创建一个 compose.yaml 文件,指定 image: floci/floci:latest,映射端口 4566,然后 docker compose up。然后手动导出四个环境变量:AWS_ENDPOINT_URL、AWS_DEFAULT_REGION、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY。注意,CLI 的 eval 命令自动处理这些,而 Docker Compose 方式需要手动设置。这个双路径设计适合不同习惯的团队。

存储模式:内存、持久化、混合与 WAL

Floci 提供四种存储模式:内存、持久化、混合和写前日志(WAL)。这直接关系到数据在模拟器重启后是否保留。内存模式最快,但数据丢失;持久化模式将状态写入磁盘;混合模式可能结合两者;WAL 模式则提供类似数据库的日志记录。文档没有详细说明每种模式的具体实现,但显然你需要根据开发场景选择。对于本地开发,内存模式足够;对于 CI 中的集成测试,可能需要持久化以确保测试间的状态隔离。这个设计比 LocalStack 的单一持久化选项更灵活,但需要你自己权衡。没有文档说明如何切换这些模式,这意味着你需要查阅官方文档,而不是依赖 README。

性能数据:启动 24 毫秒,空闲内存 13 MiB,但需谨慎看待

README 给出的性能数字是启动时间约 24 毫秒,空闲内存约 13 MiB,Docker 镜像大小约 90 MB。相比之下,LocalStack 社区版启动约 3.3 秒,空闲内存约 143 MiB,镜像约 1.0 GB。这些数字来自 Floci 的对比表,我没有运行过,无法验证。但合理的解读是,Floci 的原生镜像(约 40 MB 的二进制)确实比 LocalStack 的 JVM 堆栈轻得多。然而,这个数字只适用于无状态服务。当你启动一个 RDS 或 EKS 的 Docker 容器时,额外的内存和 CPU 消耗会迅速增加。所以,如果你只用 S3 和 DynamoDB,这些数字有参考价值;如果你打算模拟整个微服务架构,请做好资源预算。

真实 Docker 执行:保真度与资源消耗的权衡

Floci 对 Lambda、RDS、Neptune、ElastiCache、MSK、ECS、EC2、EKS、OpenSearch、CodeBuild 和 Managed Service for Apache Flink 使用真实 Docker 执行。这意味着你得到的是实际运行这些服务的容器,而不是一个返回模拟响应的 HTTP 端点。这显著提高了兼容性,例如 Neptune 的 Gremlin WebSocket 和 DocumentDB 的 MongoDB 兼容协议都可以正常工作。但代价是,你需要在本地或 CI 环境中运行 Docker,并且每个服务实例都会消耗资源。对于 CI 管道,这可能导致构建时间延长,尤其是当测试套件需要启动多个容器时。文档没有说明这些容器是否支持自定义镜像版本,这是一个关键缺口。如果你需要特定版本的 PostgreSQL 或 Redis,需要自行验证。

从 LocalStack 迁移:并非零成本

Floci 的 README 包含一个迁移指南,但内容被截断了。从表格来看,Floci 支持 LocalStack 社区版不支持的几个服务,包括 API Gateway v2、Cognito、RDS、ElastiCache、MSK、Neptune、DocumentDB、ECS、EC2、EKS、CodeBuild。这意味着如果你之前因为这些服务而不得不使用 LocalStack 的付费版本,Floci 可能是一个免费替代。但迁移并不是零成本。你的现有配置可能依赖 LocalStack 的特定环境变量或扩展机制。Floci 使用标准 AWS_ENDPOINT_URL,这与 LocalStack 的 AWS_ENDPOINT_URL 兼容,但其他方面可能需要调整。此外,旧的 hectorvent/floci 镜像不再更新,如果你从那个镜像迁移,需要更新镜像名。这个细节容易被忽略,但会影响生产环境的稳定性。

维护与许可:MIT 许可下的社区驱动

Floci 采用 MIT 许可,这意味着你可以自由使用、修改和分发,但没有任何担保。项目最近一次推送是 2026 年 8 月,发布了 1.7.0、1.6.0 和 1.5.34,显示活跃的维护节奏。但活跃的提交并不保证长期支持,尤其是当项目依赖社区贡献时。README 提到“免费永远”,但免费项目的可持续性取决于维护者的时间和资源。如果你在关键生产流程中使用 Floci,你需要自行承担风险。建议在采用前,检查项目的 issue 跟踪器和发布历史,确认安全修复的响应速度。文档没有提供升级路径或版本兼容性说明,这意味着升级可能需要你手动测试所有依赖的服务。

编辑结论

Floci 适合那些需要快速在本地或 CI 中模拟 AWS 服务、但不想为 LocalStack 社区版付费或忍受其认证令牌的开发者。若你的项目依赖 S3、DynamoDB、SQS、Lambda 等常见服务,并且能接受 4566 端口的固定入口,Floci 值得一试。但如果你需要高保真度的 RDS、Neptune 或 MSK,请务必验证其真实 Docker 执行是否符合你的版本要求,因为文档并未列出具体镜像版本。此外,若你的工作流依赖 LocalStack 的特定扩展或付费功能,迁移前需逐项检查兼容性,因为 Floci 的文档只提供了迁移指南,并未承诺完全兼容。最后,先确认你的 CI 环境是否允许拉取约 90 MB 的 Docker 镜像,以及是否接受约 13 MiB 的空闲内存占用。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社区笔记

社区笔记