无法访问 AWS ECS EC2 实例中的端口

Posted

技术标签:

【中文标题】无法访问 AWS ECS EC2 实例中的端口【英文标题】:Cannot access ports in AWS ECS EC2 instance 【发布时间】:2020-02-02 13:32:11 【问题描述】:

我正在运行 AWS ECS 服务,该服务正在运行具有多个容器的单个任务。 任务在 awsvpc 网络模式下运行。 (EC2,不是 Fargate)

容器端口映射在 ECS 任务定义中。

我在 EC2 容器实例安全组中添加了入站规则(例如:TCP 8883 -> 从任何地方访问)。也在 VPC 网络安全组中。

当我尝试从远程 PC 使用实例的公共 IP 访问端口时,我得到connection refused

例如:nc -z <PublicIP> <port>

当我 SSH 进入 EC2 实例并尝试 netstat 时,我可以看到 SSH 端口 22 正在侦听,但不是容器端口(例如:8883)。 另外,当我在实例中执行docker ps 时,端口列是空的。

我无法弄清楚我错过了什么配置。请帮忙。

PS:目标(公共 IP)可从远程 PC 访问。只是不是来自港口。

【问题讨论】:

你 ssh 到服务器,看到端口 22 正在监听,端口 8883 怎么样? 端口 8883 未在监听。实例内的 docker ps 将 PORTS 列显示为空。但在我的任务定义中,端口是映射的。 你能分享dockerfile的应用程序吗? 哪个Host 端口映射到您的任务定义中的Container 端口? FROM nginx:latest COPY ./nginx/nginx.conf /etc/nginx/nginx.conf COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf COPY 。 /nginx/certs/ /etc/nginx/certs/ CMD ["nginx", "-g", "daemon off;"] 我也需要在 dockerfile 中公开端口吗?即使在任务定义ContainerPort中配置了 【参考方案1】:

我正在运行一个 AWS ECS 服务,该服务正在运行一个任务 有多个容器。任务在 awsvpc 网络模式下运行。 (EC2, 不是法门)

Ec2,不是 Fargate,不同的马用于不同的课程。针对 awsvpc 网络模式 运行的任务具有自己的弹性网络接口 (ENI)、主要私有 IP 地址和内部 DNS 主机名。那么如何使用 AWS EC2 公共 IP 访问该容器?

awsvpc 网络模式提供的任务联网功能给 Amazon ECS 任务与 Amazon EC2 相同的网络属性 实例。当您在任务中使用 awsvpc 网络模式时 定义,从该任务定义启动的每个任务 拥有自己的弹性网络接口 (ENI),一个主私有 IP 地址和内部 DNS 主机名。任务联网功能 简化容器网络并让您更好地控制如何 容器化应用程序相互通信 您的 VPC 中的服务。

task-networking

所以你需要放置LB,然后在LB后面配置你的服务。

当您为这些服务创建任何目标组时,您必须选择 ip 作为目标类型,而不是实例。这是因为任务使用 awsvpc 网络模式与 ENI 相关联,而不是与 Amazon 相关联 EC2 实例。

所以配置有问题或者网络模式之间缺乏了解。我会推荐阅读这个article。

当我在实例中执行 docker ps 时,Ports 列是空的。

所以如果端口栏为空,可能会出现以下情况。

host 和 awsvpc 网络模式提供最高的网络连接 容器的性能,因为它们使用 Amazon EC2 网络 栈而不是网桥提供的虚拟化网络栈 模式。使用 host 和 awsvpc 网络模式,暴露容器端口 直接映射到对应的主机端口(对于主机 网络模式)或附加的弹性网络接口端口(用于 awsvpc 网络模式),因此您无法利用动态主机 端口映射。

请记住以下几点:

它适用于 ECS 优化 AMI 的最新变体。它 仅在选择加入后影响新容器实例的创建 awsvpc 中继。它只影响使用 awsvpc 网络模式创建的任务 和 EC2 启动类型。使用 AWS Fargate 启动类型创建的任务 总是有一个专用的网络接口,不管你有多少 发射。

optimizing-amazon-ecs-task-density-using-awsvpc-network-mode

【讨论】:

以上是关于无法访问 AWS ECS EC2 实例中的端口的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 无法访问同一 VPC 中的 EC2 端口

AWS EC2 Windows实例无法通过公共IP访问

如何让 AWS ECS 自动将我的容器的端口映射到主机(EC2)

无法在端口80/443设置后ping AWS ec2服务器或启动网页

通过 ELB 访问 AWS EC2 实例

AWS ECS 开发工具包。使用开发工具包为 ECS 集群注册新容器实例 (EC2)