Amazon ECS (Elastic Container Service) là dịch vụ quản lý container của AWS, cho phép bạn chạy ứng dụng Docker mà không cần tự dựng orchestration từ đầu. Bài này mình sẽ giải thích ECS hoạt động như thế nào, so sánh hai kiểu triển khai chính, rồi hướng dẫn thực hành tạo cluster + service có Load Balancer từ đầu đến cuối.
Xem thêm:
1. Amazon ECS là gì?
ECS là dịch vụ quản lý container fully-managed trên AWS. Bạn đóng gói ứng dụng vào Docker image, ECS lo phần còn lại: lên lịch chạy container, phân bổ tài nguyên, restart khi lỗi, scale khi cần. ECS không phải Kubernetes — nó đơn giản hơn, tích hợp sâu hơn với hệ sinh thái AWS (IAM, ALB, CloudWatch, ECR…), phù hợp khi bạn không muốn vận hành control plane phức tạp.
Quy trình triển khai docker lên AWS ECS:

2. Hai kiểu triển khai: EC2 vs Fargate
2.1. EC2 Launch Type
Bạn tự quản lý EC2 instance trong cluster. Mỗi instance cần cài ECS Agent để đăng ký vào cluster và nhận task.
- Phù hợp khi cần kiểm soát phần cứng, dùng instance type đặc thù (GPU, storage-optimized…)
- Cần tự theo dõi và scale instance khi tải tăng
- Chi phí thường thấp hơn nếu workload ổn định và dự đoán được
2.2. Fargate Launch Type
Fargate là giải pháp serverless của ECS, giúp bạn không cần quản lý EC2 nào cả. Chỉ cần khai báo CPU và memory. AWS tự lo phần hạ tầng.
- Không cần quan tâm đến instance, AMI, hay ECS Agent
- Scale bằng cách tăng số task, không cần nghĩ đến capacity
- Phù hợp cho hầu hết use case hiện đại
2.3. So sánh triển khai EC2 và Fargate
| Tiêu chí | EC2 Launch Type | Fargate |
|---|---|---|
| Quản lý hạ tầng | Tự quản lý | AWS quản lý |
| Kiểm soát instance | Cao | Không có |
| Chi phí | Thấp hơn nếu ổn định | Trả theo task |
| Độ phức tạp | Cao hơn | Thấp hơn |
| Phù hợp | Workload dự đoán được | Workload linh hoạt |
3. IAM Roles trong ECS
Amazon ECS sử dụng hai loại IAM roles quan trọng:
3.1. EC2 Instance Profile Role
Chỉ áp dụng khi dùng EC2 Launch Type. Role này gắn vào EC2 instance, cho phép ECS Agent trên instance đó gọi được các AWS API cần thiết: đăng ký vào cluster, đẩy log lên CloudWatch, pull image từ ECR, lấy secret từ Secrets Manager.
3.2. ECS Task Role
Áp dụng cho cả EC2 lẫn Fargate. Role này gắn vào từng task, không phải instance. Dùng khi container của bạn cần gọi AWS API.
Task A → IAM Role A → truy cập S3
Task B → IAM Role B → truy cập DynamoDB;
4. Load Balancer và lưu trữ
4.1. Load Balancer
Để expose container ra ngoài qua HTTP/HTTPS, bạn dùng Elastic Load Balancer. Có ba loại:
- ALB (Application Load Balancer): Khuyên dùng. Hỗ trợ đầy đủ, tích hợp tốt với cả EC2 lẫn Fargate, có path-based routing
- NLB (Network Load Balancer): Dùng khi cần throughput cao hoặc tích hợp với AWS PrivateLink
- CLB (Classic Load Balancer): Đã lỗi thời, không hỗ trợ Fargate — tránh dùng
4.2. Lưu trữ dùng chung với Amazon EFS
Nếu các task cần đọc/ghi vào cùng một filesystem (ví dụ: upload file, shared config), dùng Amazon EFS. Mount EFS vào nhiều task cùng lúc, kể cả task đang chạy ở các Availability Zone khác nhau.
Kết hợp Fargate + EFS là setup serverless hoàn toàn — không quản lý máy chủ, không quản lý storage server.
5. Thực hành: Tạo ECS Cluster với Fargate và EC2
Mục tiêu
Tạo một ECS Cluster hỗ trợ cả Fargate và EC2 Launch Type thông qua Auto Scaling Group.
Bước 1 — Tạo ECS Cluster
Vào AWS Console → ECS → Clusters → Create cluster.
Điền thông tin:
- Cluster name: DemoCluster
- Infrastructure: bật cả AWS Fargate và Amazon EC2 instances
Cấu hình EC2 Auto Scaling Group:
- OS: Amazon Linux 2023
- Instance type: t2.micro
- Desired capacity: Min 0, Max 5
- VPC: default, chọn đủ 3 subnet (3 AZ)
- Security Group: default
- Auto-assign public IP: theo subnet setting
Nhấn Create, chờ vài phút.
Bước 2 — Kiểm tra Auto Scaling Group
Vào EC2 → Auto Scaling Groups, tìm group tên Infra-ECS-Cluster. Xác nhận:
Desired: 0 | Min: 0 | Max: 5
Bước 3 — Khởi động thủ công 1 EC2 instance
Vào ECS → DemoCluster → tab Infrastructure → ASGProvider → Edit, đổi Desired capacity thành 1.
Sau vài phút, quay lại tab Container instances — bạn sẽ thấy:
1 instance đã đăng ký vào cluster ~1024 CPU unit ~982 MiB memory khả dụng
6. Thực hành: Deploy Service với Fargate và ALB
Mục tiêu
Tạo Task Definition chạy NGINX demo, deploy thành ECS Service trên Fargate, expose qua Application Load Balancer.
Bước 1 — Tạo Task Definition
Vào ECS → Task Definitions → Create new task definition.
Family name : nginxdemos-hello Launch type : Fargate OS : Linux vCPU : 0.5 Memory : 1 GiB Task role : (để trống) Execution role : (giữ mặc định)
Container definition:
Name : nginxdemos-hello Image : nginxdemos/hello Port : 80 / TCP
Nhấn Create.
Bước 2 — Tạo ECS Service
Vào DemoCluster → tab Services → Create.
Launch type : Fargate Task definition : nginxdemos-hello:1 Service name : nginxdemos-hello Desired tasks : 1
Bước 3 — Cấu hình network và security group
VPC : default Subnets : chọn cả 3 AZ Security Group : tạo mới, allow HTTP port 80 từ 0.0.0.0/0 Public IP : ENABLED
Bước 4 — Gắn Application Load Balancer
Load balancer type : Application Load Balancer Name : DemoALBForECS Target group : tg-nginxdemos-hello Container : nginxdemos-hello:80 Health check path : / Grace period : 0s
Nhấn Create service.
Bước 5 — Kiểm tra
- Vào Service → Tasks, đợi task chuyển sang trạng thái RUNNING
- Vào EC2 → Load Balancers, copy DNS name của DemoALBForECS
- Mở trình duyệt → bạn sẽ thấy trang demo của NGINX
Bước 6 — Scale lên 3 task
Vào Service → Update, đổi Desired tasks thành 3.
# Không cần CLI — chỉ update qua Console # Sau khi scale xong, F5 liên tục trên trình duyệt # Bạn sẽ thấy Server address thay đổi giữa các container
Đây là bằng chứng ALB đang phân phối traffic đều qua 3 container.
Bước 7 — Dọn dẹp để tránh phát sinh chi phí
Đổi Desired tasks về 0 để dừng toàn bộ task.
Nếu không dùng nữa, xóa luôn Service và Load Balancer.