Hướng dẫn ECS

Đây là bài viết đầu tiên trong loạt bài Deploy dự án Ruby on Rails trên Amazon ECS. Trong bài viết này, mình sẽ nói về các ý tưởng cần thiết để bắt đầu 1 dự án trên ECS.

ECS là gì và tại sao sử dụng ECS

ECS [Elastic container service] là 1 dịch vụ điều phối container hiệu suất cao có hỗ trợ Docker. Nó cho phép lập trình viên chạy các ứng dụng được đóng gói trên AWS. ECS được biết đến như là 1 đối thủ cạnh tranh với Kubernetes của Google. AWS tích hợp ECS cùng với rất nhiều các dịch vụ khác đi kèm, khiến nó trở thành 1 lựa chọn số 1 khi chạy phần lớn khối lượng dự án trên nền tảng AWS.

Tại sao lại cần 1 dịch vụ điều phối?

Trên thực tế, các ứng dụng được đóng gói [containerized] đơn giản thường dễ xử lý. Nếu bạn có 1 container cho ứng dụng của mình, đó là tất cả những gì bạn phải quản lý.

Tuy nhiên, khối lượng công việc trên môi trường production không đơn giản như vậy. Dung lượng cơ bản cho 1 khối lượng công việc vừa phải cần đến ít nhất 5 container, và phải đảm bảo 5 container này chạy cùng lúc, mọi lúc. Đôi khi, các containers này lại không nằm trên cùng 1 instance, mà rải rác trên 2, cho tới 3 instance. Với cách setup như vậy, việc deploy là cực kì đau khổ. Bạn phải làm việc với từng instance, chạy n bản copies của phiên bản mới, rồi cho test thủ công.

Bên cạnh đó, bạn cũng cần quản lý thêm vấn đề có nhiều hơn 1 container trên 1 instance. Với cách deploy truyền thống, bạn có 1 application server trên 1 instance, và trỏ server đó đến port 80, và vậy là xong, nó có thể được truy cập thông qua giao thức HTTP. Vậy trong trường hợp có hai container trên nhiều instance thì sao? Chúng ta không thể trỏ trực tiếp 2 container tới cùng 1 cổng 80 được. Do đó, phương án ở đây là sử dụng 1 server để cân bằng tải lưu lượng giữa các container nằm trên nhiều instance. Tuy nhiên, bạn vẫn phải thực hiện register và deregister thủ công từng container tới máy chủ.

Với cách tiếp cận như vậy, công việc bảo trì cần thiết sẽ cực kì phức tạp, đến nỗi chúng ta thực sự mong muốn quay về với cách deploy truyền thống, hơn là sử dụng Docker.

Và với sự ra đời của ECS là 1 dịch vụ điều phối, ngần đó effort là không còn cần thiết nữa:

  • ECS quy định các instance cho người dùng. Các instance đã được triển khai và sẵn sàng đưa vào sử dụng, chỉ cần quy định số lượng instance và loại instance.
  • ECS xử lý cách thức deploy container xuyên suốt các EC2 instance.
  • ECS được tích hợp với bộ cân bằng tải của AWS, do đó lập trình viên sẽ không còn phải lo lắng về việc quản lý bộ cân bằng tải. Bên cạnh đó các instance "healthy" cũng sẽ được đăng ký đến các bộ cân bằng tải để lưu lượng có thể được chuyển tới từng container. Và đối với các instance "unhealthy" sẽ được hủy đăng ký để lưu lượng truy cập sẽ không di chuyển tới các container lỗi này.
  • ECS hỗ trợ việc thực hiện deploy, và chắc chắn rằng phiên bản mới sẽ thông qua một số loại thử nghiệm trước khi lưu lượng truy cập được chuyển tới.
  • ECS hoàn toàn miễn phí. Người dùng chỉ cần thanh toán các tài nguyên mà ứng dụng sử dụng.

Ý tưởng

Docker Registry

