我发现了碎片化的说明here和其他一些关于在亚马逊ec2上部署Play2应用的地方。但是没有找到使用Beanstalk部署的任何简洁方法。
Play是一个不错的框架,AWS beanstalk是最受欢迎的服务之一,那么为什么没有正式的指令呢?
有没有人找到更好的解决方案?
答案 0 :(得分:12)
Docker Containers与sbt's experimental docker feature结合使用,可以轻松在弹性豆柄上部署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错误。
在“预定义配置”下拉列表中选择“Docker Container”。
在应用程序选择屏幕中,选择“上传”并选择您之前创建的zip文件。启动应用程序,然后冲泡一些茶。这可能需要很长时间。分钟。相同应用版本的后续部署应该稍快一些。
应用程序在aws控制台中运行并显示绿色后,单击应用程序的URL,您应该会看到应用程序的欢迎屏幕(或索引文件的任何内容)。
答案 1 :(得分:11)
这是我的解决方案,不需要任何其他服务/容器,如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
用于环境变量。
答案 2 :(得分:9)
编辑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文件。
答案 3 :(得分:2)
我们也认为这太痛苦了,并为Boxfuse添加了原生Play 2支持来解决这个问题。
您现在可以简单地执行boxfuse run my-play-app-1.0.zip -env=prod
,这将自动执行:
所有未来更新均以蓝/绿色部署执行,零停机时间。
这也适用于Elastic Load Balancers和Auto-Scaling Groups,Boxfuse免费套餐适用于AWS免费套餐。
您可以在此处详细了解:https://boxfuse.com/blog/playframework-aws
免责声明:我是Boxfuse的创始人兼首席执行官
答案 4 :(得分:1)
我在这里和那里找到了其他解决方案的一些问题。我想问题是我正在开发 Play 2.4 。
无论如何,我可以使用Typesafe Activator和Docker将应用程序部署到Beanstalk:
build.sbt
中,我添加了这一行:import com.typesafe.sbt.packager.docker.{ExecCmd, Cmd} // [...] dockerCommands := Seq( Cmd("FROM","java:openjdk-8-jre"), Cmd("MAINTAINER","myname"), Cmd("EXPOSE","9000"), Cmd("ADD","stage /"), Cmd("WORKDIR","/opt/docker"), Cmd("RUN","[\"chown\", \"-R\", \"daemon\", \".\"]"), Cmd("RUN","[\"chmod\", \"+x\", \"bin/myapp\"]"), Cmd("USER","daemon"), Cmd("ENTRYPOINT","[\"bin/myapp\", \"-J-Xms128m\", \"-J-Xmx512m\", \"-J-server\"]"), ExecCmd("CMD") )
$ ./activator clean docker:stage
[project]/target/docker
目录并创建了文件Dockerrun.aws.json
。这是它的内容:{ "AWSEBDockerrunVersion": "1", "Ports": [ { "ContainerPort": "9000" } ] }
target/docker
目录中,我测试了结果,构建,检查并运行了图像:$ docker build -t myapp . $ docker images $ docker run -p 9000:9000 myapp
$ zip -r myapp.zip *
我的zip文件包含Dockerfile
,Dockerrun.aws.json
和stage/*
个文件
答案 5 :(得分:0)
Beanstalk仅支持WAR部署,Play不正式支持WAR部署。如果您想使用EC2,那么您应该只创建一个EC2实例并按照部署说明进行操作:http://www.playframework.com/documentation/2.2.x/ProductionDist
答案 6 :(得分:0)
在aws ec2中部署游戏2. *应用程序是非常不同的,直到你找到了更好的方法。我的意思是ansible承诺一个很好的解决方案。虽然它仍然需要与ansible的新设置及其剧本一起使用,但这必须是值得的。 我最近发现了这些读取,但尚未在我的项目中应用它们。我希望以下阅读能帮助您了解更多信息:
Read it to know more about Ansible to deply play in aws
谢谢! 希望这能帮助您开始。请分享您在此过程中获得的更多知识,或者是否有任何简单的方法来解决这一复杂的部署问题。