AWS アカウント間の Amazon RDSインスタンスのレプリケーションを自動化する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS アカウント間の Amazon RDSインスタンスのレプリケーションを自動化する

作成者: Parag Nagwekar (AWS) と Arun Chandapillai (AWS)

環境:本稼働

テクノロジー: データベース DevOps、サーバーレス、インフラストラクチャ

ワークロード:その他すべてのワークロード

AWS サービス: AWS Lambda、Amazon、 RDS AWS SDK for Python (Boto3)、AWSStep Functions、Amazon SNS

[概要]

このパターンは、AWSStep Functions と AWS Lambda を使用して、異なるアカウント間で Amazon Relational Database Service (Amazon RDS) DB インスタンスをレプリケート、追跡、ロールバックAWSするプロセスを自動化する方法を示しています。この自動化を使用すると、組織の規模に関係なく、パフォーマンスへの影響や運用上のオーバーヘッドなしに RDS DB インスタンスの大規模なレプリケーションを実行できます。このパターンを使用して、組織が必須のデータガバナンス戦略またはコンプライアンス要件に準拠できるようにすることもできます。コンプライアンス要件では、異なるAWSアカウントやAWSリージョンにまたがってデータをレプリケートし、冗長化する必要があります。大規模な Amazon RDSデータのクロスアカウントレプリケーションは、コストと時間がかかる可能性がある非効率でエラーが発生しやすい手動プロセスですが、このパターンの自動化は、クロスアカウントレプリケーションを安全かつ効果的に、効率的に実現するのに役立ちます。

前提条件と制限

前提条件

  • 2 つのAWSアカウント

  • ソースAWSアカウントで稼働している RDS DB インスタンス

  • 送信先AWSアカウントの RDS DB インスタンスのサブネットグループ

  • ソースAWSアカウントで作成され、送信先アカウントと共有されている AWS Key Management Service (AWS KMS) キー (ポリシーの詳細については、このパターンの「追加情報」セクションを参照してください)。

  • 送信先AWSアカウントのデータベースを暗号化する送信先アカウントの AWSKMSキー

製品バージョン

  • Python 3.9 (Lambda AWS を使用)

  • PostgreSQL 11.3、13.x、および 14.x

アーキテクチャ

テクノロジースタック

  • Amazon Relational Database Service (Amazon RDS)

  • Amazon Simple Notification Service (Amazon SNS)

  • AWS Key Management Service (AWS KMS)

  • AWS Lambda

  • AWS Secrets Manager

  • AWS Step Functions

ターゲット アーキテクチャ

次の図は、Step Functions を使用して、RDSDB インスタンスのスケジュールされたオンデマンドレプリケーションをソースアカウント (アカウント A) から宛先アカウント (アカウント B) にオーケストレーションするためのアーキテクチャを示しています。

Step Functions を使用して、ソースアカウントと宛先アカウント間で Amazon RDS DB インスタンスをレプリケートします。

ソースアカウント (図のアカウント A) では、Step Functions ステートマシンが以下を実行します。

  1. アカウント A の RDS DB インスタンスからスナップショットを作成します。

  2. アカウント A の AWSKMSキーを使用してスナップショットをコピーして暗号化します。転送中の暗号化を確実にするために、DB インスタンスが暗号化されているかどうかにかかわらず、スナップショットは暗号化されます。

  3. アカウント B にスナップショットへのアクセス権を付与することで、アカウント B と DB スナップショットを共有します。

  4. SNS トピックに通知をプッシュし、SNSトピックがアカウント B の Lambda 関数を呼び出します。

宛先アカウント (図のアカウント B) では、Lambda 関数が Step Functions ステートマシンを実行して以下を調整します。

  1. 共有スナップショットをアカウント A からアカウント B にコピーし、まずアカウント A のAWSKMSキーを使用してデータを復号し、次にアカウント B のAWSKMSキーを使用してデータを暗号化します。

  2. Secrets Manager からシークレットを読み取り、現在の DB インスタンスの名前を取得します。

  3. Amazon の新しい名前とデフォルトAWSKMSキーを使用して、スナップショットから DB インスタンスを復元しますRDS。

  4. 新しいデータベースのエンドポイントを読み取り、Secrets Manager のシークレットを新しいデータベースエンドポイントで更新します。次に、以前の DB インスタンスにタグを付けて後で削除できるようにします。

  5. データベースの最新の N 個のインスタンスを保持し、他のすべてのインスタンスを削除します。

ツール