Việc đầu tiên bạn cần làm là đưa 1 Docker image lên Docker registry. Docker registry cũng tương tự như Github, nhưng đối tượng ở đây là Docker image. Người dùng có thể push, pull, gắn tag các image. Tag được hiểu như tên được đặt cho các phiên bản khác nhau của image. Bạn có thể push lên bao nhiêu phiên bản của image cũng được, miễn sao chúng có các tag khác nhau [ví dụ: v0.0.1, v0.0.2]. Nếu như đẩy lên với tag giống nhau, phiên bản sau sẽ ghi đè lên phiên bản trước đó.

Docker registry phổ biến nhất hiện nay là Docker Hub. AWS cũng cung cấp riêng 1 kho lưu trữ image private, là ECR [Elastic Container Registry] với mức phí là $0.1/GB/month. Amazon cũng tính phí lưu lượng đi ra khỏi ECR vào trong các instance. Trong bài viết này, đối tượng Docker Registry mình muốn hướng tới là ECR.

Task Defination

Task defination là 1 file JSON định nghĩa các task và các container. Task được hiểu là logical groupings của các container [ví dụ như 1 "image processing task" có thể có 1 Sidekiq container, 1 web container và 1 Redis container]. Các container trong 1 task phải chạy cùng nhau. Trong ví dụ về "image processing task", việc mở rộng web container yêu cầu cả việc mở rộng Sidekiq container và Redis container.

Best practice ở đây là chúng ta chỉ nên có 1 container tương ứng với 1 task, để giúp cho việc scale từng phần của hệ thống 1 cách độc lập.

Task defination bao gồm các thông tin sau:

  • Cần bao nhiêu CPU và bộ nhớ cho 1 task?
  • Định nghĩa 1 container trong 1 task:
    • Container tiêu thụ bao nhiêu CPU và memory? Nó không được vượt quá con số được phân bổ ban đầu đối với 1 task. Nếu có nhiều hơn 1 container trong 1 task thì tổng số lượng tiêu thụ CPU và memory không được vượt quá con số phân bổ ban đầu.
    • Bạn quản lý các log ra sao?
    • Docker image nào sẽ được sử dụng?
    • Biến môi trường nào sẽ khả dụng cho container?
    • Câu lệnh nào sẽ được sử dụng để start container?

Vì cấu hình này thay đổi xuyên suốt vòng đời của 1 ứng dụng, do đó task definations có thể có nhiều phiên bản, được gọi là revision.

ECS Service

1 service sẽ đảm bảo luôn có 1 số lượng n task chạy tại 1 thời điểm. Khi 1 container chết, nó sẽ sinh ra 1 phiên bản để back up. Service này cũng chịu trách nhiệm instance nào sẽ được deploy.

Khi sinh ra 1 container, ECS service sẽ đảm bảo container đó được đăng ký lên ALB [Application Elastic Load Balancer] găn với nó. 1 ALB thực thi việc điều hướng lưu lượng trên các container trong hệ thống. 1 khi container được đăng ký với ALB, lưu lượng có thể được chuyển qua container đó.

Có 2 loại service là ECS-EC2ECS-Fargate.

ECS-EC2 service triển khai các container trên EC2 instance mà ta có quyền truy cập đến. ECS-Fargate thì chạy container trên EC2 instance được quản lý bởi AWS, do đó ta sẽ không có quyền truy cập đến các instance này.

ECS Cluster

1 cụm [cluster] là tổ hợp các service và task. Khi ta chạy service ECS-EC2, 1 cụm còn được hiểu là 1 nhóm các EC2 instance. Bạn có thể thiết lập số lượng và loại EC2 instance mà bạn muốn sử dụng. Tổng số đơn vị CPU và đơn vị bộ nhớ của từng instance này xác định số lượng container có thể thiết lập trong 1 cluster.

