Как добавить доменное имя в контейнер ECS (служба EC2/ECS) без балансировщика нагрузки?

Как добавить доменное имя в контейнер ECS (служба EC2/ECS) без балансировщика нагрузки?

Я ищу способ добавить доменное имя к сервису ECS (EC2, а не Fargate).

Чтобы быть точным, я ищу решение, которое DNS разрешает доменное имя A или AAAA.(возможно CNAME, если он указывает на A или AAAA). Мне не важно, в каком сетевом режиме это работает. Контейнер можно разместить в любом из host, bridge,awsvpc если решение работает!

awsvpcнежизнеспособен за пределами Фаргейта

Решения, требующие AWS VPC, по-видимому, несовместимы с ECS/EC2 и подходят только для Fargate. Причиназдесь:

Каждая задача Amazon ECS, использующая сетевой режим awsvpc, получает собственный эластичный сетевой интерфейс (ENI), который подключается к экземпляру Amazon EC2, на котором она размещена.Существует квота по умолчанию на количество сетевых интерфейсов.который можно подключить к экземпляру Amazon EC2 Linux.Основной сетевой интерфейс учитывается в этой квоте..

Таким образом, a t3.mediumможет выполнять только 2 задачи, а a t3.2xlargeможет выполнять только 3 (ограниченияздесь)

Обнаружение услуг нецелесообразно

Service Discovery добавит только записи DNS типа SRV для сетевых контейнеров типа hostи bridgeтипа. Большая часть программного обеспечения, которое мы используем, не понимает записи SRV. Нам нужны записи A и AAAA.

Service Discovery создаст записи A и AAAA для awsvpcконтейнеров сетевого типа... и они снова awsvpcстанут нежизнеспособными.

AWS App Mesh нежизнеспособен

Мы попытались настроить сетку приложений, и нам почти сразу сказали, что наши задачи нужноawsvpc

¯\(ツ)

Балансировщики нагрузки кажутся нежизнеспособными

Это может работать для некоторых сервисов. Но затем мы проваливаемся в большие ямы, где сервис не HTTP или сервис требует, чтобы клиенты были аутентифицированы с помощью клиентских сертификатов SSL.

Создание большого количества балансировщиков нагрузки IP для не-HTTP/клиентских SSL-сервисов обходится слишком дорого.

<брань>

AFAIK, Kubernetes сделал бы это тривиальным. Даже в Docker Swarm это есть. Я действительно в шоке, сколько часов мы потратили на поиски этой тривиальной вещи.<\рант>

Вопрос

Как добавить доменное имя в контейнер ECS/EC2 без балансировщика нагрузки?

решение1

Для ясности: вам не нужно иметь уникальный эластичный сетевой интерфейс, подключенный к контейнеру ECS (из-за ограничений на экземпляр), поскольку его будет легко терраформировать или сделать что-то еще.

Создайте собственное решение AppMesh с помощью systemd:

Используйте скрипт bash, запущенный через запуск systemd, чтобы получить доступ к IMDS, найдите публичный ip-адрес для службы ECS, а затем используйте AWS CLI для обновления записи dns. Это очевиднооченьпозднее связывание, поэтому убедитесь, что вы установили TTL очень низким.

Следующий ответ: «Не делай этого»

решение2

Я не совсем понимаю этот вопрос. Service Discovery поддерживает доменное имя (пространство имен). Насколько я могу судить, это на самом деле обязательно. Другими словами, если вы хотите использовать SD для службы ECS, myserviceвы должны ссылаться на нее как myservice.<domain>где <domain>— произвольное пространство имен, которое вы должны определить (например, .local или .my.domain).Вот примерстека, использующего SD.

Обратите внимание, что все этовнутреннийк кластеру и как работает внутреннее обнаружение служб (например, как служба ECS обнаруживает другую службу ECS).

[Изменить] ЕСЛИ вы хотите предоставить доступ к своим службам ECS, но НЕ хотите использовать балансировщик нагрузки, другим вариантом будет использование API GW в качествеописанный в этом сообщении в блоге. В общем случае вы не хотите регистрировать случайные публичные IP-адреса задач Fargate в R53, потому что они эфемерны, и вам нужно будет создать сложный механизм, чтобы поддерживать их соответствие, когда задачи Fargate приходят и уходят. Вы также рассматривалиПриложение Runner?

решение3

Связанный контент