本文介绍如何使用PostgreSQL的fdw插件,使RDS PostgreSQL实例支持访问外部开通公网的数据库。
背景信息
RDS PostgreSQL支持通过fdw功能访问外部其他类型数据库,如MySQL、SQL Server、PostgreSQL及Redis等,由于RDS PostgreSQL基于用户VPC的网络构建,如需访问公网上的数据库服务,还需配置公网NAT网关并绑定弹性公网IP(EIP)。
本文通过配置公网NAT网关并绑定弹性公网IP(EIP)的方式,为RDS PostgreSQL赋予访问公网的能力,同时,确保RDS PostgreSQL实例的网络安全(配置SNAT,RDS PostgreSQL可以访问互联网,但不通过NAT网关对互联网提供服务,外网无法通过NAT网关访问RDS PostgreSQL实例)。
NAT网关、SNAT相关信息,请参见使用公网NAT网关SNAT功能访问互联网。
前提条件
已具备开通公网的目标数据库,例如:开通公网IP的MySQL、SQL Server、PostgreSQL或Redis等。
已创建RDS PostgreSQL实例,操作步骤,请参见创建RDS PostgreSQL实例。
重要RDS PostgreSQL访问开通公网的目标数据库需要使用插件如下,请确保创建的RDS PostgreSQL实例支持对应插件。RDS PostgreSQL实例各版本插件支持情况,请参见支持插件列表。
MySQL:mysql_fdw
SQL Server:tds_fdw
PostgreSQL:postgres_fdw
Redis:redis_fdw
开通公网的目标数据库及RDS PostgreSQL实例均已创建账号。
开通公网的目标数据库创建账号,请参见各引擎官方文档。
RDS PostgreSQL创建账号,请参见创建账号。
开通公网的目标数据库已创建数据库并存在数据。
操作步骤
公网NAT网关配置
创建NAT网关。
登录NAT网关管理控制台。
在公网NAT网关页面,单击创建公网NAT网关。
(可选)首次使用NAT网关时,在公网NAT网关页面关联角色创建区域,单击创建关联角色,创建服务关联角色。角色创建成功后即可创建NAT网关。
在创建公网NAT网关页面,配置以下购买信息,然后单击立即购买。
说明下表仅列出关键参数,所有参数的具体信息,请参见使用公网NAT网关SNAT功能访问互联网。
配置
说明
所属地域
选择需要创建公网NAT网关的地域,需要与RDS PostgreSQL实例同一地域。
所属专有网络
选择公网NAT网关实例所属的VPC,需要与RDS PostgreSQL实例的VPC相同。您可以前往RDS管理控制台的数据库连接页面,查看目标实例的VPC。
关联交换机
选择公网NAT网关实例所属的交换机,需要与RDS PostgreSQL实例的交换机相同。您可以前往RDS管理控制台的数据库连接页面,查看目标实例的交换机。
访问模式
本文选择稍后配置。
在确认订单页面确认公网NAT网关的配置信息,选中服务协议并单击确认订单。
创建成功后,您可以在公网NAT网关页面查看已创建的公网NAT网关实例。
为公网NAT网关绑定公网IP(EIP)。
在NAT网关管理控制台页面,找到新建的公网NAT网关实例,单击实例ID,进入基本信息页。
切换至绑定的弹性公网IP页签,单击绑定弹性公网IP。
在绑定弹性公网IP弹窗中,选择新购弹性公网IP并绑定。
单击确定。
绑定成功后,在绑定的弹性公网IP处查看已绑定的弹性公网IP。
创建SNAT条目。
在NAT网关管理控制台页面,找到新建的公网NAT网关实例,单击实例ID,进入基本信息页。
切换至SNAT管理页签,单击创建SNAT条目。
在创建SNAT条目页面,配置以下参数,然后单击确定创建。
配置
说明
SNAT条目粒度
选择SNAT条目的粒度。本文以选择交换机粒度为例:指定交换机下的RDS PostgreSQL实例通过配置的公网IP访问公网。
选择交换机
在下拉列表中选择RDS PostgreSQL实例的交换机。
选择弹性公网IP地址
选择用来提供公网访问的公网IP。本文以选择使用单个IP为例,在下拉列表中选择已绑定的EIP。
创建成功后,在SNAT条目列表处查看已配置的SNAT条目。
开通公网的目标数据库配置
开通公网的目标数据库需要配置白名单,允许公网NAT网关绑定的EIP访问。
MySQL:请参见Privileges Provided by MySQL
PostgreSQL:请参见The pg_hba.conf File
SQL Server:请参见Configure the Windows Firewall to Allow SQL Server Access
Redis:利用防火墙限制IP访问指定端口,例如CentOS中安装iptables工具,使用如下命令:
iptables -A INPUT -s <公网NAT网关绑定的EIP> -p tcp --dport <Redis端口号> -j ACCEPT
RDS PostgreSQL配置
连接RDS PostgreSQL实例。具体操作,请参见连接PostgreSQL实例。
创建插件。
说明本文以开通公网的目标数据库MySQL为例,创建mysql_fdw插件。
CREATE EXTENSION mysql_fdw;
创建开通公网的目标数据库服务器定义。
CREATE SERVER <服务名> FOREIGN DATA WRAPPER mysql_fdw OPTIONS ( host '<开通公网的目标数据库的公网IP>', port '<开通公网的目标数据库的端口号>' );
本文以公网MySQL服务为例,配置命令如下:
CREATE SERVER mysql_server80 FOREIGN DATA WRAPPER mysql_fdw OPTIONS ( host 'XX.XX.XX.XX', port '3306' );
创建用户映射,将MySQL服务器定义映射到RDS PostgreSQL的某个用户上,在RDS PostgreSQL上使用这个用户访问开通公网的目标数据库MySQL的数据。
CREATE USER MAPPING FOR <RDS PostgreSQL用户名> SERVER <已创建的服务名> OPTIONS ( username '<开通公网的目标数据库的用户名>', password '<开通公网的目标数据库的密码>' );
命令示例如下:
CREATE USER MAPPING FOR pg_client SERVER mysql_server80 OPTIONS ( username 'testuser', password 'U123456!' );
创建外表。
CREATE FOREIGN TABLE <外表名> ( id int, name varchar(10) ) SERVER <已创建的服务名> OPTIONS ( dbname '<开通公网的目标数据库的数据库名>', table_name '<开通公网的目标数据库的表名>' );
命令实例如下:
CREATE FOREIGN TABLE mysql_fdw_test ( id int, name varchar(10) ) SERVER mysql_server80 OPTIONS ( dbname 'testdb', table_name 'test' );
连接测试。
完成上述配置后,即可在RDS PostgreSQL实例中访问公网数据库中的表。
以创建名为
mysql_fdw_test
的外表为例,在RDS PostgreSQL中,直接查询外表,即可获取开通公网的目标数据库的数据。SELECT * FROM mysql_fdw_test;