Lấy ví dụ: ta tạo ra 1 cluster cho ứng dụng Image processing. Nó có 2 service ECS-EC2: 1 web service thực hiện render website, và 1 service xử lý ảnh thực hiện việc resize. Cụm cũng bao gồm 3 c5.large instance, mỗi cái có 1 2vCPU [2.048 đơn vị CPU] và 4 GiB bộ nhớ. Cách setup này cho chúng ta 6.144 đơn vị CPU và 12GiB bộ nhớ. Dung lượng này được chia sẻ giữa tất cả các ECS-EC2 service trong cụm.

Giả sử web service của chúng ta cần 1.024 CPU units và 2GB RAM đối với 1 task, và service xử lý ảnh cần tới 2.048 CPU units và 4GB RAM cho 1 task, thì chúng ta có thể đưa vào 2 image processing tasks và 2 web service tasks vào trong 3 c5.large instance này. Nếu chúng ta muốn đưa thềm vào 1 web service task nữa, điều này là không thể vì toàn bộ tài nguyên của 3 c5.large instance đã được phân bố đầy đủ cho 4 task trước đó.

Trong phần tiếp theo, chúng ta sẽ thực hiện setup tài khoản AWS và push image lên AWS's image registry.

Bài viết được dịch từ Deploy Rails in Amazon ECS: Part 1 - Concepts

Nội dung

Trong bài viết ECS-P.1, chúng ta đã sử dụng giao diện AWS Console để thực hành các bước tạo ra những thành phần cơ bản của ECS: Cluster, Task Definition, Service. Sau khi đã nắm được cấu trúc và nguyên tắc vận hành của ECS, chúng ta có thể chuyển sang Amazon ECS Command Line Interface [CLI] để triển khai quá trình này một cách nhanh chóng và hiệu quả hơn.

Phiên bản đầu tiên của ECS CLI được Amazon giới thiệu vào năm 2015. Đây là một công cụ cho phép người sử dụng giao tiếp với dịch vụ ECS thông qua những câu lệnh như tạo, chỉnh sửa hay giám sát các đối tượng ECS Cluster, Task etc… ECS CLI cũng hỗ trợ kiến trúc Docker Compose với khả năng định nghĩa và triển khai đồng thời nhiều containers trong một ứng dụng. Phiên bản CLI v2 được thiết kế lại và giới thiệu vào năm 2019 dưới tên gọi mới AWS Copilot CLI cùng những bổ sung giúp việc triển khai và cập nhật ứng dụng trở nên dễ dàng, liền mạch hơn.

Amazon ECS CLI

ECS Cluster sử dụng EC2 Instances

Trong phần này, chúng ta sử dụng ECS CLI để tạo và cài đặt dịch vụ RemindersManagement trên một ECS Cluster với cơ chế thực thi dựa trên EC2.

Bước 1: Cài đặt ECS CLI

  • Trên hệ điều hành MacOS hoặc Linux, sử dụng lênh curl để download ecs-cli:

sudo curl -Lo /usr/local/bin/ecs-cli //amazon-ecs-cli.s3.amazonaws.com/ecs-cli-darwin-amd64-latest

  • Cài đặt quyền thực thi lên file ecs-cli:

sudo chmod +x /usr/local/bin/ecs-cli

  • Xác nhận phiên bản cài đặt:

Output

ecs-cli version 1.20.0 [7547c45]

Hướng dẫn

Để đảm bảo tính bảo mật khi download ecs-cli file từ server, trong quá trình cài đặt, chúng ta có thể sử dụng PGP Signature để so sánh và xác nhận tính toàn vẹn trong nội dung file download. Có thể tham khảo các bước thực hiện quá trình này tại link: ECS CLI Install

Bước 2: Khai báo Cluster Configurations và tạo Cluster

Cluster Configuration là một tập hợp các thuộc tính [fields] mô tả cấu hình Amazon ECS cluster. Các thuộc tính cơ bản bao gồm:

  • Cluster Name: --cluster
  • Amazon Region: --region
  • Launch Type [EC2/FARGATE]: --default-launch-type

Giá trị EC2 cho Launch Type được áp dụng mặc định khi không thực hiện khai báo.

  • Trong trường hợp sử dụng EC2, sử dụng câu lệnh sau để khai báo Cluster Configuration friendreminders:

