在跨区域自动复制 Amazon RDS 实例 AWS 账户 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在跨区域自动复制 Amazon RDS 实例 AWS 账户

由 Parag Nagwekar (AWS) 和 Arun Chandapillai () 创作 AWS

摘要

此模式向您展示了如何使用 AWS Step Functions 和自动跨不同的 AWS 账户 复制、跟踪和回滚您的 Amazon Relational Database Service (AmazonRDS) 数据库实例。 AWS Lambda无论您的组织规模大小,您都可以使用这种自动化来执行RDS数据库实例的大规模复制,而不会对性能造成任何影响或运营开销。您还可以使用这种模式来帮助您的组织遵守强制性的数据治理策略或合规性要求,这些策略或合规性要求要求在不同的 AWS 账户 和之间复制和冗余数据 AWS 区域。大规模跨账户复制 Amazon RDS 数据是一个效率低下且容易出错的手动流程,可能既昂贵又耗时,但是这种模式下的自动化可以帮助您安全、有效和高效地实现跨账户复制。

先决条件和限制

先决条件

  • 二 AWS 账户

  • RDS数据库实例,在源系统中启动并运行 AWS 账户

  • 目标RDS数据库实例的子网组 AWS 账户

  • 在源中创建 AWS 账户 并与目标账户共享的 AWS Key Management Service (AWS KMS) 密钥(有关策略详细信息的更多信息,请参阅此模式的其他信息部分。)

  • 目标 AWS KMS key 中的一个 AWS 账户 ,用于加密目标账户中的数据库

限制

产品版本

  • Python 3.9(使用 AWS Lambda)

  • Postgre SQL 11.3、13.x 和 14.x

架构

技术堆栈

  • 亚马逊 Relational Database Service(亚马逊RDS)

  • 亚马逊简单通知服务(亚马逊SNS)

  • AWS Key Management Service (AWS KMS)

  • AWS Lambda

  • AWS Secrets Manager

  • AWS Step Functions

目标架构

下图显示了使用 Step Functions 编排RDS数据库实例从源账户(账户 A)到目标账户(账户 B)的定时按需复制的架构。

使用 Step Functions 在源账户和目标账户之间复制亚马逊RDS数据库实例。

在源账户(图中的账户 A)中,Step Functions 状态机执行以下操作:

  1. 从账户 A 中的RDS数据库实例创建快照。

  2. 使用 AWS KMS key 来自账户 A 复制和加密快照。为确保传输过程中的加密,无论数据库实例是否加密,都将对快照进行加密。

  3. 通过授予账户 B 对快照的访问权限,与账户 B 共享数据库快照。

  4. 向该主题推送通知,然后该SNSSNS主题调用账户 B 中的 Lambda 函数。

在目标账户(图中的账户 B)中,Lambda 函数运行 Step Functions 状态机来编排以下内容:

  1. 将共享快照从账户 A 复制到账户 B,同时使用 AWS KMS key 来自账户 A 先解密数据,然后使用账户 B AWS KMS key 中的账户对数据进行加密。

  2. 从 Secrets Manager 中读取密钥,以捕获当前数据库实例的名称。

  3. 使用新名称和亚马逊RDS的默认 AWS KMS key 名称从快照中恢复数据库实例。

  4. 读取新数据库的端点并使用新的数据库端点更新 Secrets Manager 中的密钥,然后为以前的数据库实例添加标签,以便日后将其删除。

  5. 保留数据库最新 N 个实例,并删除所有其他实例。

工具

AWS 服务

  • Amazon Relational Database Service (AmazonRDS) 可帮助您在中设置、操作和扩展关系数据库 AWS Cloud。

  • 亚马逊简单通知服务 (AmazonSNS) 可帮助您协调和管理发布者与客户之间的消息交换,包括网络服务器和电子邮件地址。

  • AWS CloudFormation帮助您设置 AWS 资源,快速一致地配置资源,并在和的整个 AWS 账户 生命周期中对其进行管理 AWS 区域。

  • AWS Key Management Service (AWS KMS) 帮助您创建和控制加密密钥以帮助保护您的数据。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

  • AWS SDK for Python (Boto3)是一个软件开发套件,可帮助您将 Python 应用程序、库或脚本与集成 AWS 服务。

  • AWS Secrets Manager通过API调用 Secrets Manager 以编程方式检索密钥,帮助您替换代码中的硬编码凭据(包括密码)。

  • AWS Step Functions是一项无服务器编排服务,可帮助您组合 Lambda 函数和其他函数 AWS 服务 来构建业务关键型应用程序。

