aws(学习笔记第四十九课) ECS集中练习(1)
文章目录
- aws(学习笔记第四十九课) ECS集中练习(1)
- 学习内容:
- 1. 代码连接和修改
- 1.1 代码链接
- 1.2 `ECS`的大分类
- 2. 进行各种`ecs`的练习
- 2.1 `AutoScaling Group`的练习
- 2.1.1 整体架构
- 2.1.2 代码
- 2.2 为`cluster`添加一个服务
- 2.2.1 整体架构
- 2.2.2 代码部分
- 2.3 为`ecs service`添加一个`elb (elastic loader balancer)`
- 2.3.1 整体架构
- 2.3.2 `Elastic Loader Balancer`代码
- 2.4 整体执行代码
- 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 代码
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
- 创建
ecs
的role
这里是AWS Managed Role
即service-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])# 输出 URLCfnOutput(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
已经作为cdk
的CfnOutput
输出了,所以可以确认自己的service endpoint url
。
2.5 cleanup
cdk destroy