ecs-cli configure --cluster friendreminders --default-launch-type EC2 --config-name friendreminders --region ap-southeast-2

Output

INFO[0000] Saved ECS CLI cluster configuration friendreminders.

Thông tin cấu hình được lưu trong file ~/.ecs/config với nội dung

version: v1 default: friendreminders clusters: friendreminders: cluster: friendreminders region: ap-southeast-2 default_launch_type: EC2

  • Sử dụng EC2 keypair FriendReminders, thực hiện lệnh ecs-cli up để triển khai cluster bao gồm 2 EC2 Instance với cấu hình t2.medium

ecs-cli up --keypair FriendReminders --capability-iam --size 2 --instance-type t2.medium

Output

INFO[0000] Using recommended Amazon Linux 2 AMI with ECS Agent 1.45.0 and Docker version 19.03.6-ce INFO[0001] Created cluster cluster=friendreminders region=ap-southeast-2 INFO[0001] Waiting for your cluster resources to be created... INFO[0002] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS INFO[0062] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS INFO[0123] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS VPC created: vpc-01f658bc83e0eab55 Security Group created: sg-07a7e8837f60bf314 Subnet created: subnet-04474333e5ffb64c9 Subnet created: subnet-0744ea43d4cc0b6af Cluster creation succeeded.

  • Xác nhận thông tin Cluster friendreminders và EC2 Instance trên AWS Console:

ECS Cluster Overview

ECS EC2 Instances List

  • Danh sách EC2 Instances được tạo ra trong friendreminders cluster cũng có thể kiểm tra bởi lệnh:

aws ecs list-container-instances --cluster friendreminders

Output

{ "containerInstanceArns": [ "arn:aws:ecs:ap-southeast-2:729365137003:container-instance/00c71427-9c6e-4191-ac12-bc17bec55fd8", "arn:aws:ecs:ap-southeast-2:729365137003:container-instance/556a472b-bf5c-44c7-bd55-d35bcb84eb9c" ] }

  • Về bản chất, câu lệnh ecs-cli up sử dụng CloudFormation để tạo stack amazon-ecs-cli-setup-friendreminders với những AWS Resources cần thiết cho hoạt động của ECS EC2 Cluster. Sử dụng AWS Console, CloudFormation -> Stack, trong mục Resources chúng ta có được danh sách các thành phần tạo bởi ecs-cli up:
    • Autoscaling Group
    • Autoscaling Launch Configuration
    • EC2 VPC
    • EC2 Internet Gateway
    • EC2 VPC Gateway Attachment
    • EC2 Route Table
    • EC2 Route
    • 2 Public EC2 Subnets
    • 2 EC2 SubnetRouteTableAssocitaions
    • EC2 Security Group

ECS Resources List

Bước 3: Triển khai ECS Service

Khi triển khai Service trong ECS Cluster, chúng ta cần cung cấp các thông tin, bao gồm:

  • docker-compose.yml - cấu hình các Tasks thực thi bên trong Services
  • ecs-params.yml - tham số mô tả hoạt động của ECS [network, role…]

Tạo folder ecs-ec2-demo với files câú hình sau:

docker-compose.yml

version: '3' services: remindersmgtservice: image: 729365137003.dkr.ecr.ap-southeast-2.amazonaws.com/remindersmgtservice:latest ports: - "80:8000" logging: driver: awslogs options: awslogs-group: /ecs/remindersmgtec2 awslogs-region: ap-southeast-2 awslogs-stream-prefix: ecs/remindersmgtservice

ecs-params.yml

version: 1 task_definition: ecs_network_mode: bridge services: remindersmgtservice: essential: true

  • Với cấu hình files trên, trong folder ecs-ec2-demo, tạo Cluster Service với lệnh ecs-cli compose:

ecs-cli compose --project-name remindersmgtec2 service create

Output

