

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

# 間の Amazon RDS インスタンスのレプリケーションを自動化する AWS アカウント
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts"></a>

*Parag Nagwekar、Arun Chandapillai (Amazon Web Services)*

## 概要
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-summary"></a>

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

## 前提条件と制限
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-prereqs"></a>

**前提条件**
+ 2 つ AWS アカウント
+ ソースで稼働している RDS DB インスタンス AWS アカウント
+ 送信先の RDS DB インスタンスのサブネットグループ AWS アカウント
+ ソースで作成 AWS アカウント され、送信先アカウントと共有される AWS Key Management Service (AWS KMS) キー (ポリシーの詳細については、このパターンの[追加情報](#automate-the-replication-of-amazon-rds-instances-across-aws-accounts-additional)セクションを参照してください）。
+  AWS KMS key 送信先アカウントのデータベースを暗号化 AWS アカウント する送信先の 。

**制限事項**
+ 一部の AWS のサービス は では使用できません AWS リージョン。利用可能なリージョンについては、「[AWS のサービス (リージョン別)](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)」を参照してください。特定のエンドポイントについては、「[Service endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)」ページから、サービスのリンクを選択してご確認ください。

**製品バージョン**
+ Python 3.9 (使用 AWS Lambda)
+ PostgreSQL 11.3、13.x、14.x

## アーキテクチャ
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-architecture"></a>

**テクノロジースタック**
+ Amazon Relational Database Service (Amazon RDS)
+ Amazon Simple Notiﬁcation Service (Amazon SNS)
+ AWS Key Management Service (AWS KMS)
+ AWS Lambda
+ AWS Secrets Manager
+ AWS Step Functions

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

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

![\[Step Functions を使用し、レプリケート元アカウントとレプリケート先アカウント間で Amazon RDS DB インスタンスをレプリケートします。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/6310ad9b-1b1a-4a67-b684-ef605fef3e87/images/001550bb-cf6b-493d-9de9-0229a43753a1.png)


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

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

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

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

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

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

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

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

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

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

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

## ツール
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-tools"></a>

**AWS のサービス**
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) を使用して、 AWS クラウドでリレーショナルデータベースをセットアップ、運用、スケーリングできます。
+ [Amazon Simple Notiﬁcation Service (Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) は、ウェブサーバーやメールアドレスなど、パブリッシャーとクライアント間のメッセージの交換を調整および管理するのに役立ちます。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) は、 AWS リソースをセットアップし、迅速かつ一貫してプロビジョニングし、 AWS アカウント および 全体のライフサイクルを通じてリソースを管理するのに役立ちます AWS リージョン。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) は、データの保護に役立つ暗号化キーの作成と制御に役立ちます。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
+ [AWS SDK for Python (Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html) は、Python アプリケーション、ライブラリ、またはスクリプトを と統合するのに役立つソフトウェア開発キットです AWS のサービス。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) を使用すると、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API コールで置き換えて、プログラムでシークレットを取得することができます。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) は、Lambda 関数とその他の を組み合わせてビジネスクリティカルなアプリケーション AWS のサービス を構築するのに役立つサーバーレスオーケストレーションサービスです。

**コードリポジトリ**

このパターンのコードは、GitHub 内の「[Crossaccount RDS Replication](https://github.com/aws-samples/aws-rds-crossaccount-replication)」リポジトリで利用できます。

## エピック
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-epics"></a>

### ワンクリック AWS アカウント で 全体の RDS DB インスタンスのレプリケーションを自動化する
<a name="automate-the-replication-of-rds-db-instances-across-aws-accounts-with-a-single-click"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| CloudFormation スタックをソースアカウントにデプロイする。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automate-the-replication-of-amazon-rds-instances-across-aws-accounts.html) | クラウド管理者、クラウドアーキテクト | 
| CloudFormation スタックをデスティネーションアカウントにデプロイする。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automate-the-replication-of-amazon-rds-instances-across-aws-accounts.html) | クラウドアーキテクト、DevOps エンジニア、クラウド管理者 | 
| 宛先アカウントで RDS DB インスタンスが作成されたことを確認する。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automate-the-replication-of-amazon-rds-instances-across-aws-accounts.html) | クラウド管理者、クラウドアーキテクト、DevOps エンジニア | 
| Lambda 関数を SNS トピックにサブスクライブする。 | 送信先アカウント AWS Command Line Interface (アカウント B AWS CLI) の Lambda 関数をソースアカウント (アカウント A) の SNS トピックにサブスクライブするには、次の () コマンドを実行する必要があります。アカウント A で、次のコマンドを実行します。<pre>aws sns add-permission \<br />--label lambda-access --aws-account-id <DestinationAccount> \<br />--topic-arn <Arn of SNSTopic > \<br />--action-name Subscribe ListSubscriptionsByTopic </pre>アカウント B で、次のコマンドを実行します。<pre>aws lambda add-permission \<br />--function-name <Name of InvokeStepFunction> \<br />--source-arn <Arn of SNSTopic > \<br />--statement-id function-with-sns \<br />--action lambda:InvokeFunction \<br />--principal sns.amazonaws.com</pre>アカウント B で、次のコマンドを実行します。<pre>aws sns subscribe \<br />--protocol "lambda" \<br />--topic-arn <Arn of SNSTopic> \<br />--notification-endpoint <Arn of InvokeStepFunction></pre> | クラウド管理者、クラウドアーキテクト、DBA | 
| ソースアカウントの RDS DB インスタンスを宛先アカウントと同期する。 | ソースアカウントで Step Functions ステートマシンを起動して、オンデマンドデータベースレプリケーションを開始します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automate-the-replication-of-amazon-rds-instances-across-aws-accounts.html)スケジュールに従って自動的にレプリケーションを実行できるようにスケジューラは用意されていますが、スケジューラはデフォルトではオフになっています。スケジューラーの Amazon CloudWatch ルールの名前は、宛先アカウントの CloudFormation スタックの **[リソース]** タブにあります。CloudWatch イベントルールを変更する方法については、CloudWatch ドキュメントの「[Deleting or Disabling a CloudWatch Events Rule](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Delete-or-Disable-Rule.html)」を参照してください。 | クラウドアーキテクト、DevOps エンジニア、クラウド管理者 | 
| 必要に応じて、データベースを以前のコピーのいずれかにロールバックする。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automate-the-replication-of-amazon-rds-instances-across-aws-accounts.html) | クラウド管理者、DBA、DevOps エンジニア | 

## 関連リソース
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-resources"></a>
+ [クロスリージョンリードレプリカ](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RDS_Fea_Regions_DB-eng.Feature.CrossRegionReadReplicas.html) (Amazon RDS ドキュメント)
+ [ブルー/グリーンデプロイ (](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RDS_Fea_Regions_DB-eng.Feature.BlueGreenDeployments.html)Amazon RDS ドキュメント)

## 追加情報
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-additional"></a>

次のポリシー例を使用して、 AWS KMS key を共有できます AWS アカウント。

```
{
    "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": "*"
        }
    ]
}
```