自動化跨AWS帳戶複寫 Amazon RDS 執行個體 - AWS 方案指引

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

自動化跨AWS帳戶複寫 Amazon RDS 執行個體

創建者帕拉格納格韋卡 (AWS) 和阿倫·錢達皮萊 () AWS

環境:生產

技術:資料庫;無伺服器 DevOps;基礎架構

工作負載:所有其他工作

AWS服務:AWSLambda; AmazonRDS; AWS SDK Python(Boto3); AWS Step Functions; Amazon SNS

Summary

此模式說明如何使用 AWS Step Functions 數和 AWS Lambda,將 Amazon 關聯式資料庫服務 (AmazonRDS) 資料庫執行個體跨不同AWS帳戶複寫、追蹤和復原的程序自動化。您可以使用此自動化功能來執行RDS資料庫執行個體的大規模複寫,而不會對效能造成任何影響或營運超額,無論您的組織規模如何。您也可以使用此模式來協助組織遵守強制性資料控管策略或合規性要求,這些策略要求您的資料在不同AWS帳戶和AWS區域之間進行複寫和備援。大規模跨帳戶複寫 Amazon RDS 資料是效率低下且容易出錯的手動程序,成本高昂且耗時,但此模式的自動化可協助您安全、有效且有效率地實現跨帳戶複寫。

先決條件和限制

先決條件

  • 兩個AWS帳戶

  • 在來源AWS帳戶中啟動並執行的RDS資料庫執行個體

  • 目的地AWS帳戶中RDS資料庫執行個體的子網路群組

  • 在來源AWS帳戶中建立並與目標帳戶共用的金AWS鑰管理服務 (AWSKMS) 金鑰 (如需有關策略詳細資訊的詳細資訊,請參閱此模式的其他資訊一節)。

  • 目的地帳戶中用來加密目的地AWS帳戶中的資料庫的AWSKMS金鑰

產品版本

  • Python 3.9(使用 AWS Lambda)

  • 波斯格雷第 SQL 11.3, 13.x, 和 14 倍

架構

技術, 堆

  • Amazon Relational Database Service(AmazonRDS)

  • Amazon 簡單通知服務(AmazonSNS)

  • AWS金鑰管理服務 (AWSKMS)

  • AWSLambda

  • AWS Secrets Manager

  • AWS Step Functions

目標架構

下圖顯示使用 Step Functions 協調RDS資料庫執行個體從來源帳戶 (帳戶 A) 到目標帳戶 (帳戶 B) 的排程隨選複寫的架構。

使用 Step Functions 數跨來源和目標帳戶複寫 Amazon RDS 資料庫執行個體。

在來源帳戶 (圖表中的帳戶 A) 中,「Step Functions」狀態機器會執行下列動作:

  1. 從帳戶 A 中的RDS資料庫執行個體建立快照。

  2. 使用帳戶 A 的AWSKMS金鑰複製並加密快照,為確保傳輸過程中的加密,無論資料庫執行個體是否加密,快照都會加密。

  3. 將快照存取權授予帳戶 B,與帳戶 B 共用資料庫快照。

  4. 將通知推送至SNS主題,然後主SNS題叫用帳戶 B 中的 Lambda 函數。

在目標帳戶 (圖表中的帳戶 B) 中,Lambda 函數會執行 Step Functions 數狀態機器來協調下列項目:

  1. 將共用快照從帳戶 A 複製到帳戶 B,同時先使用帳戶 A 中的AWSKMS金鑰解密資料,然後使用帳戶 B 中的AWSKMS金鑰加密資料。

  2. 從 Secret 管理員讀取密碼,以擷取目前資料庫執行個體的名稱。

  3. 使用 Amazon 的新名稱和預設AWSKMS金鑰從快照還原資料庫執行個體RDS。

  4. 讀取新資料庫的端點,並使用新的資料庫端點更新 Secrets Manager 中的密碼,然後標記先前的資料庫執行個體,以便稍後將其刪除。

  5. 保留資料庫的最新 N 個執行個體,並刪除所有其他執行個體。

工具

