Floci 철학: 작게 유지하고, 실제 AWS처럼 느끼기
Source: Dev.to
위의 링크에 포함된 텍스트를 한국어로 번역해 주세요. (코드 블록, URL 및 마크다운 구문은 그대로 유지하고, 본문 내용만 번역하면 됩니다.)
개요
Every AWS emulator forces a trade‑off:
- 빠르고 가짜. 작고 즉시 실행되지만, 코드가 실제 엔진에 닿아 추상화가 깨질 때까지.
- 무겁고 충실함. AWS에 더 가깝지만, 3‑second startup, 수백 MB, 번들된 Python 런타임으로 인해 모든 CI 작업이 느린 아침이 됩니다.
I built Floci to refuse the choice. One principle:
가능한 한 가장 가볍게 하세요. 중요한 곳에서는 실제와 같이 하세요.
모든 AWS 서비스의 두 절반
AWS API 문서를 충분히 읽다 보면 모든 서비스가 두 부분으로 구성되어 있다는 것을 알게 됩니다:
- Control plane – “이 버킷을 만들고, 내 큐를 나열한다.” JSON 또는 XML을 통한 단순 CRUD. 어려운 부분은 와이어‑프로토콜 정확성입니다.
- Data plane – “이 Lambda를 실행하고, 이 데이터베이스에 연결하고, 이 Redis를 쿼리한다.” 여기서 실제 엔진이 동작합니다. 가짜로 구현하는 것은 언젠가 한계에 부딪힙니다.
Control plane은 무겁게 설계될 이유가 없고, Data plane은 가짜일 이유가 없습니다. Floci는 의도적으로 서로 다른 레이어에서 두 가지를 모두 구현합니다.
구조
┌───────────────────────────────────────────┐
│ Floci core, Quarkus native binary │
│ 24 ms startup · 13 MiB idle │
│ │
│ All control planes + stateless services │
│ (S3, SQS, DynamoDB, IAM, KMS, …) │
└─────────────────┬─────────────────────────┘
│ Docker socket, on demand
▼
┌───────────────────────────────────────────┐
│ Right‑sized engines per service │
│ │
│ Tiny sidecars: │
│ • Athena, Firehose → floci‑duck (DuckDB)│
│ │
│ Heavy real engines: │
│ • Lambda → real container │
│ • RDS → real Postgres / MySQL │
│ • Cache → real Redis / Valkey │
│ • MSK → real Kafka │
└───────────────────────────────────────────┘
작은 코어 하나. 실제 엔진은 필요할 때만 해당 서비스를 사용할 경우에 끌어옵니다.
Source: …
세 가지 패턴, 두 개가 아니라
디자인은 세 가지 패턴을 사용하며, 각각 실제 동작을 제공하는 가장 작은 요소를 선택합니다:
-
Stateless / metadata → 인‑프로세스.
S3, SQS, DynamoDB, IAM. 가짜 엔진이 필요 없고, 올바르게 구현해야 할 사양만 있습니다. Floci는 이를 13 MiB에 구현합니다. -
작은 임베디드 엔진 존재 → 작은 사이드카.
Athena는 Presto 클러스터가 아니라 S3에 있는 데이터에 대한 올바른 SQL 실행이 필요합니다. Floci는 floci‑duck 를 사용합니다. 이는 DuckDB를 래핑한 작은 Rust 바이너리입니다. 실제 컬럼형 SQL을 제공하며, JVM이나 Hive 메타스토어가 필요 없습니다. 같은 사이드카가 Firehose의 Parquet 변환을 담당합니다. 이것이 가장 순수한 철학이며, 가장 가벼운 실제 엔진을 선택합니다. -
임베디드 대체제가 없음 → 실제 무거운 엔진.
RDS, ElastiCache, MSK, OpenSearch, Lambda. 여러분의 코드는 PostgreSQL, RESP, Kafka와 통신하거나 실제 컨테이너로 실행됩니다—이를 흉내낼 수 없습니다. Floci는 필요할 때 실제 엔진을 가동하고, 그 뒤에선 물러납니다.
세 패턴 모두에 적용되는 규칙: 이미 존재하는 엔진을 다시 구현하지 마세요. AWS API를 그 위에 연결하고, 뒤로 물러나세요.
What this buys you
- Lightweight isn’t marketing. 24 ms의 콜드 스타트로 테스트당 Floci를 고민 없이 실행할 수 있습니다. 유휴 상태에서 약 13 MiB는 무료 티어 CI 러너에 맞습니다. 약 90 MB 이미지가 감사 가능합니다.
docker compose up이 Alt‑Tab을 할 새도 없이 완료됩니다. - Fidelity isn’t a checkbox. Lambda는 실제 Lambda 런타임 이미지에서 실행됩니다. RDS는 실제 PostgreSQL과 통신합니다. ElastiCache는 실제 RESP를 사용합니다. Athena는 실제 S3 데이터에 대해 DuckDB를 통해 실제 SQL을 실행합니다. 테스트가 통과하면, 코드가 실제로 동작합니다.
내가 받아들이는 트레이드‑오프
- Floci는 엔진 기반 서비스에 Docker 소켓이 필요합니다. 공정한 거래죠.
- 일부 서비스는 코어보다 느리게 시작합니다. Postgres는 부팅하는 데 몇 초가 걸립니다. Floci 자체는 24 ms이지만
CreateDBInstance는 Postgres가 걸리는 만큼 걸립니다. 거짓말 없이 이를 피할 방법은 없습니다.
이것이 당신에게 거짓말하지 않는 대가입니다.
왜 중요한가
모든 에뮬레이터 선택은 다음 질문으로 귀결됩니다: 테스트가 진실을 알려주길 원하나요?
부피가 큰 에뮬레이터는 건너뛰게 됩니다. 빠르지만 가짜인 에뮬레이터는 실제 환경에서 실패하는 테스트를 통과시킵니다. Floci의 아키텍처는 양쪽 모두를 피하도록 설계되었으며, 각 서비스에 가장 작은 실제 구현을 선택하고, 절대 가장 부피가 큰 가장자리만을 흉내 내는 것을 사용하지 않습니다.
docker run --rm -p 4566:4566 \
-v /var/run/docker.sock:/var/run/docker.sock \
floci/floci:latest
🔗
📚
💬