Giới thiệu ECS
ECS Cluster là một nhóm các service được sử dụng để chạy container trong môi trường được quản lý. Một ECS Cluster có thể bao gồm nhiều servicé, được chạy trên các máy chủ EC2 tự quản lý đến giải pháp không cần máy chủ như Fargate, giúp tối ưu chi phí và dễ dàng triển khai theo quy mô cần thiết.
Sự khác biệt khi triển khai ECS Cluster với Fargate và EC2
Khi triển khai ECS Cluster, bạn có hai lựa chọn chính:
ECS với EC2: Tạo một ECS Cluster sử dụng các EC2 instances, nơi bạn tự chịu trách nhiệm quản lý tài nguyên máy chủ như việc cài đặt phần mềm, cập nhật, và bảo mật.
ECS với Fargate: Fargate hoàn toàn tự động xử lý việc cấp phát và quản lý tài nguyên, giúp bạn không cần quan tâm đến cơ sở hạ tầng, dễ dàng mở rộng ứng dụng khi cần thiết và tối ưu chi phí cho từng phiên chạy.
Lựa chọn giữa hai giải pháp này phụ thuộc vào nhu cầu quản lý và tính linh hoạt của ứng dụng. Nếu muốn toàn quyền kiểm soát hạ tầng, EC2 là lựa chọn tốt; ngược lại, Fargate phù hợp hơn nếu muốn giảm tải phần quản lý cơ sở hạ tầng.
Trong khuôn khổ của series này để đơn giản hoá việc config mình sẽ chọn triển khai ECS với Fargate.
Khởi tạo ECS Cluster
Bây giờ hãy bắt tay và khởi tạo ECS Cluster đầu tiên, Các bạn vào AWS Console gõ ECS vào trang dashboard, sau đó vào Cluster chọn Create cluster:
Điền các thông tin như hình bên dưới, như mình đã nói trong series này chúng ta sẽ triển khai ECS trên Fargate nên mình sẽ chọn Fargate và bỏ chọn EC2(Các bạn vẫn có thể chọn cả 2 option để triển khai được)
Nhấn create là các bạn đã có thể tạo ECS Cluster thành công rồi, vui lòng kiểm tra lại ECS như sau:
Trước khi đi tiếp mình sẽ nói sơ qua về các khái niệm trong ECS để các bạn nắm rõ sau đó chúng ta sẽ tiến hành config từng thành phần một:
Task Definition:
Task Definition là một cấu hình chi tiết cho từng(hoặc nhiều) container chạy trên ECS, định nghĩa các tài nguyên CPU, bộ nhớ, các cổng mạng, và các biến môi trường cho container. Task Definition đóng vai trò như một template, xác định container sẽ được chạy như thế nào trong môi trường ECS.
ECS Task:
Task là một phiên bản chạy thực tế của Task Definition. Mỗi Task sẽ đại diện cho một container hoặc nhóm container đang chạy dựa trên thông tin trong Task Definition. Nhiều Task có thể được tạo từ cùng một Task Definition để mở rộng khả năng xử lý và đáp ứng nhu cầu ứng dụng.
ECS Service:
Service trong ECS Cluster đảm nhận việc duy trì số lượng Task mong muốn trong ECS Cluster. Nếu một Task bị lỗi hoặc gặp sự cố, Service sẽ tự động tạo lại Task mới để duy trì hiệu suất và đảm bảo tính sẵn sàng cho ứng dụng. Service ở đây chính là service(back end hoặc front-end) mà chúng ta muốn nó thực tế đảm nhận việc xử lý các business logic cho chúng ta
Để đễ hình dung thì mọi người có thể tham khảo qua hình dưới đây:
Một Cluster có thể store nhiều service trên đó, và một service sẽ được tạo từ task defintion đã được define sẵn, và số lượng task mong muốn chạy trên service đó(for scalability) cũng sẽ được define trong TD hoặc có thể config manually trong service
Push docker image to ECR:
Trước khi khởi tạo ECS task definition thì chúng ta cần có image để các container có thể run từ image đó, để đơn giản thì có thể sử dụng ECR của AWS để push image lên AWS và dùng nó để tạo service.
Các bạn vào ECR -> create repository -> điền các thông số như hình:
Sau khi tạo xong các bạn click vào repository vừa tạo -> View push command ở góc trên phải và làm theo hướng dẫn để có thể build & push image từ dưới máy local:
Giả sử mình có một Nodejs service đang run dưới máy local tại port 8080:
mình sẽ build và push lên ECR, sau đó mình sẽ nhận được ECR như sau:
Khởi tạo Task Definition
Quay trở về ECS Cluster của chúng ta, các bạn click vào Task Definition ở left bar, sau đó chọn create new task definition chọn Launch type là AWS Fargate, CPU và RAM để tiết kiệm mình sẽ chọn low cost nhất. Phần container mình điền tên, copy image uri mà các bạn tạo được ở ECR vào
Sau khi điền thông tin như hình phần còn lại các bạn để default hết và nhấn Create, chúng ta sẽ thấy task definition vừa đc tạo:
Khởi tạo ECS Service
Bây giờ, sau khi tạo xong TD chúng ta sẽ tiến hành tạo ECS service dựa trên TD đã tạo. Các bạn vào lại ECS Cluster mà chúng ta đã tạo ban đầu:
Click vào cluster name, ở mục service phía dưới chọn create new service, mục launch type các bạn vẫn chọn Fargate, phần Deployment configuration chọn service sau đó ở mục family chọn TD mà chúng ta đã tạo, để dễ cho việc scale sau này ở mục desired tasks chúng ta sẽ chọn 2 nhé - điều này đồng nghĩa với việc service của chúng ta luôn có 2 task chạy song song để handle request
Mục networking là mục khá quan trọng - các bạn hãy chọn VPC mà chúng ta đã tạo ở bài trước - hiện tại VPC này có 6 subnet nhưng chỉ có 2 subnet pubic còn 4 subnet private. Vì chúng ta chưa config Load balancer nên tạm thời phải để service nằm ở public subnet để nhận request từ phía end user - sau này khi config load balancer cho nó chúng ta sẽ để service vào trong private subnet sau. Vì nằm ở trong public subnet nên đương nhiên security group cũng là PUBLIC SG
Sau khi config xong nhấn create đợi 1 lúc service và các task sẽ dc provisioning là chúng ta có thể truy cập service từ 2 task được tạo rồi!!!!!!
Các bạn vào mục task sẽ thấy 2 task được khởi tạo cùng với service này:
trong phần task, chọn một task bất kỳ và kiểm tra địa chỉ PUBLIC IP của nó là có thể truy cập vào service thông qua port 8080 rồi:
Ví dụ như task ở trên hình có địa chỉ là: 54.250.8.14 Chúng ta chỉ cần truy cập vào địa chỉ: 54.250.8.14:8080 là có thể request tới service rồi:
Tương tự với task còn lại có địa chỉ IP là: 43.207.191.255 Chúng ta cũng có thể truy cập vào service thông qua địa chỉ: 43.207.191.255:8080
Phewwww! thế là các bạn đã config xong ECS Service hỗ trợ scale 2 task sử dụng ECR, TD, ECS Cluster và VPC rồi đó. Thật xịn sò đúng không nào?
Tổng kết
Hy vọng bài viết này đã giới thiệu tổng quan về ECS Cluster, AWS Fargate, cũng như cách thiết lập các Task và Service. Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu chi tiết về cách cấu hình Elastic Load Balancing (ELB) cho lớp ứng dụng, giúp điều phối traffic một cách hiệu quả và đảm bảo độ tin cậy cho hệ thống. Hãy đón xem nhé!
Nếu có thắc mắc nào các bạn vui lòng comment bên dưới hoặc liên hệ trực tiếp với mình để chúng ta cùng trao đổi nhé!
HAPPY CODING!