

# 示例：用于 Web 和数据库服务器的 VPC
<a name="vpc-example-web-database-servers"></a>

此示例将演示如何创建可用于生产环境的两层架构 VPC。为了提高故障恢复能力，您需要在两个可用区中部署服务器。

**Topics**
+ [概述](#overview-vpc-public-private-subnets-multi-az)
+ [1. 创建 VPC](#create-vpc-public-private-subnets-multi-az)
+ [2. 部署您的应用程序](#deploy-web-database-servers)
+ [3. 测试配置](#test-web-database-servers)
+ [4. 清理](#clean-up-web-database-servers)

## 概述
<a name="overview-vpc-public-private-subnets-multi-az"></a>

下图概括了此例中包含的资源。此 VPC 在两个可用区中拥有公有和私有子网。Web 服务器在公有子网中运行，并通过负载均衡器接收来自客户端的流量。Web 服务器的安全组允许来自负载均衡器的流量。数据库服务器在私有子网中运行，并接收来自 Web 服务器的流量。数据库服务器的安全组允许来自 Web 服务器的流量。数据库服务器可以使用网关 VPC 端点连接到 Amazon S3。

![\[一个在两个可用区内拥有子网的 VPC。\]](http://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/images/vpc-example-web-database.png)


### 路由
<a name="routing-vpc-public-private-subnets-multi-az"></a>

当您使用 Amazon VPC 控制台创建此 VPC 时，我们会为公有子网创建一个路由表，其中包含本地路由和指向互联网网关的路由，并为每个私有子网创建一个路由表，其中包含本地路由和指向网关 VPC 端点的路由。

以下是公有子网的路由表示例，其中同时包含了 IPv4 和 IPv6 路由。如果您创建仅 IPv4 子网而不是双堆栈子网，则您的路由表中将仅包含 IPv4 路由。


| 目标位置 | 目标 | 
| --- | --- | 
| 10.0.0.0/16 | 本地 | 
| 2001:db8:1234:1a00::/56 | 本地 | 
| 0.0.0.0/0 | igw-id | 
| ::/0 | igw-id | 

以下是私有子网的路由表示例，其中同时包含了 IPv4 和 IPv6 本地路由。如果您创建仅 IPv4 子网，则您的路由表中将仅包含 IPv4 路由。最后一条路由会将指向 Amazon S3 的流量发送到网关 VPC 端点。


| 目标位置 | 目标 | 
| --- | --- | 
| 10.0.0.0/16 | 本地 | 
| 2001:db8:1234:1a00::/56 | 本地 | 
| s3-prefix-list-id | s3-gateway-id | 

### 安全性
<a name="security-vpc-public-private-subnets-multi-az"></a>

对于此示例配置，您必须为负载均衡器创建一个安全组，为 Web 服务器创建一个安全组，并且为数据库服务器创建一个安全组。

**负载均衡器**  
应用程序负载均衡器或网络负载均衡器的安全组必须允许来自负载均衡器侦听器端口上的客户端的入站流量。要接受来自互联网任何位置的流量，请指定 0.0.0.0/0 作为来源。负载均衡器安全组还必须在实例侦听器端口和运行状况检查端口上允许从负载均衡器到目标实例的出站流量。

**Web 服务器**  
以下安全组规则允许 Web 服务器接收来自负载均衡器的 HTTP 和 HTTPS 流量。您还可以选择允许 Web 服务器接收来自您网络的 SSH 或 RDP 流量。Web 服务器可将 SQL 或 MySQL 流量发送到数据库服务器。


| 来源 | 协议 | 端口范围 | 说明 | 
| --- | --- | --- | --- | 
| 负载均衡器安全组的 ID | TCP | 80 | 允许来自负载均衡器的入站 HTPP 访问 | 
| 负载均衡器安全组的 ID | TCP | 443 | 允许来自负载均衡器的入站 HTTPS 访问 | 
| 您网络的公有 IPv4 地址范围 | TCP | 22 | （可选）允许来自您网络中 IPv4 IP 地址的入站 SSH 访问 | 
| 您网络的 IPv6 地址范围 | TCP | 22 | （可选）允许来自您网络中 IPv6 IP 地址的入站 SSH 访问 | 
| 您网络的公有 IPv4 地址范围 | TCP | 3389 | （可选）允许来自您网络中 IPv4 IP 地址的入站 RDP 访问 | 
| 您网络的 IPv6 地址范围 | TCP | 3389 | （可选）允许来自您网络中 IPv6 IP 地址的入站 RDP 访问 | 


| 目标 | 协议 | 端口范围 | 说明 | 
| --- | --- | --- | --- | 
|  运行 Microsoft SQL Server 的实例的安全组 ID  |  TCP  |  1433  |  允许对数据库服务器进行出站 Microsoft SQL Server 访问  | 
|  运行 MySQL 的实例的安全组 ID  |  TCP  |  3306  |  允许对数据库服务器进行出站 MySQL 访问  | 

**数据库服务器**  
以下安全组规则允许数据库服务器接收来自 Web 服务器的读写请求。


| 来源 | 协议 | 端口范围 | 注释 | 
| --- | --- | --- | --- | 
| Web 服务器安全组的 ID | TCP | 1433 | 允许来自 Web 服务器的入站 Microsoft SQL Server 访问 | 
| Web 服务器安全组的 ID | TCP | 3306 | 允许来自 Web 服务器的入站 MySQL Server 访问 | 


| 目标 | 协议 | 端口范围 | 注释 | 
| --- | --- | --- | --- | 
| 0.0.0.0/0 | TCP | 80 | 允许通过 IPv4 到互联网的出站 HTTP 访问 | 
| 0.0.0.0/0 | TCP | 443 | 允许通过 IPv4 到互联网的出站 HTTPS 访问 | 

有关 Amazon RDS 数据库实例的安全组的更多信息，请参阅 *Amazon RDS 用户指南* 中的[使用安全组控制访问](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.RDSSecurityGroups.html)。

## 1. 创建 VPC
<a name="create-vpc-public-private-subnets-multi-az"></a>

按照以下过程创建在两个可用区内具有一个公有子网和一个私有子网的 VPC。

**创建 VPC**

1. 通过 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 打开 Amazon VPC 控制台。

1. 在控制面板上，选择**创建 VPC**。

1. 对于**要创建的资源**，选择 **VPC 等**。

1. 配置 VPC：

   1. 保持选中**名称标签自动生成**以为 VPC 资源创建名称标签，或者清除此选项以为 VPC 资源提供您自己的名称标签。

   1. 对于 **IPv4 CIDR 块**，您可以保留默认建议，也可以输入应用程序或网络所需的 CIDR 块。有关更多信息，请参阅 [VPC CIDR 块](vpc-cidr-blocks.md)。

   1. （可选）如果应用程序使用 IPv6 地址进行通信，则选择 **IPv6 CIDR 块**、**Amazon 提供的 IPv6 CIDR 块**。

   1. 选择**租赁**选项。此选项定义您启动到此 VPC 中的 EC2 实例是在与其他 AWS 账户 共享的硬件上运行，还是在专供您使用的硬件上运行。如果您选择将 VPC 的租赁设为 `Default`，则在此 VPC 中启动的 EC2 实例将使用您在启动实例时指定的租赁属性。有关更多信息，请参阅《*Amazon EC2 用户指南*》中的[使用定义的参数启动实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)。如果您选择 VPC 的租赁为 `Dedicated`，则这些实例将始终在专供您使用的硬件上作为[专用实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html)运行。

1. 配置子网：

   1. 对于**可用区数量**，选择 **2**，这样您可以在两个可用区中启动实例，以提高故障恢复能力。

   1. 对于**Number of public subnets**（公有子网数量），选择 **2**。

   1. 对于 **Number of private subnets**（私有子网数量），选择 **2**。

   1. 您可以保留子网的默认 CIDR 块，也可以展开**自定义子网 CIDR 块**并输入 CIDR 块。有关更多信息，请参阅 [子网 CIDR 块](subnet-sizing.md)。

1. 对于 **NAT 网关**，请保留默认值（**无**）。

1. 对于 **VPC 端点**，请保留默认值（**S3 网关**）。除非您要访问 S3 存储桶，此设置不会产生任何影响，不过启用此 VPC 端点是免费的。

1. 对于 **DNS 选项**，请同时选中这两个选项。这样可确保 Web 服务器会收到与其公有 IP 地址对应的公有 DNS 主机名。

1. 选择**创建 VPC**。

## 2. 部署您的应用程序
<a name="deploy-web-database-servers"></a>

理想情况下，您已经在开发或测试环境中测试了 Web 服务器和数据库服务器，并创建了用于在生产环境中部署应用程序的脚本或映像。

您可以使用 EC2 实例来部署 Web 服务器。您可以通过多种方式来部署 EC2 实例。例如：
+ [Amazon EC2 启动实例向导](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/)
+ [Amazon Elastic Container Service（Amazon ECS）](https://docs.aws.amazon.com/ecs/)

为了提高可用性，您可以使用 [Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/) 在多个可用区中部署服务器，并保持应用程序所需的最低服务器容量。

您可以使用 [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/) 在服务器之间均衡地分配流量。将负载均衡器附加到自动扩缩组。

您可以使用 EC2 实例来部署数据库服务器，也可以使用我们的任何一种专用数据库。有关更多信息，请参阅 [AWS 上的数据库：如何选择](https://docs.aws.amazon.com/documentation/latest/databases-on-aws-how-to-choose/)。

## 3. 测试配置
<a name="test-web-database-servers"></a>

完成应用程序部署后，您可以对其进行测试。如果应用程序无法按照预期发送或接收流量，您可以使用 Reacability Analyzer 来帮助排查问题。例如，Reachability Analyzer 可以识别路由表或安全组配置问题。有关更多信息，请参阅 [Reachability Analyzer 角色指南](https://docs.aws.amazon.com/vpc/latest/reachability/)。

## 4. 清理
<a name="clean-up-web-database-servers"></a>

完成此配置后，您可以将其删除。您必须首先终止实例并删除负载均衡器，然后才能删除 VPC。有关更多信息，请参阅 [删除您的 VPC](delete-vpc.md)。