Giới thiệu
Làm DevOps thì mảng kiến thức về Cloud rất là cần thiết rồi. AWS, Azure và GCP đều là những lựa chọn đáng cân nhắc cùng với đó thì free tier hiện tại cũng khá thuận tiện cho người mới học nhưng nếu như bạn có con máy tài nguyên dư một chút mà muốn học Cloud đơn giản hơn bằng cách Self-hosted.

Floci là một nền tảng Local Cloud Emulator miễn phí và mã nguồn mở. Nó được thiết kế để thay thế các công cụ giả lập cồng kềnh và có thu phí hiện nay vì khả năng khởi động nhanh và tiêu tốn tài nguyên thấp.
Mình tìm hiểu thì thấy cũng khá hữu ích mà lại chưa có quá nhiều thông tin cộng đồng hướng dẫn nên nay mình tranh thủ nghiên cứu và lab để mọi người có thêm nguồn tham khảo.
Có một phần quan trọng nữa là Floci tại thời điểm mình làm bài viết mình chưa thấy có giao diện nên nhân tiện vừa lab vừa có ý tưởng vibe coding mình tạo ra một nền tảng giao diện cho Floci để mọi người có thể tạo tài nguyên trực quan hơn, source code của mình để ở phần hướng dẫn nhé nó sẽ trông thế này.

Chuẩn bị
| OS | RAM | DISK | vCPU |
|---|---|---|---|
| Ubuntu 22.04 | 4GB RAM | 40GB DISK | 2vCPU |
Cài đặt Floci
Như mình đã nói mặc định theo Floci sẽ không có giao diện và chỉ sử dụng dưới dạng terminal (ví dụ với AWS là AWS CLI). Nên muốn sử dụng trực quan các services thì bạn sử dụng source code của mình nhé.
Lựa chọn 1: cài đặt Floci cơ bản
docker run -d --name floci \
-p 4566:4566 \
-e FLOCI_PORT=4566 \
-e FLOCI_DEFAULT_REGION=ap-southeast-1 \
-e FLOCI_DEFAULT_ACCOUNT_ID=000000000000 \
-e FLOCI_BASE_URL=http://localhost:4566 \
-e FLOCI_STORAGE_MODE=memory \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart always \
floci/floci:latest
Chú ý: tại dòng -e FLOCI_BASE_URL=http://localhost:4566 nên đổi thành IP_SERVER.
Lựa chọn 2: Cài đặt Floci tài liệu riêng
Mình có vibe coding Floci giao diện cho AWS mọi người truy cập bài viết này để lấy nhé https://devops.vn/d/c40xVFSj/.
Do cũng không có nhiều thời gian mà muốn nhờ các sếp của DevOps VietNam hỏi ý kiến mọi người hộ mình xem mọi người có cần không để mình phát triển tiếp, nếu mọi người có nhu cầu mình sẽ làm hoàn chỉnh cho mọi người sẵn dùng hoặc mọi người có thể phát triển thoải mái từ code này (vừa nghịch vừa nảy ý tưởng nên bản này cũng cơ bản lắm nhé).
Sau khi có thư mục mọi người giải nén ra sẽ thấy các nội dung như thế này nhé
root@duonglh-lab:~/floci# ls
config.py core docker-compose.yaml Dockerfile main.py middleware modules README.md requirements.txt utils web
Ở đây có vài chỗ cần/nên sửa trong các files:
- docker-compose.yaml: các phần nào đang để là
localhostthì bạn nên sửa thànhIP_SERVERvà port chạy floci-web là80:80bạn cũng có thể đổi (ví dụ:3001:80chẳng hạn) để đảm bảo không bị trùng port đã chạy. - config.py: tại dòng
AWS_ENDPOINT_URL: str = os.getenv("AWS_ENDPOINT_URL", "http://localhost:4566")thì bạn nên sửa thànhIP_SERVER - web/script.js: tại dòng
baseURL: "http://localhost:5000"thì bạn nên sửa thànhIP_SERVER
Tiếp theo, chỉ cần chạy lệnh khởi chạy docker-compose vậy là thay vì chỉ có floci terminal thì có cả phần giao diện trực quan để sử dụng
docker-compose up -d

Mọi người truy cập vào trình duyệt địa chỉ IP_SERVER:PORT sẽ thấy ngay giao diện của những services cơ bản như IAM, EC2, S3, DyamoDB, Lambda,… (cũng vội nên bản này chỉ làm được vài services thôi).

