使用 Amazon Beanstalk 部署 play2 应用程序的最佳方式

Posted

技术标签:

【中文标题】使用 Amazon Beanstalk 部署 play2 应用程序的最佳方式【英文标题】:Best way to deploy play2 app using Amazon Beanstalk 【发布时间】:2014-04-03 19:23:55 【问题描述】:

我在 here 和其他一些地方找到了关于在 amazon ec2 上部署 Play2 应用程序的零散说明。但是没有找到任何使用 Beanstalk 进行部署的巧妙方法。

Play 是一个不错的框架,AWS beanstalk 是最受欢迎的服务之一,那么为什么没有官方说明这样做呢?

有没有人找到更好的解决方案?

【问题讨论】:

【参考方案1】:

现在使用 Docker Containers 和 sbt's experimental docker feature 可以轻松地在弹性 beanstalk 上部署 Play2 应用。

build.sbt 中指定暴露的 docker 端口:

dockerExposedPorts in Docker := Seq(9000)

您应该自动执行以下步骤,但您可以手动尝试以测试它是否有效:

通过运行以下命令为项目生成Dockerfilesbt docker:stage。 转到./target/docker/ 目录。 使用以下内容创建一个弹性 beanstalk Dockerrun.aws.json 文件:


   "AWSEBDockerrunVersion": "1",
   "Ports": [
       
           "ContainerPort": "9000"
       
   ]

