Ich verwende Foreign Data Wrappers (FDW) und sslmode, das auf vollständige Überprüfung eingestellt ist, auf Amazon Relational Database Service (Amazon RDS) mit PostgreSQL. Wenn ich versuche, einen FDW-Server für meine DB-Instance zu erstellen, erhalte ich die folgende Fehlermeldung: „root certificate file "/home/rdsdb/.postgresql/root.crt" does not exist“. Wie kann ich diesen Fehler beheben?
Kurzbeschreibung
Um die Zertifikatsüberprüfung in PostgreSQL zu aktivieren, muss sslmode auf verify-full gesetzt sein. Wenn sslmode auf verify-full gesetzt ist, wenn Sie einen FDW-Server von einer Amazon-RDS-Instance zu einer anderen erstellen, erhalten Sie den Stammzertifikatsdatei-Fehler. Dieser Fehler wird auf der DB-Instance generiert, die den Befehl CREATE SERVER ausführt. Sie können nicht direkt auf das Dateisystem einer Amazon-RDS-Instance zugreifen oder die CA-Zertifikate installieren, aber das erforderliche Stammzertifikat ist bereits auf der DB-Instance installiert. Führen Sie folgenden Befehl aus, um den Speicherort des Zertifikats zu ermitteln:
postgres=> show ssl_cert_file;
ssl_cert_file
-----------------------------------------
/rdsdbdata/rds-metadata/server-cert.pem
(1 row)
Um den Fehler zu beheben, richten Sie beim Erstellen des Servers die FDW-Verbindung auf die Datei /rdsdbdata/rds-metadata/server-cert.pem.
Behebung
Führen Sie einen Befehl wie den folgenden aus, um die FDW-Verbindung auf die Stammzertifikatsdatei zu richten:
CREATE SERVER my_foreign_db
foreign data wrapper postgres_fdw
options (host 'my_db.xyz.eu-west-1.rds.amazonaws.com', port '5432', dbname 'my_db', sslmode 'verify-full', sslrootcert '/rdsdbdata/rds-metadata/server-cert.pem');
Um zu überprüfen, ob die Verbindung funktioniert, erstellen Sie eine Benutzerzuordnung und eine Fremdtabelle:
Hinweis: PostgreSQL protokolliert Passwörter im Klartext in den Protokolldateien. Um dies zu verhindern, lesen Sie How can I stop Amazon RDS for PostgreSQL from logging my passwords in clear-text in the log files?
CREATE USER MAPPING FOR dbuser SERVER my_foreign_db OPTIONS (user 'dbuser', password 'dbpasswd');
CREATE FOREIGN TABLE foreign_table ( id integer not null, name character(84)) SERVER my_foreign_db OPTIONS (schema_name 'public', table_name 'my_table');
Eine Verbindung wird erst hergestellt, wenn auf die Tabelle zugegriffen wird. Um zu überprüfen, ob die Verbindung funktioniert, fragen Sie die Tabelle ab:
SELECT * from foreign_table ;
Wenn die FDW-Verbindung erfolgreich zustandekommt, werden die Daten aus der Fremdtabelle zurückgegeben.
Verwandte Themen
Common management tasks for PostgreSQL on Amazon RDS
PostgreSQL-Dokumentation für postgres_fdw