- vừa được xem lúc

Một dự án ECS + ECR đơn giản dành cho người mới bắt đầu

0 0 3

Người đăng: Vinh Phạm

Theo Viblo Asia

Bạn mới làm quen với AWS và đang cố gắng hiểu cách ECS và ECR phối hợp để triển khai ứng dụng? Bài viết này là dành cho bạn! Trong hướng dẫn đơn giản này, chúng ta sẽ học cách đóng gói ứng dụng bằng container, lưu trữ ảnh (image) trên Amazon ECR và chạy nó trên ECS với Terraform.

Yêu cầu trước khi bắt đầu

Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt và cấu hình các công cụ sau:

✅ AWS CLI (đã cấu hình thông tin xác thực)

✅ Terraform

✅ Docker

✅ Một repository ECR có sẵn (hoặc Terraform sẽ tạo giúp bạn)

Dịch vụ được sử dụng trong dự án (bằng Terraform)

1. Amazon ECR (Elastic Container Registry)

🗃️ Registry Docker được quản lý hoàn toàn để lưu trữ và quản lý các container image.

  • Dùng để lưu trữ Docker image được build từ ứng dụng.
  • Terraform tự động tạo hoặc sử dụng lại repository ECR.
  • ECS sẽ kéo image trực tiếp từ ECR khi chạy.

2. Amazon ECS (Elastic Container Service) với Fargate

🚢 Dịch vụ điều phối container cho phép bạn chạy và scale ứng dụng đóng gói bằng container.

  • Sử dụng Fargate – công cụ điện toán serverless, không cần quản lý EC2.
  • ECS lo việc triển khai, scale, và quản lý vòng đời container.
  • Một hoặc nhiều tác vụ ECS chạy trong ECS service gắn với một cluster.

3. Amazon VPC (Virtual Private Cloud)

🌐 Môi trường mạng tách biệt nơi tất cả tài nguyên AWS được triển khai.

  • Terraform tạo VPC tùy chỉnh với subnet public cho ECS và ALB.
  • Bao gồm internet gateway, bảng định tuyến và nhóm bảo mật.
  • Đảm bảo mạng lưới an toàn, có tổ chức.

4. Application Load Balancer (ALB)

⚖️ Phân phối lưu lượng truy cập đến các tác vụ ECS ở các vùng khả dụng khác nhau.

  • Công khai ứng dụng qua HTTP.
  • Tự động phân phối truy cập đến các container ECS.
  • Tích hợp với CloudFront làm origin.

5. Amazon CloudFront (CDN)

🚀 Phân phối nội dung nhanh và an toàn trên toàn cầu.

  • Làm tầng trung gian trước ALB và cache nội dung tĩnh hoặc động.
  • Hỗ trợ HTTPS mặc định với chứng chỉ SSL do AWS quản lý.
  • Tích hợp với S3 để lưu log truy cập, và CloudWatch để giám sát.

6. Amazon S3

💾 Lưu trữ đối tượng an toàn và bền vững.

  • Lưu log truy cập từ CloudFront.
  • Tự động tạo bucket để thu thập log.
  • Hữu ích trong việc gỡ lỗi, kiểm tra và phân tích truy cập.

7. Amazon CloudWatch

📈 Nền tảng giám sát và quan sát tài nguyên AWS và ứng dụng.

  • Theo dõi các chỉ số như số lượng request, lỗi 4xx/5xx, độ trễ,...
  • Có thể cấu hình để ghi log tuỳ chỉnh từ ứng dụng hoặc ECS.

8. Amazon SNS

🔔 Dịch vụ nhắn tin gửi thông báo dựa trên trigger giám sát.

  • Gắn với CloudWatch để gửi email khi có cảnh báo.
  • Giúp bạn nhận thông báo ngay khi có sự cố hoặc lưu lượng bất thường.

9. Terraform

🛠️ Công cụ “Hạ tầng như mã” để tự động hóa và quản lý tài nguyên cloud.

  • Định nghĩa, cung cấp và xoá hạ tầng nhất quán giữa các môi trường.
  • Tự động hoá toàn bộ setup VPC, ECS, ALB, CloudFront, S3, CloudWatch, SNS.
  • Giúp triển khai có thể lặp lại, có kiểm soát phiên bản và dễ bảo trì.

Các bước triển khai

Bước 1: Khởi tạo Terraform

Khởi tạo Terraform trong thư mục làm việc:

terraform init

Nó sẽ trông như thế này: image.png

Bước 2: Định dạng mã Terraform

Làm sạch (format) mã Terraform (tùy chọn):

terraform fmt

image.png

Bước 3: Chuẩn bị Docker Image và đẩy lên ECR

Nếu bạn chưa đẩy image lên ECR, hãy chạy ecr_push.sh trong thư mục scripts.

Script này sẽ:

  • Build Docker image
  • Gắn tag với URL của ECR
  • Push image lên ECR

⚠️ Nếu đã có image trong ECR, bạn có thể bỏ qua bước này.

Hãy đảm bảo các mục sau được định nghĩa đúng trước khi bạn bắt đầu triển khai nhé:

  • Vùng (region)
  • Tên repository ECR
  • Tên bucket S3 log (tùy chọn)
  • Cấu hình CloudFront alias hoặc price class (nếu có)
  • Email để nhận thông báo SNS
  • Giới hạn IP truy cập (kiểm tra trong VPC main.tf)
  • Cấu hình ECS task (RAM, CPU, số lượng)
  • Thời gian giữ log

