Spring Cloud Zookeeper и Feign развернуты на AWS ECS с помощью Fargate

У меня есть два приложения Spring Boot, оба используют Spring Cloud Zookeeper для обнаружения сервисов, и одно из них использует Feign для общения с другим, как описано здесь

Все это отлично работает при развертывании на локальном хосте и в виде образов докеров через docker-compose, но при развертывании в виде отдельных задач/сервисов в AWS ECS (с использованием сетевого режима по умолчанию awsvpc) связь между ними больше не работает, и клиент Feign выдает ошибки с :

feign.FeignException$NotFound: [404 ] during [GET] to [http://my-api/api/workspace-context] [APIKeyService#getContextFromAPIKey(String)]: [<!doctype html><html lang = "en"><head><title>HTTP Status 404 – Not Found</title><style type = "text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} ... (431 bytes)]

Обратите внимание, что ответ здесь выглядит как стандартный ответ Tomcat 404.

Я видел значения, хранящиеся в Zookeeper для этого развертывания AWS, и кажется, что он помещает IP-адрес в качестве значения для address, что я не уверен, что это правильно.

{
    "name": "my-api",
    "id": "323be0b7-8ad8-4061-846e-abcdac2bbbca",
    "address": "169.254.xxx.xxx",
    "port": 8080,
    "sslPort": null,
    ...

Этот IP-адрес не совпадает ни с общедоступным, ни с частным IP-адресом ENI, связанного с задачей ECS.

Если я вручную заменю значение address этой записи Zookeeper на общедоступный IP-адрес ENI, он снова начнет работать правильно (но не с частным IP-адресом). Но, очевидно, он снова сломается после нового развертывания.

Любая помощь приветствуется

Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
766
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Spring Cloud предполагает, какой хост или IP-адрес использовать. Если на хосте установлена ​​переменная окружения, содержащая общедоступный IP-адрес, вы можете использовать ее для установки address.

spring.cloud.zookeeper.discovery.instanceIpAddress=${MY_IP_ENV_VAR}

В противном случае, согласно документации, вы можете настроить сетевые интерфейсы на игнорирование:

spring:
  cloud:
    inetutils:
      ignoredInterfaces:
        - docker0
        - ecs-eth0 #ecs private network
        - veth.*

или какие диапазоны IP-адресов предпочесть:

spring:
  cloud:
    inetutils:
      preferredNetworks:
        - 192.168
        - 10.0

Спасибо — я просмотрел их, но я не уверен, как AWS устанавливает IP-адрес (и он меняется при повторном развертывании). Думаю, мне придется углубиться в AWS ECS.

andkov 21.12.2020 12:00

Итак, после (временного) включения SSH в моем контейнере и проверки доступных сетевых интерфейсов внутри него с помощью ifconfig -a я обнаружил, что 169.254.xxx.xxx IP-адрес исходит от интерфейса с именем ecs-eth0. Добавление этого к свойству ignoredInterfaces заставило его работать правильно.

andkov 21.12.2020 17:24

ОБНОВЛЕНИЕ: AWS Fargate, похоже, изменили сетевое имя, которое они используют в версии платформы 1.4.0 — то, которое раньше называлось ecs-eth0, теперь называется eth0, поэтому вместо этого пришлось добавить его к ignoredInterfaces.

andkov 24.03.2021 14:54

Другие вопросы по теме