Эластичная балансировка нагрузки как внутри, так и через Интернет

Мы пытаемся использовать балансировку эластичной нагрузки в AWS с автомасштабированием, чтобы мы могли масштабироваться и выходить по мере необходимости.

Наше приложение состоит из нескольких небольших приложений, все они находятся в одной подсети и той же VPC.

Мы хотим поставить наш ELB между одним из наших приложений и остальными.

Проблема заключается в том, что мы хотим, чтобы балансировщик нагрузки работал как внутри между различными приложениями с использованием API, так и с помощью Интернета, потому что наше приложение все еще имеет некоторое использование, которое должно выполняться извне, а не через API.

Я читал этот question, но я не мог точно понять, как это сделать, там не указано никаких шагов или, может быть, я сделал хорошо это понимают.

У нас есть ELB, который является внутренним и внешним?

Для записи я могу получить доступ к этой сети только через VPN.

Ответ 1

Невозможно, чтобы балансировщик эластичной нагрузки имел как общедоступный IP-адрес, так и частный IP-адрес. Это тот или другой, но не оба.

Если вы хотите, чтобы ваш ELB имел частный IP-адрес, он не может слушать запросы из Интернета.

Если ваш ELB открыт для общественности, вы все равно можете позвонить ему из своих внутренних экземпляров EC2 с помощью общедоступной конечной точки. Однако есть некоторые оговорки, которые касаются этого:

  • Трафик выйдет из VPC и снова войдет в него. Это не будет прямым соединением между экземпляром и ELB, которое предоставит вам частный IP-адрес.
  • Вы также не можете использовать группы безопасности в своих правилах группы безопасности.

Существует 3 альтернативных сценария:

  • Дублируйте экземпляры ELB и EC2, один из которых посвящен частному трафику, один предназначен для общего трафика.
  • У вас есть 2 ELB (один открытый, один закрытый), которые используют одни и те же исходные экземпляры EC2.
  • Не используйте ELB для частного или общедоступного трафика и вместо этого используйте для этого один экземпляр EC2 Elastic IP-адрес (если он публичен) или частный IP-адрес (если частный).

Ответ 2

Я не согласен с ответом @MattHouser. Фактически, в VPC ваш ELB имеет все свои внутренние интерфейсы, перечисленные в сетевых интерфейсах с Public IP и Primary private IP. Я протестировал частный IP-адрес своего публичного ELB, и он работает точно так же, как и внешний.

Проблема заключается в следующем: эти IP-адреса не перечислены нигде в обновленном виде, например, на частном DNS-сервере ELB. Поэтому вы должны сделать это самостоятельно.

Я сделал немного POC script на этом, с внутренней зоной, размещенной в Route53: https://gist.github.com/darylounet/3c6253c60b7dc52da927b80a0ae8d428

Ответ 3

Стандартное решение AWS должно иметь для этого дополнительный внутренний ELB. Похоже, у @DaryL есть интересное обходное решение, но он может выйти из строя в течение 5 минут, если DNS не будет обновлен. Также нет возможности иметь отдельную группу безопасности для внутренних IP-адресов, поскольку они совместно используют ENI и безопасность внешнего IP-адреса ELB.

Ответ 4

Я сделал лямбда-функцию, которая проверяет, какие частные IP-адреса установлены для loadbalancer, и будет обновлять запись Route53 при ее изменении: https://github.com/Bramzor/lambda-sync-private-elb-ips

Используя эту функцию, вы можете легко использовать ELB для частного трафика. Я лично использую его для соединения нескольких регионов друг с другом через межрегиональный пиринг VPC без необходимости дополнительного ELB.

Ответ 5

Я столкнулся с той же проблемой, и я могу подтвердить, что лучшее решение на данный момент - это иметь два разных ALB, один с выходом в Интернет, а другой с внутренним. Вы можете присоединить оба ALB к одной группе автоматического масштабирования, чтобы иметь доступ к одному кластеру.

Убедитесь, что параметры сети (подсети, группы безопасности) обоих ALB одинаковы, чтобы оба получили доступ к одним и тем же экземплярам кластера. Автоматическое масштабирование и настройка запуска работают без проблем, когда оба ALB подключены к одной группе AutoSacling. Это также работает с ALB, созданными из сред ElasticBeanstalk.