Amazon ECS Service Discovery – Một giải pháp thay thế cho Load Balancer dành cho ECS

I. Lời nói đầu

  • Chào các bạn, mình là NamND Group 1 VTI Japan. Năm 2022 chúc các bạn có một năm nhiều thành công và sức khỏe.
  • Hôm nay mình xin được chia sẻ về việc ứng dụng dịch vụ Service Discovery trong kiến trúc Micro Service với ECS. Hi vọng qua bài viết này sẽ giúp các bạn có thêm một lựa chọn khi thiết kế network với ECS Container.

II. ECS Service Discovery

  • Là một dịch vụ tự động đăng ký các địa chỉ Private IP của ECS Task lên trên Route 53 Private Hosted Zone dưới dạng A Record.
  • Nhờ có hành động này mà nội bộ các Container trong ECS CLuster có thể giao tiếp với nhau thông qua một Private Domain.
  • Cụ thể các bạn có thể tham khảo tại: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html
  • Chúng ta cùng đến với 2 ví dụ cụ thể dưới đây để có cái nhìn rõ hơn về ECS Service Discovery.

1. Phương pháp Access đến Container từ trước tới nay

  • Chúng ta có thể tham khảo một cấu trúc điển hình cho việc kết nối tới các Container như hình dưới đây:
  • ①: Sau khi Container của các Service phía Backend được tạo ra chúng sẽ được tiến hành gắn vào Load Balancer. Tại Route 53 sẽ tiến hành đăng ký một Record mới để phân giải Private Hosted Zone Domain (Private Domain) đến Load Balancer.
  • Tại Route 53 các Record được đăng ký như ví dụ dưới đây:
Name Type Value
front.example.internal A (Alias) DNS của front-alb
back.example.internal A (Alias) DNS của back-alb
  • ②: Các Service khác muốn giao tiếp với các Service phía Backend sẽ gọi thông qua Private Domain -> Route 53 sẽ phân giải Private Domain sang ALB DNS -> ALB DNS sẽ được đổi về IP của Container, và cuối cùng các Connection sẽ được hình thành.

2. Phương pháp Access đến Container sử dụng ECS Service Discovery

  • Sau khi sử dụng ECS Service Discovery hệ thống chúng ta sẽ được cấu trúc như sau:
  • ①: Khác với việc sử dụng Load Balancer, địa chỉ IP của các Container được tạo ra sẽ được Cloud Map (ECS Service Discovery) tự động đăng ký lên trên Route 53 dưới dạng A Type.
  • Tại Route 53 các Record được đăng ký như ví dụ dưới đây:
Name Type Value
front.example.internal A (Alias) DNS của front-alb
back.example.internal A Private IP của Container 03
back.example.internal A Private IP của Container 04
  • ②: Các Service khác muốn giao tiếp với các Service phía Backend sẽ gọi thông qua Private Domain -> Route 53 sẽ phân giải Private Domain sang IP của Container, và cuối cùng các Connection sẽ được hình thành. Đến đây chúng ta thấy đã giảm được 1 bước phân giải DNS, đâu đó hệ thống cũng nhanh hơn được một chút rồi.

  • Note: Trường hợp Serivce tiến hành Auto-Scale hay tăng giảm số lượng task, các địa chỉ IP cũng sẽ được tự động đăng ký thông tin tương ứng lên trên Route 53.

III. Ưu nhược điểm của ECS Service Discovery với Load Balancer

1. Ưu điểm của ECS Service Discovery

  • Điều chúng ta dễ nhìn thấy nhất là việc sử dụng ECS Service Discovery sẽ giảm được chi phí của Load Balancer. Bao gồm những chi phí sử dụng dịch vụ Load Balancer, chi phí cấu trúc ALB, Security Group ...
  • Chúng ta có thể cấu trúc các service một cách độc lập hơn. Ví dụ, chúng ta thường gộp một vài service vào ALB, sử dụng chức năng PATH PROXY của ALB để tận dụng 1 ALB cho nhiều serivce. Giờ chúng ta có thể cài đặt cho mỗi service là một private domain để sử dụng.
  • Trước thay đổi:
    • alb.internal/service_A -> Serivce A
    • alb.internal/service_B -> Serivce B
    • alb.internal/service_C -> Serivce C
  • Sau thay đổi:
    • alb-a.internal -> Serivce A
    • alb-b.internal -> Serivce B
    • alb-c.internal -> Serivce C
  • Về cơ bản việc đổi từ PATH sang domain riêng biệt cũng không khác nhau nhiều. Tuy nhiên khi các serivce tăng lên, các bạn đều mong muốn chúng độc lập. Nếu ai sửa sai Security Group của ALB sẽ ảnh hưởng tới các Serivce khác không liên quan ...