Bước 4: Xem trước kế hoạch Terraform

terraform plan -out=tfplan

image.png

Bỏ qua thông báo huỷ image ECR nếu đã tồn tại.

Bước 5: Triển khai với Terraform

terraform apply tfplan

Hoặc nếu không dùng -out:

terraform apply

image.png

image.png

Bạn sẽ nhận được email xác nhận SNS trong quá trình triển khai, hãy click xác nhận để kích hoạt thông báo.

Việc triển khai có thể mất vài phút vì nhiều tài nguyên được tạo.

Bước 6: Truy cập Ứng dụng

Sau khi hoàn tất, Terraform sẽ tạo file outputs.txt chứa thông tin quan trọng như:

  • VPC ID
  • URL Repository ECR
  • Tên ECS Cluster
  • DNS Load Balancer
  • Domain CloudFront
  • Tên Dashboard CloudWatch
  • Tên Bucket S3
  • ARN của SNS Topic

⚠️ Không commit outputs.txt vào git nếu có thông tin nhạy cảm.

Hoặc dùng lệnh:

terraform output

URL Ứng dụng:

  • CloudFront (HTTPS): Dùng cho production
  • ALB DNS (HTTP): Dùng để kiểm thử nội bộ

Bước 7: Xoá tài nguyên khi không dùng

terraform destroy

⚠️ Lưu ý khi xoá tài nguyên: Bạn có thể gặp lỗi như:

  • ECR repository không trống
  • S3 bucket không trống

Giải pháp:

🔹 Tuỳ chọn 1: Xoá thủ công

  • Vào ECR → chọn repo → xoá toàn bộ ảnh
  • Vào S3 → chọn bucket → empty → delete

🔹 Tuỳ chọn 2: Dùng AWS CLI

  • Xoá tất cả ảnh ECR:
aws ecr batch-delete-image \ --repository-name ecs-ecr-demo \ --image-ids $(aws ecr list-images --repository-name ecs-ecr-demo --query 'imageIds[*]' --output json)
  • Xoá bucket S3:
aws s3 rm s3://ecs-ecr-demo-logs-<your-bucket-id> --recursive
aws s3 rb s3://ecs-ecr-demo-logs-<your-bucket-id>
  • Sau đó chạy lại:
terraform destroy

Tổng quan luồng hoạt động

  • Người dùng gửi yêu cầu → CloudFront nhận qua HTTPS
  • CloudFront cache → nếu trượt, gửi tới ALB
  • ALB chuyển tiếp đến ECS Task (Fargate)
  • ECS trả về phản hồi
  • CloudFront cache lại và trả phản hồi cho người dùng
  • Log → S3, Metric → CloudWatch, Alert → SNS

Lựa chọn thiết kế

  • Cấu trúc module Terraform: Mỗi thành phần như VPC, ECS, ECR,... là một module riêng → dễ bảo trì, mở rộng
  • Ứng dụng stateless: Trang tĩnh đơn giản với NGINX
  • Bảo mật: Chỉ mở cổng 80 và 443
  • File outputs.txt: Ghi thông tin quan trọng nhờ null_resource

Tuỳ biến

  • 📝 Sửa docker/index.html để thay đổi nội dung web
  • 🏗️ Sửa main.tf để thay đổi hạ tầng
  • 🔁 Cập nhật module ECS để điều chỉnh cấu hình container

Mẹo

  • Thêm lifecycle { ignore_changes = [...] } vào module ECR để tránh bị tạo lại image
  • Dùng depends_on để điều khiển thứ tự tài nguyên
  • Dự án thực tế nên dùng private subnet, ALB có HTTPS, và domain tùy chỉnh

Cảm ơn các bạn đã theo dõi!

Bình luận

Bài viết tương tự

- vừa được xem lúc

The Twelve-Factor App, cẩm nang gối đầu giường trong xây dựng application (Phần 1)

Giới thiệu. Ngày nay các phần mềm được triển khai dưới dạng các dịch vụ, chúng được gọi là các web apps hay software-as-a-service (SaaS).

0 0 45

- vừa được xem lúc

8 Sai lầm phổ biến khi lập trình Android

1. Hard code.

0 0 207

- vừa được xem lúc

Popular interview question: What is the difference between Process and Thread? 10 seconds a day

Video được đăng tại channel Tips Javascript

0 0 44

- vừa được xem lúc

Thuật toán và ứng dụng - P1

Mục đích series. . Những bài toán gắn liền với thực tế. Từ đó thấy được tầm quan trọng của thuật toán trong lập trình.

0 0 46

- vừa được xem lúc

Tác dụng của Docker trong quá trình học tập

Docker bây giờ gần như là kiến thức bắt buộc đối với các anh em Dev và Devops, nhưng mà đối với sinh viên IT nói chung vẫn còn khá mơ hồ và không biết tác dụng thực tế của nó. Hôm nay mình sẽ chia sẻ

0 0 52

- vừa được xem lúc

Làm giàu trong ngành IT

Hầu như mọi người đều đi làm để kiếm tiền, ít người đi làm vì thấy cái nghề đó thú vị lắm. Bây giờ vất cho mình 100 tỷ bảo mình bỏ nghề thì mình cũng bỏ thôi.

0 0 55