Floci:在本机模拟 AWS 服务,开发和 CI 不必连接云账号

写一个用到 S3、消息队列或 DynamoDB 的应用,本地开发时也得准备这些依赖。直接连 AWS 要管账号和测试资源,自己写 mock 又容易把真正的调用流程跳过去。

Floci 是一个用 Java 写的本地 AWS 服务模拟器:在本机启动服务,把 AWS CLI 或 SDK 的 endpoint 指向它,就能沿用原来的接口做开发和集成测试。它采用 MIT 许可证,不需要注册 Floci 账号或申请它的授权令牌,也没有按付费档位解锁功能的设计。

比自己写 mock 更接近实际调用

Floci 提供 AWS 协议兼容的本地接口,统一入口是 http://localhost:4566。支持范围包含 S3、SQS、SNS、DynamoDB、Lambda、API Gateway、Secrets Manager 等,具体到每项服务支持哪些操作,需要按服务清单核对,不能把“支持某服务”理解成完整复刻 AWS。

比如,一个上传文件后发消息的后端,可以把对象存储和队列都指向本地环境,让测试走过 SDK 请求、资源创建和业务处理这条链路。相比只替换掉几个函数返回值,这种方式更适合检查应用与云服务接口之间的衔接。

项目还提供 Terraform、CDK、OpenTofu 的接入说明,以及 Java、Go、Python、Node.js / TypeScript、.NET 的 Testcontainers 集成,适合把临时测试环境放进 CI。

用 Docker Compose 跑一个本地 S3

先准备 Docker、Docker Compose,以及用于验证的 AWS CLI。新建 compose.yaml:

services:
  floci:
    image: floci/floci:latest
    ports:
      - "127.0.0.1:4566:4566"
    volumes:
      - ./data:/app/data

启动:

docker compose up -d

下面是 Bash / zsh 的环境变量写法。test 是本地模拟环境用的占位凭据,不需要放真实 AWS 密钥:

export AWS_ENDPOINT_URL=http://localhost:4566
export AWS_DEFAULT_REGION=us-east-1
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test

aws --endpoint-url http://localhost:4566 s3 mb s3://my-bucket
aws --endpoint-url http://localhost:4566 s3 ls

这个示例把端口限制在本机回环地址,数据目录挂到当前目录的 data。接自己的应用时,再配置对应 SDK 的 endpoint;不同 SDK 的配置方式可以查项目的接入说明。

示例为了方便体验用了 latest,正式放进团队测试流水线时,最好固定镜像版本,避免更新后测试环境悄悄变化。

也有浏览器控制台

Floci 的控制台可以查看本地资源,入口是 http://localhost:4566/_floci/ui。它不是直接嵌在主进程里的静态页面:第一次访问时会拉取并启动一个控制台侧车容器,所以需要 Docker socket 权限。上面的最小 Compose 没有挂载 socket,先验证 CLI 调用即可;需要界面时再按控制台部署说明配置。

适合拿来做什么

如果项目依赖多种 AWS 服务,又想让开发环境和 CI 不必连接真实云账号,Floci 值得试一轮。已经使用 LocalStack 的项目,也可以参考它提供的迁移说明逐项验证。

它的边界同样明确:本地模拟器适合验证应用逻辑和已实现的 API 行为,不能据此确认真实 AWS 上的所有权限、网络和服务细节都没问题。选型时先对照自己用到的操作,而不是只数支持了多少种服务。

项目信息