阿卡的HTTP web应用程序未能通过健康检查亚马逊ECS

问题描述 投票:0回答:2

UPDATE

我自己回答

所以我想部署我dockerized阿卡的Http示例应用程序到Amazon弹性集装箱服务。我使用SBT泊坞窗插件以简化映像创建。

问题:当通过自动伸缩群开始了我在码头工人的应用程序工作正常,但本地没有EC2实例。出于某种原因,暴露的端口不可访问。因此,健康检查变为“不健康”和容器获取开始15秒后死亡。

我的尝试:

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

http://0.0.0.0:4567/服务器在线

  1. 我参观了EC2实例,并试图卷曲的容器,当它由代理启动。结果是:

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

  1. 我在EC2中手动运行泊坞窗容器。当我-p 4567:4567运行端口才有效。但我跑得网络模式“主机”,我相信,端口映射不是必需的。 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. 我比较其他码头工人图像测试它完美地工作(tongueroo/sinatra:latest):我能卷曲它的EC2和它通过健康检查。
  4. ECS代理不显示任何东西从我的观点来看是有用的。

我想不顺心的事与出口4567或斯卡拉/ Java绑定到端口。你有什么想法?

scala docker amazon-ecs akka-http docker-networking
2个回答
1
投票

我希望你没事。

您是否将任务定义绑定端口?因为如果你不公开的应用程序的端口,你不能做任何事情,这是非常重要的。

ECS port mapping

然后,如果你想从您的计算机上执行一个HTTP请求到容器,您将需要使用服务体验。 AWS现在为您提供服务发现借道53.但是你可以使用领事,法比奥。


0
投票

这似乎是我自己的错用Scala代码复制我从什么地方粘贴。

旧的代码不中ECS ENV工作,但无缝本地工作! :

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()
  }

新的固定代码的工作:

  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}/ v8")
    case Failure(e) =>
      Console.err.println(s"Server could not start!")
      e.printStackTrace()
      system.terminate()

  println("Waiting for termination...")
  Await.result(system.whenTerminated, Duration.Inf)
  println("TERMINATED")

有没有阻断作用和JVM绑定发生后迅速退出。

© www.soinside.com 2019 - 2024. All rights reserved.