通过 CloudFormation 堆栈部署初始化和填充无服务器 PostgreSQL RDS 实例的最佳实践

Posted

技术标签:

【中文标题】通过 CloudFormation 堆栈部署初始化和填充无服务器 PostgreSQL RDS 实例的最佳实践【英文标题】:Best practices to Initialize and populate a serverless PostgreSQL RDS instance by a CloudFormation stack deployment 【发布时间】:2022-01-18 22:05:28 【问题描述】:

我们正在成功构建一个包含无服务器 RDS PostgreSQL 实例的 AWS CloudFormation 堆栈。一旦 PostgreSQL 实例就位,我们将自动恢复一个 PostgreSQL 数据库转储(二进制格式),该转储是在 CloudFormation 刚刚创建的实例 PostgreSQL 实例上的本地开发机器上使用 pg_dump 创建的。

我们正在使用 Lambda 函数(由 CloudFormation 进程实例化),该函数包括在 Lambda 层中构建的 pg_restore 可执行文件,并且我们还在 Lambda 中打包了我们的数据库转储文件。

对于可能已经解决了很多次的问题,上述方法似乎很复杂......但谷歌搜索几乎没有发现任何与我们的场景相对应的东西。​我们可能以错误的方式考虑我们的情况,因此请随时提供不同的方法(例如,是否有 CodePipeline/CodeBuild 方法可以自动执行所有操作)。我们的偏好是尽可能坚持使用 AWS 工具集。

作为我们 CI/CD 实践的一部分,我们每次部署到新环境(例如,开发、测试、阶段、预生产、演示、Alpha、Beta、生产、故障排除)时都会运行此过程.

有没有人有建议或博客文章说明实现我们目标的另一种方法?

【问题讨论】:

【参考方案1】:

如果您已经通过 IaC(基础架构即代码)预置了所有内容,那么这可以节省大部分时间,并且您应该已经能够通过 AWS 凭证和配置文件中的不同角色将您的基础架构复制到其他账户/堆栈通过传递 --profile some-profile 标志。我会推荐 AWS SAM(无服务器应用程序模型)而不是 Cloudformation,因为我发现我只需要编写约 1/2 的代码(主要为您创建角色和策略)并通过控制台获得更好更快的反馈。我还建议使用 sam sync(它目前处于测试阶段,但值得使用),因此您无需在代码更新时创建“更改集”,纯粹是更新代码,因此部署需要 3-4 秒。这里有一些 AWS SAM 示例,请查看视频和模式:https://serverlessland.com(AWS 官方网站)

就 RDS 的还原而言,我可能会创建一个基本 RDS,然后对其进行快照并从快照中还原所有其他 RDS 实例,而不是在您能够复制快照时手动创建它,事实上跨帐户(如果需要,还可以跨区域)自动备份到快照,这应该更简洁

还有一个干净的解决方案,用于使用 AWS DMS(数据迁移服务)和 CDC(更改数据捕获)在 AWS 账户之间即时复制数据。因此,流程是您拥有一个源数据库和一个目标数据库,还有一个“复制实例”(例如 EC2 Micro),它监控您的源数据库并可以将其复制到不同的实例(因此您始终保持数据同步,例如如果您有多个开发人员在单独的“堆栈”上工作以不污染彼此的日志,您可以在需要时从一个数据库复制数据并无缝更改) - 因此这适用于 AWS 中已经存在的源数据库和目标数据库,但是您可以当然也可以使用 AWS DMS 将本地数据库迁移到 AWS,更多信息在这里:https://docs.aws.amazon.com/dms/latest/sbs/chap-manageddatabases.html

【讨论】:

感谢您的建议 - 我喜欢使用数据库快照在环境之间移动的想法,但我们在尝试远程开发并将数据库内容和其他 DDL 更改上传到我们的开发环境时遇到了复杂性- 您对我们的数据库开发方法有什么建议吗? @Neoheurist 更新了关于 AWS DMS 和 CDC 的答案,谢谢

以上是关于通过 CloudFormation 堆栈部署初始化和填充无服务器 PostgreSQL RDS 实例的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 cloudformation 部署 opsworks 应用程序?

我应该如何通过 cloudformation 部署我的 aws 状态机?

AWS API Gateway RestAPI CloudFormation 更新不更新部署资源

Cloudformation 找不到区域性 Opsworks 堆栈

部署 CloudFormation 堆栈以创建 ElasticBeanstalk 应用程序时出现 InsufficientPrivilegesException

在已创建的资源上部署 lambda 函数