web-dev-qa-db-fra.com

L'accès à RDS à partir d'un conteneur Docker ne passe pas par le groupe de sécurité?

J'essaie de lancer un serveur Web qui utilise une base de données RDS avec EC2 dans un conteneur de menu fixe.

J'ai configuré les groupes de sécurité de sorte que le rôle de l'hôte EC2 soit autorisé à accéder au RDS. Si j'essaie d'y accéder directement à partir de la machine hôte, tout fonctionne correctement.

Cependant, lorsque j'exécute un simple conteneur sur l'hôte et tente d'accéder au RDS, il est bloqué comme si le groupe de sécurité ne le laissait pas passer. Après de nombreux essais et erreurs, il semble que les demandes de conteneurs ne semblent pas provenir de l'hôte EC2. Le pare-feu dit non.

J'ai pu contourner ce problème à court terme en paramétrant --net = Host sur le conteneur Docker. Toutefois, cela rompt de nombreuses fonctionnalités de réseau Docker, telles que la possibilité de mapper les ports (c’est-à-dire que je dois maintenant m'assurer que chaque instance du conteneur écoute manuellement sur un autre port).

Quelqu'un a-t-il trouvé un moyen de contourner cela? Cela semble être une très grosse limitation à l'exécution de conteneurs dans AWS si vous utilisez réellement des ressources AWS.

15
Alex Schokking

Compris ce qui se passait, publions ici au cas où cela pourrait aider quelqu'un d'autre.

Les demandes émanant de l'intérieur du conteneur touchaient l'adresse IP publique du RDS plutôt que l'adresse privée (c'est ainsi que fonctionnent les groupes de sécurité). Il semble que le DNS à l'intérieur du conteneur de menu fixe utilisait le DNS Google 8.8.8.8, ce qui ne ferait pas la magie noire AWS consistant à transformer le point de terminaison rds en adresse IP privée.

Donc par exemple: 

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

Oui, les conteneurs atteignent les adresses IP publiques de RDS. Mais vous n'avez pas besoin de régler les options de bas niveau de Docker pour permettre à vos conteneurs de communiquer avec RDS. Le cluster ECS et l'instance RDS doivent appartenir au même VPC et l'accès peut ensuite être configuré via des groupes de sécurité. Le moyen le plus simple de le faire est de:

  1. Accédez à la page d'instances RDS
  2. Sélectionnez l'instance de base de données et accédez au détail pour en savoir plus.
  3. Cliquez sur l'identifiant du groupe de sécurité
  4. Accédez à l'onglet Entrant et choisissez Modifier.
  5. Et assurez-vous qu’il existe une règle de type MySQL/Aurora avec le source personnalisé
  6. Lors de la saisie de la source personnalisée, commencez à taper le nom du cluster ECS et le nom du groupe de sécurité sera automatiquement renseigné.

Ce tutoriel contient des captures d'écran qui illustrent les endroits où aller.

Divulgation complète: Ce tutoriel présente les conteneurs de Bitnami et je travaille pour Bitnami. Cependant, les pensées exprimées ici sont les miennes et non l'opinion de Bitnami.

18
Neal

Comme @adamneilson le mentionne, définir les options de Docker est votre meilleur choix. Voici comment découvrir votre serveur Amazon DNS sur le VPC . La section Activation de la sortie de débogage de Docker dans le Guide du développeur Amazon EC2 Container Service - Dépannage mentionne également l'emplacement du fichier d'options Docker.

En supposant que vous exécutiez un bloc VPC de 10.0.0.0/24, le DNS serait 10.0.0.2.

Pour CentOS, Red Hat et Amazon:

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

Pour Ubuntu et Debian:

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