Terraform实战09:ALB + Target Group + Auto Scaling
Terraform实战09ALB Target Group Auto Scaling本篇目标构建经典的Web架构ALB负载均衡器接收流量分发到Auto Scaling Group中的多台EC2实例。理解ALB、Target Group、Listener、Launch Template、ASG之间的关系。学完本篇你将掌握Application Load Balancer的创建和配置Target Group与健康检查Listener的转发规则Launch TemplateEC2实例模板Auto Scaling Group的弹性伸缩配置安全组的精细化设计ALB→EC2的单向放行前置条件已完成前八篇练习理解VPC公私网架构架构图用户浏览器 │ ▼ HTTP:80 ┌───────────────┐ │ ALB │ ← 公有子网面向外网 │ (负载均衡器) │ └───────┬───────┘ │ 转发Listener规则 ▼ ┌───────────────┐ │ Target Group │ ← 定义后端目标健康检查 └───────┬───────┘ │ 分发流量 ┌───────┴───────────────┐ │ Auto Scaling Group │ ← 私有子网 │ │ │ ┌─────┐ ┌─────┐ │ │ │EC2-1│ │EC2-2│ │ ← 根据模板自动创建 │ │:80 │ │:80 │ │ │ └─────┘ └─────┘ │ │ │ │ min1 desired2 max3│ └────────────────────────┘各组件的关系组件作用类比ALB接收外部流量分发到后端餐厅门口的领位员Listener监听哪个端口收到请求后怎么处理领位员的工作规则“80端口的客人带到Target Group”Target Group后端实例的集合健康检查规则一组可用的餐桌Launch TemplateEC2的配置模板AMI、规格、脚本餐桌的标准配置Auto Scaling Group根据模板管理EC2数量扩缩容根据客流量增减餐桌流量路径用户 → ALB(:80) → Listener(转发规则) → Target Group → EC2实例目录结构09-alb-asg/ ├── main.tf # 所有资源VPCALBTGASG ├── variables.tf # 变量实例规格、ASG数量等 └── outputs.tf # 输出ALB的DNS地址完整代码main.tfterraform { required_providers { aws { source hashicorp/aws version ~ 5.0 } } required_version 1.0 } provider aws { region var.region } locals { name_prefix ${var.project_name}-${var.environment} common_tags { Project var.project_name Environment var.environment ManagedBy terraform } # 启动脚本安装httpd显示实例ID验证负载均衡 user_data -EOF #!/bin/bash yum install -y httpd INSTANCE_ID$(curl -s http://169.254.169.254/latest/meta-data/instance-id) echo h1Hello from $INSTANCE_ID/h1pEnvironment: ${var.environment}/p /var/www/html/index.html systemctl start httpd systemctl enable httpd EOF } # VPC社区模块 module vpc { source terraform-aws-modules/vpc/aws version 5.16.0 name ${local.name_prefix}-vpc cidr 10.0.0.0/16 azs [${var.region}a, ${var.region}b] public_subnets [10.0.1.0/24, 10.0.2.0/24] private_subnets [10.0.10.0/24, 10.0.11.0/24] enable_nat_gateway true single_nat_gateway true enable_dns_hostnames true enable_dns_support true tags local.common_tags } # # 安全组设计重点 # ALB安全组允许外部HTTP # EC2安全组只允许来自ALB的流量 # resource aws_security_group alb { name ${local.name_prefix}-alb-sg vpc_id module.vpc.vpc_id ingress { description HTTP from anywhere from_port 80 to_port 80 protocol tcp cidr_blocks [0.0.0.0/0] # 对外开放 } egress { from_port 0 to_port 0 protocol -1 cidr_blocks [0.0.0.0/0] } tags merge(local.common_tags, { Name ${local.name_prefix}-alb-sg }) } resource aws_security_group ec2 { name ${local.name_prefix}-ec2-sg vpc_id module.vpc.vpc_id ingress { description HTTP from ALB only from_port 80 to_port 80 protocol tcp security_groups [aws_security_group.alb.id] # 【关键】只允许ALB安全组 } egress { from_port 0 to_port 0 protocol -1 cidr_blocks [0.0.0.0/0] } tags merge(local.common_tags, { Name ${local.name_prefix}-ec2-sg }) } # # 【新资源】ALB - Application Load Balancer # resource aws_lb web { name ${local.name_prefix}-alb internal false # 面向外网 load_balancer_type application # ALB类型 security_groups [aws_security_group.alb.id] subnets module.vpc.public_subnets # 至少2个AZ的公有子网 tags merge(local.common_tags, { Name ${local.name_prefix}-alb }) } # # 【新资源】Target Group - 后端目标组 # resource aws_lb_target_group web { name ${local.name_prefix}-tg port 80 protocol HTTP vpc_id module.vpc.vpc_id health_check { enabled true path / # 健康检查路径 port traffic-port protocol HTTP healthy_threshold 2 # 连续2次成功→健康 unhealthy_threshold 3 # 连续3次失败→不健康 timeout 5 # 超时秒数 interval 30 # 检查间隔 matcher 200 # 期望返回200 } tags merge(local.common_tags, { Name ${local.name_prefix}-tg }) } # # 【新资源】Listener - ALB监听器 # 定义收到80端口请求后转发到Target Group # resource aws_lb_listener http { load_balancer_arn aws_lb.web.arn port 80 protocol HTTP default_action { type forward target_group_arn aws_lb_target_group.web.arn } } # # 【新资源】Launch Template - EC2实例模板 # ASG根据这个模板创建新实例 # resource aws_launch_template web { name_prefix ${local.name_prefix}-lt- image_id data.aws_ami.amazon_linux.id instance_type var.instance_type vpc_security_group_ids [aws_security_group.ec2.id] user_data base64encode(local.user_data) # 启动脚本需base64编码 tag_specifications { resource_type instance tags merge(local.common_tags, { Name ${local.name_prefix}-web }) } tags merge(local.common_tags, { Name ${local.name_prefix}-launch-template }) } # # 【新资源】Auto Scaling Group - 弹性伸缩组 # resource aws_autoscaling_group web { name ${local.name_prefix}-asg desired_capacity var.desired_capacity min_size var.min_size max_size var.max_size vpc_zone_identifier module.vpc.private_subnets # EC2在私有子网 launch_template { id aws_launch_template.web.id version $Latest } # 【关键】关联Target Group新实例自动注册到ALB target_group_arns [aws_lb_target_group.web.arn] # 用ELB健康检查ALB判断实例是否健康 health_check_type ELB health_check_grace_period 60 tag { key Name value ${local.name_prefix}-web propagate_at_launch true } } data aws_ami amazon_linux { most_recent true owners [amazon] filter { name name values [al2023-ami-2023*-x86_64] } filter { name state values [available] } }variables.tfvariable region { default us-east-1 } variable project_name { default tf-practice } variable environment { default dev } variable instance_type { description EC2实例规格 default t3.micro } variable desired_capacity { description ASG期望实例数 default 2 } variable min_size { description ASG最小实例数 default 1 } variable max_size { description ASG最大实例数 default 3 }outputs.tfoutput alb_dns_name { description ALB的DNS地址浏览器访问 value aws_lb.web.dns_name } output alb_url { description 完整访问URL value http://${aws_lb.web.dns_name} } output target_group_arn { value aws_lb_target_group.web.arn } output asg_name { value aws_autoscaling_group.web.name }新增资源说明ALB关键字段字段含义internal false面向外网true内部ALBload_balancer_type applicationALB类型还有network、gatewaysecurity_groupsALB自己的安全组subnetsALB部署的子网至少2个AZTarget Group关键字段字段含义port后端实例监听的端口protocol后端使用的协议health_check.path健康检查的URL路径health_check.healthy_threshold连续几次成功算健康health_check.unhealthy_threshold连续几次失败算不健康health_check.interval检查间隔秒health_check.matcher期望的HTTP状态码Launch Template关键字段字段含义image_idAMI IDinstance_type实例规格vpc_security_group_ids安全组user_data启动脚本需base64编码tag_specifications实例标签Auto Scaling Group关键字段字段含义desired_capacity期望运行几台min_size缩容最少保留几台max_size扩容最多到几台vpc_zone_identifier实例创建在哪些子网launch_template使用哪个实例模板target_group_arns关联的Target Group新实例自动注册health_check_type“EC2或ELB”推荐ELBhealth_check_grace_period新实例启动后等多久再检查安全组设计要点外部流量 → ALB安全组允许0.0.0.0/0:80→ EC2安全组只允许ALB安全组EC2的安全组不直接开放给外网而是用security_groups [ALB的安全组ID]限制来源。这样外网只能通过ALB访问EC2直接访问EC2的公网IP会被拒绝即使EC2有公网IP也不怕事实上私有子网里没有操作步骤与实际输出Applyterraform apply -auto-approveaws_lb.web: Creation complete after 3m17s ← ALB创建较慢 aws_autoscaling_group.web: Creation complete after 14s Apply complete! Resources: 26 added, 0 changed, 0 destroyed. Outputs: alb_dns_name tf-practice-dev-alb-799249280.us-east-1.elb.amazonaws.com alb_url http://tf-practice-dev-alb-799249280.us-east-1.elb.amazonaws.com asg_name tf-practice-dev-asg验证负载均衡第1次刷新Hello from i-0abc123... 第2次刷新Hello from i-0def456... ← 不同实例负载均衡生效控制台验证ALB概览状态ActiveDNS名称类型applicationTarget Group健康状态2个实例注册状态HealthyListener规则HTTP:80 → Forward to target groupASG详情Desired: 2, Min: 1, Max: 3EC2实例2台实例由ASG创建Destroyterraform destroy -auto-approve# Destroy complete! Resources: 26 destroyed.延伸思考面试常见问题面试问题答案要点ALB和NLB的区别ALB工作在7层HTTP支持路径/域名路由NLB工作在4层TCP性能更高Target Group的健康检查有什么用自动摘除不健康的实例流量不会转发到故障节点ASG怎么实现弹性伸缩根据策略CPU利用率、请求数等自动调整desired_capacity为什么EC2安全组只允许ALB安全组最小权限原则EC2不直接暴露给外网Launch Template和Launch Configuration的区别Template更新支持版本管理、混合实例等Configuration已废弃ASG的health_check_type选EC2还是ELB推荐ELB——如果应用挂了但EC2没挂ELB能检测到EC2检测不到费用说明资源费用ALB~$0.022/小时NAT Gateway~$0.045/小时EC2 t3.micro × 2~$0.021/小时VPC / 子网 / 安全组免费总计~$0.09/小时本次练习约40分钟约$0.06小结本篇核心收获ALB Target Group ASG是AWS最经典的Web架构流量路径用户→ALB→Listener→Target Group→EC2ASG关联Target Group新实例自动注册到ALB无需手动操作安全组链式设计EC2只接受ALB的流量不直接暴露Launch TemplateEC2的模板ASG根据它创建新实例健康检查自动摘除不健康实例保证服务可用性下一篇预告Terraform实战10RDS Secrets Manager下一篇我们将学习创建RDS MySQL/PostgreSQL数据库数据库子网组配置用Secrets Manager管理数据库密码安全组限制只允许应用访问数据库参考链接本系列配套代码GitHubTerraform aws_lb文档Terraform aws_lb_target_group文档Terraform aws_autoscaling_group文档AWS ALB官方文档AWS Auto Scaling官方文档

