文章目录
aws(学习笔记第四十九课) ECS集中练习(1)
- 练习
ecs
的各种使用方法
学习内容:
- 使用
Auto Scaling Group
来启动ecs service
1. 代码连接和修改
1.1 代码链接
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]
)
# 输出 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
已经作为cdk
的CfnOutput
输出了,所以可以确认自己的service endpoint url
。
2.5 cleanup
cdk destroy