Đến nội dung chính
Phạm Nam

Tìm kiếm

Nhập từ khoá để tìm trong các bài viết.

Quay lại
vi

Floci giả lập AWS local miễn phí thay LocalStack

Floci là trình giả lập AWS local miễn phí, mã nguồn mở, thay thế LocalStack Community: chạy S3, DynamoDB, Lambda trên localhost:4566 cho dev, test và CI.

13 phút đọc—

Ảnh minh họa: Floci giả lập AWS local miễn phí thay LocalStack

Một buổi chiều sửa handler và cái bill không ai muốn nhìn

Bạn vừa sửa một handler nhỏ: nhận file từ S3, ghi metadata vào DynamoDB, đẩy message sang SQS. Code đổi vài chục dòng, nhưng để kiểm chứng, bạn phải deploy lên môi trường dev trên AWS thật, chờ pipeline chạy, rồi rà console xem bucket, bảng và queue nào vừa bị chạm tới. Đồng đội cũng đang test trên cùng tài khoản, nên một bảng test bị xóa nhầm là cả buổi chiều của hai người cùng đứng lại.

CI của team cũng vậy: không có tài khoản cloud riêng, mỗi pull request chạy test tích hợp là phải xin credential, lo quota, lo dọn resource. Có người chọn emulator trả phí, rồi phát hiện tính năng cần dùng nằm sau paywall. Floci ra đời cho đúng chỗ đau này: trình giả lập AWS chạy hoàn toàn trên máy local, miễn phí, mã nguồn mở, không cần tài khoản cloud hay token. Bạn trỏ SDK, AWS CLI, Terraform hoặc test suite về http://localhost:4566 và chạy vòng lặp dev/test ngay trên máy mình. Nhưng cần nhớ rõ: Floci giả lập AWS ở mức operation, không phải AWS thật.

Floci là gì

Floci là AWS emulator mã nguồn mở, viết bằng Java, giấy phép MIT, dành cho phát triển, kiểm thử và CI. Repo chính là floci-io/floci. Tính đến ngày kiểm chứng 2026-11-04, dự án có khoảng 29.000 sao trên GitHub, bản mới nhất là 2.4.0 phát hành ngày 2026-10-31, và vẫn được push code trong ngày kiểm chứng.

Cách dùng rất gọn: mọi client chỉ cần một endpoint duy nhất là http://localhost:4566, bất kể region nào. Theo mình, nguyên tắc dùng Floci nên đặt ngay từ đầu: dùng nó để kiểm chứng logic ứng dụng và luồng dữ liệu. Còn kiểm chứng cuối cùng về phân quyền, billing, quota và hành vi biên của AWS thật thì vẫn phải làm trên AWS thật.

Thay thế LocalStack Community bằng cách đổi image

Điểm khiến Floci đáng chú ý là khả năng thay thế trực tiếp LocalStack Community. Floci dùng cùng cổng 4566, cùng cách cấu hình SDK và credential, nên việc migrate trong nhiều trường hợp chỉ là đổi image từ localstack/localstack sang floci/floci:latest.

Tài liệu của dự án ghi rõ các cầu nối tương thích đi kèm: biến môi trường LocalStack được dịch tự động, ví dụ PERSISTENCE=1 thành FLOCI_STORAGE_MODE=persistent; init script trong /etc/localstack/init/ vẫn chạy không đổi; endpoint /_localstack/init và /_localstack/health vẫn được phục vụ. Muốn tắt lớp tương thích này, đặt LOCALSTACK_PARITY=false. Nếu init script cần AWS CLI hoặc boto3 có sẵn trong image, dùng tag latest-compat.

Cần nói thẳng: tương thích cấu hình không đồng nghĩa tương thích toàn bộ operation. Trước khi migrate, tra bảng Services Overview chính thức tại https://floci.io/floci/services/ theo từng service và operation mình dùng, rồi chạy lại toàn bộ test suite trên nhánh riêng.

Floci hợp với developer viết code chạm S3, SQS, SNS, DynamoDB, Lambda; DevOps/SRE muốn xây CI mà không cấp tài khoản cloud cho từng runner; sysadmin và người dùng homelab muốn học AWS mà không phát sinh bill. Nên cân nhắc kỹ nếu team cần kiểm chứng IAM policy, billing, hiệu năng AWS thật, hoặc dựa vào operation hiếm chưa có trong Services Overview. Không dùng Floci cho production, dữ liệu thật nhạy cảm, hay môi trường multi-tenant không tin cậy lẫn nhau.

