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&#604858 @BradRuderman 我能够在创建服务器命令选项中使用 host 'localhost' 在同一 RDS 实例上的数据库之间进行查询。如果你使用host 'myinstance.xxxxxxx.amazonaws.com,你会得到你描述的超时。奇怪的是,编辑入站连接规则有帮助,因为无论安全组规则是什么,都不允许来自 RDS 的出站连接。 @BradRuderman,我只是尝试了同样的事情,fdw 连接似乎只有在我向所有人开放 5432 时才有效,这很糟糕......如果我尝试将某个服务器列入白名单,则不会'不行吗?你找到解决办法了吗? 【参考方案1】:

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

    启用custom_dns_resolutionhttps://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

无法让PHPMyAdmin连接到Amazon RDS实例

无法从 Elastic Beanstalk 连接到 Amazon SimpleDB

Amazon EC2 - 无法远程连接到 MariaDB

Pymssql 无法连接到 Amazon Linux 2 上的 Azure SQL Server