相关新闻

基于LLM的Query2doc技术:用大语言模型增强信息检索效果

基于LLM的Query2doc技术:用大语言模型增强信息检索效果

1. 从“词不达意”到“意随词达”:信息检索的古老困境与新解法做搜索,无论是给自家产品加个站内搜索,还是处理海量的文档库,最头疼的往往不是技术实现,而是用户那“言简意赅”的查询。用户输入“苹果”,他到…

2026/8/12 16:40:42 阅读更多 →
Word打开总显示只读无法编辑?六种常见原因与对应解决全方案

Word打开总显示只读无法编辑?六种常见原因与对应解决全方案

着急要用的word文件,打开之后发现是只读模式,无法编辑该怎么办?其实这种情况会有很多种原因,所以取消只读方式的方法也有很多种。本篇文章将为大家梳理六种原因,并提供对应的详细解决方法,希望能够帮助大家…

2026/8/12 16:40:42 阅读更多 →
SAP Mobile Services Client核心机制与企业级应用实践

SAP Mobile Services Client核心机制与企业级应用实践

1. SAP Mobile Services Client 的本质解析第一次接触SAP Mobile Services Client时,我误以为它只是个简单的运行时容器。直到在三个跨国项目中实际部署后,才真正理解它作为MDK(Mobile Development Kit)应用"中枢神经系统&qu…