Kiến trúc: một cổng, hai đường thực thi

Floci core viết bằng Quarkus/Java, đóng vai trò gateway duy nhất tại cổng 4566. Khi request tới, core định tuyến theo service và operation dựa trên giao thức AWS, thay vì mỗi service chiếm một cổng riêng. Cách này giúp cấu hình gọn, nhưng log của mọi service dồn về một chỗ, nên khi debug bạn phải lọc theo service và operation.

Từ gateway, request rẽ thành hai đường thực thi. Đường thứ nhất là giả lập trong tiến trình: S3, SQS, SNS, DynamoDB, IAM, STS, KMS, Secrets Manager, SSM, EventBridge, Step Functions và API Gateway được mô phỏng trạng thái ngay trong Floci. Đường thứ hai là Docker-backed, không phải mock nông: Lambda, RDS, Neptune, ElastiCache, MSK, ECS, EC2, EKS, OpenSearch và CodeBuild chạy bằng container Docker thật qua Docker daemon, cho độ trung thực cao hơn nhưng tốn thời gian pull image, khởi động và dọn dẹp.

Trạng thái của cả hai đường đi qua tầng lưu trữ do biến FLOCI_STORAGE_MODE quyết định. Web console là thành phần ngoài core: nó khởi động lười khi có request đầu tiên tới http://localhost:4566/_floci/ui, chạy dưới dạng sidecar container, bắt buộc mount Docker socket. Tắt console bằng FLOCI_SERVICES_UI_ENABLED nếu bạn không cần nó.

flowchart TD
    A["Client: AWS CLI, SDK, Terraform/CDK, Testcontainers"]
    B["Endpoint duy nhất localhost:4566"]
    C["Floci core Quarkus/Java: định tuyến theo service/operation"]
    D["Giả lập trong tiến trình: S3, SQS, SNS, DynamoDB, IAM/STS, KMS, Secrets Manager, SSM"]
    E["Docker-backed: Lambda, RDS, ECS, EC2, EKS, ElastiCache, MSK, OpenSearch qua Docker daemon"]
    F["Tầng lưu trữ: memory / persistent / hybrid flush 5s / wal"]
    G["Console sidecar tùy chọn: _floci/ui, khởi động lười, cần Docker socket"]
    H["Phân vùng account: key 12 chữ số thành account ID, ngược lại về 000000000000"]
    I["Đây không phải AWS thật: IAM, billing và operation chưa hỗ trợ không được kiểm chứng tại đây"]
    A --> B --> C
    C --> D
    C --> E
    D --> F
    E --> F
    C --> G
    C --> H
    C -.-> I
    classDef dashed stroke-dasharray: 5 5
    class I dashed

Lưu trữ và đa tài khoản

Biến FLOCI_STORAGE_MODE có bốn mode. Chọn sai mode là nguyên nhân phổ biến khiến test hôm nay pass, ngày mai mất dữ liệu, hoặc test chạy chậm bất thường mà không rõ vì sao.

  • memory: chỉ giữ trong RAM, mất khi dừng container. Hợp CI vì reset nhanh và sạch.
  • persistent: ghi đĩa mỗi lần ghi. Bền hơn nhưng trả giá bằng thao tác ghi đĩa cho từng lần thay đổi.
  • hybrid: giữ trong RAM và flush bất đồng bộ mỗi 5 giây. Hợp dev local, chấp nhận cửa sổ mất dữ liệu tối đa 5 giây.
  • wal: dùng write-ahead log, bền nhất trong bốn mode.

Theo mình, CI dùng memory; dev local dùng hybrid hoặc persistent tùy mức chấp nhận mất dữ liệu; dữ liệu cần giữ qua restart thì không dùng memory.

Cơ chế đa tài khoản cũng cần hiểu đúng. Nếu AWS_ACCESS_KEY_ID đúng 12 chữ số, Floci dùng nó làm account ID và cô lập resource theo account đó. Nếu không, Floci rơi về FLOCI_DEFAULT_ACCOUNT_ID, mặc định là 000000000000. Hệ quả thực tế: mọi job dùng chung credential test như test đều chia sẻ cùng một account mặc định và có thể đụng bucket, bảng, queue của nhau. Chạy test song song thì cấp key 12 chữ số riêng cho từng job. Đây là phân vùng dữ liệu test, không phải ranh giới bảo mật.

