Link Search Menu Expand Document

Elastic Container Service - さん

Nội dung

  1. Amazon ECS CLI
    1. ECS Cluster sử dụng EC2 Instances
    2. ECS Cluster sử dụng Fargate Engine
  2. AWS Copilot CLI

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 https://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:
ecs-cli --version

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 ECS Cluster Overview

ECS EC2 Instances List 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 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 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 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 ECS Task Details

ECS RemindersManagement Swagger UI 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
  • Tạo Cluster
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 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 Task with Multi-Containers 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 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


Copyright © 2019-2022 Tuan Anh Le.