2026/8/12 16:39:41 阅读更多 →

最新新闻

Kali Linux学习指南:从渗透测试工具到合法安全实践

Kali Linux学习指南:从渗透测试工具到合法安全实践

1. 项目概述:一个被误解的“双刃剑”“Kali学得好,牢饭吃到饱”,这句话在网络安全圈流传甚广,几乎成了一句半开玩笑的“行话”。乍一听,它像是一句耸人听闻的警告,把学习Kali Linux这门技术直接和违法犯罪画…

2026/8/12 17:23:54 阅读更多 →
WiFi密码安全真相:27个9为何不安全?WPA2/WPA3破解原理与防御实战

WiFi密码安全真相:27个9为何不安全?WPA2/WPA3破解原理与防御实战

把WiFi密码设置为27个9,安全吗?这是一个看似简单,却让很多家庭用户、小型企业主甚至部分IT管理员都感到困惑的问题。很多人认为,密码越长就越安全,27位数字的密码,听起来似乎坚不可摧。但真相是&#xff0c…

2026/8/12 17:23:54 阅读更多 →
GAMES101作业8:光线追踪渲染器实现详解与核心算法解析

GAMES101作业8:光线追踪渲染器实现详解与核心算法解析

1. 项目概述:从光线追踪到渲染方程 如果你正在学习计算机图形学,那么“games101——作业8”这个标题对你来说一定不陌生。这通常指的是由闫令琪教授主讲的《现代计算机图形学入门》(GAMES101)课程中的第八次编程作业。这个作业是整…