AWS工具

  • Amazon Relational Database Service (AmazonRDS) 可協助您在AWS雲端中設定、操作和擴展關聯式資料庫。

  • Amazon 簡易通知服務 (AmazonSNS) 可協助您協調和管理發佈者和客戶之間的訊息交換,包括 Web 伺服器和電子郵件地址。

  • AWS CloudFormation協助您設定AWS資源、快速且一致地佈建資源,並在整個AWS帳戶和區域的整個生命週期中進行管理。

  • AWS金鑰管理服務 (AWSKMS) 可協助您建立和控制加密金鑰,以協助保護您的資料。

  • AWSLambda 是一種運算服務,可協助您執行程式碼,而不需要佈建或管理伺服器。它只會在需要時執行程式碼並自動調整規模,因此您只需為使用的運算時間付費。

  • AWSSDK對於 Python(Boto3)是一個軟件開發工具包,可幫助您將 Python 應用程序,庫或腳本與AWS服務集成。

  • AWSSecrets Manager 可協助您取代程式碼中的硬式編碼認證 (包括密碼),並API呼叫 Secret Manager 以程式設計方式擷取密碼。

  • AWSStep Functions 是一種無伺服器協調服務,可協助您結合 Lambda 函數和其他服務,以建置關鍵業AWS務應用程式。

Code

此模式的代碼可在 GitHub 跨帳戶RDS複寫存儲庫中找到。

史诗

任務描述所需技能

在來源帳戶中部署 CloudFormation 堆疊。

  1. 登入來源帳戶 (帳戶 A) 的AWS管理主控台,然後開啟主CloudFormation 控台

  2. 在導覽窗格中,選擇 Stacks (堆疊)

  3. 選擇 [建立堆疊],然後選擇 [使用現有資源 (匯入資源)]。

  4. 在 [識別資源] 頁面上,選擇 [下一步]。

  5. 在 [指定範本] 頁面上,選取 [上傳範本]。

  6. 選擇 [選擇檔案],從 [ GitHub 交叉帳戶RDS複製] 儲存庫中選取Cloudformation-SourceAccountRDS.yaml檔案,然後選擇 [下一步]。

  7. 堆疊名稱中,輸入堆疊的名稱。

  8. 在「參數」段落中,指定堆疊樣板中定義的參數:

    • 在中 DestinationAccountNumber,輸入目的地RDS資料庫執行個體的帳號。

    • 對於 KeyName,輸入您的AWSKMS金鑰。

    • 對於 ScheduleExpression,輸入 Cron 表示式 (預設為每日上午 12:00)。

    • 對於 S ourceDBIdentifier,輸入來源資料庫的名稱。

    • 對於 S ourceDBSnapshot 名稱,請輸入快照名稱或接受預設值。

  9. 選擇 Next (下一步)

  10. 在 [設定堆疊選項] 頁面上,保留預設值,然後選擇 [下一步]。

  11. 檢閱您的堆疊組態,然後選擇 [提交]。

  12. 選擇堆疊的 [資源] 索引標籤,然後記下SNS主題的 Amazon 資源名稱 (ARN)。

雲端管理員、雲端架構師

在目的地帳戶中部署 CloudFormation 堆疊。

  1. 登入目的地帳戶 (帳戶 B) 的AWS管理主控台,然後開啟主CloudFormation 控台

  2. 在導覽窗格中,選擇 Stacks (堆疊)

  3. 選擇 [建立堆疊],然後選擇 [使用現有資源 (匯入資源)]。

  4. 在 [識別資源] 頁面上,選擇 [下一步]。

  5. 在 [指定範本] 頁面上,選取 [上傳範本]。

  6. 選擇檔案,從「 GitHub 交叉帳戶RDS複製」儲存庫中選取Cloudformation-DestinationAccountRDS.yaml檔案,然後選擇「下一步」。

  7. 堆疊名稱中,輸入堆疊的名稱。

  8. 在「參數」段落中,指定堆疊樣板中定義的參數:

    • 在中 DatabaseName,輸入資料庫的名稱。

    • Engine 中,輸入與來源資料庫相符的資料庫引擎類型。

    • 在中 DBInstanceClass,輸入偏好的資料庫執行處理類型,或接受預設值。

    • 對於子網路群組,請輸入現有的子網VPC路群組。如需有關建立子網路群組的指示,請參閱 Amazon RDS 使用者指南中的步驟 2:建立資料庫子網路群組

    • 在中 SecretName,輸入路徑和密碼名稱,或接受預設名稱。

    • 在中 SGID,輸入目的地叢集的安全性群組 ID。

    • 對於 KMSKey,在目ARN的地帳戶中輸入KMS金鑰。

    • 在中 NoOfOlderInstances,輸入要保留用於復原之RDS資料庫執行個體的舊副本數目。

  9. 選擇 Next (下一步)

  10. 在 [設定堆疊選項] 頁面上,保留預設值,然後選擇 [下一步]。

  11. 檢閱您的堆疊組態,然後選擇 [提交]。

  12. 選擇堆疊ARN的 [資源] 索引標籤,然後記下 [實體 ID] 和InvokeStepFunction