Nếu khởi chạy thất bại phần connect fail bạn có thể F12 vào thử phần console và 99% là do config ở đâu đó chưa chính xác endpoint ví dụ nếu để mặc định localhost thì chắc chắn fail nếu thiết bị khác truy cập rồi.
Thật sự là mình cũng khá muốn phát triển tiếp đa dạng các provider và làm hoàn chỉnh để cho mọi người dùng và giao diện sát với thực tế của các provider nhất vì thấy các sếp DevOps VietNam đồng hành cùng cộng đồng rất có tâm đem đến nhiều giá trị nên cũng muốn giống các anh em khác có chút đóng góp để cộng đồng DevOps Việt Nam phát triển.
Cài đặt AWS CLI
Tiếp theo, thì để thực tế hơn mình có lab với AWS nên việc sử dụng AWS CLI để thao tác với dịch vụ AWS từ terminal là điều cần thiết. Mọi người có thể cài đặt AWS CLI rất nhanh chóng bằng các câu lệnh dưới đây:
sudo apt update
sudo apt install -y unzip curl
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
Cấu hình AWS CLI dùng Floci local
Đối với Linux / macOS / Git Bash chỉ cần chạy các lệnh:
export AWS_ENDPOINT_URL=http://localhost:4566
export AWS_DEFAULT_REGION=ap-southeast-1
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test
Chú ý: tại dòng -e FLOCI_BASE_URL=http://localhost:4566 nên đổi thành IP_SERVER.
Kiểm tra xem kết nối thành công AWS CLI tới Floci hay chưa bằng lệnh
aws sts get-caller-identity
Thành công output sẽ như sau (do FLOCI_DEFAULT_ACCOUNT_ID chúng ta cấu hình ở trên)
root@duonglh-lab:~/floci# aws sts get-caller-identity
{
"UserId": "000000000000",
"Account": "000000000000",
"Arn": "arn:aws:iam::000000000000:root"
}
Hands-on lab AWS services trên Floci
Trong phần này mình sẽ hands-on thử vài services thông dụng nhất của AWS như DynamoDB, S3, Ec2, SQS,… với cả AWS CLI và Giao diện từ code của mình nhé.
DynamoDB
Tạo table
aws dynamodb create-table \
--table-name Users \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST
Tiếp theo, mình tiến hành tạo trên giao diện nhập tại Tiêu đề Post và Nội dung Post vì mình có mặc định sẽ tạo một table là PostDB và được kết quả được hiển thị

Như vậy bây giờ chính xác nếu chúng ta kiểm tra thì sẽ tồn tại 2 bảng đó là Users và PostDB do trên tạo từ AWS CLI và giao diện

Tạo item
aws dynamodb put-item \
--table-name PostDB \
--item '{
"id": { "S": "6f005c32-aa94-4339-ac65-5a1cc01e81e7" },
"title": { "S": "Tiêu đề từ AWS CLI và chờ kiểm tra trên giao diện" },
"content": { "S": "Nội dung từ AWS CLI và chờ kiểm tra trên giao diện" }
}'
Lấy item
aws dynamodb get-item \
--table-name PostDB \
--key '{"id":{"S":"6f005c32-aa94-4339-ac65-5a1cc01e81e7"}}'
S3
Tạo bucket
aws s3 mb s3://demo-bucket
Tiếp theo, mình tiến hành upload file lên S3 bằng giao diện mới bucket mặc định là floci-demo-bucket
List bucket
aws s3 ls
Như vậy chính xác sẽ có 2 bucket được tạo ra từ AWS CLI và giao diện
root@duonglh-lab:~/floci# aws s3 ls
2026-06-15 00:25:32 demo-bucket
2026-06-15 00:26:48 floci-demo-bucket
Ngoài ra bạn có thể tiếp tục hands-on với các command dưới đây:
Tạo file rồi upload
echo "hello floci" > hello.txt
aws s3 cp hello.txt s3://demo-bucket/hello.txt
Xem file trong bucket
aws s3 ls s3://demo-bucket
Download lại
aws s3 cp s3://demo-bucket/hello.txt downloaded.txt
cat downloaded.txt
Xóa bucket khi test xong
aws s3 rm s3://demo-bucket --recursive
aws s3 rb s3://demo-bucket
IAM
Với IAM trong môi trường local, mục tiêu chính là test compatibility của app/tooling, không phải bảo mật thật như AWS production.
Tạo trên giao diện

