如何在远程/云管理的数据库上运行迁移?(通过CI/CD)



TL;DR
在CI/CD管道中针对没有公共端点的数据库运行迁移的最佳流程/最佳做法是什么
GH actions -> connect to remote db (somehow) -> run migration on said db以及部署失败时如何回滚。

问题
我需要设置一个流来部署应用程序,并相应地进行数据库迁移。我遇到的主要问题是,最好的做法是将数据库设置为在与应用程序服务匹配的私有专有网络中运行,而没有公共端点。但是在这种情况下,如何从CI/CD管道运行迁移呢?

当前场景
此处的堆栈为nodejstypeorm、Elastic Beanstalk(EBS)&AWS。

  1. 构建docker镜像应用程序代码&推送至专用ECR(app/dev-api:latest)
  2. 构建单独的docker来打包迁移,并将其推送到单独的私有ECR。dbmigrations/dev:latest
  3. 迁移镜像一推送到dbmigrations/dev:latest,就会启动一个与RDS位于同一VPC中的fargate服务,并运行迁移
  4. 如果fargate任务成功运行,请将应用程序代码部署到Elastic Beanstalk
    • a)如果在部署到EBS期间出现问题
      • 构建新的docker镜像
      • 推送到另一个ECR;回滚";迁移
      • 启动另一个fargate服务
    • b) 如果所有任务都成功运行,则退出->部署成功

下一个场景
现在我使用以下堆栈:nodejsprisma和"App Runner"RDS";在AWS上。

我仍然想在专用专有网络中运行数据库,但我不确定如何在专用数据库中运行prisma迁移。此外,我认为还有一个比运行单独的docker容器来运行数据库迁移更简单的解决方案,因为这可能会导致部署的应用程序和数据库之间的不同步。

我知道有liquibase&flyway,但两者都是付费的(我认为),并且由于prisma本身带有迁移流,我不明白为什么我需要另一个迁移工具来完成这样的任务。

提前感谢!

附言:我使用的是GithubActions,但我更关注的是一个通用的流程。我不想找一个代码示例(因为我相信这也适用于其他管道服务)

确实,您不应该在不需要从互联网访问的数据库或实例上公开公共IP。但开发人员仍应可以访问此类服务器进行维护/调试等。

这里有一个Bastion主机,它是一个中央安全代理,允许您连接到专用服务器。你可以打开一条通过堡垒到RDS的隧道并运行迁移。

在AWS上,还有一个更新的更安全的解决方案(尽管你仍然需要堡垒),称为会话管理器,它允许你更安全地连接到服务器https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html

最新更新