当前位置: 首页 > news >正文

aws(学习笔记第五十课) ECS集中练习(2)

文章目录

  • aws(学习笔记第五十课) ECS集中练习(2)
  • 学习内容:
    • 1. 代码连接
      • 1.1 代码链接
    • 2. 练习设定`ecs`的`placement`
      • 2.1 全体架构
      • 2.2 全体代码
      • 2.3 执行代码
      • 2.4 检测`service`的运行实例数
        • 2.4.1 确认`service`的名字
        • 2.4.2 确认`cluster`的名字
        • 2.4.3 使用`cli`确认`service`的运行`count`数
        • 2.4.4 增加`service`的运行`count`数
    • 3. 练习设定`ecs`的`network`
      • 3.1 全体架构
      • 3.2 代码
      • 3.3 执行代码,破碎的心
      • 3.4 尝试使用`NetworkMode.HOST`
        • 3.4.1 代码
        • 3.4.2 执行代码

aws(学习笔记第五十课) ECS集中练习(2)

  • 深入练习设定ecs的其他设定

学习内容:

  • 练习设定ecsplacement
  • 练习设定ecsnetwork

1. 代码连接

1.1 代码链接

ECS集中练习

2. 练习设定ecsplacement

2.1 全体架构

在这里插入图片描述
这里对于使用了三种placement

  • PlacementConstaint.distinct_instances : 强制同一个服务的多个任务必须运行在不同的ec2实例上。
  • PlacementStrategy.packed_by : 将任务紧密打包到尽可能少的ec2实例上,有限选择剩余资源最少的可用实例。
  • PlacementStrategy.spread_accross : 将任务均匀分散到不同的可用去(AZ)。

2.2 全体代码

from aws_cdk import (aws_autoscaling as autoscaling,aws_ec2 as ec2,aws_ecs as ecs,App, Stack
)app = App()
stack = Stack(app, "sample-ecs-task-placement")# Create a cluster
vpc = ec2.Vpc(stack, "Vpc",max_azs=2
)cluster = ecs.Cluster(stack, "EcsCluster",vpc=vpc
)asg = autoscaling.AutoScalingGroup(stack, "DefaultAutoScalingGroup",instance_type=ec2.InstanceType("t2.micro"),machine_image=ecs.EcsOptimizedImage.amazon_linux2(),vpc=vpc,
)
capacity_provider = ecs.AsgCapacityProvider(stack, "AsgCapacityProvider",auto_scaling_group=asg
)
cluster.add_asg_capacity_provider(capacity_provider)# Create a task definition with placement constraints
task_definition = ecs.Ec2TaskDefinition(stack, "TaskDef"
)container = task_definition.add_container("web",image=ecs.ContainerImage.from_registry("nginx:latest"),memory_limit_mib=256,
)
port_mapping = ecs.PortMapping(container_port=80,host_port=8080,protocol=ecs.Protocol.TCP
)
container.add_port_mappings(port_mapping)# Create Service
service = ecs.Ec2Service(stack, "Service",cluster=cluster,task_definition=task_definition,placement_constraints=[ecs.PlacementConstraint.distinct_instances()]
)service.add_placement_strategies(ecs.PlacementStrategy.packed_by(ecs.BinPackResource.MEMORY))
service.add_placement_strategies(ecs.PlacementStrategy.spread_across(ecs.BuiltInAttributes.AVAILABILITY_ZONE))
app.synth()

2.3 执行代码

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

在这里插入图片描述

2.4 检测service的运行实例数

2.4.1 确认service的名字

进入cluster–>service,可以看到选择的部分即为service name
在这里插入图片描述

2.4.2 确认cluster的名字

进入cluster,可以看到选择的部分即为cluster name
在这里插入图片描述

2.4.3 使用cli确认service的运行count
$ aws ecs describe-services \--cluster sample-ecs-task-placement-EcsCluster97242B84-UPtLnBUmifKa \--services sample-ecs-task-placement-ServiceD69D759B-zq6tlpUpZQBy \--query "services[0].runningCount"
1

可以看出,service的执行count数是1,因为在service创建的时候,没有指定desired_count,所以默认是1

2.4.4 增加service的运行count
service = ecs.Ec2Service(stack, "Service",cluster=cluster,desired_count=2,task_definition=task_definition,placement_constraints=[ecs.PlacementConstraint.distinct_instances()]
)

