Я использую шар Circle CI aws-ecs / deploy-service-update
, чтобы развернуть свой контейнер докеров, загрузив последний образ в AWS ECR и развернув это в AWS ECS с экземпляром AWS EC2. Этот контейнер представляет собой модель машинного обучения, которая принимает запросы API через порт TCP 3000 (для этого я использую fastAPI
) и возвращает прогнозы. После того, как я развернул его, я не мог отправлять запросы на общедоступный IP-адрес экземпляра контейнера задачи, которая развертывает контейнер на порту 3000 (этот IP-адрес не является общедоступным IP-адресом моего экземпляра EC2; у него только частный IP-адрес, а общедоступный IP-адрес отключен) .
А вот открытые порты экземпляра EC2: Как видите, порт 3000 здесь не указан.
Вот задача с сопоставлением портов, в которой развернут контейнер (в AWS ECS), который вы видите на снимке экрана docker ps
выше:
В определении задачи вы можете увидеть сопоставления портов, которые я определил для контейнера.
Вот задача, запущенная на моем экземпляре EC2 с определением задачи, показанным выше, и используемым мной сетевым режимом 'awsvpc ':
Здесь находится вкладка «Сеть» ENI, связанного с задачей, а также входящее правило группы безопасности, связанной с экземпляром EC2, внутри которого выполняется задача, которая принимает запросы на порт 3000 со всех IP-адресов.
После того, как я сделал
docker run -p 3000:3000 <my-image:my-tag>
внутри машины EC2 (с помощью SSHing с моего ноутбука), я мог отправлять запросы API и получать надлежащий ответ контейнеру на его общедоступный IP-адрес кластера AWS ECS. . Это означает, что порты отображаются только тогда, когда я запускаю контейнер вручную.
У меня не было проблем с портами, когда я использовал FARGATE, когда я обновлял службу из Circle CI или даже когда я вручную запускал задачи.
Итак, как автоматически сопоставить порты при запуске задачи из панели управления сервисом AWS ECS или из Circle CI? Если я запустил контейнер докеров вручную, я не смогу автоматически получать журналы из AWS Cloudwatch и не смогу остановить его с панели управления AWS ECS. Об этом позаботится другой контейнер AWS, работающий в инстансе EC2. Он направляет журналы в Cloudwatch и принимает команды остановки существующего и запуска для запуска нового контейнера с новым образом, хранящимся в AWS ECR, без необходимости использовать SSH каждый раз, когда я захочу просмотреть журналы или запустить / остановить контейнеры.
Что здесь пошло не так, что привело к тому, что порты не были сопоставлены, и как мне это исправить и правильно сопоставить порты, чтобы я мог отправлять запросы API в свой контейнер.
Поскольку вы используете сетевой режим: awsvpc контейнер будет иметь свой собственный IP-адрес и не будет использовать IP-адрес экземпляра EC2. Вы можете найти IP-адрес контейнера в сведениях о запущенной задаче.
В качестве альтернативы вы можете использовать Сетевой режим: хост , где задача будет совместно использовать IP-адрес экземпляра EC2 и будет доступна через IP-порт экземпляра 3000.
Надеюсь, это поможет :)