

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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 CLI 命令來協助您了解如何自動化此類操作並儲存輸出。

**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、子網路、資料庫子網路群組和 AZ 的相關資訊。如此一來，您就可以將發生問題的機率降至最低。如果發生網路問題，您不必中斷任何故障診斷活動，即可搜尋診斷資訊。下列各節顯示收集這些類型資訊的 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>

 建立複製之前，確認原始叢集用於其儲存的 AZ。如 [Amazon Aurora 儲存體](Aurora.Overview.StorageReliability.md) 中所述，每個 Aurora 叢集的儲存體僅與三個 AZ 相關聯。由於 [Amazon Aurora 資料庫叢集](Aurora.Overview.md) 會利用運算和儲存體的分離，因此無論叢集中有多少執行個體，此規則都是正確的。

 例如，執行如下所示的 CLI 命令，以您自己的叢集名稱取代 `my_cluster`。下列範例會依 AZ 名稱的字母順序產生清單。

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

 以下範例示範上述 `describe-db-clusters` 命令的範例輸出。它示範 Aurora 叢集的儲存體一律使用三個 AZ。

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

 若要在網路環境中建立複製，而該網路環境沒有所有連線到這些 AZ 的資源，您必須建立至少兩個與這些 AZ 相關聯的子網路，然後建立包含這兩個或三個子網路的資料庫子網路群組。下列範例示範了做法。

### 步驟 2：檢查原始叢集的資料庫子網路群組
<a name="cross-vpc-cloning-check-original-subnet-group"></a>

 如果您想要使用與原始叢集中相同的複製子網路數目，您可以從原始叢集的資料庫子網路群組取得子網路數目。Aurora 資料庫子網路群組至少包含兩個子網路，每個子網路都與不同的可用區域相關聯。請記下子網路相關聯的 AZ。

 下列範例顯示如何尋找原始叢集的資料庫子網路群組，然後反過來處理至對應的可用 AZ。在第一個命令中取代 `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 CLI 命令。您可以檢查子網路屬性，例如 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` 命令的部分輸出。輸出會顯示您可以看到對於每個子網路的一些重要屬性，例如其相關聯的 AZ 及其所屬的 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>

 您可以使用此程序來了解原始叢集中資料庫執行個體所使用的 AZ。如此一來，您可以在複製中為資料庫執行個體設定完全相同的 AZ。您也可以在複製中使用更多或更少的資料庫執行個體，取決於複製是否用於生產、開發和測試等。

 對於原始叢集中的每個執行個體，執行如下所示的命令。請確定執行個體已完成建立，且先處於 `Available` 狀態。取代 `my_instance` 的執行個體識別符。

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

 以下範例顯示執行上述 `describe-db-instances` 命令的輸出：Aurora 叢集有四個資料庫執行個體。因此，我們會執行命令四次，每次都會取代不同的資料庫執行個體識別符。輸出顯示這些資料庫執行個體如何分散到最多三個 AZ。

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

 建立複製並新增資料庫執行個體之後，您可以在 `create-db-instance` 命令中指定這些相同的 AZ 名稱。您可以在為與原始叢集完全相同 AZ 設定的新叢集中設定資料庫執行個體。

### 步驟 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 中有足夠的子網路，而且子網路與原始叢集中的正確 AZ 相關聯。

## 建立複製的網路資源
<a name="creating-network-resources-for-the-clone"></a>

 如果在收集網路資訊時發現複製需要額外的網路資源，您可以在嘗試設定複製之前建立這些資源。例如，您可能需要建立更多子網路、與特定 AZ 相關聯的子網路，或新的資料庫子網路群組。