AWS ツール

  • Amazon Relational Database Service (Amazon RDS) は、 AWS クラウドでリレーショナルデータベースをセットアップ、運用、スケーリングするのに役立ちます。

  • Amazon Simple Notification Service (Amazon SNS) は、ウェブサーバーや E メールアドレスなど、パブリッシャーとクライアント間のメッセージ交換の調整と管理に役立ちます。

  • AWS CloudFormation は、AWSリソースをセットアップし、迅速かつ一貫してプロビジョニングし、AWSアカウントとリージョン全体のライフサイクルを通じてリソースを管理するのに役立ちます。

  • AWS Key Management Service (AWS KMS) は、データを保護するための暗号化キーの作成と制御に役立ちます。

  • AWS Lambda は、サーバーのプロビジョニングや管理を必要とせずにコードを実行するのに役立つコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

  • AWS SDK for Python (Boto3) は、Python アプリケーション、ライブラリ、またはスクリプトを AWSサービスに統合するのに役立つソフトウェア開発キットです。

  • AWS Secrets Manager は、パスワードを含むコード内のハードコードされた認証情報を Secrets Manager へのAPI呼び出しに置き換えて、プログラムでシークレットを取得するのに役立ちます。

  • AWS Step Functions は、Lambda 関数と他の サービスを組み合わせてビジネスクリティカルなアプリケーションを構築するのに役立つサーバーレスオーケストレーションAWSサービスです。

コード

このパターンのコードは、 GitHub クロスアカウントRDSレプリケーションリポジトリにあります。

エピック

タスク説明必要なスキル

ソースアカウントに CloudFormation スタックをデプロイします。

  1. ソースアカウント (アカウント A) の AWSマネジメントコンソールにサインインし、CloudFormation コンソール を開きます。

  2. ナビゲーションペインで、[Stacks] を選択します。

  3. [スタックの作成] を選択し、[既存のリソースを使用 (リソースのインポート)] を選択します。

  4. [リソースの識別] ページで [次へ] を選択します。

  5. [テンプレートの指定] ページで、[テンプレートのアップロード] を選択します。

  6. ファイルの選択 を選択し、 GitHub クロスアカウントRDSレプリケーションリポジトリからCloudformation-SourceAccountRDS.yamlファイルを選択し、次へ を選択します。

  7. [スタック名] にスタックの名前を入力します。

  8. [パラメータ] セクションで、スタックテンプレートで定義されている次のパラメータを指定します。

    • にはDestinationAccountNumber、送信先 RDS DB インスタンスのアカウント番号を入力します。

    • にはKeyName、AWSKMSキーを入力します。

    • にはScheduleExpressioncron 式を入力します (デフォルトは毎日午前 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、データベースの名前を入力します。

    • [エンジン] には、ソースデータベースと一致するデータベースエンジンタイプを入力します。

    • にはDBInstanceClass、任意のデータベースインスタンスタイプを入力するか、デフォルトを受け入れます。

    • サブネットグループ には、既存のVPCサブネットグループを入力します。サブネットグループの作成手順については、「Amazon ユーザーガイド」の「ステップ 2: DB サブネットグループを作成するRDS」を参照してください。

    • にはSecretName、パスとシークレット名を入力するか、デフォルトを受け入れます。

    • にはSGID、送信先クラスターのセキュリティグループ ID を入力します。

    • にはKMSKey、送信先アカウントのKMSキーARNの を入力します。

    • にはNoOfOlderInstances、ロールバック用に保持する RDS DB インスタンスの古いコピーの数を入力します。

  9. [Next (次へ)] を選択します。

  10. [スタックオプションの設定] ページで、デフォルトの値を変更せずに [次へ] を選択します。

  11. スタック設定を確認してから、[送信] を選択します。

  12. スタックのリソースタブを選択し、 の物理 ID と ARN を書き留めますInvokeStepFunction

クラウドアーキテクト、 DevOps エンジニア、クラウド管理者

送信先アカウントで RDS DB インスタンスの作成を確認します。

  1. AWS マネジメントコンソールにサインインし、Amazon RDSコンソール を開きます。

  2. ナビゲーションペインで、データベース を選択し、新しい DB インスタンスが新しいクラスターの下に表示されることを確認します。 RDS

クラウド管理者、クラウドアーキテクト、 DevOps エンジニア

Lambda 関数をSNSトピックにサブスクライブします。

送信先アカウント (AWSアカウント BCLI) の Lambda 関数をソースアカウント (アカウント A) のSNSトピックにサブスクライブするには、次のAWSコマンドラインインターフェイス () コマンドを実行する必要があります。

アカウント 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 DB インスタンスを送信先アカウントと同期します。

ソースアカウントで Step Functions ステートマシンを起動して、オンデマンドデータベースレプリケーションを開始します。

  1. Step Functions コンソールを開きます。

  2. ナビゲーションペインで、[ステートマシン] を選択します。

  3. ステートマシンを選択します。

  4. [実行] タブで関数を選択し、[実行を開始] を選択してワークフローを開始します。

: スケジュールに従って自動的にレプリケーションを実行できるようにスケジューラーは用意されていますが、スケジューラーはデフォルトではオフになっています。スケジューラの Amazon CloudWatch ルールの名前は、ターゲットアカウントの CloudFormation スタックのリソースタブにあります。 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": "*" } ] }