【问题标题】:How should I migrate (update DB schema) my DB for my AWS Serverless application我应该如何为我的 AWS 无服务器应用程序迁移(更新数据库架构)我的数据库
【发布时间】:2018-07-25 07:05:43
【问题描述】:
我应该如何在 AWS 无服务器应用程序中运行我的数据库迁移?在传统的 NodeJS 应用程序中,我通常先让 npm start 运行 sequelize db:migrate。但是使用 Lambda 我应该怎么做呢?
我的数据库将位于私有子网中。想知道 CodeBuild 是否能够做到这一点?还在考虑让 Lambda 函数运行迁移……不确定它是否推荐。
【问题讨论】:
标签:
node.js
amazon-web-services
migration
aws-lambda
【解决方案1】:
有多种方法可以实现这一目标。实际上,您在 CodeBuild 方面走在了正确的轨道上,至少采用这种方法应该没有任何问题。
由于您的数据库位于私有子网中,因此您需要configure CodeBuild to access your VPC。配置完成后,只需允许 CodeBuild 安全组访问您的数据库即可。
您可能希望将整个事情设置为CodePipeline。您甚至可以使用 multiple buildspec 文件为不同的 CodeBuild 运行设置它。这样您就可以拥有一个如下所示的 CodePipeline:
Source -> CodeBuild (test) -> Approval -> CodeBuild (migrations) -> Lambda
理论上,您还可以创建一个执行迁移的 Lambda 函数,并根据需要触发该函数。如果迁移需要很长时间,您还可以使用 AWS Batch 来运行它们。但是将 CodeBuild 用作部署管道的一部分非常有意义。
【解决方案2】:
由于运行时间短,Lambda 可能不是适合此任务的工具。
您最好使用在 CodeBuild 上运行的自定义脚本。并且在您的 Codepipeline 中有一个连续的 CodeBuild 任务,其中第一个 codebuild 将完成第一个 CodeBuild 的迁移和完成,您可以执行将部署您的 lambdas 的新 CodeBuild。以防万一您的数据库迁移失败,您可以退出 CodePipeLine。
您的 CodePipeLine 将如下所示。
pre_build:
commands:
- DB migration command
finally:
- CleanUp Command
build:
commands:
- Deploy lambdas command
finally:
- Cleanup command
【解决方案3】:
两种方法(lambda 和 codebuild)都可以,这取决于您的持续部署/集成流程。例如,如果您需要在多个环境中运行这些迁移,Codebuild 会更合适。
如果你没有 CI/CD 机制,你可以只在 lambda 上运行它,因为它在内存方面非常灵活(你只需要小心maximum execution time),或者使用已经制作package like this(这是一个建议,取决于您的数据库)。
最后的意见是,如果您的进程非常繁重和/或需要执行大量读/写操作,您也可以尝试在 AWS ECS 实例上运行它,该实例将在您运行迁移时及之后扩展完成后,返回到其定义的最小尺寸。