作为 AWS CDK 部署的一部分,如何进行数据库架构迁移?

jjl*_*val 5 relational-database amazon-web-services amazon-rds alembic aws-cdk

我们正在 AWS EC2 上运行一个 Web 应用程序,该应用程序连接到在 AWS RDS 上运行的 MariaDB。我们设置了 AWS CDK 脚本来创建新的基础设施,包括我们自己的服务(Web 应用程序本身、后台工作人员、RabbitMQ、RDS DB)和 AWS 服务(如 ALB、安全组、DNS、S3 等)中的所有内容。一切正常,即操作基础设施,在我运行时设置所有正在运行的服务、监控和自动缩放cdk deploy

但是,有时我们需要升级 MariaDB 模式。在没有自动缩放的旧基础设施中,只需将一个 EC2 实例设置为维护模式、部署新软件并运行特殊的管理命令以使用 Alembic 启动数据库架构升级即可完成。仅运行的问题cdk deploy在于,在升级 DB 架构之前,Web 应用程序的新软件版本可能与 DB 架构不兼容。正在运行的软件应始终与 DB 模式相对应,即在升级 DB 模式时不应有任何旧实例在运行。

  1. cdk deploy当要进行数据库架构升级时,如何以受控方式进行操作,以免在旧软件版本上运行与新数据库架构不兼容的实例?

  2. 如何将数据库架构升级作为其中的一部分cdk deploy

关于问题 2:我们已经考虑拥有一个特殊版本的 web 应用程序,它不会成为自动缩放的一部分或对 Internet 开放,即它仅用于运行特殊的管理器命令,例如数据库模式升级。这是不必要的还是 AWS CDK 有一些机制可以通过关系数据库架构升级进行受控部署?

此外,我们计划使用 AWS CDK 作为 CI/CD 的一部分,即与 Jenkins 一起运行以将软件部署到目标环境。以前,我们一直使用 Jenkins 的 Salt 来编排所有这些。

注意:我看到过这个问题:使用 AWS CDK 部署后如何执行数据库架构迁移?但这不同,因为这更多是关于软件兼容性,我认为那里的答案错过了实际问题。

Max*_*erg 2

我认为 CloudFormation/CDK 将持久资源与应用程序资源分离到单独的堆栈(数据/网络/应用程序)始终是一个很好的模式。这将确保在更新任何下游堆栈之前完全更新依赖堆栈中的所有内容。然后我认为将架构更新代码放入通过数据堆栈中的CustomResource调用的 lambda 中将允许 CDK 在更新应用程序代码之前执行架构更新。