压缩该目录中的所有内容,比如压缩到一个名为play2-test-docker.zip 的文件中。 zip 文件应包含以下文件:DockerfileDockerrun.aws.jsonfiles/* 目录。

转到 aws beanstalk 控制台并使用 m3.medium 或任何具有足够内存供 jvm 运行的实例类型创建一个新应用程序。任何内存太少的实例都会导致 JVM 错误。

在 Predefined Configuration 下拉菜单中选择“Docker Container”。

在应用程序选择屏幕中,选择“上传”并选择您之前创建的 zip 文件。启动应用程序,然后去泡茶。这可能需要很长时间。分钟。相同应用版本的后续部署应该会稍微快一些。

一旦应用程序在 aws 控制台中运行并显示为绿色,单击应用程序的 url,您应该会看到应用程序的欢迎屏幕(或任何您的索引文件)。

【讨论】:

我已经完成了所有这些步骤,但是我在部署时收到了一个权限错误,你能看看吗? ***.com/questions/25821294/… 再次检查您的 zip 文件以确保您的所有文件都在那里,并且 zip 文件中的路径相对于 /target/docker 目录。如果您将-v 传递给unzip,您应该会看到/bin 目录。或者,如果您将文件解压缩到其他位置,您应该会在该目录中看到Dockerfile/bin。最后,您应该通过从target/docker 目录创建映像然后在本地部署该映像来在本地测试部署。如果它在您的机器上启动,它将在 EBS 上启动;码头工人的美丽。 我无法编辑我之前的评论,您应该在 zip 文件中看到的正确目录是 files/,而不是 binbin 目录的相对路径是 @987654347 @ 你还需要有一个空的 Volumes 数组,否则 EBS 会在你部署新版本的应用程序时给你报错,并返回这个错误:***.com/questions/28213232/… 我创建了这个小示例项目来帮助人们在 AWS Beanstalk 上发布。希望对某人有所帮助:github.com/Enalmada/play-beanstalk【参考方案2】:

这是我的解决方案,它不需要任何额外的服务/容器,如 Docker 或 Jenkins。

在 Play 应用程序目录的根目录中创建一个 dist 文件夹。创建一个包含以下内容的Procfile 文件,并将其放入dist 文件夹中(EB 需要5000 端口):

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

YOUR_APP_FILE_NAME 是bin 目录中可执行文件的名称,该目录位于activator dist 创建的.zip 中。

运行activator dist后,您只需将创建的zip文件上传到Elastic Beanstalk,它就会自动部署应用程序。您还可以将任何 .ebextension 文件夹和配置文件放入 Elastic Beanstalk 配置所需的 dist 文件夹中。前任。我有 dist/.ebextensions/nginx/conf.d/proxy.conf 用于 NGINX 反向代理设置或dist/.ebextensions/env.config 用于环境变量。

【讨论】:

简单直接。谢谢雷蒙德! 另外,我认为配置文件规范可以缩短为-Dconfig.resource=application.conf(假设它在conf文件夹中) 我也试过了,但是当我转到 URL 时收到 502 Bad Gateway 错误...你遇到了吗?我可以确认我的应用程序正在端口 5000 上运行,因为我的日志聚合器正在显示它。所以我知道应用程序正在运行并且它在正确的端口上运行。 我们有可能在dist/.ebextensions/nginx/conf.d/proxy.conf 文件中达到峰值吗?我正在使用上述方法运行 Play 应用程序,但是我似乎还无法获得客户端的真实 IP 地址。是的,我很清楚这一点:playframework.com/documentation/2.5.x/HTTPServer 但它似乎并没有解决问题。 这对我来说就像一个魅力。我不得不调整一些事情:1)应用程序需要一个密钥,根据 play prod 配置,为了测试目的,将 `-Dplay.http.secret.key=somesecretkey` 添加到 procfile 或 application.conf 应该可以工作. 2) application.conf 必须将 play.filters.hosts 设置为 EB 在我的情况下生成的主机,它类似于“.myapp-env.mqcnjcf34yryt.us-east-2.elasticbeanstalk.com”【参考方案3】:

2016 年编辑:现在有一种更好的方法可以使用新的 Java SE containers 将 Playframework 应用程序部署到 ElasticBeanstalk。

这里有一篇文章将引导您逐步完成部署,使用 Jenkins 构建和部署您的项目: https://www.davemaple.com/articles/deploy-playframework-elastic-beanstalk-jenkins/


您可以使用我在此处不断更新的自定义 AMI: https://github.com/davemaple/playframework-nginx-elastic-beanstalk

这些运行 Nginx + Playframework 并支持使用“activator dist”创建的标准 zip 文件。

【讨论】:

这绝对是要走的路。 谢谢。我一直在开玩笑说,如果我们有一个可以运行打包应用程序的虚拟机,我们就不需要 docker 为我工作。非常感谢! 知道如何实现这种 sbt 风格吗?【参考方案4】:

我们也认为这太痛苦了,并已将原生 Play 2 支持添加到 Boxfuse 以解决此问题。

您现在可以简单地执行boxfuse run my-play-app-1.0.zip -env=prod,这将自动:

为您的 Play 2 应用量身定制最小 AMI 创建弹性 IP 创建具有正确权限的安全组 启动您的应用实例

所有未来的更新都作为零停机时间的蓝/绿部署

这也适用于 Elastic Load Balancer 和 Auto-Scaling Groups,Boxfuse 免费套餐旨在适应 AWS 免费套餐。

您可以在此处阅读更多信息:https://boxfuse.com/blog/playframework-aws

免责声明:我是 Boxfuse 的创始人兼首席执行官

【讨论】:

感谢您的建议,它轻松解决了我的问题。很高兴终于有一款软件能做到它所说的那样,并且像它所说的那样简单。【参考方案5】:

我在这里和那里找到的其他解决方案遇到了一些问题。我想问题在于我正在Play 2.4上进行开发。

无论如何,我可以使用 Typesafe Activator 和 Docker 将应用程序部署到 Beanstalk:

build.sbt 我添加了以下几行: 导入 com.typesafe.sbt.packager.docker.ExecCmd, Cmd // [...] dockerCommands := Seq( Cmd("FROM","java:openjdk-8-jre"), Cmd("维护者","我的名字"), Cmd("曝光","9000"), Cmd("添加","阶段 /"), Cmd("WORKDIR","/opt/docker"), Cmd("RUN","[\"chown\", \"-R\", \"守护进程\", \".\"]"), Cmd("RUN","[\"chmod\", \"+x\", \"bin/myapp\"]"), Cmd("用户","守护进程"), Cmd("ENTRYPOINT","[\"bin/myapp\", \"-J-Xms128m\", \"-J-Xmx512m\", \"-J-server\"]"), ExecCmd("CMD") ) 我进入项目目录并在终端中运行此命令 $ ./activator clean docker:stage 我打开了[project]/target/docker目录并创建了文件Dockerrun.aws.json。这是它的内容: "AWSEBDockerrunVersion": "1", “港口”:[ “容器端口”:“9000” ] 在同一个target/docker 目录中,我测试了结果,构建、检查并运行了映像: $ docker build -t myapp 。 $ 码头工人图片 $ docker run -p 9000:9000 myapp 一切正常,我压缩了内容: $ zip -r myapp.zip *

我的 zip 文件有 DockerfileDockerrun.aws.jsonstage/* 文件

最后,我创建了一个新的 Beanstalk 应用程序并上传了上一步创建的 zip。在创建应用程序时,我负责在“预定义配置”中选择“通用 Docker”。

【讨论】:

这个过程如何处理应用程序机密(如数据库密码等)?它是否希望在 application.conf 中硬编码秘密? @xvga 硬编码?不,那将是最糟糕的。应从环境变量加载应用程序机密。 Tbh,我不记得你是否可以用 Beanstalk 做到这一点。我上一次使用这项技术是在两年前。 Afaik,EB 允许设置环境变量,但 docker 容器内的应用程序无法访问它们。由于我不想将机密硬编码到 docker 映像中,而且似乎无法从 EB 获取环境变量,因此暂时没有 docker:\ @xvga 也许这有帮助 ==> ***.com/questions/25149768/…【参考方案6】:

Beanstalk 只支持 WAR 部署,Play 官方不支持 WAR 部署。如果您想使用 EC2,那么您应该只创建一个 EC2 实例并按照部署说明进行操作:http://www.playframework.com/documentation/2.2.x/ProductionDist

【讨论】:

【参考方案7】:

在 aws ec2 中部署 play 2.* 应用程序非常不同,直到您找到了更好的方法。我的意思是 ansible 承诺一个很好的解决方案。尽管仍然需要使用新的 ansible 设置及其剧本,但这一定是值得的。 我最近发现了这些读物,但尚未将它们应用到我的项目中。我希望以下阅读内容可以帮助您了解更多信息:

Ansible + play + aws ec2

Read it to know more about Ansible to deply play in aws

谢谢! 希望这将帮助您开始。请分享您在此过程中获得的更多知识,或者是否有任何简单的方法可以解决这个复杂的部署问题。

【讨论】:

以上是关于使用 Amazon Beanstalk 部署 play2 应用程序的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

使用 Amazon Beanstalk 部署 play2 应用程序的最佳方式

使用 Amazon Elastic Beanstalk 部署 Laravel 工作台包

将 Java Web 应用程序部署到 Amazon Elastic Beanstalk

在 amazon ec2 (beanstalk) 上编辑已部署文件的权限

如何使用 Amazon AWS Elastic Beanstalk 部署私有 python pip 依赖项?

为啥 Amazon Elastic Beanstalk 需要很长时间才能更新我的部署?