+  [步驟 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。將複製的 VPC 名稱取代為 `my_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 儲存體相關聯的三個 AZ。如需說明，請參閱[步驟 1：檢查原始叢集的可用區域](#cross-vpc-cloning-check-original-azs)。

1.  與原始叢集的資料庫子網路群組相關聯的兩個或三個 AZ。如需說明，請參閱[步驟 2：檢查原始叢集的資料庫子網路群組](#cross-vpc-cloning-check-original-subnet-group)。

1.  您要用於複製之 VPC 中所有子網路的子網路 ID 和相關聯的 AZ。使用與 [步驟 3：檢查原始叢集的子網路](#cross-vpc-cloning-check-original-subnets) 相同的 `describe-subnets` 命令，取代目的地 VPC 的 VPC ID。

 檢查有多少 AZ 與原始叢集的儲存體相關聯，以及與目的地 VPC 中的子網路相關聯。若要成功建立複製，必須有兩個或三個共同的 AZ。如果您的常見可用 AZ 少於兩個，請返回 [步驟 1：建立複製的子網路](#cross-vpc-cloning-create-clone-subnets)。建立一個、兩個或三個與原始叢集儲存體相關聯之 AZ 相關聯的新子網路。

 選擇目的地 VPC 中與原始叢集中 Aurora 儲存體相同 AZ 相關聯的子網路。理想情況下，請選擇三個 AZ。這樣做可讓您靈活地將複製的資料庫執行個體分散到多個 AZ，以獲得高可用性的運算資源。

 執行類似下列的命令來建立新的資料庫子網路群組。取代清單中子網路的 ID。如果您使用環境變數指定子網路 ID，請小心以保留 ID 周圍雙引號的方式來引用 `--subnet-ids` 參數清單。

```
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、子網路、AZ 和子網路群組的正確組態已就緒可供新叢集使用，您就可以執行實際的複製操作。下列 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、子網路和 AZ 設定。使用上述範例中的命令來確認進入資料庫子網路群組的所有關係和映射。

 例如，下列命令示範將原始叢集複製到複製。在第一個範例中，來源叢集與兩個子網路相關聯，而複製與三個子網路相關聯。第二個範例顯示相反的情況，從具有三個子網路的叢集複製到具有兩個子網路的叢集。

```
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 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 儲存體都會與三個 AZ 相關聯。下列範例針對上述範例中的兩個 `restore-db-cluster-to-point-in-time` 命令，列出與原始叢集和複製相關聯的 AZ。

```
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
```

 由於每對原始和複製叢集之間至少有兩個 AZ 重疊，因此兩個叢集都可以存取相同的基礎 Aurora 儲存體。

### 步驟 2：指定複製中執行個體的網路設定
<a name="cross-vpc-cloning-configure-clone-instance-network"></a>

 當您在複製中建立資料庫執行個體時，預設會從叢集本身繼承資料庫子網路群組。如此一來，Aurora 會自動將每個執行個體指派給特定子網路，並在與子網路相關聯的 AZ 中建立執行個體。這個選擇很方便，特別是在開發和測試系統中，因為在將新執行個體新增至複製時，您不需要追蹤子網路 ID 或 AZ。

 或者，您可以在為複製建立 Aurora 資料庫執行個體時指定 AZ。您指定的 AZ 必須是來自與複製相關聯的一組 AZ。如果您用於複製的資料庫子網路群組只包含兩個子網路，則您只能從與這兩個子網路相關聯的 AZ 中進行挑選。此選項可為高可用性系統提供靈活性和彈性，因為您可以確保寫入器執行個體和待命讀取器執行個體位於不同的 AZ。或者，如果您將其他讀取器新增至叢集，則可以確保它們分散在三個 AZ。如此一來，即使在極少數的 AZ 失敗情況下，您在其他兩個 AZ 中仍有一個寫入器執行個體和另一個讀取器執行個體。

 下列範例會將佈建的資料庫執行個體新增至使用自訂資料庫子網路群組的複製 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` 選項，並指定與該子網路群組中子網路相關聯的其中一個 AZ。該 AZ 也必須是與原始叢集相關聯的其中一個 AZ。

```
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) 範例相同的一般步驟。主要差別在於，即使您有從原始叢集映射到所有 AZ 公有子網路，現在您必須確認有足夠的私有子網路用於 Aurora 叢集，而且這些子網路與原始叢集中用於 Aurora 儲存體的所有相同 AZ 相關聯。與其他複製使用案例類似，您可以使用與所需 AZ 相關聯的三個或兩個私有子網路來建立複製的資料庫子網路群組。不過，如果您在資料庫子網路群組中使用兩個私有子網路，則必須有一個與原始叢集中用於 Aurora 儲存體之與地三個 AZ 相關聯的第三個私有子網路。

 您可以參考此檢查清單，確認所有執行此類型複製操作的需求都已就緒。
+  記錄與原始叢集相關聯的三個 AZ。如需說明，請參閱[步驟 1：檢查原始叢集的可用區域](#cross-vpc-cloning-check-original-azs)。
+  在原始叢集的資料庫子網路群組中，記錄與公有子網路相關聯的三個或兩個 AZ。如需說明，請參閱[步驟 3：檢查原始叢集的子網路](#cross-vpc-cloning-check-original-subnets)。
+  建立私有子網路，映射至與原始叢集相關聯的所有三個 AZ。此外，請執行任何其他網路設定，例如建立 NAT 閘道，以便能夠與私有子網路通訊。如需相關指示，請參閱*《Amazon Virtual Private Cloud 使用者指南》*中的[刪除子網路](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html)。
+  建立新的資料庫子網路群組，其中包含從一開始與 AZ 相關聯的三個或兩個私有子網路。如需說明，請參閱[步驟 2：建立複製的資料庫子網路群組](#cross-vpc-cloning-create-subnet-group)。

 當所有先決條件都就緒時，您可以在建立複製時暫停原始叢集上的資料庫活動，並切換應用程式以使用它。建立複製並確認您可以連線到複製、執行應用程式碼，以此類推，之後您可以停止使用原始叢集。

## 建立跨 VPC 複製的端對端範例
<a name="end-to-end-example-of-creating-a-cross-vpc-clone"></a>

 在與原始 VPC 不同的 VPC 中建立複製會使用與上述範例中相同的一般步驟。由於 VPC ID 是子網路的屬性，因此您在執行任何 RDS CLI 命令時，不會實際指定 VPC ID 作為參數。主要差別在於，您更可能需要建立新的子網路、映射至特定 AZ 的新子網路、VPC 安全群組和新的資料庫子網路群組。如果這是您在該 VPC 中建立的第一個 Aurora 叢集，則尤其如此。

 您可以參考此檢查清單，確認所有執行此類型複製操作的需求都已就緒。
+  記錄與原始叢集相關聯的三個 AZ。如需說明，請參閱[步驟 1：檢查原始叢集的可用區域](#cross-vpc-cloning-check-original-azs)。
+  記錄與原始叢集資料庫子網路群組中子網路相關聯的三個或兩個 AZ。如需說明，請參閱[步驟 2：檢查原始叢集的資料庫子網路群組](#cross-vpc-cloning-check-original-subnet-group)。
+  建立子網路，映射至與原始叢集相關聯的所有三個 AZ。如需說明，請參閱[步驟 1：建立複製的子網路](#cross-vpc-cloning-create-clone-subnets)。
+  為用戶端系統、應用程式伺服器等進行任何其他網路設定，例如設定 VPC 安全群組，以便能夠與複製中的資料庫執行個體通訊。如需說明，請參閱[使用安全群組控制存取](Overview.RDSSecurityGroups.md)。
+  建立新的資料庫子網路群組，其中包含從一開始與 AZ 相關聯的三個或兩個子網路。如需說明，請參閱[步驟 2：建立複製的資料庫子網路群組](#cross-vpc-cloning-create-subnet-group)。

 當所有先決條件都就緒時，您可以在建立複製時暫停原始叢集上的資料庫活動，並切換應用程式以使用它。建立複製並驗證您可以連線到複製、執行應用程式碼等之後，您可以考慮是否要同時讓原始和複製保持執行，或停止使用原始叢集。

 下列 Linux 範例顯示將 Aurora 資料庫叢集從一個 VPC 複製到另一個 VPC 的 AWS CLI 操作順序。有些與範例無關的欄位不會顯示在命令輸出中。

 首先，我們會檢查來源和目的地 VPC 的 ID。您在建立 VPC 時指派給 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 儲存體的相同一組 AZ 來設定複製，我們會檢查原始叢集使用的 AZ。

```
$ 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
```

 我們確保有與原始叢集使用的 AZ 對應的子網路：`us-east-1d`、`us-east-1c` 和 `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 中的必要 AZ。

```
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 儲存體的 AZ。建立一般叢集時，您可以使用任何一組三個 AZ。當您複製現有的叢集時，子網路群組必須至少符合其用於 Aurora 儲存體的三個 AZ中的兩個。

```
$ 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` 選項會將複製與一組正確的子網路建立關聯，這些子網路映射至原始叢集中一組正確的 AZ。

```
$ 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 儲存體使用與原始叢集相同的一組 AZ。

```
$ 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 安全群組允許來自您用於 EC2 執行個體、應用程式伺服器等目的地 VPC 中 IP 位址範圍的連線。