Ngoài core AWS, dự án còn có floci-az (Azure, cổng 4577), floci-gcp (GCP, 4588) và floci-oci (OCI, 4599) — chỉ nhắc để người đọc biết, không triển khai sâu.

Triển khai bằng Docker Compose

Bạn cần Docker Engine cùng plugin Compose, cổng 4566 còn trống, và AWS CLI hoặc SDK của ngôn ngữ đang dùng. Về phiên bản, theo mình nên pin floci/floci:2.4.0 cho CI và cho hướng dẫn này để tái lập được. Tag -baseline chỉ dành cho ARM64 như Raspberry Pi 4.

Tạo file docker-compose.yml, chạy và chờ log Ready.:

services:
  floci:
    image: floci/floci:2.4.0
    ports:
      - "4566:4566"
docker compose up -d
docker compose logs -f floci
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

Bài về Dockge giúp quản trị stack Compose bằng giao diện web, và bài về Coolify là hướng đi liền kề khi muốn đưa lab lên server riêng.

Đường thay thế nhắc ngắn: CLI chính thức với luồng floci start rồi eval $(floci env) nằm ở repo riêng floci-io/floci-cli, và mỗi release có binary native floci-aws cho Linux, macOS và Windows. Phần này mình chưa đọc sâu tới lệnh cài CLI ngoài luồng đó, nên bài này lấy Docker Compose làm đường chính và không bịa thêm lệnh cài đặt.

Kiểm chứng và lỗi thường gặp

Các lệnh dưới đây chép từ Quick Start trong tài liệu chính thức, chưa phải kết quả mình tự chạy trong bài này. Kỳ vọng ở mức hành vi: lệnh tạo bucket và tạo bảng thành công, lệnh liệt kê thấy được bảng vừa tạo. Nếu lệnh báo operation chưa hỗ trợ, đó là tín hiệu tra Services Overview, không phải cứ mặc định là lỗi cấu hình.

aws s3 mb s3://my-bucket
aws dynamodb create-table --table-name demo-table \
  --attribute-definitions AttributeName=pk,AttributeType=S \
  --key-schema AttributeName=pk,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST
aws dynamodb list-tables

Về lỗi thường gặp: cổng 4566 đã bị chiếm thì đổi mapping hoặc dừng tiến trình cũ. Docker chưa chạy hoặc Compose thiếu plugin thì Floci không khởi động được — kiểm tra Docker trước khi nghi ngờ Floci. Console không mở thường do thiếu mount Docker socket hoặc sidecar floci-ui chưa pull được; nếu không cần console thì tắt nó đi. Init script LocalStack cũ bị lỗi thì chuyển sang tag latest-compat và kiểm tra /etc/localstack/init/. Test song song đụng resource thì nguyên nhân thường là dùng chung credential test rơi về account mặc định. Khi lệnh báo operation chưa hỗ trợ, hãy tra Services Overview rồi quyết định mock riêng, bỏ test đó khỏi suite local, hoặc chạy kiểm chứng trên AWS thật.

Đánh giá

Ưu điểm rõ nhất là miễn phí hoàn toàn, không tài khoản cloud, không token, không paywall tính năng. Tiếp theo là khả năng drop-in LocalStack Community: đổi image là chạy, giữ nguyên cổng, credential, SDK và phần lớn init script. Độ phủ service đủ cho nhu cầu ngày thường, từ S3, SQS, SNS, DynamoDB, Lambda, IAM/STS, KMS, Secrets Manager, SSM, EventBridge, Step Functions, API Gateway cho tới Bedrock và SageMaker ở mức operation. Nhóm Docker-backed cho độ trung thực cao hơn mock nông ở Lambda, RDS, ECS, EC2, EKS và các service dữ liệu.

Nhược điểm cũng phải nói thẳng. Đây không phải AWS thật: tương thích ở mức operation, và test pass local không chứng minh pass trên AWS thật. IAM/STS chấp nhận credential tùy ý theo mặc định nên không kiểm chứng được policy và lỗi phân quyền thực tế. Nhóm Docker-backed nặng hơn, phụ thuộc Docker daemon và image pull. Console là sidecar ngoài core, cần Docker socket và có image riêng là 0.7.0 nên có thể lệch phiên bản với core. Cộng đồng còn non hơn đối thủ lâu năm: repo mới tạo tháng 02/2026, dù đang phát triển rất nhanh.