INFO[0000] Using ECS task definition TaskDefinition="remindersmgtec2:4" WARN[0000] Timeout was specified as zero. Service creation may not have completed yet. WARN[0000] Timeout was specified as zero. Your service deployment may not have completed yet. INFO[0000] Created an ECS service service=remindersmgtec2 taskDefinition="remindersmgtec2:4"

Nội dung output của câu lệnh cho biết Task Definition và Service - remindersmgtec2 được tạo ra thành công.

ECS Cluster Service Created

Chú ý

Câu lệnh ecs-cli compose service create chỉ cho phép tạo ra Task Definition và Service với cùng một tên gọi. Chúng ta bắt buộc phải sử dụng AWS Console nếu muốn sử dụng những tên gọi khác nhau.

  • Sau khi service remindersmgtec2 được tạo ra, thực thi task trong service với lệnh:

ecs-cli compose --project-name remindersmgtec2 service start

Output

INFO[0000] Updated ECS service successfully desiredCount=1 force-deployment=false service=remindersmgtec2 INFO[0020] Service status desiredCount=1 runningCount=1 serviceName=remindersmgtec2 INFO[0020] [service remindersmgtec2] has started 1 tasks: [task 0182bca2-6bb9-4ff2-9eb7-f715058bac18]. timestamp="2020-10-14 06:59:51 +0000 UTC" INFO[0020] ECS Service has reached a stable state desiredCount=1 runningCount=1 serviceName=remindersmgtec2

  • Kiểm tra trạng thái Task trong Service trên AWS Console

ECS Task Running

Với public IP của container e93d7578-c47c-4da4-86d6-d54ce9dddadf, xác nhận hoạt động của RemindersManagement Service:

ECS Task Details

RemindersManagement Service - Swagger UI

Bước 4: Xoá ECS Cluster

  • Thực hiện loại bỏ service khỏi cluster với lệnh:

ecs-cli compose --project-name remindersmgtec2 service down

Output

INFO[0000] Deleted ECS service service=remindersmgtec2 INFO[0000] Service status desiredCount=0 runningCount=1 serviceName=remindersmgtec2 INFO[0020] Service status desiredCount=0 runningCount=0 serviceName=remindersmgtec2 INFO[0020] [service remindersmgtec2] has stopped 1 running tasks: [task 0182bca2-6bb9-4ff2-9eb7-f715058bac18]. timestamp="2020-10-14 07:08:54 +0000 UTC" INFO[0020] ECS Service has reached a stable state desiredCount=0 runningCount=0 serviceName=remindersmgtec2

  • Thực hiện loại bỏ ECS Cluster friendreminders:

ecs-cli down --cluster-config friendreminders

Sau khi xác nhận y để tiếp tục quá trình loại bỏ, kết quả thực thi của câu lệnh:

Are you sure you want to delete your cluster? [y/N] y INFO[0003] Waiting for your cluster resources to be deleted... INFO[0003] Cloudformation stack status stackStatus=DELETE_IN_PROGRESS INFO[0063] Cloudformation stack status stackStatus=DELETE_IN_PROGRESS INFO[0124] Deleted cluster cluster=friendreminders

ECS Cluster sử dụng Fargate Engine

Trong phần này, chúng ta sử dụng ECS CLI để tạo và cài đặt dịch vụ RemindersManagement trên một ECS Cluster với cơ chế thực thi dựa trên Fargate. Thêm vào đó, chúng ta sẽ khai báo và kết hợp hoạt động của nhiều containers: Reverse proxy - Nginx và RemindersManagement trên cùng một Task trong ECS Cluster.

Bước 1: Cập nhật cấu hình Ngix - nginx.conf

  • Trong ECS Cluster hoạt động theo mô hình Fargate, các Containers trong Task sử dụng chung một network namespace [127.0.0.1 / localhost] với các giá trị ports riêng biệt. Do vậy để Nginx container giao tiếp được với RemindersManagement Container, chúng ta thay đổi địa chỉ upstream trong file nginx.conf như sau:

