Доступ к RDS из контейнера Docker не проходит через группу безопасности?

Я пытаюсь запустить веб-сервер, который использует базу данных RDS с EC2 внутри контейнера докера.

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

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

Я смог обойти это в краткосрочной перспективе, установив --net = host в контейнере Docker, однако это нарушает множество замечательных сетевых функций Docker, таких как возможность сопоставления портов (т.е. Теперь мне нужно убедиться, что каждый экземпляр контейнера прослушивает другой порт вручную).

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

Ответ 1

Выяснилось, что происходит, публикуя здесь, если это помогает кому-то еще.

Запросы из контейнера попадают в общедоступный IP-адрес RDS, а не из частного (как работают группы безопасности). Похоже, что DNS внутри контейнера докеров использовал 8.8.8.8 google dns, и это не сделало бы черную магию AWS превращения конечной точки rds в частный ip.

Итак, например:

DOCKER_OPTS="--dns 10.0.0.2 -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock -g /mnt/docker"

Ответ 2

Да, контейнеры попадают в общедоступные IP-адреса RDS. Но вам не нужно настраивать низкоуровневые параметры Docker, чтобы ваши контейнеры могли разговаривать с RDS. Кластер ECS и экземпляр RDS должны находиться в одном и том же VPC, а затем доступ можно настроить с помощью групп безопасности. Самый простой способ сделать это:

  • Перейдите на страницу экземпляров RDS
  • Выберите экземпляр БД и разверните его, чтобы увидеть детали.
  • Нажмите на идентификатор группы безопасности
  • Перейдите на вкладку "Входящие" и выберите "Редактировать"
  • И убедитесь, что существует правило типа MySQL/Aurora с исходным текстом
  • При вводе пользовательского источника просто начните вводить имя кластера ECS, и имя группы безопасности будет автоматически завершено для вас.

В этом учебнике есть скриншоты, которые иллюстрируют, куда идти.

Полное раскрытие: В этом учебнике представлены контейнеры от Bitnami, и я работаю над Bitnami. Однако мысли, выраженные здесь, являются моими собственными, а не мнением Битнами.

Ответ 3

Как упоминает @adamneilson, настройка опций Docker - лучший выбор. Вот как открыть ваш DNS-сервер Amazon на VPC. Также раздел Включение вывода отладки Docker в Руководстве разработчика контейнера Amazon EC2. Устранение неполадок упоминает, где находится файл опций Docker.

Предполагая, что вы используете блок VPC 10.0.0.0/24, DNS будет 10.0.0.2.

Для CentOS, Red Hat и Amazon:

sed -i -r 's/(^OPTIONS=\")/\1--dns 10.0.0.2 /g' /etc/sysconfig/docker

Для Ubuntu и Debian:

sed -i -r 's/(^OPTIONS=\")/\1--dns 10.0.0.2 /g' /etc/default/docker

Ответ 4

Правило входящего трафика для RDS должно быть установлено на частный IP-адрес экземпляра EC2, а не на публичный IPv4.