简介
配送应用已在 VPC 内准备就绪,但其公有服务尚不能接收外部请求。你将建立缺失的路径:将互联网网关附加到 VPC,在应用所在子网的路由表中添加默认路由,并将公网地址关联到应用的网络接口。
请先完成“创建包含应用子网的 VPC”。这个全新环境提供自己的 VPC、子网、应用和访问规则,不复用之前的 VM。CLI 已配置。保留无关的参考网络以及所有供应的应用资源。
认证考点关联
本实验提供以下考试主题的动手练习。
- Cloud Practitioner (CLF-C02) · 任务 3.5:VPC 网关组件及其用途。
- Solutions Architect – Associate (SAA-C03) · 任务 3.4:公有子网的基础路由和地址条件。
- CloudOps Engineer – Associate (SOA-C03) · 任务 5.1 和 5.3:互联网网关与路由的基础配置,以及缺失 VPC 路由的诊断。
- Advanced Networking – Specialty (ANS-C01) · 任务 2.2:在单个 VPC 连接设计中配置路由的基础练习。
附加互联网网关
本步骤中,你将检查供应的应用网络,并将互联网网关附加到其 VPC。
使用 Terminal 执行命令,并点击旁边的 AWS View。该视图读取与 CLI 相同的资源状态。application-network VPC 包含 public-subnet 和 private-subnet;供应的应用位于 public-subnet,私有地址为 10.20.1.10。
cd /home/labex/project
通过 Name 标签选择应用 VPC。--filters 限定服务端结果,--query 选择 ID。$(...) 将该 ID 捕获到 shell 变量,供后续步骤使用:
VPC_ID=$(aws ec2 describe-vpcs \
--filters Name=tag:Name,Values=application-network \
--query 'Vpcs[0].VpcId' \
--output text)
读取所选网络的子网:
aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=$VPC_ID" \
--query 'Subnets[].{CIDR:CidrBlock,ID:SubnetId}' \
--output table
地址范围为 10.20.1.0/24 和 10.20.2.0/24。独立的 10.99.0.0/16 参考网络与本任务无关,请保留。
HTTP 是此应用端点使用的请求/响应协议。端口标识接收请求的服务;本应用监听 TCP 端口 80。在 AWS View 中点击 Request application · client A,从供应的客户端 198.51.100.10 发送外部请求。结果为 Connection failed,并显示 No public address。应用存在,但公有访问路径尚未完成。
互联网网关(IGW)将 VPC 的公有路由路径连接到互联网。创建和附加是两个独立操作。为新网关添加标签,以识别自己的练习资源;引号中的标签规范作为一个参数传入:
IGW_ID=$(aws ec2 create-internet-gateway \
--tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=parcel-internet},{Key=Project,Value=parcel}]' \
--query 'InternetGateway.InternetGatewayId' \
--output text)
仅将此网关附加到所选的应用 VPC:
aws ec2 attach-internet-gateway --internet-gateway-id "$IGW_ID" --vpc-id "$VPC_ID"
附加成功时命令没有输出。改为查询资源关系:
aws ec2 describe-internet-gateways \
--internet-gateway-ids "$IGW_ID" \
--query 'InternetGateways[].{ID:InternetGatewayId,Attachments:Attachments}' \
--output json
附加信息指向你的 VPC,状态为 available。AWS View 现在在 VPC 下方显示该互联网网关。仅附加网关并不会提供子网路由或应用的公网地址。保持此 Terminal 打开,以保留保存的 ID。
添加公有子网默认路由
本步骤中,你将把公有子网的互联网流量引导至已附加的网关。
路由表将目标地址范围映射到目标。每个子网使用其关联的路由表;若没有显式关联,则使用 VPC 主路由表。本环境已供应两个分别关联的路由表:public-routes 和 private-routes。选择应用 VPC 内的 public-routes:
PUBLIC_ROUTE_TABLE_ID=$(aws ec2 describe-route-tables \
--filters "Name=vpc-id,Values=$VPC_ID" Name=tag:Name,Values=public-routes \
--query 'RouteTables[0].RouteTableId' \
--output text)
同时读取路由及关联关系:
aws ec2 describe-route-tables \
--route-table-ids "$PUBLIC_ROUTE_TABLE_ID" \
--query 'RouteTables[].{ID:RouteTableId,Routes:Routes,Associations:Associations}' \
--output json
关联指向 public-subnet;已有的 10.20.0.0/16 路由目标为 local,让 VPC 流量保留在 VPC 内。不要删除该本地路由或修改 private-routes。
默认路由 0.0.0.0/0 覆盖未匹配到更具体路由的 IPv4 目标。--gateway-id 将互联网网关设为其目标:
aws ec2 create-route \
--route-table-id "$PUBLIC_ROUTE_TABLE_ID" \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id "$IGW_ID"
响应包含 Return: true。再次查询路由表:
aws ec2 describe-route-tables \
--route-table-ids "$PUBLIC_ROUTE_TABLE_ID" \
--query 'RouteTables[].Routes[].{Destination:DestinationCidrBlock,Target:GatewayId,State:State}' \
--output table
默认路由指向你的 igw-...,状态为 active;本地路由仍在。AWS View 在 public-routes 下显示 0.0.0.0/0,指向同一个网关。再次点击 Request application · client A,请求仍失败并显示 No public address。子网已有公有路由,但应用还需要自己的公网 IPv4 地址。
关联公网地址并测试 HTTP
本步骤中,你将为供应的应用关联弹性 IP,并发送成功的外部请求。
弹性 IP 是分配给账户的公网 IPv4 地址,可以关联到支持的资源。分配 ID 标识预留的地址,关联 ID 标识其与资源之间的连接。清理时,你将同时删除关联和地址分配。
网络接口(ENI)提供应用的网络连接和私有 IP。本实验供应了应用接口,无需创建实例或配置其操作系统。通过 VPC 和名称选择接口:
ENI_ID=$(aws ec2 describe-network-interfaces \
--filters "Name=vpc-id,Values=$VPC_ID" Name=tag:Name,Values=application-interface \
--query 'NetworkInterfaces[0].NetworkInterfaceId' \
--output text)
分配供 VPC 使用的地址,并保存分配 ID:
ALLOCATION_ID=$(aws ec2 allocate-address \
--domain vpc \
--query 'AllocationId' \
--output text)
将地址关联到应用接口,并保存关联 ID:
ASSOCIATION_ID=$(aws ec2 associate-address \
--allocation-id "$ALLOCATION_ID" \
--network-interface-id "$ENI_ID" \
--query 'AssociationId' \
--output text)
读取关联后的接口状态:
aws ec2 describe-network-interfaces \
--network-interface-ids "$ENI_ID" \
--query 'NetworkInterfaces[].{ID:NetworkInterfaceId,PrivateIP:PrivateIpAddress,PublicIP:Association.PublicIp}' \
--output table
私有地址仍为 10.20.1.10,公网字段现在包含地址。在 AWS View 中,应用卡片同时显示公网地址和网关路由。点击 Request application · client A。
结果为 Success,源地址为 198.51.100.10,目标端口为 80,响应正文为 Application online。这是供应应用返回的 HTTP 响应。仅有已配置资源的清单,不能证明请求可用。

