更新
因此,我尝试将dockerized Akka Http示例应用程序部署到Amazon Elastic Container Service中。我正在使用sbt Docker插件来简化映像创建。
问题:并且当我由自动缩放组启动时,我在docker中的应用在本地运行良好,但在EC2实例中却无法运行。由于某些原因,无法访问裸露的端口。因此,运行状况检查将变为“不健康”,并且容器在启动后15秒内被杀死。
我尝试过的事情:
位于http://0.0.0.0:4567/的服务器在线
卷曲:(7)无法连接到本地主机端口4567:连接被拒绝
我在EC2中手动运行了Docker容器。仅当我使用-p 4567:4567
运行port时,port才起作用。但是我运行网络模式“主机” ,我认为不需要端口映射。 ECS代理在容器启动期间不使用端口映射(在docker ps
中可见)。
我尝试部署两个主机地址绑定:
Http().bindAndHandle(routes, "localhost", 4567) // doesn't work locally on Mac
Http().bindAndHandle(routes, "0.0.0.0", 4567) // works locally in Docker
我用另一个docker镜像进行了测试,以进行比较,它工作得很好(tongueroo/sinatra:latest
):我可以在EC2中卷曲它,并通过了运行状况检查。
ECS代理没有显示任何有用的信息。
我猜想EXPORT 4567或scala / java绑定到端口出了问题。你有什么想法?
答案 0 :(得分:1)
我希望你没事。
您是否配置了任务定义以绑定端口?这非常重要,因为如果您不公开应用程序端口,您将无能为力。
然后,如果要执行从计算机到容器的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迅速退出。