Amazon ECS – EC2 Launch Type.
ECS là viết tắt của Elastic Container Service, là một dịch vụ quản lý container của Amazon. ECS cho phép người dùng khởi chạy các container Docker trên AWS một cách dễ dàng. Thay vì quản lý các container trực tiếp, người dùng có thể quản lý các tác vụ (tasks) của ECS trên các cluster của ECS.
EC2 Launch Type là một trong hai loại khởi chạy tác vụ trong ECS. Loại này yêu cầu người dùng tự triển khai và duy trì các hạ tầng (instance EC2) cho ECS. Mỗi instance EC2 phải chạy ECS Agent để đăng ký với ECS Cluster. Khi các tác vụ ECS được khởi chạy, AWS sẽ quản lý việc khởi động / dừng các container trên các instance EC2 này.
Amazon ECS – Fargate Launch Type.
AWS Fargate là một dịch vụ container serverless của Amazon, cho phép bạn chạy các ứng dụng container trên AWS mà không cần phải quản lý hoặc định cấu hình các EC2 instances.
Trong AWS Fargate, bạn chỉ cần tạo định nghĩa task (task definition) bằng cách xác định các thông số như CPU, RAM, hệ điều hành và các thông số khác liên quan đến container. AWS sẽ tự động tạo và quản lý các resources cần thiết để thực hiện các task này, ví dụ như EC2 instances.
Nói cách khác, bạn không phải quản lý hoặc định cấu hình các EC2 instances, và chỉ cần quan tâm đến định nghĩa task của mình. Điều này giúp cho việc triển khai và mở rộng ứng dụng trở nên đơn giản và nhanh chóng hơn. Để scale ứng dụng, bạn chỉ cần tăng số lượng tasks mà Fargate sẽ thực hiện cho bạn mà không cần phải lo lắng về việc tạo và quản lý các EC2 instances.
Amazon ECS – IAM Roles for ECS.
EC2 Instance Profile (EC2 Launch Type):
- Được sử dụng bởi ECS agent.
- Thực hiện các cuộc gọi API tới dịch vụ ECS.
- Gửi các logs của container tới CloudWatch Logs.
- Kéo Docker image từ ECR.
- Tham chiếu đến dữ liệu nhạy cảm trong Secrets Manager hoặc SSM Parameter Store.
ECS Task Role:
- Cho phép mỗi task có một vai trò cụ thể.
- Sử dụng các vai trò khác nhau cho các Dịch vụ ECS khác nhau bạn chạy.
- Task Role được xác định trong định nghĩa của task.
Amazon ECS – Load Balancer Integrations.
Trên AWS, để phân phối tải cho các task trong Amazon ECS, bạn có thể sử dụng các loại Load Balancer khác nhau như Application Load Balancer, Network Load Balancer và Elastic Load Balancer.
- Application Load Balancer được hỗ trợ và hoạt động cho hầu hết các trường hợp sử dụng. Nó có thể phân phối tải trên các ứng dụng cùng một cổng hoặc các ứng dụng khác nhau trên các cổng khác nhau.
- Network Load Balancer được khuyến nghị chỉ cho các trường hợp sử dụng có lưu lượng lớn hoặc hiệu suất cao hoặc kết hợp với AWS Private Link để kết nối với dịch vụ ECS.
- Elastic Load Balancer được hỗ trợ nhưng không được khuyến nghị. Nó không cung cấp các tính năng nâng cao và không hỗ trợ Fargate.
Amazon ECS – Data Volumes (EFS).
EFS (Elastic File System) là một dịch vụ lưu trữ trực tuyến của Amazon Web Services (AWS). Nó cho phép các khối lượng công việc truy cập tập tin thông qua một giao diện file chuẩn.
Trong ECS, EFS được sử dụng để chia sẻ dữ liệu giữa các task chạy trên nhiều AZ (Availability Zones). EFS có thể được mount trên các task của ECS, bao gồm cả EC2 và Fargate launch types. Nó cho phép các task chạy trên bất kỳ AZ nào chia sẻ cùng một dữ liệu lưu trữ trong EFS.
Khi sử dụng EFS và Fargate cùng với nhau, điều này có thể giúp bạn tạo ra một giải pháp lưu trữ serverless và đảm bảo tính khả dụng của dịch vụ.
Một số use case phổ biến của EFS trong ECS bao gồm lưu trữ dữ liệu đồng bộ giữa các task, lưu trữ tập tin cấu hình chung, hoặc lưu trữ dữ liệu cho ứng dụng web. Chú ý rằng, Amazon S3 không được phép mount filesystem.
Thực hành tạo ECS Cluster.
Hãy vào Amazon Elastic Container Service › Clusters › Create, đặt tên cho cluster tại Cluster name.
Phần Networking bạn hãy thiết lập VPC và subnet của bạn.
Tai đây bạn sẽ thấy có 3 thành phần đó là AWS Fargate (serverless), Amazon EC2 instances và External instances using ECS Anywhere. Mặc định thành phần AWS Fargate (serverless) sẽ được bật mặc định và bạn sẽ không phải thay đổi gì.
Với thành phần AWS Fargate (serverless) bạn sẽ có một nơi để chạy các container mà không cần phải quản lý con máy ảo chạy dịch vụ này, AWS sẽ làm hết tất cả cho bạn và Amazon EC2 instances bạn sẽ được vào máy ảo EC2 của bạn để có thể chủ động quản lý theo ý muốn của bạn.
Bây giờ mình sẽ demo lựa chọn thêm Amazon EC2 instances. Tại Auto Scaling group (ASG) mình chọn tại mới ASG bằng cách lựa chọn Create new ASG, hãy chọn một OS mà bạn muốn tại Operating system/Architecture và một loại EC2 tại EC2 instance type.
Desired capacity trong Amazon ECS là một thuộc tính của service, cho phép bạn xác định số lượng task mà bạn muốn chạy trong service. Khi bạn tạo một service, bạn có thể thiết lập desired capacity của nó để đảm bảo rằng số lượng task trong service sẽ luôn đạt được giá trị này.
Các tuỳ chọn khác mình sẽ bỏ qua và bấm vào Create để tạo Cluster mới.
Thông báo Cluster Demo Cluster creation is in progress cho biết quá trỉnh khởi tạo cluster đang diễn ra.
Đây chính là nơi hiển thị thông tin EC2 của bạn sẽ được tự động tạo ra vì bạn đã chọn Amazon EC2 instances để khởi tạo cluster, hiện tại chưa có instance nào được tạo.
Và sau khi tạo xong cluster bạn sẽ nhận được thông tin như dưới.
Bạn bấm vào cluster vừa tạo và bấm vào thẻ Infrastructure, bạn sẽ có các thông tin cơ bản cần quan tâm như dưới, bạn nhận được cluster type là ASGProvider.
Bạn cũng có các thông tin như Managed scaling, Managed instance protection, Current size, Desired size, Min size và Max size.
Bạn hãy vào EC2 › Auto Scaling groups › Infra-ECS-Cluster-Occ5f695… và bấm vào Edit để thay đổi giá trị Desired tasks.
Mình sẽ thay đổi giá trị từ 0 sang 1.
Kết quả.
Bạn sẽ thấy 1 EC2 đang chuẩn bị được khởi tạo và đang ở chế độ Pending, sau khi khởi tạo xong EC2 thì phần Lifecycle sẽ chuyển sang InService.
Và đây là kết quả khi instance được tạo xong.
Thực hành Creating ECS Service.
Sau khi có cụm ECS chúng ta bắt đầu tạo các dịch vụ để chạy trên cụm bằng các vào Amazon Elastic Container Service › Task definitions, bấm vào Create new task definition.
Hãy đặt cho nó 1 cái tên và kéo xuống dưới.
Phần Container bạn đặt cho nó 1 cái tên và điền tên image vào Image URI, nhập container port và giao thức sẽ sử dụng. Hãy bỏ qua các thành phần khá và kéo xuống dưới, bấm vào next.
Tại step 2 (Configure environment, storage, monitoring, and tags) bạn hãy lựa chọn 1 loại dịch vụ ECS cần sử dụng và lần này mình sẽ lựa chọn AWS Fargate (serverless).
Lựa chọn hệ điều hành, cpu và ram.
Tạm thời các cài dặt khác bạn có thể bỏ qua, kéo xuống dưới và bấm Next.
Tại phần Review and create cho phép bạn review lại các thiết lập, nếu không có gì thay đổi bạn hãy kéo xuống dưới cùng và bấm Create.
Thông báo Task definition successfully created cho biết quá trình khởi tạo container đã thành công.
Tiếp tục vào EC2 › Security Groups › Create security group để tạo security group thứ nhất.
Create security group
Phần inbound rule mình mở port 80 TCP đến tất cả các đích.
Và security group thứ 2 tên “nginx-demo-sg”.
Tại phần Inbound rules này chúng ta thiết lập source là từ security group đã tạo ở phần trên sg-02adOdadc206f9b37.
Phần Outbound rule chúng ta trỏ 0.0.0.0/0 ý nghĩa là đến mọi đích và kéo xuống dưới bấm Create security group để tạo rule mới.
Giờ chúng ta hãy vào Services của DemoCluster theo đường dẫn Amazon Elastic Container Service › Clusters › DemoCluster › Services và tại thể Services bấm Deploy.
Trong kiến trúc của Amazon Elastic Container Service (ECS), Service và Task là hai khái niệm quan trọng của loại ứng dụng Application.
- Task là một instance của một container, nó bao gồm các thông tin như hình ảnh, cấu hình, lịch trình chạy, và các thông số khác để chạy một container đơn lẻ.
- Service là một tập hợp các Task có chung một định nghĩa Task, cùng chạy một ứng dụng và được quản lý bởi ECS. Mỗi Service sẽ có một số lượng Task chạy song song để cung cấp khả năng mở rộng và tăng tính sẵn sàng.
Một ví dụ điển hình của sự khác biệt giữa Task và Service trong ứng dụng Application trên ECS là:
- Nếu ta có một ứng dụng web đơn giản, ta sẽ cần một Task để chạy một container cho ứng dụng web đó.
- Nhưng nếu ứng dụng web của ta cần phải đảm bảo khả năng mở rộng và sẵn sàng cao hơn, ta sẽ tạo một Service với nhiều Task để chạy nhiều container ứng dụng web cùng một lúc. Nếu có bất kỳ Task nào bị lỗi, ECS sẽ tự động khởi động lại Task đó hoặc thay thế nó với một Task mới để đảm bảo rằng Service luôn hoạt động đúng cách và không bị gián đoạn.
Trong trường hợp của mình thì mình chọn Service để tiếp tục demo.
Khi sử dụng Amazon ECS, ta có thể sử dụng revision để quản lý việc triển khai các phiên bản mới của ứng dụng. Revision là một bản sao của task definition, cho phép ta theo dõi và quản lý các phiên bản khác nhau của ứng dụng một cách dễ dàng.
Tiếp theo mình lựa chọn nginxdemos-hello đã define ở phần trên để tiếp tục demo, Revision chọn phiên bản latest, đặt tên cho service tại Service name.
Desired tasks là số lượng task (hoặc container) mà bạn muốn chạy trong một service. Nó thường được cấu hình thông qua một thuộc tính trong service definition của Amazon ECS. Khi bạn tạo một service mới, bạn có thể đặt desired tasks bằng 0, nghĩa là không có task nào được chạy ban đầu. Khi desired tasks được đặt, Amazon ECS sẽ tự động bắt đầu các task đó và phân bổ chúng trên các instance EC2 hoặc Fargate. Nếu số lượng task đang chạy hiện tại ít hơn số lượng desired tasks, Amazon ECS sẽ tự động khởi động thêm các task để đáp ứng yêu cầu của bạn. Tương tự, nếu số lượng task đang chạy nhiều hơn số lượng desired tasks, Amazon ECS sẽ tự động dừng bớt các task để giảm chi phí.
Chúng ta sẽ sử dụng đã tạo ở phần trên có tên sq-0284edb2b9ef37ffe và có sử dụng thêm public ip, nếu không còn gì thay đổi bạn hãy kéo xuống dưới và bấm Deploy.
Chờ đợi 1 lát và đây là kết quả khi bạn tạo xong.
Và khi nhấp vào đó chúng ta sẽ thấy có 1 Desired tasks đang hoạt động.
Khi bạn kéo xuống dưới phần Notifications bạn sẽ thấy có 1 service đang hoạt động.
Hãy qua phần Load Balancers bạn sẽ thấy có 1 Load Balancer tên DemoALBForECS đã được tạo và nó sử dụng Security group là nginx-demo-sg nhưng tôi không muốn sử dụng security group này mà sẽ sử dụng alb-ecs-sg nên tôi sẽ bấm vào Edit security group.
Lựa chọn security group là alb-ecs-sg.
Hãy copy URL tại DNS name.
Giờ mình sẽ vào Amazon Elastic Container Service Clusters › Demo Cluster › Services › nginxdemos › Health và bấm Edit.
Tại Desired tasks mình sẽ chỉnh thành 4, lưu ý nếu bạn tăng số lượng Desired tasks lên thì bạn sẽ phải chi tiền cho nó nên bạn hãy cân nhắc khi thay đổi thành phần này.
Sau khi lưu lại bạn sẽ có kết quả tại Desired tasks là 4 và có 3 tast đang pending.
Kéo xuống Services bạn sẽ thấy các tast đang được khởi tạo.
Màn hình này cho thấy có 3 tast đang ở trạng thái là Provisioning và nó sẽ sớm được hoàn thành.
Sau 1 lúc chờ đợi bạn sẽ có kết quả như dưới.
Và khi bạn quay lại url cũ bạn tải lại trang, bạn sẽ thấy sẽ có giá trị Server address khác nhau trả về, điều này cho thấy mỗi lần trả về lại có 1 container khác nhau xửa lý và trả kết quả cho bạn.
Và cuối cùng nếu bạn muốn tạm dừng service này mà không muốn mất các thiết lập của bạn, bạn chỉ cần thay đổi giá trị Desired tasks thành 0. Điều này sẽ giúp bạn không bị mất chi phí và sau này nếu muốn sử dụng lại bạn chỉ cần thay đổi giá trị Desired tasks thành 1 con số khác 0 tuỳ ý bạn và lúc này các dịch vụ sẽ tiếp tục hoạt động trở lại.
Đây là kết quả khi bạn thiết lập thông số Desired tasks bằng 0.