2. Nhược điểm của ECS Service Discovery

  • Do đơn thuần là việc Mapping IP với một Private DNS nên ECS Service Discovery không sử dụng được các chức năng của ALB (hoặc NLB) như PATH PROXY, Authentication, Fixed-response, Stickiness Session, Blue/Green Deploy ...
  • Chỉ hỗ trợ Health Check ở Level Container. Thay vì từ ALB sẽ gọi đến Endpoint Health Check của container, chúng ta phải tự setting health-check khi trong bản thân của Container.
  • Về những Quotar và những cân nhắc khi bạn sử dụng ECS Service Discovery các bạn có thể tham khảo tại: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html

IV. Handson

  • Trong khuôn khổ bài viết mình không lấy lại evidence nhưng các bạn có thể làm theo các bước dưới đây.

1. Setting VPC ID

VPC_IP=vpc-aaabbbccc

2. Tạo Security Group cho ECS Service

aws ec2 create-security-group \
--group-name cloudmap-handson-sg-container \
--description "The security group for containers used in cloud map hands-on." \
--vpc-id $VPC_IP

3. Thao tác với Security Discovery

3.1 Tạo Security Discovery DNS NameSpace

aws servicediscovery create-private-dns-namespace \
--name httpd-service-discovery.internal \
--vpc $VPC_IP
  • Đến đây các bạn có thể xem setting trong Route 53 có một Private Hosted Zones đã được tạo ra

3.2 Lấy thông tin namespace và tạo Service trong Service Discovery

aws servicediscovery create-service \
--name cloudmap-handson \
--dns-config 'NamespaceId="ns-aaabbbcccddd",DnsRecords=[{Type="A",TTL="300"}]' \
--health-check-custom-config FailureThreshold=1

4. Thao tác với ECS

4.1 Tạo ECS Cluser

aws ecs create-cluster --cluster-name cloudmap-handson-cluster

4.2 Tạo ECS Task Definition

  • Tạo file task-definition.json

    {
    "family": "httpd-task",
    "networkMode": "awsvpc",
    "containerDefinitions": [
        {
            "name": "httpd-container",
            "image": "httpd:2.4.41-alpine",
            "portMappings": [
                {
                    "hostPort": 80,
                    "protocol": "tcp",
                    "containerPort": 80
                }
            ]
        }
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "256",
    "memory": "512"
    }
  • Đăng ký Task Definition

    aws ecs register-task-definition --cli-input-json file://task-definition.json

4.3 Tạo ECS Service

  • Lấy các thông tin như Serivce ARN (Service Discovery) đã tạo ở trên, Security Group ID, Subnet ID và tạo file service-definition.json

    {
    "cluster": "cloudmap-handson-cluster",
    "serviceName": "cloudmap-handson-httpd-service",
    "taskDefinition": "httpd-task:1",
    "serviceRegistries": [
        {
            "registryArn": "arn:aws:servicediscovery:ap-northeast-1:123456789012:service/srv-aabbbcccdddeee"
        }
    ],
    "desiredCount": 1,
    "launchType": "FARGATE",
    "networkConfiguration": {
        "awsvpcConfiguration": {
            "subnets": [
                "subnet-aaa",
                "subnet-bbb"
            ],
            "securityGroups": [
                "sg-aaabbbccc"
            ],
            "assignPublicIp": "DISABLED"
        }
    }
    }
  • Tạo ECS Service

    aws ecs create-service --cli-input-json file://service-definition.json
  • Đến đây các bạn có thể xác nhận các địa chỉ IP của container được tự động đăng ký trên Route 53 và có thể gọi thử domain trong VPC của mình rồi

V. Kết luận

  • Hi vọng qua bài viết này các bạn có thêm một option để thiết kế hệ thống network cho ECS. Chúng ta có thể ứng dụng ECS Service Discovery để tiến hành việc cost optimize.
  • Hẹn gặp lại các bạn ở các bài viết tiếp theo.

Leave a Reply

Your email address will not be published. Required fields are marked *