postgres_fdw无法连接到Amazon RDS上的服务器

6

我有两个Postgres 9.3.5实例在RDS中,都在同一个安全组中,该安全组允许来自安全组内部的所有入站流量和所有出站流量。我正在尝试设置一个数据库,以便通过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,但我正在运行较新的版本,它们支持。在创建服务器语句中,我尝试使用IP地址替换"myinstance.xxxxxx.amazonaws.com",但没有成功。有什么想法吗?
进一步测试:
我在具有相同安全组的EC2实例上安装了Postgres,主服务器上的外部表表现正常。在同一RDS实例中的数据库之间的postgres_fdw起作用。
所有这些都让我认为这必须是我的Postgres RDS实例中的postgres_fdw对外连接存在问题。

1
我有同样的问题。我注意到,如果我向所有人开放5432端口,它可以工作。但我不想这样做,我想了解从入站角度来说,我需要打开哪些端口。https://forums.aws.amazon.com/thread.jspa?messageID=604858&#604858 - Brad Ruderman
@BradRuderman 我能够使用host 'localhost'在创建服务器命令选项中在相同的RDS实例之间查询数据库。如果你使用`host 'myinstance.xxxxxxx.amazonaws.com',你会像你描述的那样超时。编辑入站连接规则有所帮助是奇怪的,因为无论安全组规则如何,来自RDS的出站连接都是被禁止的。 - pail
@BradRuderman,我刚刚尝试了同样的事情,发现只有在向所有人开放5432端口时,fdw连接才能正常工作,这太糟糕了...如果我尝试仅将某个特定服务器列入白名单,它就无法工作?你找到解决方法了吗? - Tomislav Mikulin
4个回答

2
为了使 AWS RDS(使用 VPC)中的两个实例之间可以使用 postgres_fdw,我需要:
  1. 启用 custom_dns_resolution。请参阅此文档
  2. 将查询数据库的公共 IP 添加到安全组的入站规则中或者将 RDS 实例的内部 IP 添加为服务器主机。请参阅此帖子
第一条已经有很好的文档说明,但在发现第二条时才成功实现。

1

1
你提供的文档没有提到禁止出站连接的内容。 - Juraj Petrik
1
完全可以实现(我们正在使用它)。你只需要不使用DB安全组,改为使用VPC安全组。 - Viktor Yarmak
2
似乎这已经不再是真的了:https://aws.amazon.com/about-aws/whats-new/2018/05/amazon-rds-supports-outbound-network-access-from-postgresql-read-replicas/ - krlmlr

0
我曾经遇到类似的问题,并发现postgres_fdw只有在主数据库和远程实例处于同一可用区且使用9.3.5版本时,在EU-WEST-1 RDS地区才能正常工作。如果跨越可用区,则无法连接。我的安全组只允许5432 TCP入站,所有出站流量都允许。

2
这对你真的有效吗?不是在同一实例上有两个数据库,或者在EC2实例上运行Postgres,而是两个单独的RDS实例?并且你传递了host XYZ.eu-west-1.rds.amazonaws.com或类似于CREATE SERVER的东西吗?我刚试过,即使在相同的AZ中打开入站5432到0.0.0.0/0,我也无法让它工作,我认为是因为@pail提到的:亚马逊说他们阻止从RDS实例发出的所有出站网络连接。 - ryan

0
如果您在相同的可用区,那么它应该可以正常工作,没有任何问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接