AWS Fargate 主机名不可用?

AWS Fargate hostname not doable?

我正在尝试设置一个简单的应用程序。它是从 https://budgetapp.docsapp.io/ 中拖出的,意味着在 public 中的某个地方工作。我的任务是以最自动化的方式部署它,并将 java 机器的指标公开给 public(远程 jConsole)。 最终,它应该以大约 15 个完全相同的副本站起来。

对于此任务,我选择了 AWS Fargate。它完美地设置了应用程序,它返回管理端口上的指标(它由 Dropwizard 部署)。我挣扎的是监控。它应该是真实的,并且至少显示 CPU 和内存使用情况。我可以在 docker 本地完成,但 Fargate 缺少一件重要的事情。为部署的任务设置主机名。

我遇到的错误: Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: 578463faab0f: 578463faab0f: System error。这是由于 /etc/hosts 文件中缺少包含容器 uname -n 的条目。 好像设置不了啊!这有可能以某种方式完成吗?

我 运行 我的 java 服务是这样的: java -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Djava.rmi.server.useLocalHostname=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=5000 -Dcom.sun.management.jmxremote.rmi.port=5000 -jar budgetapp.jar server config.yml

我很乐意接受任何建议!

这是 ecs 代理中的一个已知问题。你试过这个作为解决方法吗:

echo "$(ip a | grep -A2 eth1 | grep inet | awk '{print }' | sed 's#/.*##g' ) $(hostname)" >> /etc/hosts

您可以在容器的入口点获取 ip 并修改 /etc/host。

我相信正在修复 ecs 代理,但我在 GitHub 上找不到问题。

感谢大家的帮助。 最终答案是我在互联网上阅读的内容和此处答案的结合。

关键是将 java.rmi.server.hostname 值更改为其 外部 IP 地址 ,这是我在填写 jConsole 表单时将使用的实际地址。 (原来这个值不是服务绑定接口的值,而是外部监控工具访问它的IP地址值。)

同样,在入口点,我需要向容器的主机名添加一个外部 IP,只是为了将主机名添加到 /etc/hosts

我 运行 在 ECS Fargate 上遇到了同样的问题,代码在 docker 和 CI/CD 管道中运行良好。我还没有 bootstrap 脚本,所以集成 Roy 的解决方案有点费力。

以下是对我有用的方法:

  1. 创建一个 ecs_bootloader.sh shell 脚本到一个目录中,该目录已经被复制到图像中(bin 在我的例子中):
#!/bin/bash

echo "$(ip a | grep -A2 eth1 | grep inet | awk '{print }' | sed 's#/.*##g' ) $(hostname)" >> /etc/hosts

#My command here:
python bin/run_all.py

修改了我的 ECS 任务定义,将 ENTRYPOINT 和命令更改为:

ENTRYPOINT: bin/ecs_bootstrap.sh
COMMAND:    bin/run_all.py

备注:

  • 这可以通过从 ecs_bootstrap.sh 脚本调用 COMMAND 来改进。 (目前 COMMAND 被 bootstrap 脚本忽略。)
  • 因为我已经将 bin 文件夹复制到容器中,所以我不必修改我的 Dockerfile。