

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

# 使用 IaC 原則自動化 Amazon Aurora 全域資料庫的藍/綠部署
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac"></a>

*Ishwar Chauthaiwale、ANKIT JAIN 和 Ramu Jagini，Amazon Web Services*

## 總結
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-summary"></a>

對於在 [Amazon Aurora 全域資料庫](https://aws.amazon.com/rds/aurora/global-database/)上執行關鍵工作負載的組織而言，管理資料庫更新、遷移或擴展工作可能具有挑戰性。確保在零停機時間的情況下無縫執行這些操作，對於維護服務可用性和避免使用者中斷至關重要。

藍/綠部署策略可讓您同時執行兩個相同的環境，為這項挑戰提供解決方案：藍 （目前環境） 和綠 （新環境）。藍/綠策略可讓您實作變更、執行測試，並在風險最低且停機時間最低的環境中切換流量。

此模式使用基礎設施即程式碼 (IaC) 原則，協助您自動化 Aurora 全域資料庫的藍/綠部署程序。它使用 [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)、 [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)和 [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 來簡化藍/綠部署。為了改善可靠性，它使用全域交易識別符 (GTIDs進行複寫。與二進位日誌 (binlog) 複寫相比， GTID 式複寫可在環境之間提供更好的資料一致性和容錯移轉功能。

**注意**  
此模式假設您使用的是 Aurora MySQL 相容版本全域資料庫叢集。如果您改為使用 Aurora PostgreSQL 相容，請使用 MySQL 命令的 PostgreSQL 對等項目。

透過遵循此模式中的步驟，您可以：
+ 佈建綠色 Aurora 全域資料庫：使用 CloudFormation 範本，您可以建立反映現有藍色環境的綠色環境。
+ 設定 GTID 式複寫：您可以設定 GTID 複寫，讓藍色和綠色環境保持同步。
+ 無縫切換流量：您可以使用 Route 53 和 Lambda，在完全同步後自動將流量從藍色環境切換到綠色環境。
+ 完成部署：您驗證綠色環境作為主要資料庫可完全運作，然後停止複寫並清除任何臨時資源。

此模式中的方法提供下列優點：
+ 在關鍵資料庫更新或遷移期間減少停機時間：自動化可確保在環境之間順利轉換，並將服務中斷降至最低。
+ 啟用快速復原：如果流量切換到綠色環境後發生問題，您可以快速恢復到藍色環境並維持服務連續性。
+ 增強測試和驗證：綠色環境可以完整測試，而不會影響即時藍色環境，從而降低生產過程中發生錯誤的可能性。
+ 確保資料一致性：以 GTID 為基礎的複寫可讓您的藍色和綠色環境保持同步，防止資料在遷移期間遺失或不一致。
+ 維持業務連續性：自動化藍/綠部署有助於避免長時間中斷和財務損失，方法是在更新或遷移期間保持您的服務可用。

## 先決條件和限制
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶。
+ 來源 Aurora MySQL 相容全域資料庫叢集 （藍色環境）。全域資料庫提供多區域組態，以實現高可用性和災難復原。如需設定全域資料庫叢集的說明，請參閱 [Aurora 文件](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-getting-started.html)。
+ 在來源叢集上啟用 [GTID 型複寫](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)。

**限制**
+ 有些 AWS 服務 不適用於所有 AWS 區域。如需區域可用性，請參閱[AWS 服務 依區域](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)頁面，然後選擇服務的連結。

**產品版本**
+ Aurora MySQL 相容 8.0 或更新版本

## Architecture
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-architecture"></a>

![使用 GTID 複寫來同步不同區域中的藍色和綠色環境。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/19922266-c2e5-460b-9a0f-22e6d6736094/images/7a8c3095-7904-4080-906f-0c403c289a4f.png)


此圖展示了以下要點：
+ 全域資料庫設定：Aurora 全域資料庫叢集策略性地部署在兩個資料庫叢集中 AWS 區域。此組態可啟用地理分佈和區域備援，以增強災難復原功能。
+ 主要至次要區域複寫：邏輯複寫機制可確保從主要區域到次要區域的無縫資料同步。此複寫會在地理距離之間維持資料一致性，並將延遲降至最低。
+ 叢集之間的 GTID 式複寫：GTID 式複寫可維持藍色主要叢集與綠色主要叢集之間的交易一致性和排序資料流程，並確保可靠的資料同步。
+ 藍色主要至次要複寫：邏輯複寫會在藍色主要叢集及其次要叢集之間建立強大的資料管道。此複寫可實現持續資料同步和高可用性。
+ Route 53 DNS 組態：Route 53 託管區域記錄會管理所有藍色和綠色叢集資料庫端點的 DNS 解析。此組態提供無縫的端點映射，並在容錯移轉案例期間啟用有效的流量路由。

## 工具
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-tools"></a>

**AWS 服務**
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) 是一種全受管關聯式資料庫引擎，專為雲端而建置，並與 MySQL 和 PostgreSQL 相容。
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您建立和設定 AWS 資源的模型，以減少管理這些資源的時間，並有更多時間專注於執行 的應用程式 AWS。您可以建立範本來描述您想要的所有 AWS 資源，CloudFormation 會為您佈建和設定這些資源。
+  [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一種運算服務，支援執行程式碼，無需佈建或管理伺服器。Lambda 只有在需要時才會執行程式碼，可自動從每天數項請求擴展成每秒數千項請求。 
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一種可用性高、可擴展性強的 DNS Web 服務。

## 最佳實務
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-best-practices"></a>

建議您徹底檢閱 AWS 文件，以深入了解 Route 53 中的[藍/綠部署策略](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-overview.html)、[GTID 式複寫](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)和[加權路由政策](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html)。此知識對於有效實作和管理資料庫遷移、確保資料一致性，以及最佳化流量路由至關重要。透過全面了解這些 AWS 功能和最佳實務，您將更能處理未來的更新、盡可能減少停機時間，並維護彈性且安全的資料庫環境。

如需針對此模式使用 AWS 服務 的指導方針，請參閱下列 AWS 文件：
+ [Amazon Aurora MySQL 的最佳實務](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.BestPractices.html)
+ [CloudFormation 最佳實務](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html)
+ [使用 AWS Lambda 函數的最佳實務](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)
+ [Amazon Route 53 的最佳實務](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/best-practices.html)

## 史詩
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-epics"></a>

### 建立綠色環境
<a name="create-the-green-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 從藍色叢集建立快照備份。 | 在藍/綠部署中，綠色環境代表您目前 （藍色） 資料庫環境的新相同版本。您可以在切換生產流量之前，使用綠色環境安全地測試更新、驗證變更並確保穩定性。它可做為實作資料庫變更的預備基礎，並將對即時環境的干擾降至最低。<br />若要建立綠色環境，請先在 Aurora MySQL 相容全域資料庫中建立主要 （藍色） 叢集的快照。此快照是建立綠色環境的基礎。<br />若要建立快照：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />或者，您可以使用 AWS Command Line Interface (AWS CLI) 來建立快照：<pre>aws rds create-db-cluster-snapshot --db-cluster-snapshot-identifier blue-green-demo --db-cluster-identifier ex-global-cluster --region eu-west-1</pre><br />在繼續下一個步驟之前，請確定快照已成功完成。 | DBA | 
| 為您的全域資料庫及其資源產生 CloudFormation 範本。 | CloudFormation IaC 產生器可協助您從現有 AWS 資源產生 CloudFormation 範本。使用此功能為現有的 Aurora MySQL 相容全域資料庫及其相關聯的資源建立 CloudFormation 範本。此範本會設定子網路群組、安全群組、參數群組和其他設定。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html) | DBA | 
| 修改綠色環境的 CloudFormation 範本。 | 自訂 CloudFormation 範本以反映綠色環境的設定。這包括更新資源名稱和識別符，以確保綠色環境獨立於藍色叢集運作。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)如果您使用 `SnapshotIdentifier` 屬性還原資料庫叢集，請避免指定屬性，例如 `GlobalClusterIdentifier`、 `MasterUsername`或 `MasterUserPassword`。 | DBA | 
| 部署 CloudFormation 堆疊以建立綠色環境的資源。 | 在此步驟中，您會部署自訂 CloudFormation 範本，以建立綠色環境的資源。<br />若要部署 CloudFormation 堆疊：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />CloudFormation 會啟動建立綠色環境資源的程序。此程序可能需要幾分鐘的時間才能完成。 | DBA | 
| 驗證 CloudFormation 堆疊和資源。 | 當 CloudFormation 堆疊部署完成時，您需要確認綠色環境已成功建立：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />驗證後，您的綠色環境已準備好進一步設定，包括從藍色環境複寫。 | DBA | 

### 設定 GTID 型複寫
<a name="configure-gtid-based-replication"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證藍色叢集上的 GTID 設定。 | GTIDs 提供高度可靠的方法來複寫藍色和綠色環境之間的資料。[GTID 型複寫](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)透過為藍色環境中的每個交易指派唯一識別符，提供彈性、簡化的方法。相較於傳統的 binlog 複寫，此方法可確保環境之間的資料同步順暢、一致且易於管理。<br />在設定複寫之前，您需要確保在藍色叢集上正確啟用 GTID 型複寫。此步驟保證藍色環境中的每個交易都是唯一的追蹤，並且可以在綠色環境中複寫。<br />若要確認 GTID 已啟用：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />這些設定可針對藍色環境中所有未來的交易啟用 GTID 追蹤。確認這些設定後，您可以開始設定複寫。 | DBA | 
| 建立複寫使用者。 | 若要將資料從藍色環境複寫到綠色環境，您需要在藍色叢集上建立專用的複寫使用者。此使用者將負責管理複寫程序。<br />若要設定複寫使用者：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />此使用者現在具有在兩個環境之間複寫資料的必要許可。 | DBA | 
| 在綠色叢集上設定 GTID 型複寫。 | 下一個步驟是為 GTID 型複寫設定綠色叢集。此設定可確保綠色環境會持續鏡像在藍色環境中發生的所有交易。<br />若要設定綠色叢集：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html) | DBA | 
| 在綠色叢集上開始複寫。 | 您現在可以開始複寫程序。在綠色叢集上，執行 命令：<pre>START SLAVE;</pre><br />這可讓綠色環境開始同步資料，以及從藍色環境接收和套用交易。 | DBA | 
| 驗證複寫程序。 | 若要驗證綠色環境是否準確複寫藍色叢集的資料：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />如果所有指標都正確，GTID 型複寫功能會順暢運作，而且綠色環境會與藍色環境完全同步。 | DBA | 

