postgres_fdw无法连接到亚马逊RDS上的服务器



我在RDS中有两个Postgres 9.3.5实例,都在一个安全组中,允许安全组内的所有入站流量和所有出站流量。我正在尝试设置一个数据库,以便能够通过postgres_fdw从另一个数据库的几个表中进行选择。

我已经创建了服务器-

create server master 
foreign data wrapper postgres_fdw 
OPTIONS (dbname 'main', 
         host 'myinstance.xxxxx.amazonaws.com');

以及必要的用户映射和外部表-

create foreign table condition_fdw (
    cond_id integer,
    cond_name text
) server master options(table_name 'condition', schema_name 'data');

然而,一个简单的select count(*) from condition_fdw给了我

ERROR:  could not connect to server "master"
DETAIL:  could not connect to server: Connection timed out
        Is the server running on host "myinstance.xxxxxx.amazonaws.com" (xx.xx.xx.xx) and accepting
        TCP/IP connections on port 5432?

我可以从EC2实例通过psql连接到这两个数据库。我知道直到最近RDS还不支持postgres_fdw,但我正在运行支持的更新版本。

在create-server语句中,我尝试将"myinstance.xxxxxxx.amazonaws.com"替换为它解析到的IP地址,但没有成功。

有什么想法吗?

进一步测试

我在具有相同安全组的ec2实例上安装了postgres,主服务器的外部表的行为与预期一致。

postgres_fdw在同一RDS实例上的数据库之间工作。

这一切让我认为,在我的postgres RDS实例上,来自postgres_fdw的传出连接一定有问题。

要让postgres_fdw在AWS RDS(带VPC)的两个实例之间工作,我必须:

  1. 启用custom_dns_resolutionhttps://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.CustomDNS
  2. 在安全组的入站规则中添加查询数据库的公共IP,或者添加RDS实例的内部IP作为服务器主机。https://forums.aws.amazon.com/thread.jspa?threadID=235154

第一个记录得很好,但我直到第二个才开始工作。

亚马逊似乎不允许从RDS实例传出连接,因此在此之前,不可能在RDS实例之间使用postgres_fdw进行更改。我将不得不运行一个ec2实例作为我的postgres服务器,以便对另一台服务器上的数据库使用外部表。

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.RDSSecurityGroups.html

我遇到了类似的问题,发现postgres_fdw只有在主实例和远程实例位于同一可用区域时才能在EU-WEST-1 RDS区域中工作,并且在9.3.5上,如果您跨越AZ,它将不会连接。我的安全组是5432 TCP仅入站和所有出站。

如果您在同一可用性区域,那么没有理由不工作。

相关内容

  • 没有找到相关文章

最新更新