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

Amazon web services 如何让AWS ECS自动将我的容器的端口映射到主机(EC2) 背景:,amazon-web-services,amazon-ec2,port,amazon-ecs,Amazon Web Services,Amazon Ec2,Port,Amazon Ecs,我正在使用Circle CI的aws ecs/deploy service update orb来部署我的docker容器,方法是在aws ECR中提取最新映像,并在aws EC2实例中部署它。这个容器是一个机器学习模型,它在TCP端口3000接受API请求。我正在使用fastAPI进行此操作,并返回预测。在我部署它之后,我无法向在端口3000部署容器的任务的容器实例的公共IP发送请求,该IP不是我的EC2实例的公共IP;它只有私有IP,而公共IP是禁用的 调试 作为入站规则的一部分,我检查了我

我正在使用Circle CI的aws ecs/deploy service update orb来部署我的docker容器,方法是在aws ECR中提取最新映像,并在aws EC2实例中部署它。这个容器是一个机器学习模型,它在TCP端口3000接受API请求。我正在使用fastAPI进行此操作,并返回预测。在我部署它之后,我无法向在端口3000部署容器的任务的容器实例的公共IP发送请求,该IP不是我的EC2实例的公共IP;它只有私有IP,而公共IP是禁用的

调试 作为入站规则的一部分,我检查了我的安全组,并确保端口3000已打开,可以接收来自所有IPs0.0.0.0的请求。 我停止了任务,该任务将自动停止EC2实例中运行的容器,因为我认为Circle CI可能出了问题。然后,根据AWS ECS的service configuration1所需任务和任务定义,一个新任务已启动,因此容器将自动启动。但是,我也不能向这个发送请求。 我访问了我的EC2实例,以了解端口3000是否打开。这是我了解到端口根本没有映射的时候: 如您所见,容器的PORTS列为空,容器必须在端口3000处接受来自命令的请求。 以下是EC2实例的开放端口: 如您所见,此处未列出端口3000

下面是将容器部署到AWS ECS的端口映射任务,您可以在上面看到docker ps屏幕截图: 在任务定义中,您可以看到我为容器定义的端口映射

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

这是与任务相关联的ENI的Networking选项卡,也是与任务正在运行的EC2实例相关联的安全组的入站规则,它在端口3000上接受来自所有IP的请求。

编辑1: 在我做了之后

docker run -p 3000:3000 <my-image:my-tag>
在EC2机器内部,通过我的笔记本电脑,我可以向容器发送API请求并接收对AWS ECS集群的公共IP的正确响应。这意味着仅当我手动运行容器时才映射端口

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

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

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

对于awsvpc网络模式,端口映射的工作方式有点不同。hostPort在此无效,创建的ENI将向VPC公开containerport

此模式有几个先决条件,例如ECS代理版本、实例类型ENI计数限制、实例配置文件等。。。检查AWS官方文档:

您是否已检查是否连接了ENI以及这些ENI上哪些端口处于打开状态?

对于awsvpc网络模式,端口映射的工作方式有点不同。hostPort在此无效,创建的ENI将向VPC公开containerport

此模式有几个先决条件,例如ECS代理版本、实例类型ENI计数限制、实例配置文件等。。。检查AWS官方文档:


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

我犯的错误是使用了FARGATE优化集群和其中的EC2实例;这可能导致没有网络模式默认值、网桥、主机、awsvpc,并且我的应用程序无法工作。因此,当我重新编辑与上次相同的内容,但使用EC2优化集群类型时,网桥网络模式工作正常。

我犯的错误是使用FARGATE优化集群和其中的EC2实例;这可能导致没有网络模式默认值、网桥、主机、awsvpc,并且我的应用程序无法工作。因此,当我重新编辑与上次相同的内容,但使用EC2优化的群集类型时,网桥网络模式工作正常。

是的,此任务附带了一个ENI。但我没有看到任何显示开放端口的选项。附加到此ENI的安全组具有向所有IP打开端口3000的入站规则。我还禁用了所有级别的公共IP
s、 请检查我的编辑。我已经展示了附加到任务的ENI及其入站规则,该规则向所有IP公开端口3000。TBH,我无法从您在回答中链接的文档中了解太多。是的,此任务附带了一个ENI。但我没有看到任何显示开放端口的选项。附加到此ENI的安全组具有向所有IP打开端口3000的入站规则。我还禁用了所有级别的公共IP。请检查我的编辑。我已经展示了附加到任务的ENI及其入站规则,该规则向所有IP公开端口3000。TBH,我无法从您在答案中链接的文档中了解太多。