将公有子网连接到互联网

AWSBeginner
立即练习

简介

配送应用已在 VPC 内准备就绪,但其公有服务尚不能接收外部请求。你将建立缺失的路径:将互联网网关附加到 VPC,在应用所在子网的路由表中添加默认路由,并将公网地址关联到应用的网络接口。

请先完成“创建包含应用子网的 VPC”。这个全新环境提供自己的 VPC、子网、应用和访问规则,不复用之前的 VM。CLI 已配置。保留无关的参考网络以及所有供应的应用资源。

认证考点关联

本实验提供以下考试主题的动手练习。

附加互联网网关

本步骤中,你将检查供应的应用网络,并将互联网网关附加到其 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 响应。仅有已配置资源的清单,不能证明请求可用。

应用具有公网地址和互联网网关路由,客户端 A 收到 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 访问,证明即使保留公网地址,删除路由仍会使请求失败,随后恢复路径,并仅删除自己的练习资源。

继续学习“使用安全组控制应用访问”,限制哪些外部请求可以到达应用。