1. 部署堆栈

模板文件 vpc-1.yaml:

  1. AWSTemplateFormatVersion: 2010-09-09
  2. Description: Deploy a VPC
  3. Resources:
  4. VPC:
  5. Type: AWS::EC2::VPC
  6. Properties:
  7. CidrBlock: 10.0.0.0/16
  8. EnableDnsHostnames: true
  9. Tags:
  10. - Key: Name
  11. Value: Lab VPC
  12. InternetGateway:
  13. Type: AWS::EC2::InternetGateway
  14. Properties:
  15. Tags:
  16. - Key: Name
  17. Value: Lab Internet Gateway
  18. AttachGateway:
  19. Type: AWS::EC2::VPCGatewayAttachment
  20. Properties:
  21. VpcId: !Ref VPC
  22. InternetGatewayId: !Ref InternetGateway
  23. PublicSubnet1:
  24. Type: AWS::EC2::Subnet
  25. Properties:
  26. VpcId: !Ref VPC
  27. CidrBlock: 10.0.0.0/24
  28. AvailabilityZone: !Select
  29. - '0'
  30. - !GetAZs ''
  31. Tags:
  32. - Key: Name
  33. Value: Public Subnet 1
  34. PrivateSubnet1:
  35. Type: AWS::EC2::Subnet
  36. Properties:
  37. VpcId: !Ref VPC
  38. CidrBlock: 10.0.1.0/24
  39. AvailabilityZone: !Select
  40. - '0'
  41. - !GetAZs ''
  42. Tags:
  43. - Key: Name
  44. Value: Private Subnet 1
  45. PublicRouteTable:
  46. Type: AWS::EC2::RouteTable
  47. Properties:
  48. VpcId: !Ref VPC
  49. Tags:
  50. - Key: Name
  51. Value: Public Route Table
  52. PublicRoute:
  53. Type: AWS::EC2::Route
  54. Properties:
  55. RouteTableId: !Ref PublicRouteTable
  56. DestinationCidrBlock: 0.0.0.0/0
  57. GatewayId: !Ref InternetGateway
  58. PublicSubnetRouteTableAssociation1:
  59. Type: AWS::EC2::SubnetRouteTableAssociation
  60. Properties:
  61. SubnetId: !Ref PublicSubnet1
  62. RouteTableId: !Ref PublicRouteTable
  63. PrivateRouteTable:
  64. Type: AWS::EC2::RouteTable
  65. Properties:
  66. VpcId: !Ref VPC
  67. Tags:
  68. - Key: Name
  69. Value: Private Route Table
  70. PrivateSubnetRouteTableAssociation1:
  71. Type: AWS::EC2::SubnetRouteTableAssociation
  72. Properties:
  73. SubnetId: !Ref PrivateSubnet1
  74. RouteTableId: !Ref PrivateRouteTable
  75. Outputs:
  76. VPC:
  77. Description: VPC
  78. Value: !Ref VPC
  79. AZ1:
  80. Description: Availability Zone 1
  81. Value: !GetAtt
  82. - PublicSubnet1
  83. - AvailabilityZone

image.png
image.png
image.png

2. 检查 VPC

在此,我们将检查创建的 VPC 资源以及创建资源的 CloudFormation 模板的代码。

以下是 CloudFormation 创建的资源:

  • Amazon VPC
  • Internet Gateway
  • 2 个 Subnet
  • 2 个 Route Table

这些资源都位于一个可用区中。可用区是区域内的一个隔离位置,由一个或多个数据中心组成。
image.png

2.1 LabVPC

VPC 是 AWS 云的一个隔离部分,它允许资源互相通信,并有选择的与 Internet 通信。
image.png
详细信息“显示 IPv4 CIDR ,这是分配给 VPC 的 IP 地址范围。此 VPC 的 CIDR 为 10.0.0.0/16 ,这意味着它包含所有以 10.0.x.x 的开头的 IP 地址。

  1. Resources:
  2. VPC:
  3. Type: AWS::EC2::VPC
  4. Properties:
  5. CidrBlock: 10.0.0.0/16
  6. EnableDnsHostnames: true
  7. Tags:
  8. - Key: Name
  9. Value: Lab VPC

