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

标签 amazon-web-services amazon-ec2 port amazon-ecs

上下文:

我正在使用 Circle CI 的 aws-ecs/deploy-service-update orb 通过拉取 AWS ECR 中的最新图像来部署我的 docker 容器,并将其部署在带有 AWS EC2 实例的 AWS ECS 中。这个容器是一个机器学习模型,它在 TCP 端口 3000 上接受 API 请求(我为此使用 fastAPI)并返回预测。部署后,我无法向在端口 3000 部署容器的任务的容器实例的公共(public) IP 发送请求(此 IP 不是我的 EC2 实例的公共(public) IP;它只有私有(private) IP,公共(public) IP 已禁用) .

调试

  1. 我检查了我的安全组并确保端口 3000 已打开以接收来自所有 IP (0.0.0.0) 的请求,作为入站规则的一部分。
  2. 我停止了任务(它会自动停止在 EC2 实例中运行的容器),我认为 Circle CI 可能出了点问题。然后,根据 AWS ECS 的服务配置(1 个所需任务)和任务定义,一个新任务(因此容器)自动启动。但是,我也无法向其发送请求。
  3. 我通过 SSH 连接到我的 EC2 实例以了解端口 3000 是否打开。这是我得知端口根本没有映射的时候: enter image description here
    如您所见,容器的 PORTS 列为空,并且容器必须在端口 3000 上接受来自命令的请求。

下面是 EC2 实例的开放端口: enter image description here 如您所见,此处未列出端口 3000。


这是部署容器(到 AWS ECS)的端口映射任务,您在上面的 docker ps 屏幕截图中看到: enter image description here
在任务定义中,可以看到我为容器定义的端口映射。


这是在我的 EC2 实例上运行的任务,任务定义如上所示,我使用的网络模式是“awsvpc”: enter image description here


这是与任务关联的 ENI 的“网络”选项卡,以及与任务在其中运行的 EC2 实例关联的安全组的入站规则,它接受来自所有 IP 的端口 3000 的请求。 enter image description here

编辑 1:

在我做了之后

docker run -p 3000:3000 <my-image:my-tag>

在 EC2 机器内(通过从我的笔记本电脑进行 SSH 连接),我可以发送 API 请求并接收对容器的正确响应到它的 AWS ECS 集群的公共(public) IP。这意味着仅当我手动运行容器时才会映射端口。

当我使用 FARGATE 时,当我从 Circle CI 更新服务时,甚至当我手动启动任务时,我的端口都没有问题。

那么,当从 AWS ECS 服务仪表板或 Circle CI 运行任务时,如何自动映射端口?如果我手动运行 docker 容器,我将无法从 AWS Cloudwatch 自动获取日志,也无法从 AWS ECS 仪表板停止它。 AWS 在 EC2 实例中运行的另一个容器将处理这些事情。它会将日志路由到 Cloudwatch 并接受停止现有日志并启动命令以使用存储在 AWS ECR 中的新图像启动新容器,而无需每次我想查看日志或启动/停止容器时都使用 SSH。

这里出了什么问题,导致端口未被映射,我该如何修复它并正确映射端口,以便我能够将 API 请求发送到我的容器。

最佳答案

对于 awsvpc 网络模式,端口映射的工作方式略有不同。 hostPort 在这里不是有效选项,创建的 ENI 会将容器端口公开给 VPC。

此模式有几个先决条件,例如 ECS 代理版本、实例类型(ENI 计数限制)、实例配置文件……查看官方 AWS 文档: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html

您是否检查过连接的 ENI 以及这些 ENI 上打开了哪些端口?

关于amazon-web-services - 如何让 AWS ECS 自动将我的容器的端口映射到主机 (EC2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64632279/

相关文章:

amazon-web-services - 根据参数值创建AWS资源

amazon-web-services - 有什么方法可以在代码级别捕获AWS lambda超时错误?

r - 访问部署在 AWS 实例上的 Shiny 服务器中的错误日志

Amazon EC2 代码部署没有主机成功

android - 如何将现有的 MS Access 移植到 SQLite 以用于 Android 应用程序开发?

amazon-web-services - 编辑云形成模板会终止现有实例并创建新实例

ubuntu - 如何让用户数据在自定义 Ubuntu 18.04 AMI 上执行?

java - 从 Eclipse 在 AWS EC2 上部署 Java webapp

ruby-on-rails - 如何在 AWS 的 80 端口上运行 Rails?

node.js - Node 服务器正在运行,但无法在浏览器上运行且端口未定义