简介
你的团队有两台应用服务器,但客户端需要一个统一的服务地址。本实验将创建应用负载均衡器,将监听器连接到目标组,并注册两台服务器。真实 HTTP 响应会显示每次请求由哪台服务器处理。
你应已通过前面的课程了解 EC2 实例、VPC 子网和安全组。实验环境已提供网络和运行中的应用服务器,并配置好 AWS CLI。你将创建负载均衡资源,并在最后删除它们。
认证考点关联
本实验为以下认证考点提供入门实践。
- Solutions Architect – Associate (SAA-C03) · 任务 2.1:应用负载均衡器概念,以及在多个应用后端之间分配请求。
- CloudOps Engineer – Associate (SOA-C03) · 任务 2.2:Elastic Load Balancing 基础配置,以及观察目标可用性。
创建应用负载均衡器
本步骤为两台已准备好的应用服务器创建统一入口。
应用负载均衡器(ALB)将 HTTP 或 HTTPS 请求分配给应用后端。网络负载均衡器(NLB)主要处理 TCP 和 UDP 等传输层连接;此 HTTP 应用适合使用 ALB。本实验将始终使用 ALB。
进入已准备好的工作目录:
cd /home/labex/project
launch.env 文件包含已提供网络的标识符。先查看文件,再用 source 将其中的变量赋值加载到当前 shell:
cat launch.env
source launch.env
SUBNET_ID 和 SECOND_SUBNET_ID 指向不同可用区中的两个子网。ALB 配置至少需要两个这样的子网。ALB_SECURITY_GROUP_ID 指向已允许端口 80 上 HTTP 监听器流量的安全组;应用服务器使用另一个安全组管理应用端口。
创建名为 application-alb 的面向互联网的应用负载均衡器。面向互联网描述其地址方案。--query 只提取资源 ARN,--output text 让该值便于复用。shell 的 $(...) 语法会将命令输出保存到 LB_ARN:
LB_ARN=$(aws elbv2 \
create-load-balancer \
--name application-alb \
--type application \
--scheme internet-facing \
--subnets "$SUBNET_ID" "$SECOND_SUBNET_ID" \
--security-groups "$ALB_SECURITY_GROUP_ID" \
--query 'LoadBalancers[0].LoadBalancerArn' \
--output text)
Amazon 资源名称(ARN)用于标识 AWS 资源。使用刚才保存的 ARN 查看负载均衡器:
aws elbv2 \
describe-load-balancers \
--load-balancer-arns "$LB_ARN" \
--query 'LoadBalancers[].{Name:LoadBalancerName,Type:Type,Scheme:Scheme,DNS:DNSName}'
查找名称 application-alb、类型 application 和地址方案 internet-facing。DNS 名称是客户端将使用的地址,不同环境中的值可能不同。仅创建负载均衡器还没有连接应用服务器。
点击 Terminal 旁的 AWS View。页面读取与 CLI 相同的资源状态,此时应显示 application-alb。由于还没有连接目标组和目标,对应区域仍为空。