上面代码中的 Type 声明了 CloudFormation 创建的资源的类型。然后, Properties 部分指定有关要创建的资源的信息:

  • CidrBlock :与 VPC 关联的 IP 地址范围;
  • EnableDnsHostnames :为 VPC 中的 EC2 实例开启 DNS 域名功能;
  • Tag :向资源添加一个友好名称;

2.2 Internet 网关

Internet 网关有两个目的:

  • 在 VPC 路由表中为可路由 Internet 的流量提供目标;
  • 对已分配了公共 IPv4 地址的 EC2 实例执行网路地址转换(NAT);

以下是创建此 Internet 网关的模板中的代码:

  1. InternetGateway:
  2. Type: AWS::EC2::InternetGateway
  3. Properties:
  4. Tags:
  5. - Key: Name
  6. Value: Lab Internet Gateway

在控制台中,Internet 网关显示它已连接到 VPC:
image.png

这是通过模板中的以下代码完成的:

  1. AttachGateway:
  2. Type: AWS::EC2::VPCGatewayAttachment
  3. Properties:
  4. VpcId: !Ref VPC
  5. InternetGatewayId: !Ref InternetGateway

VPC 的 AttachGateway 在 VPC 和网关之间创建关系。 :::info 注意:模板使用 !Ref 关键字引用模板中的其他元素,后跟另一个资源的名称。这样,仅通过引用资源名称就可以轻松构件相互链接的资源。 :::

2.3 子网

将出现两个子网:

  • Public Subnet 1:通过 Internet 网关连接到 Internet,可由需要公共访问的资源使用;
  • Private Subnet 1:未连接到互联网。无法从 Internet 到达此子网中的任何资源,从而为这些资源提供了额外的安全性;

image.png

以下是模板中创建子网的代码:

  • VpcId:包含子网的 VPC;
  • CidrBlock:分配给子网的 IP 地址范围;
  • AvailabilityZone:定义区域内的哪个物理位置应包含子网; :::info 可用区使用一个名为 !Select 的函数和一个名为 !GetAZs 的函数,它们会检索该区域内的可用区列表,并引用该列表中的第一个元素。
    以这种方式,该模板可以在任何区域中使用,因为它在运行时检索可用区列表,而不是在模板中对可用区进行硬编码。 :::

    1. PublicSubnet1:
    2. Type: AWS::EC2::Subnet
    3. Properties:
    4. VpcId: !Ref VPC
    5. CidrBlock: 10.0.0.0/24
    6. AvailabilityZone: !Select
    7. - '0'
    8. - !GetAZs ''
    9. Tags:
    10. - Key: Name
    11. Value: Public Subnet 1
    12. PrivateSubnet1:
    13. Type: AWS::EC2::Subnet
    14. Properties:
    15. VpcId: !Ref VPC
    16. CidrBlock: 10.0.1.0/24
    17. AvailabilityZone: !Select
    18. - '0'
    19. - !GetAZs ''
    20. Tags:
    21. - Key: Name
    22. Value: Private Subnet 1

2.4 路由表

路由表用于将流量路由进出子网。该路由表(Public Route Table)的配置为:

  • 对 VPC(10.0.0.0/16)中的流量,将在本地路由流量;
  • 对于去往 Internet(0.0.0.0/0)的流量,将流量路由到 Internet 网关(igw-*);

image.png

以下时模板中创建 Public Route Table 的代码:

  1. PublicRouteTable:
  2. Type: AWS::EC2::RouteTable
  3. Properties:
  4. VpcId: !Ref VPC
  5. Tags:
  6. - Key: Name
  7. Value: Public Route Table