Hands-on chi tiết với AWS CLI
Tạo IAM user
aws iam create-user \
--user-name demo-user
List user:
aws iam list-users
Xem chi tiết user:
aws iam get-user \
--user-name demo-user
Tạo access key cho user
aws iam create-access-key \
--user-name demo-user
Kết quả sẽ có dạng:
{
"AccessKey": {
"UserName": "demo-user",
"AccessKeyId": "...",
"SecretAccessKey": "...",
"Status": "Active"
}
}
Tạo group và add user vào group
aws iam create-group \
--group-name developers
aws iam add-user-to-group \
--user-name demo-user \
--group-name developers
Kiểm tra user thuộc group nào:
aws iam list-groups-for-user \
--user-name demo-user
List user trong group:
aws iam get-group \
--group-name developers
Tạo policy IAM
Tạo file policy
cat > ec2-readonly-policy.json <<'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:DescribeImages",
"ec2:DescribeSecurityGroups",
"ec2:DescribeKeyPairs"
],
"Resource": "*"
}
]
}
EOF
Tạo policy
aws iam create-policy \
--policy-name EC2ReadOnlyLocalPolicy \
--policy-document file://ec2-readonly-policy.json
Policy ARN thường sẽ có dạng
arn:aws:iam::000000000000:policy/EC2ReadOnlyLocalPolicy
Attach policy vào user
aws iam attach-user-policy \
--user-name demo-user \
--policy-arn arn:aws:iam::000000000000:policy/EC2ReadOnlyLocalPolicy
Kiểm tra policy đã attach:
aws iam list-attached-user-policies \
--user-name demo-user
Tạo IAM role cho EC2
Tạo trust policy
cat > ec2-trust-policy.json <<'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
Tạo role
aws iam create-role \
--role-name demo-ec2-role \
--assume-role-policy-document file://ec2-trust-policy.json
Attach policy vào role:
aws iam attach-role-policy \
--role-name demo-ec2-role \
--policy-arn arn:aws:iam::000000000000:policy/EC2ReadOnlyLocalPolicy
Kiểm tra role:
aws iam get-role \
--role-name demo-ec2-role
Ec2
Với EC2, mục tiêu chính là test API flow như tạo instance, xem trạng thái, stop/start/terminate.
Tạo Ec2 trên giao diện
Các AMIs hiện có
Các Instance types hiện có
Ngoài ra có thể tạo thêm Security group và Key, khi ấn tạo sẽ được kết quả

Kiểm tra EC2 API hoạt động chưa
aws ec2 describe-instances
aws ec2 describe-security-groups
Kết quả chính xác sẽ trả về JSON cụ thể là chính xác
Tạo key pair
aws ec2 create-key-pair \
--key-name demo-key \
--query 'KeyMaterial' \
--output text > demo-key.pem
Set quyền file key:
chmod 400 demo-key.pem
List key pairs:
aws ec2 describe-key-pairs
Tạo security group
aws ec2 create-security-group \
--group-name demo-sg \
--description "Demo security group"
Lấy group id:
aws ec2 describe-security-groups
Cho phép SSH port 22:
aws ec2 authorize-security-group-ingress \
--group-name demo-sg \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0
Kiểm tra lại:
aws ec2 describe-security-groups \
--group-names demo-sg
Chạy EC2 instance local
Thử chạy instance:
aws ec2 run-instances \
--image-id ami-12345678 \
--instance-type t2.micro \
--key-name demo-key \
--security-groups demo-sg \
--count 1
Lấy instance ID:
aws ec2 describe-instances \
--query 'Reservations[].Instances[].InstanceId' \
--output text
Ví dụ kết quả:
i-1234567890abcdef0
Gán vào biến:
INSTANCE_ID=$(awslocal ec2 describe-instances \
--query 'Reservations[0].Instances[0].InstanceId' \
--output text)
echo $INSTANCE_ID
Stop / Start / Terminate instance
Stop instance:
awslocal ec2 stop-instances \
--instance-ids $INSTANCE_ID
Check:
awslocal ec2 describe-instances \
--query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name}' \
--output table
Start lại:
awslocal ec2 start-instances \
--instance-ids $INSTANCE_ID
Terminate:
awslocal ec2 terminate-instances \
--instance-ids $INSTANCE_ID
Check lại:
awslocal ec2 describe-instances \
--query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name}' \
--output table
SQS
Tạo queue
aws sqs create-queue --queue-name orders
Floci dùng account ID mặc định là 000000000000, nên queue URL sẽ có dạng http://localhost:4566/000000000000/orders.
Gửi message
aws sqs send-message \
--queue-url http://localhost:4566/000000000000/orders \
--message-body '{"event":"order.created","id":1}'
Nhận message
aws sqs receive-message \
--queue-url http://localhost:4566/000000000000/orders
Tương tự trên giao diện thao tác với SQS

Còn rất nhiều các services khác mọi người có thể trải nghiệm nhé, cơ bản thì các command AI hiện tại hỗ trợ rất tốt rồi và làm dài nữa mọi người cũng ngán đọc vì hiện tại cũng chưa có quá gì nhiều ở phần Floci giao diện mình tạo.
Kết luận
Floci là một local Cloud Emulator rất đáng chú ý, nhất là nếu bạn từng dùng LocalStack hoặc đang muốn có một môi trường AWS giả lập nhẹ, miễn phí, không cần token và dễ đưa vào CI. Điểm hay của nó không chỉ là mock API AWS, mà còn ở việc một số service quan trọng như Lambda, RDS, MSK, EKS, CodeBuild có thể chạy bằng Docker thật, giúp analyze thực tế hơn mock thuần.
Với newbie, có thể hiểu đơn giản: Floci cho bạn một cái AWS mini chạy ngay trên máy, đủ để luyện tập, test app và thử workflow cloud mà không sợ tốn tiền hay phá môi trường thật. Mong rằng bài viết sẽ hữu ích với mọi người.






