本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在跨区域自动复制 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 账户 ,用于加密目标账户中的数据库
限制
有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅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)的定时按需复制的架构。
在源账户(图中的账户 A)中,Step Functions 状态机执行以下操作:
从账户 A 中的RDS数据库实例创建快照。
使用 AWS KMS key 来自账户 A 复制和加密快照。为确保传输过程中的加密,无论数据库实例是否加密,都将对快照进行加密。
通过授予账户 B 对快照的访问权限,与账户 B 共享数据库快照。
向该主题推送通知,然后该SNSSNS主题调用账户 B 中的 Lambda 函数。
在目标账户(图中的账户 B)中,Lambda 函数运行 Step Functions 状态机来编排以下内容:
将共享快照从账户 A 复制到账户 B,同时使用 AWS KMS key 来自账户 A 先解密数据,然后使用账户 B AWS KMS key 中的账户对数据进行加密。
从 Secrets Manager 中读取密钥,以捕获当前数据库实例的名称。
使用新名称和亚马逊RDS的默认 AWS KMS key 名称从快照中恢复数据库实例。
读取新数据库的端点并使用新的数据库端点更新 Secrets Manager 中的密钥,然后为以前的数据库实例添加标签,以便日后将其删除。
保留数据库最新 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 堆栈。 |
| 云管理员、云架构师 |
在目标账户中部署 CloudFormation 堆栈。 |
| 云架构师、 DevOps 工程师、云管理员 |
验证目标账户中RDS数据库实例的创建情况。 |
| 云管理员、云架构师、 DevOps 工程师 |
通过 Lambda 函数订阅该主题。SNS | 您必须运行以下 AWS Command Line Interface (AWS CLI) 命令才能将目标账户(账户 B)中的 Lambda 函数订阅到源账户(账户 A)中的SNS主题。 在账户 A 中,运行以下命令:
在账户 B 中,运行以下命令:
在账户 B 中,运行以下命令:
| 云管理员、云架构师、DBA |
将源账户中的RDS数据库实例与目标账户同步。 | 通过在源账户中启动 Step Functions 状态机,启动按需数据库复制。
注意已有计划程序可以帮助您按计划自动运行复制,但默认情况下,该计划程序处于关闭状态。您可以在目标账户 CloudFormation 堆栈的 “资源” 选项卡中找到计划程序的 Amazon CloudWatch 规则名称。有关如何修改 CloudWatch 事件规则的说明,请参阅 CloudWatch 文档中的删除或禁用 CloudWatch 事件规则。 | 云架构师、 DevOps 工程师、云管理员 |
需要时,可以将数据库回滚至之前的任何副本。 |
| 云管理员DBA、 DevOps 工程师 |
相关资源
蓝/绿部署(Ama RDS zon 文档)
其他信息
您可以使用以下示例策略来 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": "*" } ] }