2
votes

Base de données PostgreSQL sur EC2: connexion refusée

Mon application Django et ma base de données PostgreSQL sont configurées sur deux instances EC2 dans le même VPC. L'application est sur l'instance avec le sous-réseau connecté à la passerelle Internet; la base de données se trouve sur une instance avec un sous-réseau qui n'a pas de passerelle Internet.

L'adresse IP privée de l'instance d'application est 10.0.0.164; l'adresse IP privée de l'instance de base de données est 10.0.1.136.

Lorsque j'essaye de connecter mon application Django à la base de données, j'obtiens l'erreur

n'a pas pu se connecter au serveur: connexion refusée
Le serveur fonctionne-t-il sur l'hôte "10.0.1.136" et accepter les connexions TCP / IP sur le port 5432?

Cependant, j'ai autorisé le trafic TCP entrant sur le port 5432 sur l'instance de base de données. Mon groupe de sécurité règle pour l'instance qui héberge la base de données:

Inbound: autorise tout le trafic TCP et ICMP IPV4 & IPV6 dans tous les ports depuis l'adresse IP interne de l'instance hébergeant l'application Django (10.0.0.164/32)

(capture d'écran de mes règles entrantes https://imgur.com/a/HNbrIDm a>)

Sortant: autorise tout le trafic dans tous les ports vers n'importe où

Mon fichier pg_hba.conf sur l'instance de base de données EC2:

XXX

Mon fichier postgresql.conf a défini l'adresse d'écoute sur «10 .0.0.164, 127.0.0.1» et le port sur «5432».

Mes paramètres de base de données dans settings.py de Django :

ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'articles',
            'USER': 'postgres',
            'PASSWORD': 'password',
            'HOST': '10.0.1.136',
            'PORT': '5432',

Que puis-je faire d'autre pour que l'instance de base de données accepte la connexion?

EDIT: Mes instances EC2 exécutent Ubuntu 16.04

EDIT: c'est ce que j'ai obtenu en exécutant sudo lsof -nP -i | grep LISTEN sur l'instance de base de données: postgres 1823 postgres 6u IPv4 19766 0t0 TCP 127.0.0.1:5432 (LISTEN)

J'ai exécuté sudo ufw allow 5432 et toujours la même erreur

Quand j'ai exécuté netstat -nlt sur l'instance de base de données, je ne vois pas le port 5432


13 commentaires

Quelle distribution Linux utilisez-vous? Assurez-vous d'autoriser le port 5432 sur le pare-feu du système d'exploitation. Par exemple, dans Ubuntu, vous devez faire sudo ufw allow 5432 .


@Pedro Ubuntu 16.04. Merci de me rappeler d'inclure cette information! Je vais essayer cette commande


@Pedro Voulez-vous dire que je dois faire sudo ufw allow 5432 sur l'instance de base de données ou l'instance d'application?


Pour être clair, votre base de données est une instance EC2, n'est-ce pas? pas RDS


@Pedro oui EC2, pas RDS


@Pedro J'ai fait sudo ufw allow 5432 sur les deux instances et j'ai toujours la même erreur = (


Le pare-feu Ubuntu (ufw) bloque les connexions entrantes, vous devez donc exécuter la commande dans l'instance de base de données.


@Pedro je viens de faire et tout redémarré et j'obtiens toujours la même erreur = (


avez-vous essayé d'envoyer une requête ping au serveur de base de données à partir de l'instance d'application?


@Pedro bon point! J'ai juste nmap-ed le port 5432 du serveur et il est retourné que le port est fermé. J'ai déjà exécuté sudo ufw allow 5432 / tcp et sudo ufw allow 5432 sur l'instance. pourquoi est-il toujours fermé?


Essayez de désactiver le pare-feu (instance de base de données) sudo ufw disable et envoyez à nouveau un ping. Vous pouvez vérifier l'état du pare-feu en utilisant sudo ufw status


@Pedro vient de le faire. dit toujours fermé lorsque je mappe à partir de l'instance d'application


@Pedro Je viens de résoudre le problème! affichera la réponse. Merci pour votre aide


3 Réponses :


0
votes

Comme vous l'avez mentionné que votre base de données est dans l'instance EC2, vérifiez les règles entrantes de l'instance. J'ai vu l'image des règles entrantes. La source doit être 0.0.0.0/0,::/0 à la place sur l'IP de l'instance


0 commentaires

2
votes

postgres 1823 postgres 6u IPv4 19766 0t0 TCP 127.0.0.1:5432 (ÉCOUTER)

C'est votre problème ici, votre postgres est lié à localhost uniquement.

Changer l'IP que postgres écoute en modifiant le fichier /var/lib/pgsql/data/postgresql.conf ou / etc / postgresql / "Numéro de version ici" /main/postgresql.conf et modifiez l'adresse d'écoute comme suit ...

listen_addresses='127.0.0.1 10.0.1.136'

vous devez indiquer les adresses d'écoute comme je l'ai fait sans les virgules dans les versions ultérieures de postgres

J'espère que cela résout votre problème! :)


2 commentaires

ouais c'était le problème! Merci! vient de publier une réponse détaillant comment j'ai résolu le problème


Heureux de pouvoir vous aider, j'ai également remarqué que vous avez dit que l'adresse d'écoute était 10.0.1.164 dans votre question, je suppose que c'est l'adresse de l'application Django et non la base de données? Ce serait probablement la raison pour laquelle il n'écoutait que sur localhost :)



2
votes

Cette page a résolu mon problème: https://zaiste.net/postgresql_allow_remote_connections/

J'ai exécuté sudo netstat -plunt | grep postgres et j'ai trouvé que mon Postgres fonctionnait réellement sur le port 1823 (POURQUOI). J'ai modifié mon postgresql.conf pour autoriser toutes les listen_addresses ( listen_addresses = '*' ) puis changé les paramètres de ma base de données Django sur le port 1823


0 commentaires