代码存储库

此模式的代码可在 GitHub 跨账户RDS复制存储库中找到。

操作说明

任务描述所需技能

在源账户中部署 CloudFormation 堆栈。

  1. 登录源账户(账户 A)并打开CloudFormation 控制台。 AWS Management Console

  2. 在导航窗格中,选择 Stacks(堆栈)

  3. 选择创建堆栈,然后选择使用现有的资源(导入资源)

  4. 识别资源页面,选择下一步

  5. Select Template(选择模板)页面上,选择 Upload a template(上传模板)

  6. 选择 “选择文件”,从 “ GitHub 跨账户RDS复制” 存储库中选择Cloudformation-SourceAccountRDS.yaml文件,然后选择 “下一步”。

  7. 堆栈名称中,输入资源堆栈的名称。

  8. Parameters(参数)部分中,指定在堆栈模板中定义的以下参数:

    • 对于 DestinationAccountNumber,输入目标RDS数据库实例的账号。

    • 对于 KeyName,请输入您的 AWS KMS key。

    • 对于 ScheduleExpression,输入 cron 表达式(默认值为每天上午 12:00)。

    • 对于 S ourceDBIdentifier,输入源数据库的名称。

    • 在 “S ourceDBSnapshot 名称” 中,输入快照的名称或接受默认名称。

  9. 选择下一步

  10. 配置堆栈选项页面上,保留默认设置,然后选择下一步

  11. 查看集合配置并选择 Submit(提交)。

  12. 为您的堆栈选择资源选项卡,然后记下该SNS主题的 Amazon 资源名称 (ARN)。

云管理员、云架构师

在目标账户中部署 CloudFormation 堆栈。

  1. 登录目标账户(账户 B)并打开CloudFormation 控制台。 AWS Management Console

  2. 在导航窗格中,选择 Stacks(堆栈)

  3. 选择创建堆栈,然后选择使用现有的资源(导入资源)

  4. 识别资源页面,选择下一步

  5. Select Template(选择模板)页面上,选择 Upload a template(上传模板)

  6. 选择文件,从 GitHub 跨账户RDS复制存储库中选择Cloudformation-DestinationAccountRDS.yaml文件,然后选择下一步

  7. 堆栈名称中,输入资源堆栈的名称。

  8. Parameters(参数)部分中,指定在堆栈模板中定义的以下参数:

    • 对于 DatabaseName,输入数据库的名称。

    • 引擎,输入与源数据库匹配的数据库引擎类型。

    • 对于 DBInstanceClass,输入首选数据库实例类型或接受默认值。

    • 对于子网组,请输入现有的子VPC网组。有关创建子网组的说明,请参阅 Amazon RDS 文档中的步骤 2:创建数据库子网组

    • 对于 SecretName,请输入路径和密钥名称,或者接受默认值。

    • 对于 SGID,请输入目标集群的安全组 ID。

    • 对于 KMSKey,在ARN目标账户中输入KMS密钥的。

    • 对于 NoOfOlderInstances,输入要为回滚保留的RDS数据库实例的旧副本数量。

  9. 选择下一步

  10. 配置堆栈选项页面上,保留默认设置,然后选择下一步

  11. 查看集合配置并选择 Submit(提交)。

  12. 选择堆栈的 “资源” 选项卡,然后记下物理 ID 和ARNInvokeStepFunction

云架构师、 DevOps 工程师、云管理员

验证目标账户中RDS数据库实例的创建情况。

  1. 登录 AWS Management Console 并打开 Amazon RDS 控制台

  2. 在导航窗格中,选择数据库,然后验证新RDS数据库实例是否出现在新集群下。

云管理员、云架构师、 DevOps 工程师

通过 Lambda 函数订阅该主题。SNS

您必须运行以下 AWS Command Line Interface (AWS CLI) 命令才能将目标账户(账户 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 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": "*" } ] }