Akka Http Web应用程序无法通过Amazon ECS中的运行状况检查

时间:2019-02-10 17:47:50

标签: scala docker amazon-ecs akka-http docker-networking

更新

我自己回答了

因此,我尝试将dockerized Akka Http示例应用程序部署到Amazon Elastic Container Service中。我正在使用sbt Docker插件来简化映像创建。

问题:并且当我由自动缩放组启动时,我在docker中的应用在本地运行良好,但在EC2实例中却无法运行。由于某些原因,无法访问裸露的端口。因此,运行状况检查将变为“不健康”,并且容器在启动后15秒内被杀死。

我尝试过的事情:

  1. CloudWatch日志包含正常的启动日志:
  

位于http://0.0.0.0:4567/的服务器在线

  1. 我访问了EC2实例,并尝试在代理启动容器时卷曲该容器。结果是:
  

卷曲:(7)无法连接到本地主机端口4567:连接被拒绝

  1. 我在EC2中手动运行了Docker容器。仅当我使用-p 4567:4567运行port时,port才起作用。但是我运行网络模式“主机” ,我认为不需要端口映射。 ECS代理在容器启动期间不使用端口映射(在docker ps中可见)。

  2. 我尝试部署两个主机地址绑定:

    Http().bindAndHandle(routes, "localhost", 4567) // doesn't work locally on Mac

    Http().bindAndHandle(routes, "0.0.0.0", 4567) // works locally in Docker

  3. 我用另一个docker镜像进行了测试,以进行比较,它工作得很好(tongueroo/sinatra:latest):我可以在EC2中卷曲它,并通过了运行状况检查。

  4. 从我的角度来看,
  5. ECS代理没有显示任何有用的信息。

我猜想EXPORT 4567或scala / java绑定到端口出了问题。你有什么想法?

2 个答案:

答案 0 :(得分:1)

我希望你没事。

您是否配置了任务定义以绑定端口?这非常重要,因为如果您不公开应用程序端口,您将无能为力。

ECS port mapping

然后,如果要执行从计算机到容器的HTTP请求,则需要使用服务发现。 AWS现在为您提供通过Route 53的服务发现。但是您可以使用CONSUL和Fabio。

答案 1 :(得分:0)

这似乎是我自己的错,因为我从某个地方复制粘贴了Scala代码。

旧代码在ECS env中不起作用,但在本地无缝运行! :

<t t-name="PaymentScreen-Paymentmethods">
    <div class='paymentmethods'>
        <t t-foreach="widget.pos.cashregisters" t-as="cashregister">
            <div class="button paymentmethod" t-att-data-id="cashregister.journal_id[0]">
                <t t-esc="cashregister.journal_id[1]" />
                <t t-esc="widget.pos.get_client().refund_credit"/>
            </div>
        </t>
    </div>
</t>

新的有效固定代码:

val serverBinding: Future[Http.ServerBinding] = Http().bindAndHandle(routes, "0.0.0.0", 4567)

  serverBinding.onComplete {
    case Success(bound) =>
      println(s"Server online at http://${bound.localAddress.getHostString}:${bound.localAddress.getPort}/")
      StdIn.readLine() // let it run until user presses return
      serverBinding
        .flatMap(_.unbind()) // trigger unbinding from the port
        .onComplete(_ => system.terminate()) // and shutdown when done
    case Failure(e) =>
      Console.err.println(s"Server could not start!")
      e.printStackTrace()
      system.terminate()
  }

没有阻塞操作,绑定发生后JVM迅速退出。