几个月前,我被要求为使用RDS(PostgreSQL)的项目设计DRP过程(多区域)。 RDS实例是关键组件,这些存储的PII信息。 RDS会自动拍摄该实例的快照,您可以使用它们在失败时重新创建实例,这些快照可以在同一区域中使用,但是您可以在帐户和区域之间共享或复制它们,在这里,一些AWS Docs related RDS automatic snapshots。
我最初的想法是创建一个K8作业以为每个RDS实例运行PG_DUMP,然后将文件上传到在其他区域中创建的S3存储桶中,这还不错,但这需要更多的工作来备份和还原。因此,我决定在区域之间复制快照,这里出现了一个新的挑战,如何自动化该副本?在这篇文章中,我将展示要解决此问题的方法,这里要提到的一个关键点是,对于大量快照,由于AWS RDS复制快照。 P>
AWS文档说:
“您最多可以有20个快照复制请求到每个帐户的单个目的地区域。”
这种方法使用AWS Event-Bridge和Lambda来自动化复制过程,总而言之,Vev-Bridge检测到已经创建了新的RDS快照,并触发了Lambda功能以将快照复制到其他区域。
为此豆荚创建了一个地Terraform代码,您可以检查here
RDS快照
您可以为实例配置自动化的RDS快照,这每天发生在实例创建中定义的备份窗口中。
在这种情况下,在每个实例中配置了自动化的RDS快照,这只是在创建RDS实例的同一帐户和区域中创建快照。
AWS活动桥
EventBridge是一款无服务器服务,它使用事件将应用程序组件连接在一起,从而使您更容易构建可扩展事件驱动的应用程序。您可以将其用于将事件从组织中的本地应用程序,AWS服务和第三方软件等来源路由到您组织的消费者应用程序。
在这种情况下,AWS为某些服务生成了大量事件,RDS可以找到分为类别的事件,下表显示了RDS快照的事件。当RDS启动自动快照时,AWS会注册该事件。您可以在AWS documentation中找到所有事件。
如何使用事件?
让我们从Eventbridge世界中的一个重要概念开始,这是事件总线。这是接收事件的管道,您可以配置规则以操纵事件并指定操作。事件表示为JSON对象,它们都具有相似的结构和相同的顶级字段。默认情况下,AWS帐户有一个默认事件总线,可从AWS服务接收事件。
在这种情况下,我们可以使用默认事件 -
创建一个规则。您可以选择用于使用的AWS服务,AWS将显示活动的外观示例。
对于我们的情况,我们可以使用EventID进行自动快照,RDS-Event-0091,您可以参考帖子顶部显示的图像以获取更多信息。
{
"source": ["aws.rds"],
"detail-type": ["RDS DB Snapshot Event"],
"account": ["1234567890"],
"region": ["us-east-1"],
"detail": {
"SourceType": ["SNAPSHOT"],
"EventID": ["RDS-EVENT-0091"]
}
}
通过定义事件模式,我们可以指定此事件到默认事件总线时执行的lambda函数。
这意味着,如果在默认事件总线中收到事件并与指定的模式进行匹配,将触发lambda并通过生成事件传递JSON,则看起来像这样:
{
"version": "0",
"id": "844e2571-85d4-695f-b930-0153b71dcb42",
"detail-type": "RDS DB Snapshot Event",
"source": "aws.rds",
"account": "123456789012",
"time": "2018-10-06T12:26:13Z",
"region": "us-east-1",
"resources": ["arn:aws:rds:us-east-1:123456789012:db:mysql-instance-2018-10-06-12-24"],
"detail": {
"EventCategories": ["creation"],
"SourceType": "SNAPSHOT",
"SourceArn": "arn:aws:rds:us-east-1:123456789012:db:mysql-instance-2018-10-06-12-24",
"Date": "2018-10-06T12:26:13.882Z",
"SourceIdentifier": "rds:mysql-instance-2018-10-06-12-24",
"Message": "Automated snapshot created"
}
}
lambda功能
lambda函数是一个python代码,可获取事件并提取有用的信息并在另一个区域中启动副本。
lambda函数只需启动副本,该函数就不会等待完成任务。
您可以看到python代码here