雲端架構師、 DevOps 工程師、雲端管理員

確認目的地帳戶中RDS資料庫執行個體的建立。

  1. 登入AWS管理主控台並開啟 Amazon 主RDS控台

  2. 在瀏覽窗格中,選擇 [資料庫],然後確認新的資料RDS庫執行個體出現在新叢集下方。

雲端管理員、雲端架構師、 DevOps 工程師

訂閱 Lambda 函數以瞭解SNS主題。

您必須執行下列AWS命令列介面 (AWSCLI) 命令,才能將目標帳戶 (帳戶 B) 中的 Lambda 函數訂閱至來源帳戶 (帳戶 A) 中的SNS主題。

在帳戶 A 中,執行下列命令:

aws sns add-permission \ --label lambda-access --aws-account-id <DestinationAccount> \ --topic-arn <Arn of SNSTopic > \ --action-name Subscribe ListSubscriptionsByTopic

在帳戶 B 中,執行下列命令:

aws lambda add-permission \ --function-name <Name of InvokeStepFunction> \ --source-arn <Arn of SNSTopic > \ --statement-id function-with-sns \ --action lambda:InvokeFunction \ --principal sns.amazonaws.com

在帳戶 B 中,執行下列命令:

aws sns subscribe \ --protocol "lambda" \ --topic-arn <Arn of SNSTopic> \ --notification-endpoint <Arn of InvokeStepFunction>
雲端管理員、雲端架構師、DBA

將來源帳戶中的RDS資料庫執行個體與目標帳戶同步。

啟動來源帳戶中的「Step Functions 數」狀態機器,以起始隨選資料庫複寫。

  1. 開啟「Step Functions」主控台

  2. 在瀏覽窗格中,選擇 [狀態機器]。

  3. 選擇您的狀態機。

  4. 在 [行] 索引標籤上,選取您的函數,然後選擇 [開始執行] 以啟動工作流程。

備註:排程器可協助您按排程自動執行複製,但排程器預設為關閉。您可以在目標帳戶 CloudFormation 堆疊的 [資源] 索引標籤中找到排程器的 Amazon CloudWatch 規則名稱。如需有關如何修改 CloudWatch 事件規則的指示,請參閱 CloudWatch 使用指南中的刪除或停用 CloudWatch 事件規則

雲端架構師、 DevOps 工程師、雲端管理員

如有需要,請將資料庫復原至任何先前的副本。

  1. 開啟 Secrets Manager 主控台

  2. 從密碼清單中,選擇您先前使用 CloudFormation 範本建立的密碼。您的應用程式會使用密碼來存取目的地叢集中的資料庫。

  3. 若要從詳細資訊頁面更新密碼值,請在「機密值」段落中選擇擷取秘密值,然後選擇編輯

  4. 輸入資料庫端點的詳細資訊。

雲管理員DBA, DevOps 工程師

相關資源

其他資訊

您可以使用下列範例政策跨AWS帳戶共用AWSKMS金鑰。

{ "Version": "2012-10-17", "Id": "cross-account-rds-kms-key", "Statement": [ { "Sid": "Enable user permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<SourceAccount>:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow administration of the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<DestinationAccount>:root" }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }, { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<DestinationAccount>:root", "arn:aws:iam::<SourceAccount>:root" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey", "kms:CreateGrant" ], "Resource": "*" } ] }