cfn-lint, thoát ra bằng deactivate/home/ec2-usercdk-workshop-02 và vào trong thư mục đópythoncd ~
mkdir cdk-workshop-02
cd cdk-workshop-02
cdk init app --language python

cdk-workshop-02/cdk_workshop_02_stack.py, thêm các thư viện này vào trong tệp tinfrom aws_cdk import (
Stack,
aws_ecs as ecs,
aws_ecs_patterns as ecsp,
aws_apigateway as apigateway
)
from constructs import Construct
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:
nginxdemos/hello từ Dockerhub# 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}"))
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)
cdk-workshop-02/cdk_workshop_02_stack.pyfrom 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}"))
Trước khi mà chúng ta có thể triển khai lên Cloud, thì
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.requirements.txtcdk-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

requirements.txt. Dùng python -m pip để bảo đảm cài vào đúng venv:python -m pip install -r requirements.txt

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
cdk diff

cdk bootstrap

cdk deploy

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

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.

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.