Estou usando Foreign Data Wrappers (FDW) e sslmode que estão configurados para verificação completa no Amazon Relational Database Service (Amazon RDS) executando o PostgreSQL. Quando tento criar um servidor FDW para minha instância de banco de dados, recebo o seguinte erro: “O arquivo de certificado raiz “/home/rdsdb/.postgresql/root.crt” não existe”. Como faço para resolver esse erro?
Breve descrição
Para habilitar a verificação do certificado no PostgreSQL, sslmode deve ser definido como verify-full. Se sslmode estiver definido como verifiy-full ao criar um servidor FDW de uma instância do Amazon RDS para outra, você receberá o erro do arquivo do certificado raiz. Esse erro é gerado na instância de banco de dados em que o comando CREATE SERVER é executado. Você não pode acessar filesystem em uma instância do Amazon RDS nem instalar os certificados CA, mas o certificado raiz necessário já está instalado na instância de banco de dados. Para encontrar a localização do certificado, execute o seguinte comando:
postgres=> show ssl_cert_file;
ssl_cert_file
-----------------------------------------
/rdsdbdata/rds-metadata/server-cert.pem
(1 row)
Para resolver esse erro, aponte a conexão FDW para o arquivo /rdsdbdata/rds-metadata/server-cert.pem ao criar o servidor.
Resolução
Para apontar a conexão FDW para o arquivo de certificado raiz, execute um comando semelhante ao seguinte:
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');
Para confirmar se a conexão está funcionando, crie um mapeamento de usuário e uma tabela externa:
Observação: o PostgreSQL registra senhas em texto não criptografado nos arquivos de log. Para evitar isso, consulte Como faço para impedir que o Amazon RDS para PostgreSQL registre minhas senhas em texto não criptografado nos arquivos de log?
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');
A conexão não é estabelecida até que a tabela seja acessada. Para confirmar que a conexão está funcionando, consulte a tabela:
SELECT * from foreign_table ;
Se a conexão FDW for bem-sucedida, os dados da tabela externa serão retornados.
Informações relacionadas
Tarefas comuns de gerenciamento para PostgreSQL no Amazon RDS
Documentação do PostgreSQL para /rdsdbdata/rds-metadata/server-cert.pem