### 從藍色叢集切換流量至綠色叢集
<a name="switch-traffic-from-blue-to-green-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 Route 53 加權路由政策。 | 驗證藍色和綠色環境之間的資料一致性後，您可以將流量從藍色叢集切換到綠色叢集。此轉換應該是順暢的，而且應該將停機時間降至最低，並確保應用程式資料庫的完整性。若要解決這些需求，您可以使用 Route 53 進行 DNS 路由，並使用 Lambda 自動化流量切換。此外，定義明確的轉返計劃可確保您可以在發生任何問題時還原至藍色叢集。<br />第一步是在 Route 53 中設定加權路由。加權路由可讓您控制藍色和綠色叢集之間的流量分佈，並逐步將流量從一個環境轉移到另一個環境。<br />若要設定加權路由：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />如需加權路由政策的詳細資訊，請參閱 [Route 53 文件](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html)。 | AWS DevOps | 
| 部署 Lambda 函數以監控複寫延遲。 | 為了確保綠色環境與藍色環境完全同步，請部署 Lambda 函數來監控叢集之間的複寫延遲。此函數可以檢查複寫狀態，特別是 **Seconds\_Behind\_Master** 指標，以判斷綠色叢集是否已準備好處理所有流量。<br />以下是您可以使用的範例 Lambda 函數：<pre>import boto3<br /><br />def check_replication_lag(event, context):<br />    client = boto3.client('rds')<br />    response = client.describe_db_instances(DBInstanceIdentifier='green-cluster-instance')<br />    replication_status = response['DBInstances'][0]['ReadReplicaDBInstanceIdentifiers']<br />    if replication_status:<br />        lag = replication_status[0]['ReplicationLag']<br />        return lag<br />    return -1</pre><br />此函數會檢查複寫延遲並傳回 值。如果延遲為零，則綠色叢集會與藍色叢集完全同步。 | AWS DevOps | 
| 使用 Lambda 自動化 DNS 權重調整。 | 當複寫延遲達到零時，就可以將所有流量切換到綠色叢集。您可以使用另一個 Lambda 函數來自動化此轉換，該函數會調整 Route 53 中的 DNS 權重，以將 100% 的流量導向綠色叢集。<br />以下是自動化流量切換的 Lambda 函數範例：<pre>import boto3<br /><br />def switch_traffic(event, context):<br />    route53 = boto3.client('route53')<br />    lag = check_replication_lag(event, context)<br />    if lag == 0:<br />        response = route53.change_resource_record_sets(<br />            HostedZoneId='YOUR_HOSTED_ZONE_ID',<br />            ChangeBatch={<br />                'Changes': [<br />                    {<br />                        'Action': 'UPSERT',<br />                        'ResourceRecordSet': {<br />                            'Name': 'db.example.com',<br />                            'Type': 'CNAME',<br />                            'SetIdentifier': 'GreenCluster',<br />                            'Weight': 100,<br />                            'TTL': 60,<br />                            'ResourceRecords': [{'Value': 'green-cluster-endpoint'}]<br />                        }<br />                    },<br />                    {<br />                        'Action': 'UPSERT',<br />                        'ResourceRecordSet': {<br />                            'Name': 'db.example.com',<br />                            'Type': 'CNAME',<br />                            'SetIdentifier': 'BlueCluster',<br />                            'Weight': 0,<br />                            'TTL': 60,<br />                            'ResourceRecords': [{'Value': 'blue-cluster-endpoint'}]<br />                        }<br />                    }<br />                ]<br />            }<br />        )<br />        return response</pre><br />此函數會檢查複寫延遲，並在延遲為零時更新 Route 53 DNS 權重，以將流量完全切換到綠色叢集。** **在切換過程中，如果藍色叢集遇到大量寫入流量，請考慮在切換期間暫時暫停寫入操作。這可確保複寫趕上進度，並防止藍色和綠色叢集之間的資料不一致。 | AWS DevOps | 
| 驗證流量開關。 | Lambda 函數調整 DNS 權重後，您應該驗證所有流量是否導向綠色叢集，以及切換是否成功。<br />若要驗證：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />如果一切如預期執行，則流量切換會完成。 | AWS DevOps | 
| 如果您遇到任何問題，請復原變更。 | 如果流量切換之後發生任何問題，則擁有復原計劃至關重要。如有必要，以下說明如何快速還原至藍色叢集：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />透過實作此轉返計劃，您可以確保在發生任何非預期問題時對使用者造成的干擾降到最低。 | AWS DevOps | 