worker_processes 4; events { worker_connections 1024; } http { sendfile on; upstream app_servers { server 127.0.0.1:8000; } server { listen 80; location / { proxy_pass http://app_servers; } } server { listen 443 ssl; server_name localhost; ssl_certificate /etc/ssl/certs/localhost.crt; ssl_certificate_key /etc/ssl/private/localhost.key; location / { proxy_pass http://app_servers; proxy_redirect off; proxy_http_version 1.1; proxy_cache_bypass $http_upgrade; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $server_name; } } }

Với khai báo này, Nginx proxy sẽ xử lý các yêu cầu gửi dến qua port 80 [http] hoặc 443 [https], cập nhật giá trị của header và chuyển hướng những yêu cầu này đến upstream service - RemindersManagement qua port 8000.

  • Sau khi thay đổi khai báo, sử dụng lệnh dockers để tạo mới và đưa Docker Image lên ECR Repository của Nginx:

Trong folder RemindersManagement.API/Proxy, tạo Docker Image

docker build -t 729365137003.dkr.ecr.ap-southeast-2.amazonaws.com/nginx:fargate .

Output

Sending build context to Docker daemon 20.48kB Step 1/4 : FROM nginx:latest ---> 4bb46517cac3 Step 2/4 : COPY nginx.conf /etc/nginx/nginx.conf ---> 8fa50cf810a4 Step 3/4 : COPY localhost.crt /etc/ssl/certs/localhost.crt ---> ae6f58e1dd3e Step 4/4 : COPY localhost.key /etc/ssl/private/localhost.key ---> b1c9d8c9146d Successfully built b1c9d8c9146d Successfully tagged 729365137003.dkr.ecr.ap-southeast-2.amazonaws.com/nginx:fargate

Upload Docker Image lên ECR Repository

// Login ECR aws ecr get-login-password --region ap-southeast-2 | docker login --username AWS --password-stdin 729365137003.dkr.ecr.ap-southeast-2.amazonaws.com // Push Image to Repository docker push 729365137003.dkr.ecr.ap-southeast-2.amazonaws.com/nginx:fargate

Chú ý: Tham khảo cách thức tạo ECR Repository của Nginx Container trong Bước 1 của bài viết Swarm - P.3

Bước 2: Khai báo Cluster Configurations và tạo Cluster

  • Khai báo cấu hình Cluster

ecs-cli configure --cluster friendreminders --default-launch-type FARGATE --config-name friendreminders --region ap-southeast-2

Output

INFO[0000] Saved ECS CLI cluster configuration friendreminders.

Kiểm tra thông tin cấu hình lưu trong file ~/.ecs/config:

version: v1 default: friendreminders clusters: friendreminders: cluster: friendreminders region: ap-southeast-2 default_launch_type: FARGATE

ecs-cli up --cluster-config friendreminders --force

Lưu ý việc sử dụng tham số --force trong trường hợp đang tồn tại một CloudFormation Stack có cùng tên trên hệ thống. Output của câu lệnh cho chúng ta biết được giá trị ID của VPC và Subnet sử dụng bởi Cluster.

INFO[0000] Created cluster cluster=friendreminders region=ap-southeast-2 INFO[0001] Waiting for your CloudFormation stack resources to be deleted... INFO[0001] Cloudformation stack status stackStatus=DELETE_IN_PROGRESS INFO[0062] Waiting for your cluster resources to be created... INFO[0062] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS VPC created: vpc-0fcf5ca95e08e0602 Subnet created: subnet-0fe765bea2942cf21 Subnet created: subnet-007fc3b2adcc56398 Cluster creation succeeded.

Xác nhận Cluster friendreminders đã được tạo ra trên AWS Console:

ECS Fargate Cluster Overview

Bước 3: Cập nhật Security Group cho Cluster VPC

Với giá trị ID của VPC: vpc-0fcf5ca95e08e0602, thực hiện những lệnh sau để cập nhật Security Group cho phép giao tiếp qua port 80:

  • Tìm giá trị Security Group ID:

aws ec2 describe-security-groups --filters Name=vpc-id,Values=vpc-0fcf5ca95e08e0602 --region ap-southeast-2

Output

{ "SecurityGroups": [ { "Description": "default VPC security group", "GroupName": "default", "IpPermissions": [ { "IpProtocol": "-1", "IpRanges": [], "Ipv6Ranges": [], "PrefixListIds": [], "UserIdGroupPairs": [ { "GroupId": "sg-081c2fc0b6df262ff", "UserId": "729365137003" } ] } ], "OwnerId": "729365137003", "GroupId": "sg-081c2fc0b6df262ff", "IpPermissionsEgress": [ { "IpProtocol": "-1", "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ], "Ipv6Ranges": [], "PrefixListIds": [], "UserIdGroupPairs": [] } ], "VpcId": "vpc-0fcf5ca95e08e0602" } ] }

  • Sử dụng giá trị Security Group ID: sg-081c2fc0b6df262ff, bổ sung Firewall rule:

aws ec2 authorize-security-group-ingress --group-id sg-081c2fc0b6df262ff --protocol tcp --port 80 --cidr 0.0.0.0/0 --region ap-southeast-2

  • Sử dụng lại lệnh aws ec2 describe-security-groups để kiểm tra kết quả

aws ec2 describe-security-groups --filters Name=vpc-id,Values=vpc-0fcf5ca95e08e0602 --region ap-southeast-2

Output

{ "SecurityGroups": [ { "Description": "default VPC security group", "GroupName": "default", "IpPermissions": [ { "IpProtocol": "-1", "IpRanges": [], "Ipv6Ranges": [], "PrefixListIds": [], "UserIdGroupPairs": [ { "GroupId": "sg-081c2fc0b6df262ff", "UserId": "729365137003" } ] }, { "FromPort": 80, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ], "Ipv6Ranges": [], "PrefixListIds": [], "ToPort": 80, "UserIdGroupPairs": [] } ], "OwnerId": "729365137003", "GroupId": "sg-081c2fc0b6df262ff", "IpPermissionsEgress": [ { "IpProtocol": "-1", "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ], "Ipv6Ranges": [], "PrefixListIds": [], "UserIdGroupPairs": [] } ], "VpcId": "vpc-0fcf5ca95e08e0602" } ] }

Bước 4: Triển khai ECS Service

  • Tương tự như với EC2 Cluster, việc triển khai Service trong Fargate Cluster cần cung cấp cấu hình:
    • docker-compose.yml - cấu hình các Tasks thực thi bên trong Services
    • ecs-params.yml - tham số mô tả hoạt động của ECS [network, role…]
  • Tạo folder ecs-fargate-demo với những files sau:

docker-compose.yml

version: '3' services: nginx: image: 729365137003.dkr.ecr.ap-southeast-2.amazonaws.com/nginx:fargate ports: - "80:80" - "443:443" logging: driver: awslogs options: awslogs-group: /ecs/remindersmgtfargate awslogs-region: ap-southeast-2 awslogs-stream-prefix: ecs/nginx remindersmgtservice: image: 729365137003.dkr.ecr.ap-southeast-2.amazonaws.com/remindersmgtservice:latest ports: - "8000:8000" logging: driver: awslogs options: awslogs-group: /ecs/remindersmgtfargate awslogs-region: ap-southeast-2 awslogs-stream-prefix: ecs/remindersmgt

ecs-params.yml

version: 1 task_definition: task_execution_role: ECSRemindersMgtTask ecs_network_mode: awsvpc task_size: mem_limit: 0.5GB cpu_limit: 256 run_params: network_configuration: awsvpc_configuration: subnets: - "subnet-0fe765bea2942cf21" - "subnet-007fc3b2adcc56398" security_groups: - "sg-081c2fc0b6df262ff" assign_public_ip: ENABLED

Chú ý việc thay đổi các giá trị ID của Subnets và Security Group trong file ecs-params.yml theo các kết quả có được từ quá trình cấu hình.

  • Sử dụng lệnh ecs-cli compose để tạo service dựa trên cấu hình khai báo:

ecs-cli compose --project-name remindersmgtfargate service up --create-log-groups --cluster-config friendreminders

Output:

INFO[0000] Using ECS task definition TaskDefinition="remindersmgtfargate:25" WARN[0000] Failed to create log group /ecs/remindersmgtfargate in ap-southeast-2: The specified log group already exists WARN[0000] Failed to create log group /ecs/remindersmgtfargate in ap-southeast-2: The specified log group already exists INFO[0000] Auto-enabling ECS Managed Tags INFO[0011] [service remindersmgtfargate] has started 1 tasks: [task 6e45416687bf4611b6d80e3273cc7453]. timestamp="2020-10-15 01:37:06 +0000 UTC" INFO[0051] Service status desiredCount=1 runningCount=1 serviceName=remindersmgtfargate INFO[0051] [service remindersmgtfargate] has reached a steady state. timestamp="2020-10-15 01:37:47 +0000 UTC" INFO[0051] ECS Service has reached a stable state desiredCount=1 runningCount=1 serviceName=remindersmgtfargate INFO[0051] Created an ECS service service=remindersmgtfargate taskDefinition="remindersmgtfargate:25"

Sử dụng AWS Console để kiểm tra trạng thái Service, Task và Containers thực thi trong Task:

ECS Fargate Running Task with multi-containers

Với giá trị IP của Elastic Network Interface sử dụng bởi Task chúng ta có thể kiểm tra kết quả thực thi của RemindersManagement Service thông qua NGINX proxy

ECS Fargate Task Execution

Bước 5: Xoá ECS Cluster

  • Thực hiện loại bỏ service khỏi cluster với lệnh:

ecs-cli compose --project-name remindersmgtfargate service down

Output

INFO[0000] Deleted ECS service service=remindersmgtfargate INFO[0000] Service status desiredCount=0 runningCount=1 serviceName=remindersmgtfargate INFO[0005] Service status desiredCount=0 runningCount=0 serviceName=remindersmgtfargate INFO[0005] [service remindersmgtfargate] has stopped 1 running tasks: [task 6e45416687bf4611b6d80e3273cc7453]. timestamp="2020-10-15 01:49:23 +0000 UTC" INFO[0005] ECS Service has reached a stable state desiredCount=0 runningCount=0 serviceName=remindersmgtfargate

  • Thực hiện loại bỏ ECS Cluster friendreminders:

ecs-cli down --cluster-config friendreminders

Sau khi xác nhận y để tiếp tục quá trình loại bỏ, kết quả thực thi của câu lệnh:

Are you sure you want to delete your cluster? [y/N] y INFO[0002] Waiting for your cluster resources to be deleted... INFO[0003] Cloudformation stack status stackStatus=DELETE_IN_PROGRESS INFO[0064] Deleted cluster cluster=friendreminders

Kết luận

ECS CLI cung cấp một phương thức thuận tiện hơn so với cách sử dụng AWS Console khi triển khai các đối tượng như Cluster, Service, Task. Tuy vậy, việc sử dụng các câu lệnh riêng rẽ vẫn tồn tại những điểm hạn chế, đặc biệt là khả năng tái sử dụng. Trong phần tiếp theo, chúng ta sẽ sử dụng bộ công cụ AWS Cloud Development Kit [CDK] để khắc phục điểm yếu trên. Ngoài ra, CDK còn cung cấp khả năng tuỳ biến cao, cho phép kết hợp việc triển khai cơ sở hạ tầng ECS và cài đặt dịch vụ Microservices trong cùng một qui trình Pipeline đem lại tính hiệu quả cao nhất cho hoạt động CICD.

AWS Copilot CLI

Tài liệu tham khảo

  • Installing the Amazon ECS CLI
  • AWS Copilot CLI [preview]
  • Amazon ECS CLI

Copyright © 2019-2022 Tuan Anh Le.

Video liên quan

Chủ Đề