postgres_fdw 无法连接到 Amazon RDS 上的服务器
Posted
技术标签:
【中文标题】postgres_fdw 无法连接到 Amazon RDS 上的服务器【英文标题】:postgres_fdw cannot connect to server on Amazon RDS 【发布时间】:2015-02-26 16:39:54 【问题描述】:我在 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 的传出连接一定有问题。
【问题讨论】:
我有确切的问题。我注意到,如果我向所有人开放 5432,它就可以工作。我不想这样做,并且想从入站的角度了解我必须打开什么。 forums.aws.amazon.com/thread.jspa?messageID=604858򓪺 @BradRuderman 我能够在创建服务器命令选项中使用host 'localhost'
在同一 RDS 实例上的数据库之间进行查询。如果你使用host 'myinstance.xxxxxxx.amazonaws.com
,你会得到你描述的超时。奇怪的是,编辑入站连接规则有帮助,因为无论安全组规则是什么,都不允许来自 RDS 的出站连接。
@BradRuderman,我只是尝试了同样的事情,fdw 连接似乎只有在我向所有人开放 5432 时才有效,这很糟糕......如果我尝试将某个服务器列入白名单,则不会'不行吗?你找到解决办法了吗?
【参考方案1】:
要让 postgres_fdw
在 AWS RDS(使用 VPC)中的两个实例之间工作,我必须:
-
启用
custom_dns_resolution
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.CustomDNS
在安全组的入站规则中添加查询数据库的公网IP或添加RDS实例的内部IP作为服务器主机。 https://forums.aws.amazon.com/thread.jspa?threadID=235154
第一个记录得很好,但我无法让它工作,直到遇到第二个。
【讨论】:
【参考方案2】:Amazon 似乎不允许来自 RDS 实例的传出连接,因此在此之前无法跨 RDS 实例使用 postgres_fdw 进行更改。我必须运行一个 ec2 实例作为我的 postgres 服务器,以便将外部表用于另一台服务器上的数据库。
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.RDSSecurityGroups.html
【讨论】:
您链接的文档没有说明不允许传出连接。 完全有可能(我们正在使用它)。您只是不能使用数据库安全组并使用 VPC 安全组。 看来这不再是真的了:aws.amazon.com/about-aws/whats-new/2018/05/…【参考方案3】:我遇到了类似的问题,发现 postgres_fdw 只能在主实例和远程实例位于同一可用区和 9.3.5 时在 EU-WEST-1 RDS 区域中工作,如果您越过可用区,它就不会连接。我的安全组是 5432 TCP 仅入站和所有出站。
【讨论】:
这对你真的有用吗?不是同一个实例上的两个数据库,或者 EC2 实例上的 postgres,而是两个独立的 RDS 实例?你通过了host XYZ.eu-west-1.rds.amazonaws.com
或类似于CREATE SERVER
的东西?我刚刚尝试了这个,但无法让它工作,即使在同一个 AZ 并将入站 5432 开放到 0.0.0.0/0,我希望因为@pail 提到的:亚马逊说他们阻止 all i> 来自 RDS 实例的出站网络连接。【参考方案4】:
如果你在同一个可用区,它没有理由不工作。
【讨论】:
以上是关于postgres_fdw 无法连接到 Amazon RDS 上的服务器的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 Postgres 连接到数据库,但无法将 Amazon 服务器上的地址转换为 Amazon 数据库
Pentaho DI 无法连接到 AWS Redshift - Amazon 错误 100021