截图展示创建检查点。资源名称与实验一致,DNS 名称是示例值。
将监听器连接到目标组
本步骤定义传入的 HTTP 请求应转发到哪里。
目标组包含可为某个应用提供服务的后端,目标组端口是访问这些后端所用的端口。监听器在负载均衡器上接受客户端连接,并通过动作决定转发位置。在此应用中,客户端使用监听器端口 80,服务器上的应用运行在端口 8081。
在已提供的 VPC 中创建实例类型的目标组。--target-type instance 表示将注册 EC2 实例 ID。健康检查路径 /health 是应用的就绪状态接口:
TG_ARN=$(aws elbv2 \
create-target-group \
--name application-targets \
--protocol HTTP \
--port 8081 \
--vpc-id "$VPC_ID" \
--target-type instance \
--health-check-path /health \
--query 'TargetGroups[0].TargetGroupArn' \
--output text)
创建 HTTP 监听器。其默认动作将请求转发到 TG_ARN。CLI 简写 Type=forward,TargetGroupArn=... 用于指定该动作:
LISTENER_ARN=$(aws elbv2 \
create-listener \
--load-balancer-arn "$LB_ARN" \
--protocol HTTP \
--port 80 \
--default-actions "Type=forward,TargetGroupArn=$TG_ARN" \
--query 'Listeners[0].ListenerArn' \
--output text)
查看创建的监听器:
aws elbv2 \
describe-listeners \
--load-balancer-arn "$LB_ARN" \
--query 'Listeners[].{Protocol:Protocol,Port:Port,Actions:DefaultActions}'
输出应显示 HTTP 端口 80,以及引用你所建目标组的转发动作。在 AWS View 中,目标组会出现在 ALB 和后端区域之间。此时仍未注册目标,下一步需要连接服务器。
注册并测试两台应用服务器
本步骤注册两台运行中的服务器,并观察真实请求到达两个后端。
列出已准备好的应用服务器。名称过滤器选择实例标签,查询表达式显示有用的连接字段:
aws ec2 \
describe-instances \
--filters 'Name=tag:Name,Values=app-a,app-b' \
--query 'Reservations[].Instances[].{Instance:InstanceId,Name:Tags[?Key==`Name`].Value|[0],State:State.Name,PrivateIP:PrivateIpAddress}' \
--output table
两个实例都应为 running。分别按名称获取其 ID,可以避免依赖列表顺序:
APP_A=$(aws ec2 \
describe-instances \
--filters 'Name=tag:Name,Values=app-a' \
--query 'Reservations[0].Instances[0].InstanceId' \
--output text)
APP_B=$(aws ec2 \
describe-instances \
--filters 'Name=tag:Name,Values=app-b' \
--query 'Reservations[0].Instances[0].InstanceId' \
--output text)
注册目标会将这些实例 ID 连接到目标组。如果未显式指定 Port 覆盖值,每个目标使用目标组的应用端口 8081:
aws elbv2 \
register-targets \
--target-group-arn "$TG_ARN" \
--targets "Id=$APP_A" "Id=$APP_B"
ALB 通过探测 /health 判断目标是否可用。等待健康检查报告目标健康。CLI waiter 会重复执行只读状态查询,直到满足条件或超时:
aws elbv2 \
wait target-in-service \
--target-group-arn "$TG_ARN"
查看已注册目标的 ID、端口和健康状态:
aws elbv2 \
describe-target-health \
--target-group-arn "$TG_ARN" \
--query 'TargetHealthDescriptions[].{Instance:Target.Id,Port:Target.Port,Health:TargetHealth.State}' \
--output table
两个目标都应显示端口 8081 和状态 healthy。保存负载均衡器的 DNS 名称:
LB_DNS=$(aws elbv2 \
describe-load-balancers \
--load-balancer-arns "$LB_ARN" \
--query 'LoadBalancers[0].DNSName' \
--output text)
使用 HTTP 客户端 curl 请求应用健康接口。--config client.conf 读取已提供的连接设置;-sS 隐藏进度,同时保留错误信息:
curl --config client.conf -sS "http://$LB_DNS/health"
成功响应类似以下示例,其中实例 ID 是示例值:
{"service":"Report server","message":"Application ready","instance_id":"i-..."}
发送六个独立请求。for 循环重复执行相同请求,echo 让每个响应单独占一行:
for request in 1 2 3 4 5 6; do
curl --config client.conf -sS "http://$LB_DNS/health"
echo
done
在响应中查找 APP_A 和 APP_B 的值。这证明请求分配到了两个后端;不要通过请求数量推断性能或容量。目标组的默认算法是轮询,生产服务中的请求分配还可能受到连接和其他配置的影响。
打开 AWS View,确认两个目标都健康。多次点击 Send request,查看响应中的 instance_id。请求会通过监听器到达应用;两个目标卡片展示资源状态,而响应标识真正处理请求的后端。

此示例展示两个健康目标和一次成功请求。你的实例 ID 会不同,应将响应与自己的目标 ID 对照。
删除负载均衡资源
本步骤删除你创建的资源,保留已提供的应用服务器和网络。
先删除监听器,解除对目标组的转发依赖:
aws elbv2 \
delete-listener \
--listener-arn "$LISTENER_ARN"
删除负载均衡器,再删除其目标组:
aws elbv2 \
delete-load-balancer \
--load-balancer-arn "$LB_ARN"
aws elbv2 \
delete-target-group \
--target-group-arn "$TG_ARN"
确认两类负载均衡资源的查询结果都为空:
aws elbv2 \
describe-load-balancers \
--query 'LoadBalancers[].LoadBalancerName'
aws elbv2 \
describe-target-groups \
--query 'TargetGroups[].TargetGroupName'
每个查询都应返回 []。AWS View 应显示没有负载均衡器和目标组。已提供的 EC2 服务器仍在运行;它们属于实验准备资源,不是你的清理对象。
总结
你创建了应用负载均衡器,将 HTTP 监听器连接到目标组,并注册了两台 EC2 应用服务器。你查看了目标健康状态,通过真实响应识别了两个提供服务的后端。最后,你删除了负载均衡资源,保留了已准备好的服务器和网络。
下一个实验将研究健康检查如何发现应用故障、让健康目标继续服务,并让恢复后的目标重新加入。



