aws(学习笔记第四十九课) ECS集中练习(1)

发布于:2025-07-21 ⋅ 阅读:(19) ⋅ 点赞:(0)

aws(学习笔记第四十九课) ECS集中练习(1)

  • 练习ecs的各种使用方法

学习内容:

  • 使用Auto Scaling Group来启动ecs service

1. 代码连接和修改

1.1 代码链接

ECS集中练习

1.2 ECS的大分类

  • EC2 启动模式
    • 显式管理 EC2 实例(如您的 CDK 代码中的 AutoScalingGroup)。
    • 需配置实例类型、AMI、扩展策略等。
    • 适合需要直接控制底层基础设施的场景。
  • Fargate 启动模式
    • 完全托管,无需管理 EC2 实例。
    • 按任务资源(vCPU/内存)付费,无需预置容量。
    • 适合无状态服务或快速部署场景。
      在这里插入图片描述

2. 进行各种ecs的练习

2.1 AutoScaling Group的练习

2.1.1 整体架构

在这里插入图片描述

2.1.2 代码

class ECSCluster(Stack):

    def __init__(self, scope: Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, *kwargs)

        vpc = ec2.Vpc(
            self, "MyVpc",
            max_azs=2
        )
        # 添加 ECS 实例角色
        ecs_role = iam.Role(
            self, "EcsInstanceRole",
            assumed_by=iam.ServicePrincipal("ec2.amazonaws.com"),
            managed_policies=[
                iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AmazonEC2ContainerServiceforEC2Role")
            ]
        )
        # 替换 AutoScalingGroup 的启动配置为启动模板
        launch_template = ec2.LaunchTemplate(
            self, "LaunchTemplate",
            instance_type=ec2.InstanceType("t2.xlarge"),
            machine_image=ecs.EcsOptimizedImage.amazon_linux2(),
            security_group=ec2.SecurityGroup(self, "SG", vpc=vpc),
            associate_public_ip_address=True,
            user_data=ec2.UserData.for_linux(),
            role = ecs_role
        )

        asg = autoscaling.AutoScalingGroup(
            self, "MyFleet",
            launch_template=launch_template,
            desired_capacity=3,
            vpc=vpc,
            vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC),
        )

        cluster = ecs.Cluster(
            self, 'EcsCluster',
            vpc=vpc
        )

        capacity_provider = ecs.AsgCapacityProvider(self, "AsgCapacityProvider",
            auto_scaling_group=asg
        )
        cluster.add_asg_capacity_provider(capacity_provider)
app = App()
ECSCluster(app, "MyFirstEcsCluster")
app.synth()

主要步骤如下:

  • 创建vpc
  • 创建ecsrole
    这里是AWS Managed Roleservice-role/AmazonEC2ContainerServiceforEC2Role,通过这个role,给ec2赋予需要的ecs权限
  • 创建ec2.LaunchTemplate,新的cdk中,创建Auto Scaling Group必须要使用ec2.LaunchTemplate
  • 使用ec2.LaunchTemplate创建autoscaling.AutoScalingGroup
  • 创建ecs cluster
  • ecs cluster设定provider,即调用add_asg_capacity_provider

2.2 为cluster添加一个服务

这里,准备好了ecs cluster之后,就相当于准备好了一个计算环境(Compute Environment),接下来测试下服务。

2.2.1 整体架构

在这里插入图片描述
整体架构分为三个大部分:

  • Compute Environment
    这部分就是为整个ecs cluster提供计算能力,这里成为compute environment
  • Task Definition
    这里,为了提供了服务的静态定义,包括
    • image – 使用哪个镜像
    • momory_limit_mib – 使用多大的计算资源
    • cpu – 使用的虚拟cpu的核数等
  • service
    如果让一个service能够真正的动起来,也就是启动起来,光有静态的task definition还是不够的,需要定义service
2.2.2 代码部分
# 添加测试任务
        task_definition = ecs.Ec2TaskDefinition(
            self, "TestTask",
            network_mode=ecs.NetworkMode.AWS_VPC
        )
        task_definition.add_container(
            "TestContainer",
            image=ecs.ContainerImage.from_registry("nginx:alpine"),  # 使用Nginx测试镜像
            memory_limit_mib=256,
            cpu=256,
            port_mappings=[ecs.PortMapping(container_port=80)]
        )

        service = ecs.Ec2Service(
            self, "TestService",
            cluster=cluster,
            task_definition=task_definition,
            desired_count=1,
        )

2.3 为ecs service添加一个elb (elastic loader balancer)

2.3.1 整体架构

在这里插入图片描述

2.3.2 Elastic Loader Balancer代码
 # 创建负载均衡器
        lb = elbv2.ApplicationLoadBalancer(
            self, "ServiceLB",
            vpc=vpc,
            internet_facing=True
        )
        # 添加监听器
        listener = lb.add_listener("Listener", port=80)
        listener.add_targets(
            "ECSTarget",
            port=80,
            targets=[service]
        )

        # 输出 URL
        CfnOutput(
            self, "ServiceEndpoint",
            value=f"http://{lb.load_balancer_dns_name}",
            description="Nginx Service URL"
        )

2.4 整体执行代码

cd your_own_dir/python/ecs/cluster
python -m venv .venv
source .venv/Scripts/activate
pip install -r requirements.txt
cdk --require-approval never deploy

在这里插入图片描述
在这里插入图片描述
因为ServiceEndpoint已经作为cdkCfnOutput输出了,所以可以确认自己的service endpoint url
在这里插入图片描述

2.5 cleanup

cdk destroy

网站公告

今日签到

点亮在社区的每一天
去签到