AWS Event-Bridge和Lambda将RDS快照复制到另一个区域
#aws #python #devops #eventdriven

几个月前,我被要求为使用RDS(PostgreSQL)的项目设计DRP过程(多区域)。 RDS实例是关键组件,这些存储的PII信息。 RDS会自动拍摄该实例的快照,您可以使用它们在失败时重新创建实例,这些快照可以在同一区域中使用,但是您可以在帐户和区域之间共享或复制它们,在这里,一些AWS Docs related RDS automatic snapshots

我最初的想法是创建一个K8作业以为每个RDS实例运行PG_DUMP,然后将文件上传到在其他区域中创建的S3存储桶中,这还不错,但这需要更多的工作来备份和还原。因此,我决定在区域之间复制快照,这里出现了一个新的挑战,如何自动化该副本?在这篇文章中,我将展示要解决此问题的方法,这里要提到的一个关键点是,对于大量快照,由于AWS RDS复制快照。

AWS文档说:

“您最多可以有20个快照复制请求到每个帐户的单个目的地区域。”

这种方法使用AWS Event-Bridge和Lambda来自动化复制过程,总而言之,Vev-Bridge检测到已经创建了新的RDS快照,并触发了Lambda功能以将快照复制到其他区域。

Architecture Diagram

为此豆荚创建了一个地Terraform代码,您可以检查here

RDS快照

您可以为实例配置自动化的RDS快照,这每天发生在实例创建中定义的备份窗口中。
在这种情况下,在每个实例中配置了自动化的RDS快照,这只是在创建RDS实例的同一帐户和区域中创建快照。

AWS活动桥

EventBridge是一款无服务器服务,它使用事件将应用程序组件连接在一起,从而使您更容易构建可扩展事件驱动的应用程序。您可以将其用于将事件从组织中的本地应用程序,AWS服务和第三方软件等来源路由到您组织的消费者应用程序。

在这种情况下,AWS为某些服务生成了大量事件,RDS可以找到分为类别的事件,下表显示了RDS快照的事件。当RDS启动自动快照时,AWS会注册该事件。您可以在AWS documentation中找到所有事件。

RDS Events

如何使用事件?

让我们从Eventbridge世界中的一个重要概念开始,这是事件总线。这是接收事件的管道,您可以配置规则以操纵事件并指定操作。事件表示为JSON对象,它们都具有相似的结构和相同的顶级字段。默认情况下,AWS帐户有一个默认事件总线,可从AWS服务接收事件。

default event-bus

在这种情况下,我们可以使用默认事件 -

创建一个规则。

rds-rule-creation

您可以选择用于使用的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函数。

Trigger-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