示例结果:公有子网同时显示网关路由和应用地址,请求返回 Application online。ID 和分配的地址可能不同。
准备好的访问规则允许此客户端和端口。下一个实验将教授如何控制这些规则;此处请保持规则不变。
观察并恢复路由故障
本步骤中,你将移除一条路由,观察失败的请求,再恢复可用路径。
公网地址不能替代路由。仅移除你创建的默认路由,保留供应的本地路由:
aws ec2 delete-route \
--route-table-id "$PUBLIC_ROUTE_TABLE_ID" \
--destination-cidr-block 0.0.0.0/0
确认公网地址仍有关联:
aws ec2 describe-addresses \
--allocation-ids "$ALLOCATION_ID" \
--query 'Addresses[].{PublicIP:PublicIp,Interface:NetworkInterfaceId}' \
--output table
在 AWS View 中,public-routes 现在仅包含本地路由。旧响应可能标为 Previous request,它不反映修改后的配置。点击 Request application · client A 发送新请求。即使公网地址仍在,结果也变为 Connection failed。

诊断示例:应用仍有公网地址,public-routes 仅有本地路由,新请求失败。
恢复指向同一已附加网关的路由:
aws ec2 create-route \
--route-table-id "$PUBLIC_ROUTE_TABLE_ID" \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id "$IGW_ID"
响应包含 Return: true。路由在 AWS View 中重新出现后,再次点击 Request application · client A。Success 和 Application online 恢复。你通过只改变路由这一条件定位了问题,而没有同时修改多个设置。
删除自己的公有路径
本步骤中,你将仅删除自己创建的地址、路由和网关,保留供应的应用网络和参考网络。
资源之间存在依赖关系。先解除地址与接口的关联:
aws ec2 disassociate-address --association-id "$ASSOCIATION_ID"
再释放地址分配;仅解除关联会保留已分配的资源:
aws ec2 release-address --allocation-id "$ALLOCATION_ID"
在分离网关前,删除自己的默认路由:
aws ec2 delete-route \
--route-table-id "$PUBLIC_ROUTE_TABLE_ID" \
--destination-cidr-block 0.0.0.0/0
aws ec2 detach-internet-gateway --internet-gateway-id "$IGW_ID" --vpc-id "$VPC_ID"
最后删除已分离的网关:
aws ec2 delete-internet-gateway --internet-gateway-id "$IGW_ID"
这些删除命令成功时没有输出。查询完整清单来证明资源不存在,不要依赖标签:
aws ec2 describe-addresses --query 'Addresses' --output json
aws ec2 describe-internet-gateways --query 'InternetGateways' --output json
在本全新环境中,两者均返回 []。再次检查供应子网的路由:
aws ec2 describe-route-tables \
--route-table-ids "$PUBLIC_ROUTE_TABLE_ID" \
--query 'RouteTables[].Routes[].{Destination:DestinationCidrBlock,Target:GatewayId}' \
--output table
仅剩本地路由。供应的 VPC、子网和应用接口仍在。AWS View 不再显示你的网关或公网地址。再次点击 Request application · client A;已删除的公有路径不能处理请求。清单查询失败不能证明资源已清理。
运行本步骤的完成检查。
总结
你附加了互联网网关,在应用所在子网关联的路由表中添加默认路由,并关联弹性 IP。你测试了真实 HTTP 访问,证明即使保留公网地址,删除路由仍会使请求失败,随后恢复路径,并仅删除自己的练习资源。
继续学习“使用安全组控制应用访问”,限制哪些外部请求可以到达应用。



