6

我在 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?

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

在创建服务器语句中,我尝试将“myinstance.xxxxxx.amazonaws.com”替换为它解析到的 IP 地址,但没有成功。

有任何想法吗?

进一步测试

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

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

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

4

4 回答 4

2

postgres_fdw在 AWS RDS(使用 VPC)中的两个实例之间工作,我必须:

  1. 启用custom_dns_resolution https://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

第一个记录得很好,但我无法让它工作,直到绊倒第二个。

于 2020-10-12T06:45:37.597 回答
1

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

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

于 2015-02-27T02:53:55.677 回答
0

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

于 2015-03-17T13:59:00.037 回答
0

如果您在同一个可用区,那么它没有理由不起作用。

于 2016-11-25T10:48:00.320 回答