

# 使用 Amazon Aurora 的跨 VPC 克隆
<a name="Aurora.Managing.Clone.Cross-VPC"></a>

 假设您要对原始集群和克隆群施加不同的网络访问控制。例如，使用克隆功能，您可以在不同 VPC 中创建生产 Aurora 集群的副本，以供开发和测试之用。或者，在从公有子网迁移到私有子网的过程中，您也可以创建克隆，用于增强数据库的安全性。

 以下各节演示如何为克隆设置网络配置，使得原始集群和克隆集群都可以访问相同的 Aurora 存储节点，即使这些节点来自不同的子网或不同的 VPC，也可以访问。预先验证网络资源，可以避免在克隆过程中出现可能难以诊断的错误。

 如果您不熟悉 Aurora 如何与 VPC、子网和数据库子网组交互，请先参阅 [Amazon VPC 和 Amazon Aurora](USER_VPC.md)。您可以按照该部分中的教程，在 AWS 管理控制台中创建这些类型的资源，并了解这些资源如何组合在一起。

 由于这些步骤涉及在 RDS 和 EC2 服务之间切换，因此示例使用 AWS 命令行界面命令，来帮助您了解如何自动执行此类操作并保存输出。

**Topics**
+ [开始前的准备工作](#before-you-begin)
+ [收集有关网络环境的信息](#gathering-information-about-the-network-environment)
+ [为克隆集群创建网络资源](#creating-network-resources-for-the-clone)
+ [使用新的网络设置创建 Aurora 克隆](#creating-an-aurora-clone-with-new-network-settings)
+ [将集群从公有子网移动到私有子网](#moving-a-cluster-from-public-subnets-to-private-ones)
+ [创建跨 VPC 克隆的端到端示例](#end-to-end-example-of-creating-a-cross-vpc-clone)

## 开始前的准备工作
<a name="before-you-begin"></a>

 在您开始设置跨 VPC 克隆之前，请确保具有以下资源：
+  用作克隆的源的 Aurora 数据库集群。如果这是您首次创建 Aurora 数据库集群，请参阅[开始使用 Amazon Aurora](CHAP_GettingStartedAurora.md) 中的教程，使用 MySQL 或 PostgreSQL 数据库引擎设置集群。
+  第二个 VPC（如果您打算创建跨 VPC 克隆）。如果您没有可用于克隆的 VPC，请参阅[教程：创建 VPC 以用于数据库集群（仅限 IPv4）](CHAP_Tutorials.WebServerDB.CreateVPC.md)或[教程：创建 VPC 以用于数据库集群（双堆栈模式）](CHAP_Tutorials.CreateVPCDualStack.md)。

## 收集有关网络环境的信息
<a name="gathering-information-about-the-network-environment"></a>

 使用跨 VPC 克隆时，原始集群与其克隆集群之间的网络环境可能会有很大不同。在创建克隆之前，请您收集并记录有关原始集群中使用的 VPC、子网、数据库子网组和可用区的信息。这样，您就可以尽可能减少出现问题的可能性。如果出现了网络问题，您无需中断任何故障排除活动即可搜索诊断信息。以下各个部分说明了收集这些类型信息的 CLI 示例。在创建克隆和进行任何故障排除时，您可以将详细信息保存为任意便于查阅的格式。
+  [步骤 1：检查原始集群的可用区](#cross-vpc-cloning-check-original-azs) 
+  [步骤 2：检查原始集群的数据库子网组](#cross-vpc-cloning-check-original-subnet-group) 
+  [步骤 3：检查原始集群的子网](#cross-vpc-cloning-check-original-subnets) 
+  [步骤 4：检查原始集群中数据库实例的可用区](#cross-vpc-cloning-check-original-instance-azs) 
+  [第 5 步：检查可用于克隆集群的 VPC](#cross-vpc-cloning-check-vpcs) 

### 步骤 1：检查原始集群的可用区
<a name="cross-vpc-cloning-check-original-azs"></a>

 在创建克隆之前，请核实原始集群将哪些可用区用于其存储。如 [Amazon Aurora 存储](Aurora.Overview.StorageReliability.md)中所述，每个 Aurora 集群的存储都与三个且仅与三个可用区相关联。由于 [Amazon Aurora 数据库集群](Aurora.Overview.md)利用了计算和存储分离的优势，因此无论在集群中具有多少个实例，此规则都适用。

 例如，运行类似下文的 CLI 命令，将 `my_cluster` 替换为您自己的集群名称。以下示例生成按可用区名称的字母顺序排序的列表。

```
aws rds describe-db-clusters \
  --db-cluster-identifier my_cluster \
  --query 'sort_by(*[].AvailabilityZones[].{Zone:@},&Zone)' \
  --output text
```

 以下示例说明了前述 `describe-db-clusters` 命令的示例输出。它表明 Aurora 集群的存储始终使用三个可用区。

```
us-east-1c
us-east-1d
us-east-1e
```

 要在没有足够资源连接到这些可用区的网络环境中创建克隆，您必须创建与其中至少两个可用区关联的子网，然后创建包含这两个或三个子网的数据库子网组。下面的示例演示了如何操作。

### 步骤 2：检查原始集群的数据库子网组
<a name="cross-vpc-cloning-check-original-subnet-group"></a>

 如果您要为克隆集群使用与原始集群相同数量的子网，则可以从原始集群的数据库子网组中获取子网的数量。Aurora 数据库子网组至少包含两个子网，每个子网都与不同的可用区关联。记下子网与哪些可用区关联。

 以下示例演示如何查找原始集群的数据库子网组，然后逆向推导出对应的可用区。将第一个命令中的 `my_cluster` 替换为您的集群名称。将第二个命令中的 `my_subnet` 替换为数据库子网组的名称。

```
aws rds describe-db-clusters --db-cluster-identifier my_cluster \
  --query '*[].DBSubnetGroup' --output text

aws rds describe-db-subnet-groups --db-subnet-group-name my_subnet_group \
  --query '*[].Subnets[].[SubnetAvailabilityZone.Name]' --output text
```

 对于其数据库子网组包含两个子网的集群，示例输出可能类似于以下内容。在本例中，`two-subnets` 是创建数据库子网组时指定的名称。

```
two-subnets

us-east-1d
us-east-1c
```

 对于数据库子网组包含三个子网的集群，输出可能类似于下文。

```
three-subnets

us-east-1f
us-east-1d
us-east-1c
```

### 步骤 3：检查原始集群的子网
<a name="cross-vpc-cloning-check-original-subnets"></a>

 如果您需要有关原始集群中子网的更多详细信息，请运行类似于下文的 AWS 命令行界面命令。您可以检查子网属性，例如 IP 地址范围、所有者等。这样，您就可以确定是使用同一个 VPC 中的不同子网，还是在不同的 VPC 中创建具有相似特性的子网。

 查找您的 VPC 中所有可用子网的子网 ID。

```
aws ec2 describe-subnets --filters Name=vpc-id,Values=my_vpc \
  --query '*[].[SubnetId]' --output text
```

 查找在您的数据库子网组中所使用的那些子网。

```
aws rds describe-db-subnet-groups --db-subnet-group-name my_subnet_group \
  --query '*[].Subnets[].[SubnetIdentifier]' --output text
```

 然后在列表中指定要调查的子网，如以下命令所示。用您的子网名称替换 `my_subnet_1`，依此类推。

```
aws ec2 describe-subnets \
  --subnet-ids '["my_subnet_1","my_subnet2","my_subnet3"]'
```

 以下示例说明了此类 `describe-subnets` 命令的部分输出。输出显示了您可以查看的每个子网的一些重要属性，例如与其关联的可用区和所属的 VPC。

```
{
    'Subnets': [
        {
            'AvailabilityZone': 'us-east-1d',
            'AvailableIpAddressCount': 54,
            'CidrBlock': '10.0.0.64/26',
            'State': 'available',
            'SubnetId': 'subnet-000a0bca00e0b0000',
            'VpcId': 'vpc-3f3c3fc3333b3ffb3',
            ...
        },
        {
            'AvailabilityZone': 'us-east-1c',
            'AvailableIpAddressCount': 55,
            'CidrBlock': '10.0.0.0/26',
            'State': 'available',
            'SubnetId': 'subnet-4b4dbfe4d4a4fd4c4',
            'VpcId': 'vpc-3f3c3fc3333b3ffb3',
            ...
```

### 步骤 4：检查原始集群中数据库实例的可用区
<a name="cross-vpc-cloning-check-original-instance-azs"></a>

 您可以使用此过程来了解原始集群中用于数据库实例的可用区。这样，您就可以为克隆集群中的数据库实例设置完全相同的可用区。您还可以根据克隆集群用于生产环境还是开发和测试等，在克隆集群中增加或减少数据库实例的数量。

 对于原始集群中的每个实例，运行类似于下文的命令。请确保该实例已完成创建，并且首先处于 `Available` 状态。将 `my_instance` 替换为实例标识符。

```
aws rds describe-db-instances --db-instance-identifier my_instance \
  --query '*[].AvailabilityZone' --output text
```

 下面的示例显示了运行前述 `describe-db-instances` 命令的输出。Aurora 集群有四个数据库实例。因此，我们运行该命令四次，每次都替换为不同的数据库实例标识符。输出显示了这些数据库实例如何分布在最多三个可用区中。

```
us-east-1a
us-east-1c
us-east-1d
us-east-1a
```

 创建克隆集群并向其添加数据库实例后，您可以在 `create-db-instance` 命令中指定这些相同的可用区名称。您可以采用这种做法来设置数据库实例，以便在新集群中配置与原始集群中完全相同的可用区。

### 第 5 步：检查可用于克隆集群的 VPC
<a name="cross-vpc-cloning-check-vpcs"></a>

 如果您打算在与原始集群不同的 VPC 中创建克隆集群，则可以获取对您账户可用的 VPC ID 列表。如果您需要在与原始集群相同的 VPC 中创建任何额外的子网，也可以执行此步骤。运行命令创建子网时，您需要指定 VPC ID 作为参数。

 要列出对您账户可用的所有 VPC，请运行以下 CLI 命令：

```
aws ec2 describe-vpcs --query '*[].[VpcId]' --output text
```

 以下示例说明了前述 `describe-vpcs` 命令的示例输出。输出显示当前 AWS 账户中有四个 VPC，可以用作跨 VPC 克隆的源或目标。

```
vpc-fd111111
vpc-2222e2cd2a222f22e
vpc-33333333a33333d33
vpc-4ae4d4de4a4444dad
```

 您可以将同一个 VPC 作为克隆集群的目标，也可以使用不同的 VPC。如果原始集群和克隆集群位于同一个 VPC 中，则可以为克隆集群重复使用相同的数据库子网组。您也可以创建不同的数据库子网组。例如，新的数据库子网组可能会使用私有子网，而原始集群的数据库子网组可能使用的是公有子网。如果您在不同的 VPC 中创建克隆集群，请确保新 VPC 中有足够的子网，并且这些子网与原始集群中的正确可用区相关联。

## 为克隆集群创建网络资源
<a name="creating-network-resources-for-the-clone"></a>

 如果在收集网络信息时，您发现克隆集群需要额外的网络资源，则可以先创建这些资源，然后再尝试设置克隆集群。例如，您可能需要创建更多子网、将子网与特定可用区关联或创建新数据库子网组。
+  [步骤 1：为克隆集群创建子网](#cross-vpc-cloning-create-clone-subnets) 
+  [步骤 2：为克隆集群创建数据库子网组](#cross-vpc-cloning-create-subnet-group) 

### 步骤 1：为克隆集群创建子网
<a name="cross-vpc-cloning-create-clone-subnets"></a>

 如果您需要为克隆集群创建新的子网，请运行类似下文的命令。在不同的 VPC 中创建克隆集群或者进行了其他网络更改（例如使用私有子网而非公有子网）时，您可能需要执行此操作。

 AWS 会自动生成子网的 ID。将 `my_vpc` 替换为克隆集群的 VPC 的名称。为 `--cidr-block` 选项选择地址范围，允许范围内至少有 16 个 IP 地址。您可以包括要指定的任何其他属性。运行命令 `aws ec2 create-subnet help` 以查看所有选项。

```
aws ec2 create-subnet --vpc-id my_vpc \
  --availability-zone AZ_name --cidr-block IP_range
```

 以下示例显示了新创建子网的一些重要属性。

```
{
    'Subnet': {
        'AvailabilityZone': 'us-east-1b',
        'AvailableIpAddressCount': 59,
        'CidrBlock': '10.0.0.64/26',
        'State': 'available',
        'SubnetId': 'subnet-44b4a44f4e44db444',
        'VpcId': 'vpc-555fc5df555e555dc',
        ...
        }
}
```

### 步骤 2：为克隆集群创建数据库子网组
<a name="cross-vpc-cloning-create-subnet-group"></a>

 如果您要在不同的 VPC 中创建克隆集群，或者使用同一 VPC 内的一组不同的子网，则您可以创建一个新的数据库子网组，然后在创建克隆集群时指定该子网组。

 请确保您了解以下所有详细信息。您可从前面示例的输出中找到所有这些信息。

1.  原始集群的 VPC。有关说明，请参阅 [步骤 3：检查原始集群的子网](#cross-vpc-cloning-check-original-subnets)。

1.  克隆集群的 VPC（当您在不同的 VPC 中创建克隆集群时）。有关说明，请参阅 [第 5 步：检查可用于克隆集群的 VPC](#cross-vpc-cloning-check-vpcs)。

1.  与原始集群的 Aurora 存储相关联的三个可用区。有关说明，请参阅 [步骤 1：检查原始集群的可用区](#cross-vpc-cloning-check-original-azs)。

1.  与原始集群的数据库子网组关联的两个或三个可用区。有关说明，请参阅 [步骤 2：检查原始集群的数据库子网组](#cross-vpc-cloning-check-original-subnet-group)。

1.  您打算用于克隆集群的 VPC 中所有子网的子网 ID 和关联可用区。使用与[步骤 3：检查原始集群的子网](#cross-vpc-cloning-check-original-subnets)中相同的 `describe-subnets` 命令，替换目标 VPC 的 VPC ID。

 检查有多少个可用区既与原始集群的存储相关联，又与目标 VPC 中的子网相关联。要成功创建克隆集群，必须有两个或三个共同的可用区。如果共同可用区少于两个，请返回到[步骤 1：为克隆集群创建子网](#cross-vpc-cloning-create-clone-subnets)。创建一个、两个或三个新的子网，这些子网关联到与原始集群存储相关联的可用区。

 在目标 VPC 中选择子网，这些子网应关联到与原始集群中的 Aurora 存储关联的相同可用区。理想情况下，选择三个可用区。采用这种做法，克隆集群的数据库实例可以尽可能灵活地分布到多个可用区，从而实现计算资源的高可用性。

 运行类似下文的命令来创建新的数据库子网组。替换为您在列表中的子网 ID。如果您使用环境变量指定子网 ID，请注意在括起 `--subnet-ids` 参数列表时，要保留 ID 两边的双引号。

```
aws rds create-db-subnet-group --db-subnet-group-name my_subnet_group \
  --subnet-ids '["my_subnet_1","my_subnet_2","my_subnet3"]' \
  --db-subnet-group-description 'DB subnet group with 3 subnets for clone'
```

 下面的示例显示了 `create-db-subnet-group` 命令的部分输出。

```
{
    'DBSubnetGroup': {
        'DBSubnetGroupName': 'my_subnet_group',
        'DBSubnetGroupDescription': 'DB subnet group with 3 subnets for clone',
        'VpcId': 'vpc-555fc5df555e555dc',
        'SubnetGroupStatus': 'Complete',
        'Subnets': [
            {
                'SubnetIdentifier': 'my_subnet_1',
                'SubnetAvailabilityZone': {
                    'Name': 'us-east-1c'
                },
                'SubnetStatus': 'Active'
            },
            {
                'SubnetIdentifier': 'my_subnet_2',
                'SubnetAvailabilityZone': {
                    'Name': 'us-east-1d'
                },
                'SubnetStatus': 'Active'
            }
            ...
        ],
        'SupportedNetworkTypes': [
            'IPV4'
        ]
    }
}
```

 此时，您还没有实际创建克隆。您已创建所有相关的 VPC 和子网资源，这样在创建克隆集群时，您可以为 `restore-db-cluster-to-point-in-time` 和 `create-db-instance` 命令指定相应的参数。

## 使用新的网络设置创建 Aurora 克隆
<a name="creating-an-aurora-clone-with-new-network-settings"></a>

 在您确保 VPC、子网、可用区和子网组的配置正确且可供新集群使用时，就可以执行实际的克隆操作了。以下 CLI 示例重点介绍在设置克隆及其数据库实例时，您在命令中指定的选项，例如 `--db-subnet-group-name`、`--availability-zone` 和 `--vpc-security-group-ids`。
+  [步骤 1：为克隆集群指定数据库子网组](#cross-vpc-cloning-specify-clone-subnet-group) 
+  [步骤 2：为克隆集群中的实例指定网络设置](#cross-vpc-cloning-configure-clone-instance-network) 
+  [步骤 3：建立从客户端系统到克隆集群的连接](#cross-vpc-cloning-connect-to-clone) 

### 步骤 1：为克隆集群指定数据库子网组
<a name="cross-vpc-cloning-specify-clone-subnet-group"></a>

 创建克隆时，您可以通过指定数据库子网组来正确配置所有 VPC、子网和可用区设置。使用前面示例中的命令来验证进入数据库子网组的所有关系和映射。

 例如，以下命令用于将原始集群克隆到克隆集群。在第一个示例中，源集群与两个子网关联，克隆集群与三个子网关联。第二个示例显示了相反的情况，即从具有三个子网的集群克隆到具有两个子网的集群。

```
aws rds restore-db-cluster-to-point-in-time \
  --source-db-cluster-identifier cluster-with-3-subnets \
  --db-cluster-identifier cluster-cloned-to-2-subnets \
  --restore-type copy-on-write --use-latest-restorable-time \
  --db-subnet-group-name two-subnets
```

 如果您打算在克隆集群中使用 Aurora Serverless v2 实例，请在创建克隆时提供 `--serverless-v2-scaling-configuration` 选项，如下所示。这样做可以让您在克隆集群中创建数据库实例时使用 `db.serverless` 类。您也可以在以后修改克隆集群来添加此扩展配置属性。此示例中的容量数字允许集群中的每个 Serverless v2 实例在 2 到 32 个 Aurora 容量单位（ACU，Aurora Capacity Unit）之间扩展。有关 Aurora Serverless v2 功能以及如何选择容量范围的信息，请参阅[使用 Aurora Serverless v2](aurora-serverless-v2.md)。

```
aws rds restore-db-cluster-to-point-in-time \
  --source-db-cluster-identifier cluster-with-2-subnets \
  --db-cluster-identifier cluster-cloned-to-3-subnets \
  --restore-type copy-on-write --use-latest-restorable-time \
  --db-subnet-group-name three-subnets \
  --serverless-v2-scaling-configuration 'MinCapacity=2,MaxCapacity=32'
```

 无论数据库实例使用多少个子网，源集群和克隆集群的 Aurora 存储都与三个可用区相关联。以下示例针对前面示例中的两个 `restore-db-cluster-to-point-in-time` 命令，列出了与源集群和克隆集群关联的可用区。

```
aws rds describe-db-clusters --db-cluster-identifier cluster-with-3-subnets \
  --query 'sort_by(*[].AvailabilityZones[].{Zone:@},&Zone)' --output text

us-east-1c
us-east-1d
us-east-1f

aws rds describe-db-clusters --db-cluster-identifier cluster-cloned-to-2-subnets \
  --query 'sort_by(*[].AvailabilityZones[].{Zone:@},&Zone)' --output text

us-east-1c
us-east-1d
us-east-1f

aws rds describe-db-clusters --db-cluster-identifier cluster-with-2-subnets \
  --query 'sort_by(*[].AvailabilityZones[].{Zone:@},&Zone)' --output text

us-east-1a
us-east-1c
us-east-1d

aws rds describe-db-clusters --db-cluster-identifier cluster-cloned-to-3-subnets \
  --query 'sort_by(*[].AvailabilityZones[].{Zone:@},&Zone)' --output text

us-east-1a
us-east-1c
us-east-1d
```

 由于每一对原始集群和克隆集群之间至少有两个可用区重叠，因此两个集群都可以访问相同的底层 Aurora 存储。

### 步骤 2：为克隆集群中的实例指定网络设置
<a name="cross-vpc-cloning-configure-clone-instance-network"></a>

 在克隆集群中创建数据库实例时，默认情况下，它们会继承集群本身的数据库子网组。这样，Aurora 就会自动将每个实例分配到一个特定的子网，并在与该子网关联的可用区中创建实例。这种选择非常方便，尤其是对于开发和测试系统，因为您在向克隆中添加新实例时，不必跟踪子网 ID 或可用区。

 或者，您可以在为克隆集群创建 Aurora 数据库实例时指定可用区。您指定的可用区必须来自与克隆集群关联的一组可用区。如果您用于克隆集群的数据库子网组仅包含两个子网，则您只能从与这两个子网关联的可用区中进行选择。这种选择为高可用性系统提供了灵活性和韧性，因为您可以确保写入器实例和备用读取器实例位于不同的可用区中。或者，如果您向集群添加其他读取器，则可以确保它们分布在三个可用区中。这样，即使在极少的情况下可用区出现了故障，您在另外两个可用区中仍然有一个写入器实例和另一个读取器实例。

 以下示例将预置的数据库实例添加到使用自定义数据库子网组的克隆 Aurora PostgreSQL 集群。

```
aws rds create-db-instance --db-cluster-identifier my_aurora_postgresql_clone \
  --db-instance-identifier my_postgres_instance \
  --db-subnet-group-name my_new_subnet \
  --engine aurora-postgresql \
  --db-instance-class db.t4g.medium
```

 以下示例说明了此命令的部分输出。

```
{
  'DBInstanceIdentifier': 'my_postgres_instance',
  'DBClusterIdentifier': 'my_aurora_postgresql_clone',
  'DBInstanceClass': 'db.t4g.medium',
  'DBInstanceStatus': 'creating'
  ...
}
```

 以下示例将 Aurora Serverless v2 数据库实例添加到使用自定义数据库子网组的 Aurora MySQL 克隆集群中。为了能够使用 Serverless v2 实例，请确保为 `restore-db-cluster-to-point-in-time` 命令指定 `--serverless-v2-scaling-configuration` 选项，如前面的示例所示。

```
aws rds create-db-instance --db-cluster-identifier my_aurora_mysql_clone \
  --db-instance-identifier my_mysql_instance \
  --db-subnet-group-name my_other_new_subnet \
  --engine aurora-mysql \
  --db-instance-class db.serverless
```

 以下示例说明了此命令的部分输出。

```
{
  'DBInstanceIdentifier': 'my_mysql_instance',
  'DBClusterIdentifier': 'my_aurora_mysql_clone',
  'DBInstanceClass': 'db.serverless',
  'DBInstanceStatus': 'creating'
  ...
}
```

### 步骤 3：建立从客户端系统到克隆集群的连接
<a name="cross-vpc-cloning-connect-to-clone"></a>

 如果您已经从客户端系统连接到 Aurora 集群，则可能需要允许对新克隆集群使用相同类型的连接。例如，您可能从 Amazon Cloud9 实例或 EC2 实例连接到原始集群。要允许来自相同客户端系统或您在目标 VPC 中创建的新客户端系统的连接，请设置与 VPC 中等同的数据库子网组和 VPC 安全组。然后，在创建克隆集群时指定子网组和安全组。

 以下示例设置 Aurora Serverless v2 克隆集群。该配置基于创建数据库集群时 `--engine-mode provisioned` 和 `--serverless-v2-scaling-configuration` 的组合，然后在集群中创建每个数据库实例使用 `--db-instance-class db.serverless`。`provisioned` 引擎模式是默认模式，因此如果您首选该模式，可以省略该选项。

```
aws rds restore-db-cluster-to-point-in-time \
  --source-db-cluster-identifier serverless-sql-postgres\
  --db-cluster-identifier serverless-sql-postgres-clone \
  --db-subnet-group-name 'default-vpc-1234' \
  --vpc-security-group-ids 'sg-4567' \
  --serverless-v2-scaling-configuration 'MinCapacity=0.5,MaxCapacity=16' \
  --restore-type copy-on-write \
  --use-latest-restorable-time
```

 然后，在克隆集群中创建数据库实例时，请指定相同的 `--db-subnet-group-name` 选项。或者，您可以提供 `--availability-zone` 选项并指定与该子网组中子网关联的可用区之一。此可用区还必须是与原始集群关联的可用区之一。

```
aws rds create-db-instance \
  --db-cluster-identifier serverless-sql-postgres-clone \
  --db-instance-identifier serverless-sql-postgres-clone-instance \
  --db-instance-class db.serverless \
  --db-subnet-group-name 'default-vpc-987zyx654' \
  --availability-zone 'us-east-1c' \
  --engine aurora-postgresql
```

## 将集群从公有子网移动到私有子网
<a name="moving-a-cluster-from-public-subnets-to-private-ones"></a>

 您可以使用克隆在公有子网和私有子网之间移动集群。在将应用程序部署到生产环境之前，要为其添加额外的安全层时，您可以执行此操作。在本示例中，在开始 Aurora 的克隆过程之前，您应该已经设置好私有子网和 NAT 网关。

 对于涉及 Aurora 的步骤，您可以按照前面示例中的相同常规步骤操作，以便[收集有关网络环境的信息](#gathering-information-about-the-network-environment)和[使用新的网络设置创建 Aurora 克隆](#creating-an-aurora-clone-with-new-network-settings)。主要区别在于，即使您有映射到原始集群中所有可用区的公有子网，现在您也必须验证 Aurora 集群是否有足够的私有子网，以及这些子网是否与原始集群中用于 Aurora 存储的相同的所有可用区关联。与其他克隆应用场景类似，您可以为克隆生成数据库子网组，在子网组中包括与所需可用区关联的两个或三个私有子网。但是，如果您在数据库子网组中使用两个私有子网，则必须有第三个私有子网，该子网与原始集群中用于 Aurora 存储的第三个可用区相关联。

 您可以查阅此清单，验证是否满足执行此类克隆操作的所有要求。
+  记录与原始集群关联的三个可用区。有关说明，请参阅 [步骤 1：检查原始集群的可用区](#cross-vpc-cloning-check-original-azs)。
+  记录与原始集群的数据库子网组中公有子网关联的两个或三个可用区。有关说明，请参阅 [步骤 3：检查原始集群的子网](#cross-vpc-cloning-check-original-subnets)。
+  创建映射到与原始集群关联的全部三个可用区的私有子网。此外还需要完成与私有子网通信所需的任何其他联网设置，例如创建 NAT 网关。有关说明，请参阅《Amazon Virtual Private Cloud 用户指南》**中的[创建子网](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html)。
+  创建一个新数据库子网组，其中包含三个或两个私有子网，这些子网一开始就与可用区关联。有关说明，请参阅 [步骤 2：为克隆集群创建数据库子网组](#cross-vpc-cloning-create-subnet-group)。

 满足所有先决条件后，您可以在创建克隆集群时暂停原始集群上的数据库活动，然后切换应用程序来使用克隆集群。在创建了克隆集群并确认可以连接到克隆集群、运行应用程序代码等之后，您可以停止使用原始集群。

## 创建跨 VPC 克隆的端到端示例
<a name="end-to-end-example-of-creating-a-cross-vpc-clone"></a>

 在与原始集群不同的 VPC 中创建克隆集群时，所使用的常规步骤与前面的示例相同。因为 VPC ID 是子网的一个属性，所以在运行任何 RDS CLI 命令时，您无需指定 VPC ID 作为参数。主要区别在于，您更可能需要创建新的子网，将新子网映射到特定可用区，创建 VPC 安全组和新的数据库子网组。如果这是您在该 VPC 中创建的第一个 Aurora 集群，则尤其如此。

 您可以查阅此清单，验证是否满足执行此类克隆操作的所有要求。
+  记录与原始集群关联的三个可用区。有关说明，请参阅 [步骤 1：检查原始集群的可用区](#cross-vpc-cloning-check-original-azs)。
+  记录与原始集群的数据库子网组中子网关联的两个或三个可用区。有关说明，请参阅 [步骤 2：检查原始集群的数据库子网组](#cross-vpc-cloning-check-original-subnet-group)。
+  创建映射到与原始集群关联的全部三个可用区的子网。有关说明，请参阅 [步骤 1：为克隆集群创建子网](#cross-vpc-cloning-create-clone-subnets)。
+  针对客户端系统、应用程序服务器等，执行与克隆集群中的数据库实例进行通信所需的任何其他联网设置，例如设置 VPC 安全组。有关说明，请参阅 [使用安全组控制访问权限](Overview.RDSSecurityGroups.md)。
+  创建一个新数据库子网组，其中包含三个或两个子网，这些子网一开始就与可用区关联。有关说明，请参阅 [步骤 2：为克隆集群创建数据库子网组](#cross-vpc-cloning-create-subnet-group)。

 满足所有先决条件后，您可以在创建克隆集群时暂停原始集群上的数据库活动，然后切换应用程序来使用克隆集群。在创建了克隆集群并确认可以连接到克隆集群、运行应用程序代码等之后，您可以考虑是保持原始集群和克隆集群继续运行，还是停止使用原始集群。

 以下 Linux 示例说明了将 Aurora 数据库集群从一个 VPC 克隆到另一个 VPC 的 AWS 命令行界面操作顺序。命令输出中没有显示与示例无关的一些字段。

 首先，我们检查源和目标 VPC 的 ID。在 VPC 元数据中，您在创建 VPC 时为其分配的描述性名称表示为标签。

```
$ aws ec2 describe-vpcs --query '*[].[VpcId,Tags]'
[
    [
        'vpc-0f0c0fc0000b0ffb0',
        [
            {
                'Key': 'Name',
                'Value': 'clone-vpc-source'
            }
        ]
    ],
    [
        'vpc-9e99d9f99a999bd99',
        [
            {
                'Key': 'Name',
                'Value': 'clone-vpc-dest'
            }
        ]
    ]
]
```

 源 VPC 中已存在原始集群。要使用 Aurora 存储的同一组可用区来设置克隆集群，我们需要检查原始集群使用的可用区。

```
$ aws rds describe-db-clusters --db-cluster-identifier original-cluster \
  --query 'sort_by(*[].AvailabilityZones[].{Zone:@},&Zone)' --output text

us-east-1c
us-east-1d
us-east-1f
```

 我们需要确保存在与原始集群使用的可用区相对应的子网：`us-east-1c`、`us-east-1d` 和 `us-east-1f`。

```
$ aws ec2 create-subnet --vpc-id vpc-9e99d9f99a999bd99 \
  --availability-zone us-east-1c --cidr-block 10.0.0.128/28
{
    'Subnet': {
        'AvailabilityZone': 'us-east-1c',
        'SubnetId': 'subnet-3333a33be3ef3e333',
        'VpcId': 'vpc-9e99d9f99a999bd99',
    }
}

$ aws ec2 create-subnet --vpc-id vpc-9e99d9f99a999bd99 \
--availability-zone us-east-1d --cidr-block 10.0.0.160/28
{
    'Subnet': {
        'AvailabilityZone': 'us-east-1d',
        'SubnetId': 'subnet-4eeb444cd44b4d444',
        'VpcId': 'vpc-9e99d9f99a999bd99',
    }
}

$ aws ec2 create-subnet --vpc-id vpc-9e99d9f99a999bd99 \
--availability-zone us-east-1f --cidr-block 10.0.0.224/28
{
    'Subnet': {
        'AvailabilityZone': 'us-east-1f',
        'SubnetId': 'subnet-66eea6666fb66d66c',
        'VpcId': 'vpc-9e99d9f99a999bd99',
    }
}
```

 此示例确认了目标 VPC 中存在映射到所需可用区的子网。

```
aws ec2 describe-subnets --query 'sort_by(*[] | [?VpcId == `vpc-9e99d9f99a999bd99`] |
[].{SubnetId:SubnetId,VpcId:VpcId,AvailabilityZone:AvailabilityZone}, &AvailabilityZone)' --output table

---------------------------------------------------------------------------
|                             DescribeSubnets                             |
+------------------+----------------------------+-------------------------+
| AvailabilityZone |         SubnetId           |          VpcId          |
+------------------+----------------------------+-------------------------+
|  us-east-1a      |  subnet-000ff0e00000c0aea  |  vpc-9e99d9f99a999bd99  |
|  us-east-1b      |  subnet-1111d111111ca11b1  |  vpc-9e99d9f99a999bd99  |
|  us-east-1c      | subnet-3333a33be3ef3e333   |  vpc-9e99d9f99a999bd99  |
|  us-east-1d      | subnet-4eeb444cd44b4d444   |  vpc-9e99d9f99a999bd99  |
|  us-east-1f      | subnet-66eea6666fb66d66c   |  vpc-9e99d9f99a999bd99  |
+------------------+----------------------------+-------------------------+
```

 在 VPC 中创建 Aurora 数据库集群之前，您必须有一个数据库子网组，其子网映射到用于 Aurora 存储的可用区。创建常规集群时，您可以使用任意三个可用区的组合。克隆现有集群时，子网组必须与用于 Aurora 存储的三个可用区中的至少两个相匹配。

```
$ aws rds create-db-subnet-group \
  --db-subnet-group-name subnet-group-in-other-vpc \
  --subnet-ids '["subnet-3333a33be3ef3e333","subnet-4eeb444cd44b4d444","subnet-66eea6666fb66d66c"]' \
  --db-subnet-group-description 'DB subnet group with 3 subnets: subnet-3333a33be3ef3e333,subnet-4eeb444cd44b4d444,subnet-66eea6666fb66d66c'

{
    'DBSubnetGroup': {
        'DBSubnetGroupName': 'subnet-group-in-other-vpc',
        'DBSubnetGroupDescription': 'DB subnet group with 3 subnets: subnet-3333a33be3ef3e333,subnet-4eeb444cd44b4d444,subnet-66eea6666fb66d66c',
        'VpcId': 'vpc-9e99d9f99a999bd99',
        'SubnetGroupStatus': 'Complete',
        'Subnets': [
            {
                'SubnetIdentifier': 'subnet-4eeb444cd44b4d444',
                'SubnetAvailabilityZone': { 'Name': 'us-east-1d' }
            },
            {
                'SubnetIdentifier': 'subnet-3333a33be3ef3e333',
                'SubnetAvailabilityZone': { 'Name': 'us-east-1c' }
            },
            {
                'SubnetIdentifier': 'subnet-66eea6666fb66d66c',
                'SubnetAvailabilityZone': { 'Name': 'us-east-1f' }
            }
        ]
    }
}
```

 现在，子网和数据库子网组已准备就绪。以下示例说明了用于克隆集群的 `restore-db-cluster-to-point-in-time`。`--db-subnet-group-name` 选项将克隆集群与正确的子网组相关联，这些子网映射到原始集群中正确的一组可用区。

```
$ aws rds restore-db-cluster-to-point-in-time \
  --source-db-cluster-identifier original-cluster \
  --db-cluster-identifier clone-in-other-vpc \
  --restore-type copy-on-write --use-latest-restorable-time \
  --db-subnet-group-name subnet-group-in-other-vpc

{
  'DBClusterIdentifier': 'clone-in-other-vpc',
  'DBSubnetGroup': 'subnet-group-in-other-vpc',
  'Engine': 'aurora-postgresql',
  'EngineVersion': '15.4',
  'Status': 'creating',
  'Endpoint': 'clone-in-other-vpc.cluster-c0abcdef.us-east-1.rds.amazonaws.com'
}
```

 以下示例确认克隆集群中的 Aurora 存储使用了与原始集群相同的一组可用区。

```
$ aws rds describe-db-clusters --db-cluster-identifier clone-in-other-vpc \
  --query 'sort_by(*[].AvailabilityZones[].{Zone:@},&Zone)' --output text

us-east-1c
us-east-1d
us-east-1f
```

 此时，您可以为克隆集群创建数据库实例。在与每个实例关联的 VPC 安全组中，确保允许来自目标 VPC 中的 EC2 实例、应用程序服务器等所用的 IP 地址范围的连接。