Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to deploy play2 app using Amazon Beanstalk

I found fragmented instructions here and some other places about deploying Play2 app on amazon ec2. But did not find any neat way to deploy using Beanstalk.

Play is a nice framework and AWS beanstalk is one of the most popular services then why is there no official instruction to do this?

Has anyone found any better solution?

like image 261
Mohammad Haque Avatar asked Mar 02 '14 23:03

Mohammad Haque


2 Answers

Deploying a Play2 app on elastic beanstalk is now easy with Docker Containers in combination with sbt's experimental docker feature.

In build.sbt specify the exposed docker ports:

dockerExposedPorts in Docker := Seq(9000)

You should automate the following steps, but you can try this out manually to test that it works:

Generate a Dockerfile for the project by running the command: sbt docker:stage. Go to the ./target/docker/ directory. Create an elastic beanstalk Dockerrun.aws.json file with the following contents:

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

Zip up everything in that directory, let's say into a file called play2-test-docker.zip. The zip file should contain the files: Dockerfile, Dockerrun.aws.json, and files/* directory.

Go to aws beanstalk console and create a new application using the m3.medium or any instance type with enough memory for the jvm to run. Any instance with too little memory will result in a JVM error.

Select "Docker Container" in the Predefined Configuration dropdown.

In the application selection screen, select "Upload" and select the zip file you created earlier. Launch the app and then go brew some tea. This can take a very long time. Minutes. Subsequent deployments of the same app version should be slightly quicker.

Once the app is running and green in the aws console, click on the app's url and you should see the welcome screen of the application (or whatever your index file is).

like image 59
bobc Avatar answered Nov 16 '22 01:11

bobc


Here's my solution that doesn't require any additional services/containers like Docker or Jenkins.

Create a dist folder in the root of your Play application's directory. Create a Procfile file containing the following contents and put it in the dist folder (EB requires port 5000):

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

The YOUR_APP_FILE_NAME is the name of the executable in the bin directory, which is inside the .zip created by activator dist.

After running activator dist, you can just upload the created zip file into Elastic Beanstalk and it will automatically deploy the app. You also put whatever .ebextension folders and configuration files into the dist folder that you require for Elastic Beanstalk configuration. Ex. I have dist/.ebextensions/nginx/conf.d/proxy.conf for NGINX reverse proxy settings or dist/.ebextensions/env.config for environment variables.

like image 29
Raymond26 Avatar answered Nov 16 '22 01:11

Raymond26