这里,增加service的属性desired_count=2

3. 练习设定ecsnetwork

3.1 全体架构

在这里插入图片描述

3.2 代码

from aws_cdk import (aws_autoscaling as autoscaling,aws_ec2 as ec2,aws_ecs as ecs,App, Stack,aws_iam as iam,
)# Based on https://aws.amazon.com/blogs/compute/introducing-cloud-native-networking-for-ecs-containers/app = App()
stack = Stack(app, "ec2-service-with-task-networking")# Create a cluster
vpc = ec2.Vpc(stack, "Vpc",max_azs=2
)cluster = ecs.Cluster(stack, "awsvpc-ecs-demo-cluster",vpc=vpc
)
ecs_role = iam.Role(stack, "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(stack, "LaunchTemplate",instance_type=ec2.InstanceType("t2.micro"),machine_image=ecs.EcsOptimizedImage.amazon_linux2(),security_group=ec2.SecurityGroup(stack, "SG", vpc=vpc),user_data=ec2.UserData.for_linux(),role = ecs_role
)asg = autoscaling.AutoScalingGroup(stack, "DefaultAutoScalingGroup",launch_template=launch_template,vpc=vpc,vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC),
)capacity_provider = ecs.AsgCapacityProvider(stack, "AsgCapacityProvider",auto_scaling_group=asg
)
cluster.add_asg_capacity_provider(capacity_provider)# Create a task definition with its own elastic network interface
task_definition = ecs.Ec2TaskDefinition(stack, "nginx-awsvpc",network_mode=ecs.NetworkMode.AWS_VPC,
)web_container = task_definition.add_container("nginx",image=ecs.ContainerImage.from_registry("nginx:latest"),cpu=100,memory_limit_mib=256,essential=True
)
port_mapping = ecs.PortMapping(container_port=80,protocol=ecs.Protocol.TCP
)
web_container.add_port_mappings(port_mapping)# Create a security group that allows HTTP traffic on port 80 for our
# containers without modifying the security group on the instance
security_group = ec2.SecurityGroup(stack, "nginx--7623",vpc=vpc,allow_all_outbound=False
)
security_group.add_ingress_rule(ec2.Peer.any_ipv4(),ec2.Port.tcp(80)
)# Create the service
service = ecs.Ec2Service(stack, "awsvpc-ecs-demo-service",cluster=cluster,task_definition=task_definition,security_groups=[security_group]
)app.synth()

这里,可以为service设定专门的security group,期待执行之后,通过http://{ec2_ip}:80能访问创建的nginx服务。但是事实上心如所愿吗?

3.3 执行代码,破碎的心

执行cdk --require-approval never deploy,之后访问http://{ec2_ip}:80,非常遗憾,不能访问这个网页。
知之为知之,不知ai知。
在这里插入图片描述
通过ai,很快知道aws中的ecs ec2下支持两种网络模式。

#模式说明代码注意点
1HOSThost 网络模式(直接通过 EC2 IP 访问)security_group设定在launchTemplate上
allow_all_outbound=True
使用network_mode=ecs.NetworkMode.HOST
2AWS_VPCawsvpc 模式 + 添加 ALB(推荐生产环境)security_group设定在service上
allow_all_outbound=false
使用network_mode=ecs.NetworkMode.AWS_VPC

3.4 尝试使用NetworkMode.HOST

