使用 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)
您应该自动执行以下步骤,但您可以手动尝试以测试它是否有效:
通过运行以下命令为项目生成Dockerfile
:sbt docker:stage
。
转到./target/docker/
目录。
使用以下内容创建一个弹性 beanstalk Dockerrun.aws.json
文件:
"AWSEBDockerrunVersion": "1",
"Ports": [
"ContainerPort": "9000"
]
压缩该目录中的所有内容,比如压缩到一个名为play2-test-docker.zip
的文件中。 zip 文件应包含以下文件:Dockerfile
、Dockerrun.aws.json
和 files/*
目录。
转到 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/
,而不是 bin
。bin
目录的相对路径是 @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
,这将自动:
所有未来的更新都作为零停机时间的蓝/绿部署。
这也适用于 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 文件有 Dockerfile
、Dockerrun.aws.json
和 stage/*
文件
【讨论】:
这个过程如何处理应用程序机密(如数据库密码等)?它是否希望在 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) 上编辑已部署文件的权限