[英]How to have AWS ECS automatically map ports of my container to the host machine(EC2)
我正在使用 Circle CI 的aws-ecs/deploy-service-update
orb 通过拉取 AWS ECR 中的最新映像来部署我的 docker 容器,并将其部署在带有 AWS EC2 实例的 AWS ECS 中。 这个容器是一个机器学习模型,它在 TCP 端口 3000 接受 API 请求(我为此使用了fastAPI
)并返回预测。 部署后,我无法向在端口 3000 部署容器的任务的容器实例的公共 IP 发送请求(此 IP 不是我的 EC2 实例的公共 IP;它只有私有 IP,公共 IP 已禁用) .
以下是 EC2 实例的开放端口: 如您所见,此处未列出端口 3000。
这是您在上面的docker ps
屏幕截图中看到的带有端口映射的任务,它部署了容器(到 AWS ECS):
在任务定义中,可以看到我为容器定义的端口映射。
这是在我的 EC2 实例上运行的任务,其任务定义如上所示,我使用的网络模式是“awsvpc”:
这是与任务关联的 ENI 的“网络”选项卡,以及与在其中运行任务的 EC2 实例关联的安全组的入站规则,它接受来自所有 IP 的端口 3000 上的请求。
我做了之后
docker run -p 3000:3000 <my-image:my-tag>
在 EC2 机器内部(通过从我的笔记本电脑通过 SSH 连接),我可以发送 API 请求并接收到容器的正确响应到它的 AWS ECS 集群的公共 IP。 这意味着仅当我手动运行容器时才会映射端口。
当我使用 FARGATE 时,当我从 Circle CI 更新服务时,甚至当我手动启动任务时,端口都没有问题。
那么,当从 AWS ECS 服务仪表板或 Circle CI 运行任务时,如何自动映射端口? 如果我手动运行 docker 容器,我将无法从 AWS Cloudwatch 自动获取日志,也无法从 AWS ECS 仪表板停止它。 在 EC2 实例中运行的 AWS 的另一个容器将处理这些事情。 它将日志路由到 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 上打开了哪些端口?
我犯的错误是使用了 FARGATE 优化集群和其中的 EC2 实例; 这可能导致我的应用程序没有网络模式(默认、桥接、主机、awsvpc 和无)工作。 所以,当我像上次一样重新做所有事情时,但使用 EC2 优化的集群类型时, bridge
网络模式按预期工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.