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

文章目录

  • [aws(学习笔记第四十九课) ECS集中练习(1)](#aws(学习笔记第四十九课) ECS集中练习(1))
  • 学习内容:
    • [1. 代码连接和修改](#1. 代码连接和修改)
      • [1.1 代码链接](#1.1 代码链接)
      • [1.2 `ECS`的大分类](#1.2 ECS的大分类)
    • [2. 进行各种`ecs`的练习](#2. 进行各种ecs的练习)
      • [2.1 `AutoScaling Group`的练习](#2.1 AutoScaling Group的练习)
      • [2.1.1 整体架构](#2.1.1 整体架构)
      • [2.1.2 代码](#2.1.2 代码)
      • [2.2 为`cluster`添加一个服务](#2.2 为cluster添加一个服务)
        • [2.2.1 整体架构](#2.2.1 整体架构)
        • [2.2.2 代码部分](#2.2.2 代码部分)
      • [2.3 为`ecs service`添加一个`elb (elastic loader balancer)`](#2.3 为ecs service添加一个elb (elastic loader balancer))
        • [2.3.1 整体架构](#2.3.1 整体架构)
        • [2.3.2 `Elastic Loader Balancer`代码](#2.3.2 Elastic Loader Balancer代码)
      • [2.4 整体执行代码](#2.4 整体执行代码)
      • [2.5 `cleanup`](#2.5 cleanup)

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 代码

python 复制代码
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 代码部分
python 复制代码
# 添加测试任务
        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代码
python 复制代码
 # 创建负载均衡器
        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 整体执行代码

shell 复制代码
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

shell 复制代码
cdk destroy
相关推荐
屁股割了还要学7 分钟前
【C语言进阶】题目练习(3)
c语言·开发语言·c++·学习·算法·青少年编程
wjpwjpwjp083121 分钟前
[MySQL基础3] 数据控制语言DCL和MySQL中的常用函数
数据库·笔记·后端·学习·mysql
PP东43 分钟前
Mybatis学习之简介(一)
学习·oracle·mybatis
典孝赢麻崩乐急1 小时前
Java学习--------消息队列的重复消费、消失与顺序性的深度解析
java·开发语言·学习
斟的是酒中桃1 小时前
【学习记录】智能客服小桃(进度更新ing)
人工智能·python·学习·语言模型·langchain·agent
西岭千秋雪_2 小时前
NIO网络通信基础
笔记·学习·计算机网络·nio
MUTA️2 小时前
Clip微调系列:《coOp: learning to prompt for vision-language models》
笔记
努力自学的小夏2 小时前
RK3568 Linux驱动学习——SDK安装编译
linux·arm开发·笔记·学习
取不好名字=3 小时前
【ComfyUI学习笔记01】下载安装 | 运行第一个工作流 | 学习思路
笔记·学习·ai作画·stable diffusion