有没有办法将更改推送到 AWS Beanstalk,而不是在每次部署时上传整个 zip 文件?

Posted

技术标签:

【中文标题】有没有办法将更改推送到 AWS Beanstalk,而不是在每次部署时上传整个 zip 文件?【英文标题】:Is there a way to push changed to AWS Beanstalk instead of uploading an entire zip file on each deploy? 【发布时间】:2017-07-23 18:29:26 【问题描述】:

我正在迁移 Play!从 Heroku 到 AWS Beanstalk 的应用程序。 Heroku 在部署方面非常简单:只需将更改推送到 Heroku 上的远程 git 存储库,然后在服务器端进行构建。

这非常方便,因为不需要为每个微小的变化上传整个项目(包括所有库!)。

基本上,对于每个更改,我们都会生成一个 140 MB 的 Docker 压缩文件,至少需要 10 分钟才能上传。

肯定有更好的方法,但是在 Google 上进行长时间的搜索只返回了使用脚本和 Jenkins 等替代方案自动生成文件的选项,但这并不能解决问题,它只是自动解决了问题。

谁有更好的解决方案?

【问题讨论】:

Elastic Beanstalk 支持类似于 Heroku 的基于 Git 的部署。但是,您似乎已经决定使用 Docker 部署,我相信每次都需要完整的 zip 上传。 是的,您可以将 eb codecommit 用于 php 或 js 项目。我缺少的一块拼图是运行打包的 Play 框架应用程序。我将如何使用 codecommit 并将应用程序打包在 eb 实例上?放弃 Docker 完全没有问题。 【参考方案1】:

简短回答:不。

长答案:我最终用激活器打包了应用程序,而不是使用 Docker。

    在项目的根目录中创建一个名为“dist”的文件夹。 包含一个名为 Procfile 的文件,其中包含以下行:

web: ./bin/YOUR_APP_NAME -Dhttp.port=5000 -Dconfig.file=conf/application.conf

确保将 YOUR_APP_NAME 替换为 build.sbt 中配置的应用名称。

    使用以下命令打包 Play 应用:

activator clean dist

这将在项目的 target/universal/ 文件夹中生成一个 zip 文件。

    将该 zip 文件部署到 AWS Elastic Beanstalk。

【讨论】:

【参考方案2】:

所以我也对这个问题感到好奇,并与 AWS 专家讨论了这里的不同选项。每个选项都有它的缺点。

第一个选项是烘焙您的应用程序代码,从中创建一个 AMI,然后使用烘焙的 AMI 进行部署。 More on that

在采用之前,您必须先测试此方法。缺点是您必须定期维护 AMI。由于 AMI 已被锁定,您可能还会错过 Beanstalk 的关键补丁

关于这个话题的好read

下一个方法是离开 Beanstalk 并使用 CloudFormation,您可以将应用程序文件夹上传到 S3。您的 CloudFormation 模板必须负责启动所需的所有资源并使用 AWS::CloudFormation::Init 和 cfn-signals,才能安装和设置软件。资源元数据中的更改可以通过使用来检测正确的 CloudFormation 信号,我们还可以在检测到模板规范发生更改时运行用户指定的操作。

(AWS::CloudFormation::Init)

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-helper-scripts-reference.html(可与 CloudFormation 一起使用的帮助脚本集)

虽然这些并不是您所要求的完全解决方案,但它们可能是一个不错的选择。至少我确保你不会错过 Beanstalk 的任何可用选项。

我从他们那里得到的一个建议是考虑将应用程序拆分为多个组件和子组件。这将大大减少您的应用程序大小。

希望这会有所帮助。

【讨论】:

谢谢,我知道EB Codecommit,问题是在推送代码后部署应用程序。 对不起,我误读了您的问题。我将更新我的答案。 感谢您的努力。 AWS 真的应该看看 Heroku 对构建包做了什么。实施起来应该不难,收益也很大。 完全同意你的观点。【参考方案3】:

您可以设置一个AWS CodeCommit 存储库,并将其用作本地git 存储库的remote。接下来,您可以设置 AWS CodePipeline 来构建您的应用程序并在 AWS CodeCommit 存储库有新提交时部署到 Elastic Beanstalk。

这样您就不必每次都上传所有内容。每当您执行 git push 时,只会将更改的文件上传到 AWS CodeCommit 存储库,然后 AWS CodePipeline 会负责构建您的应用程序并将其部署到 Elastic Beanstalk。

【讨论】:

以上是关于有没有办法将更改推送到 AWS Beanstalk,而不是在每次部署时上传整个 zip 文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MacOSX 将 Rails 应用程序推送到 AWS Elastic Beanstalk

sh 构建Docker镜像,将其推送到AWS EC2 Container Registry,然后将其部署到AWS Elastic Beanstalk

git:在 Mac 上尝试将存储库推送到 Amazon Elastic Beanstalk 时,“aws.push”不是 git 命令

Symfony2,AWS Beanstalk:如何将供应商作为文件而不是 git-submodules 推送到 repo

如何将 AWS Beanstalk IP 列入白名单

将 AWS Lambda 数据推送到 Kinesis Stream