Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Es kann keine Verbindung zur AWS VPC RDS-Instance (mysql oder postgres) hergestellt werden

Zusätzliche Informationen für Personen, die möglicherweise auf ähnliche Probleme stoßen, wenn sie versuchen, eine Verbindung zu RDS oder RedShift herzustellen:

1) Sicherheitsgruppen prüfen

Stellen Sie sicher, dass die Sicherheitsgruppe für die RDS-Instance den Zugriff von der Sicherheitsgruppe zulässt, zu der Ihr Quellserver gehört (oder seine IP direkt hinzugefügt wird, wenn er sich außerhalb von AWS befindet). Die Sicherheitsgruppe, die Sie sich ansehen sollten, ist diejenige, die in den RDS-Instanzattributen der Benutzeroberfläche der RDS-Konsole angegeben ist (mit dem Namen „Sicherheitsgruppe“).

HINWEIS :Datenbanksicherheitsgruppen können sich von AWS EC2-Sicherheitsgruppen unterscheiden. Wenn sich Ihre RDS-Instance im klassischen/öffentlichen EC2 befindet, sollten Sie den Abschnitt „Datenbanksicherheitsgruppe“ der RDS-Benutzeroberfläche überprüfen. Für VPC-Benutzer ist die Sicherheitsgruppe eine normale VPC-Sicherheitsgruppe (der Name sg-xxx wird in den Attributen der RDS-Instanz aufgeführt).

2) Bestätigen Sie, dass DNS kein Problem darstellt.

Amazon verwendet Split-DNS, sodass eine DNS-Suche außerhalb von AWS die öffentliche IP zurückgibt, während eine Suche innerhalb von AWS eine private IP zurückgibt. Wenn Sie vermuten, dass es sich um ein DNS-Problem handelt, haben Sie bestätigt, dass unterschiedliche IPs aus unterschiedlichen Verfügbarkeitszonen zurückgegeben werden? Wenn verschiedene AZs unterschiedliche IPs erhalten, müssen Sie sich an den AWS-Support wenden.

3) Bestätigen Sie die Netzwerkkonnektivität, indem Sie eine Socket-Verbindung herstellen.

Tools wie Tracepath und Traceroute werden wahrscheinlich nicht helfen, da RDS derzeit den ICMP-Verkehr unterbindet.

Testen Sie die Portkonnektivität, indem Sie versuchen, eine Socket-Verbindung zur RDS-Instanz auf Port 3306 (mysql oder 5432 für postgres) herzustellen. Beginnen Sie damit, die IP der RDS-Instance zu finden und entweder telnet oder nc zu verwenden (stellen Sie sicher, dass Sie die interne/private IP verwenden, wenn Sie sich innerhalb von AWS verbinden):

telnet x.x.x.x 3306
nc -vz x.x.x.x 3306

a) Wenn Ihr Verbindungsversuch nicht erfolgreich ist und sofort fehlschlägt, ist der Port wahrscheinlich blockiert oder der Remote-Host führt keinen Dienst auf diesem Port aus. Möglicherweise müssen Sie sich an den AWS-Support wenden, um weitere Fehler zu beheben. Wenn Sie eine Verbindung von außerhalb von AWS herstellen, versuchen Sie zuerst, eine Verbindung von einer anderen Instanz innerhalb von AWS herzustellen (da Ihre Firewall diese Verbindungen möglicherweise blockiert).

b) Wenn Ihre Verbindung nicht erfolgreich ist und Sie eine Zeitüberschreitung erhalten, werden Pakete wahrscheinlich von einer Firewall verworfen/ignoriert oder Pakete kehren auf einem anderen Netzwerkpfad zurück. Sie können dies bestätigen, indem Sie netstat -an | grep SYN (von einer anderen ssh-Sitzung, während auf den telnet/nc-Befehl gewartet wird, um das Zeitlimit zu überschreiten).

Verbindungen im SYN-Zustand bedeuten, dass Sie eine Verbindungsanfrage gesendet, aber nichts zurückerhalten haben (SYN_ACK oder Reject/Block). Normalerweise bedeutet dies, dass eine Firewall oder Sicherheitsgruppe Pakete ignoriert oder verwirft.

Es kann auch ein Problem mit NAT-Routing oder mehreren Pfaden von mehreren Schnittstellen geben. Vergewissern Sie sich, dass Sie weder iptables noch ein NAT-Gateway zwischen Ihrem Host und der RDS-Instanz verwenden. Wenn Sie sich in einer VPC befinden, stellen Sie außerdem sicher, dass Sie ausgehenden/ausgehenden Datenverkehr vom Quellhost zulassen.

c) Wenn Ihr Socket-Verbindungstest erfolgreich war, Sie aber keine Verbindung mit einem MySQL-Client (CLI, Workbench, App usw.) tatsächliche IP-Adresse der RDS-Instanz):

netstat -an | grep x.x.x.x

Wenn bei Verwendung von Telnet oder NC eine Verbindung hergestellt wurde, aber bei Verwendung eines MySQL-Clients der Status „SYN“ angezeigt wird, liegt möglicherweise ein MTU-Problem vor.

Zum Zeitpunkt der Erstellung dieses Artikels unterstützt RDS möglicherweise keine ICMP-Pakete, die für PMTUD verwendet werden (https:/ /en.wikipedia.org/wiki/Path_MTU_Discovery#Problems_with_PMTUD ). Dies kann ein Problem sein, wenn Sie versuchen, von einer klassischen ec2-Instanz über ClassicLink auf RDS oder RedShift in einer VPC zuzugreifen. Versuchen Sie, die MTU wie folgt zu verringern, und testen Sie dann erneut:

sudo ip link show
# take note of the current MTU (likely 1500 or 9001)
sudo ip link set dev eth0 mtu 1400

Wenn die niedrigere MTU funktioniert hat, wenden Sie sich an den AWS-Kundensupport, um Hilfe zu erhalten, und erwähnen Sie, dass Sie ein MTU-Problem sehen, während Sie versuchen, eine Verbindung zu Ihrer RDS-Instance herzustellen. Dies kann passieren, wenn TCP-Pakete mit Kapselung zum Tunneln verpackt werden, was zu einer niedrigeren nutzbaren MTU für Paketdaten / Nutzlast führt. Durch das Verringern der MTU auf dem Quellserver können die umschlossenen Pakete immer noch unter die MTU-Grenze passen, während sie das Tunneling-Gateway passieren.

Wenn es nicht funktioniert hat, setzen Sie Ihre MTU auf die Standardeinstellung zurück und wenden Sie sich zur weiteren Fehlerbehebung an den AWS-Support.