3.4.1 代码
from aws_cdk import (aws_autoscaling as autoscaling,aws_ec2 as ec2,aws_ecs as ecs,App, Stack,aws_iam as iam,
)# Based on https://aws.amazon.com/blogs/compute/introducing-cloud-native-networking-for-ecs-containers/app = App()
stack = Stack(app, "ec2-service-with-task-networking")# Create a cluster
vpc = ec2.Vpc(stack, "Vpc",max_azs=2
)cluster = ecs.Cluster(stack, "awsvpc-ecs-demo-cluster",vpc=vpc
)
ecs_role = iam.Role(stack, "EcsInstanceRole",assumed_by=iam.ServicePrincipal("ec2.amazonaws.com"),managed_policies=[iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AmazonEC2ContainerServiceforEC2Role")]
)
# Create a security group that allows HTTP traffic on port 80 for our
# containers without modifying the security group on the instance
security_group = ec2.SecurityGroup(stack, "nginx--7623",vpc=vpc,allow_all_outbound=True
)
security_group.add_ingress_rule(ec2.Peer.any_ipv4(),ec2.Port.tcp(80)
)
# 替换 AutoScalingGroup 的启动配置为启动模板
launch_template = ec2.LaunchTemplate(stack, "LaunchTemplate",instance_type=ec2.InstanceType("t2.micro"),machine_image=ecs.EcsOptimizedImage.amazon_linux2(),#security_group=ec2.SecurityGroup(stack, "SG", vpc=vpc),security_group=security_group,user_data=ec2.UserData.for_linux(),role = ecs_role
)asg = autoscaling.AutoScalingGroup(stack, "DefaultAutoScalingGroup",launch_template=launch_template,vpc=vpc,vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC),
)capacity_provider = ecs.AsgCapacityProvider(stack, "AsgCapacityProvider",auto_scaling_group=asg
)
cluster.add_asg_capacity_provider(capacity_provider)# Create a task definition with its own elastic network interface
task_definition = ecs.Ec2TaskDefinition(stack, "nginx-awsvpc",network_mode=ecs.NetworkMode.HOST,
)web_container = task_definition.add_container("nginx",image=ecs.ContainerImage.from_registry("nginx:latest"),cpu=100,memory_limit_mib=256,essential=True
)
port_mapping = ecs.PortMapping(container_port=80,protocol=ecs.Protocol.TCP
)
web_container.add_port_mappings(port_mapping)# Create the service
service = ecs.Ec2Service(stack, "awsvpc-ecs-demo-service",cluster=cluster,task_definition=task_definition,#security_groups=[security_group]
)app.synth()
3.4.2 执行代码
python -m venv ./.venv
source ./.venv/Scripts/activate
pip install -r requirements.txt
cdk --require-approval never deploy

在这里插入图片描述
访问http://35.78.68.247:80,可以看到正常打开。
在这里插入图片描述
接下来的练习:未完待续。。。

  • 如何使用nlb + farget service
  • 设定fargate AutoScaling policy
  • 设定fargate efs
http://www.lryc.cn/news/604432.html

相关文章:

  • arkui 动画曲线
  • 【python 获取邮箱验证码】模拟登录并获取163邮箱验证码,仅供学习!仅供测试!仅供交流!
  • 【go】实现BMI计算小程序与GUI/WEB端实现
  • python案例分析:基于抖音评论的文本分析,使用svm算法进行情感分析以及LDA主题分析,准确率接近90%
  • 相亲小程序聊天与互动系统模块搭建
  • 鹏哥C语言_82_指针_指针数组
  • 构建智能体(Agent)时如何有效管理其上下文
  • 大语言模型(LLM)技术架构与工程实践:从原理到部署
  • 基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(二)
  • 【Lua】元表常用属性
  • PCB学习笔记(一)
  • 【Python系列】如何安装无 GIL 的 Python 3.13
  • dify 添加 ollama 模型报错
  • AP-0316 全功能语音处理模组:技术解析与应用指南
  • MySQL的单行函数:
  • 【C++】适配器模式手搓STL的stack和queue
  • 字节跳动GR-3:可泛化、支持长序列复杂操作任务的机器人操作大模型(技术报告解读)
  • 探索 Linux 权限的奥秘:守护系统安全的关键
  • C++11 std::function 详解:通用多态函数包装器
  • Thales靶机攻略
  • 二叉树算法之【二叉树的层序遍历】
  • 关于mysql时间类型和java model的日期类型映射
  • “古法编程”到“vibe coding”的第一步:Zread助力一键生成项目说明书
  • 本地 docker 部署 HAR包分析工具 harviewer
  • 云原生环境里的显示变革:Docker虚拟浏览器与cpolar穿透技术实战
  • Web前端实战:Vue工程化+ElementPlus
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——8. AI赋能(下):在Qt中部署YOLOv8模型
  • 【CF】Day115——杂题 (构造 | 区间DP | 思维 + 贪心 | 图论 + 博弈论 | 构造 + 位运算 | 贪心 + 构造 | 计数DP)
  • 从0到1学PHP(七):PHP 与 HTML 表单:实现数据交互
  • useRouteLeaveConfirm 路由离开确认弹窗 Hook