Hướng dẫn dựng AWS Local và Hands-on với Floci (kèm code giao diện)

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.

74259695-b1a9-45d5-a79b-d213934c57fa

Floci là một nền tảng Local Cloud Emulator miễn phí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.

1e76adc8-5a14-4e60-9042-6f7a2cb28c2c

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à localhost thì bạn nên sửa thành IP_SERVER và port chạy floci-web là 80:80 bạn cũng có thể đổi (ví dụ: 3001:80 chẳ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ành IP_SERVER
  • web/script.js: tại dòng baseURL: "http://localhost:5000" thì bạn nên sửa thành IP_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
7946ac34-3062-4789-896e-636f80614348

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).

42c04cae-d329-40d7-951f-16b015cd293c

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 đề PostNộ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ị

cb3d699b-580e-4712-8183-3327aed16b33

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à UsersPostDB do trên tạo từ AWS CLI và giao diện

1bd6e63f-492c-45bf-bd91-0c99845c5555

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

6f005c32-aa94-4339-ac65-5a1cc01e81e7

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

57c86b0c-1c2d-4f89-a96c-438d02f622b2

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ó

a18291d7-ba38-4286-be86-4ce54ce58c2a

Các Instance types hiện có

0abaa10c-95a7-4971-b9a7-59aeed92aac2

Ngoài ra có thể tạo thêm Security group và Key, khi ấn tạo sẽ được kết quả

4e6e22ba-c9f7-4c8a-98a1-54b0a3e1fd86

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

09b8a7e6-5571-43a3-9f35-d80f6749b52f

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.

Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất

Tiêu điểm chuyên gia