Về bảo mật, chỉ chạy trên localhost, không expose cổng 4566 ra mạng, không dùng cho dữ liệu production hay credential thật. Endpoint là HTTP local và credential mặc định là test/test, nên expose nó ra ngoài chẳng khác nào mở một AWS giả không có auth. Không mount Docker socket nếu không cần console hoặc service Docker-backed, vì socket Docker tương đương quyền điều khiển Docker host nếu container bị chiếm.

Về hiệu năng, phần này mình chưa đo benchmark nào nên không đưa ra con số tốc độ. Chỉ có thể phân tích ở mức cấu hình đã có tài liệu: memory nhanh nhất nhưng mất dữ liệu khi dừng; persistent bền nhưng trả giá ghi đĩa mỗi lần; hybrid cân bằng với cửa sổ mất dữ liệu tối đa 5 giây; wal bền nhất với chi phí log ghi trước.

Về vận hành, log Ready. là tín hiệu khởi động và endpoint /_localstack/health giữ tương thích cho healthcheck cũ. Rollback đơn giản vì Floci là drop-in ở tầng cấu hình: đổi image Compose về localstack/localstack hoặc tag Floci cũ, khôi phục biến môi trường và init script cũ, chạy lại smoke test S3 và DynamoDB.

So sánh với các lựa chọn cùng phạm vi

Tiêu chí so sánh thống nhất là: giá và paywall; độ phủ service ở mức operation; độ trung thực; lưu trữ; đa tài khoản; tương thích SDK, CLI, Terraform và Testcontainers; độ trưởng thành. Ô nào chưa kiểm chứng được thì ghi rõ chưa kiểm chứng thay vì điền cho đủ bảng.

Tiêu chíFlociLocalStackMoto và mock thư việnAWS thật (sandbox)
GiáMiễn phí, không paywallCommunity miễn phí, có tier trả phíMiễn phí dạng thư việnTốn chi phí
Mô hìnhServer emulator qua HTTP, cổng 4566Server emulator qua HTTP, cổng 4566Mock gắn trong code testCloud thật
Độ trung thựcGiả lập thuần cộng Docker-backedEmulator lâu năm, cần tra operation riêngNhanh cho test đơn vịChuẩn vàng cho IAM, billing, quota
CI đa ngôn ngữTốt, mọi SDK trỏ về một endpointTốt, cùng mô hìnhHạn chế theo ngôn ngữTốt nhưng cần credential và dọn resource

So với LocalStack, Floci hợp khi bạn đã chạm paywall hoặc cần Docker-backed; ở lại LocalStack hợp hơn khi test suite đã ổn định trên đó hoặc team đã trả Pro. So với Moto, khác biệt nằm ở mô hình: Moto gắn trong code test, còn Floci là server độc lập qua HTTP nên phục vụ mọi ngôn ngữ, SDK, Terraform và CDK. So với AWS thật, AWS thật vẫn là chuẩn vàng cho IAM, billing, quota và hành vi biên, nhưng tốn chi phí và cần dọn resource — nên dùng Floci cho vòng lặp dev/test và CI thường xuyên, AWS thật trong sandbox riêng cho kiểm chứng cuối. Cảnh báo riêng cho workflow AI: Bedrock và SageMaker trong Floci chỉ là giả lập ở mức operation và API, không phải chạy model thật.

Use case thực tế

  • Doanh nghiệp, CI không cần tài khoản cloud: mỗi pull request chạy Floci ở mode memory, test suite chạm S3, DynamoDB và SQS qua endpoint local, xong là hủy. Ma trận operation phải rà qua Services Overview trước, và test IAM tách riêng ra AWS sandbox.
  • Homelab và người tự học AWS: dựng lab AWS bằng Docker Compose, học S3, DynamoDB, Lambda và IAM mà không mở tài khoản cloud. Lab local không dạy được billing, quota và sự cố mạng của AWS thật.
  • Workflow AI, test orchestration quanh model: upload file lên S3, trigger Lambda, đẩy message qua SQS, điều phối bằng Step Functions và EventBridge, ghi metadata vào DynamoDB — toàn bộ không cần gọi Bedrock thật.
  • DevOps/SRE, Terraform, CDK và Testcontainers: trỏ Terraform, CDK hoặc OpenTofu về localhost:4566 để test plan, apply và destroy mà không chạm cloud; dùng Testcontainers và cấp key 12 chữ số riêng cho job song song.
  • IT admin, diễn tập và đào tạo: diễn tập backup và restore S3, rotation secret qua Secrets Manager và SSM, và kịch bản queue tắc nghẽn — restart container ở mode memory là có môi trường sạch.