2026/8/12 17:23:54 阅读更多 →
零基础玩转bWAPP靶场(五十一):XSS - Reflected (Login Form)

零基础玩转bWAPP靶场(五十一):XSS - Reflected (Login Form)

摘要:这是 bWAPP 系列第五十一篇,聚焦于 XSS - Reflected (Login Form)。这一关的注入点在登录表单中,用户输入的 login 和 password 被拼接到 SQL 查询中,同时登录失败时的错误信息会回显用户输入的内容,形成反射型 X…

2026/8/12 17:23:54 阅读更多 →
深度适配DeepSeek模型:vLLM、LMDeploy与Triton推理引擎改造实战

深度适配DeepSeek模型:vLLM、LMDeploy与Triton推理引擎改造实战

1. 项目概述:为什么需要改造推理引擎来适配DeepSeek?最近在部署DeepSeek模型时,我发现了一个普遍存在的痛点:直接使用原生的vLLM、LMDeploy或者Triton Inference Server,往往无法充分发挥DeepSeek模型(尤其…

2026/8/12 17:23:53 阅读更多 →
Java 核心特性深度解析:多态、反射与代理

Java 核心特性深度解析:多态、反射与代理

1. 引言在 Java 编程语言中,多态(Polymorphism)、反射(Reflection)和代理(Proxy)是面向对象编程和高级运行时特性的核心支柱。理解并掌握这三者,是迈向 Java 高级开发的必经之路。它…

2026/8/12 17:22:53 阅读更多 →

日新闻

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

1. 为什么需要一个“目录树”工具?在Linux世界里,尤其是Ubuntu这样的发行版,命令行是很多人的主战场。我们每天都要和文件、目录打交道。ls命令是查看目录内容的首选,它简洁、高效,能列出文件名、权限、大小等关键信息…

2026/8/12 9:33:34 阅读更多 →
博思AI智能体:意图识别、思考链与性能优化的工程实践

博思AI智能体:意图识别、思考链与性能优化的工程实践

在AI应用从“能用”走向“好用”的进程中,系统的响应速度、决策透明度与高并发稳定性是决定用户体验的关键。博思AI智能体近期完成了一次重要的专项优化,聚焦于意图识别、思考链展示与全链路压测三大核心领域,将系统从功能实现推向了工程卓越…

2026/8/12 9:33:34 阅读更多 →
子代理架构:AI智能体任务分解与协同执行的核心原理与实践

子代理架构:AI智能体任务分解与协同执行的核心原理与实践

1. 项目概述:为什么我们需要“子代理”?最近在折腾各种AI应用和自动化流程时,我越来越频繁地遇到一个瓶颈:单个AI智能体(Agent)的能力边界。无论是处理复杂的多步骤任务,还是需要同时调用多个专…

2026/8/12 9:33:34 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →