ECS EC2 Launch Тип: Строка подключения к сервисной базе данных - PullRequest
0 голосов
/ 15 января 2019

Я пробую небольшой POC (учебный эксперимент) на докере. У меня есть 3 образа докера, по одному для витрины магазина, поисковой системы и базы данных, называемой storefront, solr, docmysql соответственно. Я попытался запустить их в рое докеров (на одном узле) на ec2, и он отлично работает.

В POC мне нужно было переместить это в AWS ECS, используя тип запуска EC2 на одном AMI, не оптимизированном для Amazon. Я установил и запустил ecs-агент на этом. Я создал 3 сервиса с одной задачей для каждого из 3 изображений, настроенных как контейнеры в рамках задачи. Речь идет о подключении к базе данных из магазина.

У витрины есть файл свойств, где соединение с базой данных обычно определяется как

  "jdbc:mysql://docmysql/hybris64?useConfigs=maxPerformance&characterEncoding=utf8&useSSL=false". 

Это сработало, когда я запустил его как рой докеров. После того, как я переместил его в ECS (тип запуска EC2), мне пришлось открыть порт 3306 из моей задачи / контейнера для службы docmysql. Это дало мне конечную точку службы docmysql.local, где local является частным пространством имен. Я попытался изменить строку подключения на

"jdbc:mysql://docmysql.local/hybris64?useConfigs=maxPerformance&characterEncoding=utf8&useSSL=false" 

в файле свойств, и он всегда завершается с ошибкой «Имя или служба неизвестна». Какой должна быть строка подключения? Когда служба создана, я вижу 2 записи в маршруте 53, одну запись SRV и запись A. Запись A имеет имя .docmysql.local. Если я использую ее в строке подключения к базе данных, я вижу, что она работает, но, очевидно, не то, что нужно делать с hascoded taskid. Я читал об AWS Cloud Map (servicediscovery), но все еще не очень ясно, как это сделать. Я не буду ставить какой-либо loadbalancer перед моей задачей БД в сервисе, для БД всегда будет только одна задача.

Итак, каков наилучший способ создания строки подключения, которая работает? Кроме того, почему у меня не было проблем, когда я управлял им как рой докеров.

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

1 Ответ

0 голосов
/ 07 февраля 2019

Ну, я поднял несколько вопросов, прежде чем мое собственное решение проблемы:

  • Вам нужен ваш экземпляр для масштабирования с использованием ECS? Если нет, перенесите его в RDS.
  • Вам нужно развернуть его на EC2-Type? Если нет, используйте fargate, с ним проще работать.

Теперь я столкнулся с этой проблемой в Fargate и обнаружил, что в зависимости от определений вашего контейнера / задачи его можно использовать в одной и той же задаче для целей тестирования, поэтому ответом будет 127.0.0.1.

При выполнении различных задач вам нужно работать в сетевом режиме awsvpc, поэтому вы получите следующее:

  • Каждая задача, использующая сетевой режим awsvpc, получает собственный эластичный сетевой интерфейс, который подключен к экземпляру контейнера, в котором он размещен. (ОТ AWS)

Я предлагаю создать лямбда-функцию для динамического обнаружения вашего сетевого интерфейса.

Прочитайте это для глубокого понимания:

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html

https://aws.amazon.com/blogs/developer/invoking-aws-lambda-functions-from-java/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...