Private Route Table 也有类似的代码。

以下是在 Public Route Table 中定义到 Internet 的路由的代码:

  1. PublicRoute:
  2. Type: AWS::EC2::Route
  3. Properties:
  4. RouteTableId: !Ref PublicRouteTable
  5. DestinationCidrBlock: 0.0.0.0/0
  6. GatewayId: !Ref InternetGateway

路由的配置为:

  • RouteTableId:表示拥有路由的路由表;
  • DestinationCidrBlock:定义此路由规则的 IP 地址范围(其中0.0.0.0/0表示绑定到 Internet 的流量);
  • GatewayId:定义将流量路由到何处,这种情况下,它是模板前面定义的 Internet 网关;

仅为 Public Route Table 配置了此路由,这就是使它成为 public 的原因。

2.5 子网关联

控制台中显示 Public Route Table 与 Public Subnet 1 关联。
image.png
路由表可以与多个子网关联,每个关联都需要有明确的链接。

以下是定义此链接的代码:

  1. PublicSubnetRouteTableAssociation1:
  2. Type: AWS::EC2::SubnetRouteTableAssociation
  3. Properties:
  4. SubnetId: !Ref PublicSubnet1
  5. RouteTableId: !Ref PublicRouteTable

2.6 Outputs

模板在 Outputs 部分返回了有关其创建的资源的信息:

  • VPC 是已创建的 VPC 的 ID;
  • AZ1 显示了在其中创建子网的可用区;

    1. Outputs:
    2. VPC:
    3. Description: VPC
    4. Value: !Ref VPC
    5. AZ1:
    6. Description: Availability Zone 1
    7. Value: !GetAtt
    8. - PublicSubnet1
    9. - AvailabilityZone

    VPC 输出只是对 VPC 的引用,从而显示 VPC ID;
    AZ1 输出使用 !GetAtt 函数检索资源的属性。在这种情况下,它将从 Public Subnet 1 检索 AvaiabilityZone 属性。

3. 更新堆栈

部署堆栈后,建议对资源的任何更改都应通过 CloudFormation 进行,而不是直接修改资源。

在此部分将使用新的模板,更新堆栈,该模板定义了以下资源:
AWS CloudFormation 创建 VPC 示例 03 - 图10
第二个 Public 和 Private Subnet 已添加到另一个可用区中。这也是最佳做法,确保你的资源可以在多个可用区(数据中心)中运行,以确保系统出现故障时具有高可用性。

