RDS PostgreSQL通过公网访问外部数据库

本文介绍如何使用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网关配置

  1. 创建NAT网关。

    1. 登录NAT网关管理控制台

    2. 公网NAT网关页面,单击创建公网NAT网关

    3. (可选)首次使用NAT网关时,在公网NAT网关页面关联角色创建区域,单击创建关联角色,创建服务关联角色。角色创建成功后即可创建NAT网关。

    4. 在创建公网NAT网关页面,配置以下购买信息,然后单击立即购买

      说明

      下表仅列出关键参数,所有参数的具体信息,请参见使用公网NAT网关SNAT功能访问互联网

      配置

      说明

      所属地域

      选择需要创建公网NAT网关的地域,需要与RDS PostgreSQL实例同一地域。

      所属专有网络

      选择公网NAT网关实例所属的VPC,需要与RDS PostgreSQL实例的VPC相同。您可以前往RDS管理控制台的数据库连接页面,查看目标实例的VPC。

      关联交换机

      选择公网NAT网关实例所属的交换机,需要与RDS PostgreSQL实例的交换机相同。您可以前往RDS管理控制台的数据库连接页面,查看目标实例的交换机。

      访问模式

      本文选择稍后配置

    5. 确认订单页面确认公网NAT网关的配置信息,选中服务协议并单击确认订单

      创建成功后,您可以在公网NAT网关页面查看已创建的公网NAT网关实例。创建NAT网关

  2. 为公网NAT网关绑定公网IP(EIP)。

    1. NAT网关管理控制台页面,找到新建的公网NAT网关实例,单击实例ID,进入基本信息页。

    2. 切换至绑定的弹性公网IP页签,单击绑定弹性公网IP

    3. 绑定弹性公网IP弹窗中,选择新购弹性公网IP并绑定绑定弹性公网IP

    4. 单击确定

      绑定成功后,在绑定的弹性公网IP处查看已绑定的弹性公网IP。已绑定的弹性公网IP

  3. 创建SNAT条目。

    1. NAT网关管理控制台页面,找到新建的公网NAT网关实例,单击实例ID,进入基本信息页。

    2. 切换至SNAT管理页签,单击创建SNAT条目

    3. 创建SNAT条目页面,配置以下参数,然后单击确定创建

      配置

      说明

      SNAT条目粒度

      选择SNAT条目的粒度。本文以选择交换机粒度为例:指定交换机下的RDS PostgreSQL实例通过配置的公网IP访问公网。

      选择交换机

      在下拉列表中选择RDS PostgreSQL实例的交换机。

      选择弹性公网IP地址

      选择用来提供公网访问的公网IP。本文以选择使用单个IP为例,在下拉列表中选择已绑定的EIP。

      创建成功后,在SNAT条目列表处查看已配置的SNAT条目。已配置的SNAT

开通公网的目标数据库配置

开通公网的目标数据库需要配置白名单,允许公网NAT网关绑定的EIP访问。

RDS PostgreSQL配置

  1. 连接RDS PostgreSQL实例。具体操作,请参见连接PostgreSQL实例

  2. 创建插件。

    说明

    本文以开通公网的目标数据库MySQL为例,创建mysql_fdw插件。

    CREATE EXTENSION mysql_fdw;
  3. 创建开通公网的目标数据库服务器定义。

    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'
    );
  4. 创建用户映射,将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!'
    );
  5. 创建外表。

    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'
    );
  6. 连接测试。

    完成上述配置后,即可在RDS PostgreSQL实例中访问公网数据库中的表。

    以创建名为mysql_fdw_test的外表为例,在RDS PostgreSQL中,直接查询外表,即可获取开通公网的目标数据库的数据。

    SELECT * FROM mysql_fdw_test;