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 的解决方案有点费力。
以下是对我有用的方法:
- 创建一个
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。
我正在尝试设置一个简单的应用程序。它是从 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 的解决方案有点费力。
以下是对我有用的方法:
- 创建一个
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。