"host not allowed" error when deploying a play framework application to Amazon AWS with Boxfuse

Haijin picture Haijin · Jul 13, 2017 · Viewed 14.1k times · Source

I am trying to deploy a simple web application written using Play Framework in Scala to Amazon web service.

The web application is running OK in development mode and production mode in my local machine, and I've changed its default port to 80.

I used Boxfuse to deploy to AWS as suggested.

I first run "sbt dist" then "boxfuse run -env=prod"

Things went well as desired. The image is fused and pushed to AWS. AMI is created. Instance was started and my application was running.

i-0f696ff22df4a2b71 => 2017-07-13 01:28:23.940 [info] play.api.Play - Application started (Prod)

Then came the error message:

WARNING: Healthcheck (http://35.156.38.90/) returned 400 instead of 200. Retrying for the next 300 seconds ...

i-0f696ff22df4a2b71 => 2017-07-13 01:28:24.977 [info] p.c.s.AkkaHttpServer - Listening for HTTP on /0.0.0.0:80

i-0f696ff22df4a2b71 => 2017-07-13 01:28:25.512 [warn] p.f.h.AllowedHostsFilter - Host not allowed: 35.156.38.90

The instance was terminated after repeated try after 3 minutes. It gave a warning like:

Ensure your application responds with an HTTP 200 at / on port 80

But I've made sure the application responds in local machine, and I tried both Windows and Ubuntu, all works well.

Also, running "boxfuse run" on local machine, I can connect to it using "http://localhost", but still have the error.

Hope someone with experience can give me some suggestions. Thanks in advance.

ps: not sure if relevant, I added these settings to application.conf

http {
        address = 0.0.0.0
        port = 80
    }

Answer

Leo C picture Leo C · Jul 13, 2017

Judging from the error message, it looks like the problem might be related to play.filters.hosts.allowed not set up in application.conf. The filter lets you configure which hosts can access your application. More details about the Play filter is available here.

Here's a configuration example:

play.filters.hosts {
  allowed = ["."]
}

Note that allowed = ["."] matches all hosts hence would not be recommended in a production environment.