ECS, ALB và API Gateway

Tạo cụm ECS và Application Load Balancer

  1. Truy cập vào trong VSCode
    • Nếu đang trong virtual environment cfn-lint, thoát ra bằng deactivate
    • Về thư mục home /home/ec2-user
    • Tạo một thư mục mới tên là cdk-workshop-02 và vào trong thư mục đó
    • Tạo một dự án CDK mới với ngôn ngữ là python
cd ~
mkdir cdk-workshop-02
cd cdk-workshop-02
cdk init app --language python

create-work-folder

  1. Vào trong tệp tin vừa được tạo với CDK là cdk-workshop-02/cdk_workshop_02_stack.py, thêm các thư viện này vào trong tệp tin
from aws_cdk import (
  Stack,
  aws_ecs as ecs,
  aws_ecs_patterns as ecsp,
  aws_apigateway as apigateway
)
from constructs import Construct
  1. Trong cdk-workshop-02/cdk_workshop_02_stack.py, khai báo một cụm ECS với Cân bằng tải ứng dụng (ALB) trong hàm __init__()
      # Declare a Load Balancer Fargate 
      lb_fargate_service = ecsp.ApplicationLoadBalancedFargateService(
				self, 
				"Workshop02-MyWebServer",
        task_image_options=ecsp.ApplicationLoadBalancedTaskImageOptions(
            image=ecs.ContainerImage.from_registry("nginxdemos/hello")
        ),
        public_load_balancer=True,
        desired_count=3
      )

ecsp.ApplicationLoadBalancedFargateService sẽ tạo ra các tài nguyên như sau:

  • Một VPC mới được tạo ra với cấu hình mặc định (subnet, Internet Gateway, RouteTable, EIP, Nat Gateway, …)
  • Một cụm ECS được tạo mới trong VPC đó, và chạy trong Fargate
  • Một ECS Task được định nghĩa với bản sao nginxdemos/hello từ Dockerhub
  • Một nhóm ECS Container được khởi tạo từ ECS Task, với số lượng là 3
  • Một Application Load Balancer được đặt ở trước cụm ECS đó
  • Các roles và security groups cần thiết

Configure API Gateway

  1. Khai báo một API Gateway
# Define API Gateway
api = apigateway.RestApi(self, "ProxyToLBECS")
  1. Cấu hình tài nguyên API Gateway để trỏ về DNS của Application Load Balancer
# Get the DNS value of the Application Load Balancer 
lb = lb_fargate_service.load_balancer
lb_dns = lb_fargate_service.load_balancer.load_balancer_dns_name

# Add resource and method for proxy request
proxy = api.root.add_resource("ecs")
proxy.add_method("GET", apigateway.HttpIntegration(f"http://{lb_dns}"))

Bạn có thể đọc thêm về các phương thức và thuộc tính của ApplicationLoadBalancedFargateService tại the official CDK documentation of AWS (Python)

  1. Kiểm tra lại mã ở trong cdk-workshop-02/cdk_workshop_02_stack.py
from aws_cdk import (
    Stack,
    aws_ecs as ecs,
    aws_ecs_patterns as ecsp,
    aws_apigateway as apigateway
)
from constructs import Construct

class CdkWorkshop02Stack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        # Declare a Load Balancer Fargate 
        lb_fargate_service = ecsp.ApplicationLoadBalancedFargateService(
          self, 
          "Workshop02-MyWebServer",
          task_image_options=ecsp.ApplicationLoadBalancedTaskImageOptions(
              image=ecs.ContainerImage.from_registry("nginxdemos/hello")),
          public_load_balancer=True,
          desired_count=3
        )
        
        # Define API Gateway
        api = apigateway.RestApi(self, "ProxyToLBECS")
        
        # Get the DNS value of the Application Load Balancer 
        lb = lb_fargate_service.load_balancer
        lb_dns = lb_fargate_service.load_balancer.load_balancer_dns_name
        
        # Add resource and method for proxy request
        proxy = api.root.add_resource("ecs")
        proxy.add_method("GET", apigateway.HttpIntegration(f"http://{lb_dns}"))

Khởi tạo một môi trường ảo cho Python

Trước khi mà chúng ta có thể triển khai lên Cloud, thì

  • Khởi tạo một môi trường ảo (virtual environment) trong thư mục cdk-workshop-02. Máy chủ có cả Python hệ thống của Amazon Linux 2023 lẫn Python 3.14 tự cài, nên ta cô lập thư viện của project trong venv để tránh xung đột.
  • Cài các packages ở trong requirements.txt
  1. Tạo virtual environment bằng Python 3.14 ngay trong thư mục cdk-workshop-02.
python3.14 -m venv venv
source venv/bin/activate

Sau khi kích hoạt, kiểm tra venv đang dùng đúng Python 3.14:

python --version

setup-venv

  1. Cài các thư viện cần ở trong requirements.txt. Dùng python -m pip để bảo đảm cài vào đúng venv:
python -m pip install -r requirements.txt

install-required-packges

Triển khai

Các lệnh cdk phải chạy khi đang ở trong thư mục project ~/cdk-workshop-02 và đã kích hoạt venv (source venv/bin/activate). Nếu mở terminal mới, chạy lại 2 lệnh:

cd ~/cdk-workshop-02
source venv/bin/activate
  1. Kiểm tra lại những gì chúng ta đã tạo trước khi triển khai
cdk diff

check-resources

  1. Trước khi triển khai, thì chúng ta cần phải khởi động môi trường máy chủ EC2
cdk bootstrap

boostrap-environment

  1. Khi đó thì chúng ta triển khai stack đã khai báo
cdk deploy

start-deploy

Nhấn y để tiếp tục

  1. Kết thúc và kiểm tra lại kết quả

deploy-done

Truy cập vào đường link của API gateway (ProxyToLBECSEndpoint), thêm path /ecs. Bạn sẽ truy cập được vào web server được triển khai trong ECS.

Để kiểm tra sự hoạt động của Application Load Balancer, nhấn làm mới trình duyệt một vài lần, bạn sẽ thấy đích đến của trang web thay đổi. Ở phần trước, chúng ta đặt tham số desired_count=3, nên sẽ có 3 container được triển khai song song với nhau đằng sau ALB. Bạn sẽ thấy sự thay đổi ở Server address qua các lần làm mới trình duyệt.

check-ecs

Nếu bạn đã chạy được đến phần này, chúc mừng bạn đã hoàn thành phần đầu tiên của bài lab CDK cơ bản 2. Ở phần tiếp theo, chúng ta sẽ sử dụng CDK để triển khai một hàm Lambda đằng sau 1 resource của API Gateway.