### 驗證並停止 GTID 型複寫
<a name="validate-and-stop-gtid-based-replication"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在綠色叢集上停止 GTID 型複寫。 | 將流量從藍色環境切換到綠色環境之後，您應該驗證轉換的成功，並確保綠色叢集如預期般運作。此外，藍色和綠色叢集之間的 GTID 型複寫必須停止，因為綠色環境現在可做為主要資料庫。完成這些任務可確保您的環境安全、簡化並針對持續操作進行最佳化。<br />若要停止複寫：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />當您停止複寫時，綠色叢集會變得完全獨立，並做為工作負載的主要資料庫環境運作。 | DBA | 
| 清除資源。 | 清除從藍色遷移到綠色叢集期間建立的任何暫時或未使用的資源，可確保您的環境保持最佳化、安全且符合成本效益。清除包括調整安全設定、進行最終備份，以及停用不必要的資源。<br />若要清除資源：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />清理資源有助於維護安全且簡化的環境、降低成本，並確保僅保留必要的基礎設施。 | AWS DevOps | 

## 相關資源
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-resources"></a>

CloudFormation:
+ [CloudFormation 使用者指南](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)
+ [CloudFormation 最佳實務](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html)
+ [使用 IaC 產生器從現有資源產生範本](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/generate-IaC.html)
+ 將[整個應用程式匯入 CloudFormation](https://aws.amazon.com/blogs/devops/import-entire-applications-into-aws-cloudformation/)(AWS 部落格文章）

Amazon Aurora：
+ [Amazon Aurora 使用者指南](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Welcome.html)
+ [管理 Amazon Aurora 資料庫叢集](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_Aurora.html)

藍/綠部署策略：
+ [Amazon Aurora 藍/綠部署概觀](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-overview.html)

以 GTID 為基礎的複寫：
+ [使用 GTID 式複寫](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html) (Amazon RDS 文件）

AWS Lambda:
+ [AWS Lambda 開發人員指南](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
+ [使用 AWS Lambda 函數的最佳實務](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)

Amazon Route 53：
+ 《[Amazon Route 53 開發人員指南](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html)》
+ [加權路由](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html)

MySQL 用戶端工具：
+ [PyMYSQL](https://github.com/PyMySQL/PyMySQL)