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

时间:2014-03-02 23:17:24

标签: amazon-web-services playframework-2.0 elastic-beanstalk

我发现了碎片化的说明here和其他一些关于在亚马逊ec2上部署Play2应用的地方。但是没有找到使用Beanstalk部署的任何简洁方法。

Play是一个不错的框架,AWS beanstalk是最受欢迎的服务之一,那么为什么没有正式的指令呢?

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

7 个答案:

答案 0 :(得分:12)

Docker Containerssbt'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文件应包含以下文件:DockerfileDockerrun.aws.jsonfiles/*目录。

转到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,这将自动执行:

  • 为您的Play 2应用创建最小的AMI
  • 创建弹性IP
  • 使用正确的权限创建安全组
  • 启动应用实例

所有未来更新均以蓝/绿色部署执行,零停机时间

这也适用于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文件包含DockerfileDockerrun.aws.jsonstage/*个文件

  • 最后,我创建了一个新的Beanstalk应用程序并上传了最后一步创建的zip。我负责选择" Generic Docker" on" Predefined configuration",当我创建应用程序时。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

Ansible + play + aws ec2

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

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