模板文件 vpc-2.yaml:

  1. AWSTemplateFormatVersion: 2010-09-09
  2. Description: Deploy a VPC
  3. Resources:
  4. VPC:
  5. Type: AWS::EC2::VPC
  6. Properties:
  7. CidrBlock: 10.0.0.0/16
  8. EnableDnsHostnames: true
  9. Tags:
  10. - Key: Name
  11. Value: Lab VPC
  12. InternetGateway:
  13. Type: AWS::EC2::InternetGateway
  14. Properties:
  15. Tags:
  16. - Key: Name
  17. Value: Lab Internet Gateway
  18. AttachGateway:
  19. Type: AWS::EC2::VPCGatewayAttachment
  20. Properties:
  21. VpcId: !Ref VPC
  22. InternetGatewayId: !Ref InternetGateway
  23. PublicSubnet1:
  24. Type: AWS::EC2::Subnet
  25. Properties:
  26. VpcId: !Ref VPC
  27. CidrBlock: 10.0.0.0/24
  28. AvailabilityZone: !Select
  29. - '0'
  30. - !GetAZs ''
  31. Tags:
  32. - Key: Name
  33. Value: Public Subnet 1
  34. PrivateSubnet1:
  35. Type: AWS::EC2::Subnet
  36. Properties:
  37. VpcId: !Ref VPC
  38. CidrBlock: 10.0.1.0/24
  39. AvailabilityZone: !Select
  40. - '0'
  41. - !GetAZs ''
  42. Tags:
  43. - Key: Name
  44. Value: Private Subnet 1
  45. PublicSubnet2:
  46. Type: AWS::EC2::Subnet
  47. Properties:
  48. VpcId: !Ref VPC
  49. CidrBlock: 10.0.2.0/24
  50. AvailabilityZone: !Select [1, !GetAZs '']
  51. Tags:
  52. - Key: Name
  53. Value: Public Subnet 2
  54. PrivateSubnet2:
  55. Type: AWS::EC2::Subnet
  56. Properties:
  57. VpcId: !Ref VPC
  58. CidrBlock: 10.0.3.0/24
  59. AvailabilityZone: !Select [1, !GetAZs '']
  60. Tags:
  61. - Key: Name
  62. Value: Private Subnet 2
  63. PublicRouteTable:
  64. Type: AWS::EC2::RouteTable
  65. Properties:
  66. VpcId: !Ref VPC
  67. Tags:
  68. - Key: Name
  69. Value: Public Route Table
  70. PublicRoute:
  71. Type: AWS::EC2::Route
  72. Properties:
  73. RouteTableId: !Ref PublicRouteTable
  74. DestinationCidrBlock: 0.0.0.0/0
  75. GatewayId: !Ref InternetGateway
  76. PublicSubnetRouteTableAssociation1:
  77. Type: AWS::EC2::SubnetRouteTableAssociation
  78. Properties:
  79. SubnetId: !Ref PublicSubnet1
  80. RouteTableId: !Ref PublicRouteTable
  81. PublicSubnetRouteTableAssociation2:
  82. Type: AWS::EC2::SubnetRouteTableAssociation
  83. Properties:
  84. SubnetId: !Ref PublicSubnet2
  85. RouteTableId: !Ref PublicRouteTable
  86. PrivateRouteTable:
  87. Type: AWS::EC2::RouteTable
  88. Properties:
  89. VpcId: !Ref VPC
  90. Tags:
  91. - Key: Name
  92. Value: Private Route Table
  93. PrivateSubnetRouteTableAssociation1:
  94. Type: AWS::EC2::SubnetRouteTableAssociation
  95. Properties:
  96. SubnetId: !Ref PrivateSubnet1
  97. RouteTableId: !Ref PrivateRouteTable
  98. PrivateSubnetRouteTableAssociation2:
  99. Type: AWS::EC2::SubnetRouteTableAssociation
  100. Properties:
  101. SubnetId: !Ref PrivateSubnet2
  102. RouteTableId: !Ref PrivateRouteTable
  103. Outputs:
  104. VPC:
  105. Description: VPC
  106. Value: !Ref VPC
  107. AZ1:
  108. Description: Availability Zone 1
  109. Value: !GetAtt
  110. - PublicSubnet1
  111. - AvailabilityZone
  112. AZ2:
  113. Description: Availability Zone 2
  114. Value: !GetAtt
  115. - PublicSubnet2
  116. - AvailabilityZone

image.png

预览更改集:
它将创建两个新的子网,此外,将添加两个路由表关联,以将这些子网与其响应的路由表关联。
image.png
image.png
现在显示有 VPC 中有四个子网了。VPC 现在已更新以支持高可用性能的应用程序。

4. CloudFormation Designer 中查看堆栈

Designer 是用于创建,查看和修改 AWS CloudFormation 模板的图形工具。使用 Designer,可以使用拖放界面来绘制模板资源图,然后使用集成的 JSON 或 YAML 编辑器来编辑其详细信息。
image.png
image.png
在组成部分选项卡,单击图中的一些元素:

  • 窗口的下部显示模板中定义资源的代码;
  • 箭头显示资源之间的关系,例如与子网关联的路由表;

5. 删除堆栈

删除堆栈,会删除堆栈中所有创建的资源,但是 CloudFormation 自动创建的用于上传模板的 S3 Bucket 是需要另外手动删除的。