Kết luận

Floci hợp với dev và team đang trả giá cho vòng lặp test AWS chậm và đắt, team đã chạm paywall của emulator khác, CI cần môi trường sạch reset nhanh, và homelab muốn học AWS miễn phí. Floci chưa hợp với team cần kiểm chứng IAM policy, billing, quota và hiệu năng thật; workload dựa vào operation hiếm; môi trường multi-tenant không tin cậy; và production.

Bước tiếp theo cụ thể: chạy Compose với tag pin 2.4.0; chạy ba lệnh kiểm chứng S3 và DynamoDB ở trên; tra Services Overview cho đúng service mình dùng; nếu đang dùng LocalStack thì migrate trên nhánh riêng và chạy lại test suite trước khi xóa cấu hình cũ. Floci đáng thử vì nó gỡ đúng nút thắt chi phí và paywall của test AWS local — nhưng chỉ giữ được giá trị khi team tôn trọng ranh giới giả lập và giữ một vòng kiểm chứng AWS thật.

Bài học rút ra

  1. Tương thích cấu hình không bằng tương thích operation — đổi image chạy được chưa đủ, phải chạy lại ma trận test.
  2. Credential test dùng chung là account dùng chung — test song song cần key 12 chữ số riêng.
  3. Mode lưu trữ là quyết định vận hành, không phải tùy chọn phụ — memory cho CI, hybrid, persistent và wal cho dev tùy mức chịu mất dữ liệu.
  4. Docker-backed và mock thuần là hai loại chi phí khác nhau — đừng gộp thời gian CI của chúng thành một con số.
  5. Test pass local không chứng minh IAM đúng — giữ vòng kiểm chứng sandbox AWS thật cho phân quyền.
  6. Console tiện nhưng đắt về quyền — không mount Docker socket khi không cần.

Phạm vi kiểm chứng

Ngày kiểm chứng: 2026-11-04, đối chiếu tài liệu chính thức và GitHub API của floci-io/floci. Đã kiểm chứng: repo, giấy phép MIT, ngôn ngữ Java, sao và fork ở mức xấp xỉ, release 2.4.0 ngày 2026-10-31, file Compose, biến môi trường, cổng 4566, lệnh AWS CLI mẫu, bảng storage mode, cơ chế key 12 chữ số và mapping tương thích LocalStack. Mặc định so với tùy chọn so với phạm vi schema: endpoint 4566 và credential test là mặc định; storage mode, LOCALSTACK_PARITY=false và tắt console là tùy chọn; danh sách service là phạm vi operation theo Services Overview, không phải cam kết parity đầy đủ. Các con số là cấu hình, không phải benchmark: flush hybrid mỗi 5 giây, cổng 4566 và 4500, account mặc định 000000000000. Chưa kiểm chứng: chưa cài đặt, chạy hay đo benchmark Floci; chưa kiểm chứng từng operation trong Services Overview; chưa kiểm chứng lệnh cài CLI ngoài luồng floci start và eval $(floci env); số sao viết ở mức xấp xỉ vì thay đổi theo ngày.

Tài liệu tham khảo


Bài viết liên quan

  • 10 phút đọc—

    AWS Emulator: test code chạm AWS ngay trên máy

    AWS Emulator là trình giả lập AWS chính thức: chạy S3, DynamoDB, SQS ngay trên máy qua HTTPS 127.0.0.1:9297, không cần tài khoản, không phí, cho dev và CI.

  • 11 phút đọc—

    Tự host OpenMAIC: lớp học AI đa agent

    Hướng dẫn tự host OpenMAIC bằng Docker Compose: biến chủ đề hoặc tài liệu thành lớp học AI có giáo viên và bạn học AI, quiz, mô phỏng, PBL và xuất PPTX, HTML.

  • 15 phút đọc—

    Tự host NetBird: mesh VPN WireGuard cho homelab

    Hướng dẫn tự host NetBird bằng Docker Compose trên VPS: mesh VPN WireGuard peer-to-peer, quản lý truy cập theo nhóm, không mở port từng dịch vụ ra Internet.

Bình luận

Bình luận được duyệt trước khi hiển thị.

Đang tải bình luận…

Để lại bình luận