创建包含应用子网的 VPC

AWSBeginner
立即练习

简介

包裹配送应用需要为面向公众的服务和内部工作进程分配独立地址范围。你将创建 VPC,把两个非重叠子网放在不同可用区,并在 AWS View 中检查地址规划。

你应已熟悉运行 AWS CLI 命令和读取资源 ID。CLI 已为这个全新环境配置好。最后,你将仅删除自己创建的资源。

认证考点关联

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

创建配送 VPC

本步骤中,你将选择应用的外层地址范围并创建 VPC。

虚拟私有云(VPC)是一个 AWS 区域内的隔离网络。它的 CIDR 地址块定义子网可以使用的地址。IPv4 CIDR 由起始地址和前缀长度组成:10.20.0.0/16 包含 10.20.0.0 至 10.20.255.255。前缀数字越小,留给地址的位数越多,因此 /16 比 /24 大。

使用准备好的 Terminal 执行命令,并点击旁边的 AWS View 标签页。该视图读取与 CLI 相同的资源状态,展示你创建的网络资源。操作时保留两个界面。

先进入工作目录:

cd /home/labex/project

修改前先读取已有 VPC 清单。--query 选择 ID 和 CIDR 字段,--output table 让结果更方便比较:

aws ec2 describe-vpcs --query 'Vpcs[].{ID:VpcId,CIDR:CidrBlock}' --output table

参考网络使用 10.99.0.0/16,也可能显示其他已有 VPC。保留这些网络;你将创建并最终删除自己的 10.20.0.0/16 网络。

EC2 命令组包含 VPC 网络操作。--cidr-block 设置地址范围,--tag-specifications 在创建时添加 Name 和 Project 标签。引号让包含括号和逗号的值作为一个参数传入。

Shell 表达式 $(...) 执行命令并捕获输出。将输出赋给 VPC_ID,可保存后续命令需要的 VPC ID。--query 'Vpc.VpcId' --output text 只返回该 ID:

VPC_ID=$(aws ec2 create-vpc \
  --cidr-block 10.20.0.0/16 \
  --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=delivery-network},{Key=Project,Value=parcel}]' \
  --query 'Vpc.VpcId' \
  --output text)

捕获输出的命令不会打印结果。使用保存的 ID 读取资源;"$VPC_ID" 将变量值作为一个参数代入:

aws ec2 describe-vpcs \
  --vpc-ids "$VPC_ID" \
  --query 'Vpcs[].{ID:VpcId,CIDR:CidrBlock,State:State}' \
  --output table

CIDR 为 10.20.0.0/16,状态为 available。AWS View 中出现具有相同 CIDR、尚无应用子网的 delivery-network。保持此 Terminal 打开,以保留保存的 ID。

添加面向公众的子网

本步骤中,你将在 VPC 内分配较小的地址范围,并将其放在一个可用区。

子网是 VPC 地址范围的一部分。每个子网只属于该区域中的一个可用区(AZ);VPC 本身覆盖整个区域。us-east-1a 这样的可用区名称标识子网资源的部署位置。

为未来面向公众的服务预留 10.20.1.0/24。它覆盖 10.20.1.0 至 10.20.1.255,位于 10.20.0.0/16 内。AWS 在普通 IPv4 子网中保留前四个和最后一个地址,因此这个 /24 有 251 个可分配地址。不要把保留地址分配给工作负载。

查看可用的可用区名称。环境启动时已配置区域:

aws ec2 describe-availability-zones \
  --query 'AvailabilityZones[].{Zone:ZoneName,State:State}' \
  --output table

此子网使用 us-east-1a,下一个使用 us-east-1b。--vpc-id 选择父网络,--availability-zone 选择位置。保存新子网的 ID,以便清理:

PUBLIC_SUBNET_ID=$(aws ec2 create-subnet \
  --vpc-id "$VPC_ID" \
  --cidr-block 10.20.1.0/24 \
  --availability-zone us-east-1a \
  --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=delivery-public},{Key=Project,Value=parcel}]' \
  --query 'Subnet.SubnetId' \
  --output text)

读取其父网络、地址范围和可用区:

