我在執行 PostgreSQL 的 Amazon Relational Database Service (Amazon RDS) 上使用外部資料包裝函式 (FDW) 和設定為驗證完整的 sslmode。我在嘗試為資料庫執行個體建立 FDW 伺服器時遇到以下錯誤:「根憑證檔案 "/home/rdsdb/.postgresql/root.crt" 不存在」。我該如何解決此錯誤?
簡短描述
若要在 PostgreSQL 中啟用憑證驗證,必須將 sslmode 設定為驗證完整。如果 sslmode 在您從一個 Amazon RDS 執行個體將 FDW 伺服器建立到另一個時被設定為驗證完整,您將收到根憑證檔案錯誤。此錯誤在執行 CREATE SERVER 命令的資料庫執行個體上產生。您無法在 Amazon RDS 執行個體上直接存取檔案系統或安裝 CA 憑證,但所需的根憑證已安裝在資料庫執行個體上。若要尋找憑證位置,請執行下列命令:
postgres=> show ssl_cert_file;
ssl_cert_file
-----------------------------------------
/rdsdbdata/rds-metadata/server-cert.pem
(1 row)
若要解決此錯誤,請在建立伺服器時,將 FDW 連線指向 /rdsdbdata/rds-metadata/server-cert.pem 檔案。
解決方法
若要將 FDW 連線指向根憑證檔案,請執行類似於以下內容的命令:
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');
若要確認連線是否正常運作,請建立使用者映射和外部資料表:
注意: PostgreSQL 會在日誌檔中以純文字記錄密碼。若要防止這種情況,請參閱如何阻止 Amazon RDS for PostgreSQL 在日誌檔中以純文字記錄我的密碼?
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');
在存取資料表之前不會建立連線。若要確認連線是否正常運作,請查詢資料表:
SELECT * from foreign_table ;
如果 FDW 連線成功,則會傳回來自外部資料表的資料。
相關資訊
Amazon RDS 上的 PostgreSQL 常見管理任務
適用於 postgres_fdw 的 PostgreSQL 文件