сопоставление портов не выполнено для контейнера, развернутого на AWS ECS (использует EC2)

Контекст:

Я использую шар Circle CI aws-ecs / deploy-service-update , чтобы развернуть свой контейнер докеров, загрузив последний образ в AWS ECR и развернув это в AWS ECS с экземпляром AWS EC2. Этот контейнер представляет собой модель машинного обучения, которая принимает запросы API через порт TCP 3000 (для этого я использую fastAPI ) и возвращает прогнозы. После того, как я развернул его, я не мог отправлять запросы на общедоступный IP-адрес экземпляра контейнера задачи, которая развертывает контейнер на порту 3000 (этот IP-адрес не является общедоступным IP-адресом моего экземпляра EC2; у него только частный IP-адрес, а общедоступный IP-адрес отключен) .

Отладка

  1. Я проверил свою группу безопасности и убедился, что порт 3000 открыт для приема запросов со всех IP-адресов (0.0.0.0), как часть правила для входящих подключений.
  2. Я остановил задачу (которая автоматически остановит работу контейнера в экземпляре EC2) с мыслью, что что-то пошло не так с Circle CI. Затем, в соответствии с конфигурацией сервиса (1 желаемая задача) и определением задачи AWS ECS, автоматически запускается новая задача (следовательно, контейнер). Но я тоже не мог отправлять запросы на это.
  3. Я подключился к своему экземпляру EC2 по SSH, чтобы узнать, открыт ли порт 3000. Именно тогда я узнал, что порты вообще не отображаются: enter image description here
    Как видите, столбец ПОРТЫ для контейнера пуст, и контейнер должен принимать запросы на порт 3000 от команды.

А вот открытые порты экземпляра EC2: enter image description here Как видите, порт 3000 здесь не указан.


Вот задача с сопоставлением портов, в которой развернут контейнер (в AWS ECS), который вы видите на снимке экрана docker ps выше: enter image description here
В определении задачи вы можете увидеть сопоставления портов, которые я определил для контейнера.


Вот задача, запущенная на моем экземпляре EC2 с определением задачи, показанным выше, и используемым мной сетевым режимом 'awsvpc ': enter image description here


Здесь находится вкладка «Сеть» ENI, связанного с задачей, а также входящее правило группы безопасности, связанной с экземпляром EC2, внутри которого выполняется задача, которая принимает запросы на порт 3000 со всех IP-адресов. enter image description here

РЕДАКТИРОВАТЬ 1:

После того, как я сделал

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 в свой контейнер.

1
задан 5 November 2020 в 19:23
1 ответ

Поскольку вы используете сетевой режим: awsvpc контейнер будет иметь свой собственный IP-адрес и не будет использовать IP-адрес экземпляра EC2. Вы можете найти IP-адрес контейнера в сведениях о запущенной задаче.

В качестве альтернативы вы можете использовать Сетевой режим: хост , где задача будет совместно использовать IP-адрес экземпляра EC2 и будет доступна через IP-порт экземпляра 3000.

Надеюсь, это поможет :)

1
ответ дан 5 November 2020 в 20:19

Теги

Похожие вопросы