aws ec2 describe-subnets \
  --subnet-ids "$PUBLIC_SUBNET_ID" \
  --query 'Subnets[].{ID:SubnetId,VPC:VpcId,CIDR:CidrBlock,Zone:AvailabilityZone}' \
  --output table

VPC ID 与保存的 ID 相同,范围为 10.20.1.0/24,可用区为 us-east-1a。AWS View 将此子网显示在 delivery-network 内。

delivery-public 这个名称说明预期用途。名称本身不会使子网成为公有子网:还需要互联网网关路由,下一个实验将配置它。

添加独立的工作进程子网

本步骤中,你将为内部工作进程分配独立、非重叠的子网,并比较完整规划。

同一 VPC 内的两个子网不能重叠。给工作进程分配 10.20.2.0/24,可使其与 10.20.1.0/24 分开。两个范围都位于 VPC 的 /16 内。

将此子网放在 us-east-1b,以观察一个 VPC 可以包含不同可用区的子网。这只是展示布局;你尚未跨可用区部署冗余应用。

PRIVATE_SUBNET_ID=$(aws ec2 create-subnet \
  --vpc-id "$VPC_ID" \
  --cidr-block 10.20.2.0/24 \
  --availability-zone us-east-1b \
  --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=delivery-private},{Key=Project,Value=parcel}]' \
  --query 'Subnet.SubnetId' \
  --output text)

使用服务端过滤器,仅选择 VPC 内的子网。在 Name=vpc-id,Values=... 中,Name 标识过滤器,Values 包含匹配的 VPC ID:

aws ec2 describe-subnets \
  --filters "Name=vpc-id,Values=$VPC_ID" \
  --query 'Subnets[].{ID:SubnetId,CIDR:CidrBlock,Zone:AvailabilityZone}' \
  --output table

两行结果显示以下规划。生成的 ID 和行顺序可能不同:

用途 CIDR 可用区
面向公众的服务 10.20.1.0/24 us-east-1a
内部工作进程 10.20.2.0/24 us-east-1b

尝试添加 10.20.1.128/25,观察重叠边界。这个较小范围已在 delivery-public 内,因此不能成为此 VPC 中的另一个子网:

aws ec2 create-subnet \
  --vpc-id "$VPC_ID" \
  --cidr-block 10.20.1.128/25 \
  --availability-zone us-east-1a

预期错误包含 InvalidSubnet.Conflict。不会创建第三个子网。保留上面创建的两个有效 /24 范围。

在 AWS View 中比较相同的范围和可用区。两个子网都还没有互联网路由。它们各自的地址范围提供了独立位置,供后续实验应用路由和访问规则。

配送 VPC 包含位于不同可用区的两个非重叠子网

示例结果:两个子网 CIDR 均位于 VPC 范围内,每个子网显示自己的可用区。你环境中的资源 ID 会不同。

删除练习网络

本步骤中,你将删除两个子网和 VPC,并保留已有的参考网络。

资源之间有依赖关系:VPC 中仍有你的子网时,不能删除它。仅删除保存的子网 ID。删除成功的命令没有输出:

aws ec2 delete-subnet --subnet-id "$PUBLIC_SUBNET_ID"
aws ec2 delete-subnet --subnet-id "$PRIVATE_SUBNET_ID"

现在删除空的 VPC:

aws ec2 delete-vpc --vpc-id "$VPC_ID"

再次读取完整 VPC 清单,不要依靠可修改的标签来证明删除:

aws ec2 describe-vpcs --query 'Vpcs[].{ID:VpcId,CIDR:CidrBlock}' --output table

清单中没有 10.20.0.0/16 VPC。10.99.0.0/16 参考网络和其他已有网络仍在。清单查询失败不能证明清理成功。AWS View 此时显示没有应用 VPC。

运行本步骤的完成检查。

下一个实验在全新环境中启动,并提供自己的应用。它将教授互联网网关、路由和公网地址如何让外部请求到达应用。

总结

你创建了 VPC 地址范围,将其划分为两个非重叠的应用子网,并把每个子网放在一个可用区。你通过 CLI 和 AWS View 检查了父子关系,然后仅删除自己的练习网络。

继续学习“将公有子网连接到互联网”,把地址规划转变为可工作的应用路径。