全部產品
Search
文件中心

ApsaraDB RDS:RDS PostgreSQL通過公網訪問外部資料庫

更新時間:Jun 19, 2024

本文介紹如何使用PostgreSQL的fdw外掛程式,使RDS PostgreSQL執行個體支援訪問外部開通公網的資料庫。

背景資訊

RDS PostgreSQL支援通過fdw功能訪問外部其他類型資料庫,如MySQL、SQL Server、PostgreSQL及Redis等,由於RDS PostgreSQL基於使用者VPC的網路構建,如需訪問公網上的資料庫服務,還需配置公網NAT Gateway並綁定Elastic IP Address(EIP)。

本文通過配置公網NAT Gateway並綁定Elastic IP Address(EIP)的方式,為RDS PostgreSQL賦予訪問公網的能力,同時,確保RDS PostgreSQL執行個體的網路安全(配置SNAT,RDS PostgreSQL可以訪問互連網,但不通過NAT Gateway對互連網提供服務,外網無法通過NAT Gateway訪問RDS PostgreSQL執行個體)。

NAT Gateway、SNAT相關資訊,請參見使用公網NAT GatewaySNAT功能訪問互連網

前提條件

  • 已具備開通公網的目標資料庫,例如:開通公網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 Gateway配置

  1. 建立NAT Gateway。

    1. 登入NAT Gateway管理主控台

    2. 公網NAT Gateway頁面,單擊建立NAT Gateway

    3. (可選)首次使用NAT Gateway時,在公網NAT Gateway頁面關聯角色建立地區,單擊建立關聯角色,建立服務關聯角色。角色建立成功後即可建立NAT Gateway。

    4. 在建立公網NAT Gateway頁面,配置以下購買資訊,然後單擊立即購買

      說明

      下表僅列出關鍵參數,所有參數的具體資訊,請參見使用公網NAT GatewaySNAT功能訪問互連網

      配置

      說明

      所屬地區

      選擇需要建立公網NAT Gateway的地區,需要與RDS PostgreSQL執行個體同一地區。

      所屬專用網路

      選擇公網NAT Gateway執行個體所屬的VPC,需要與RDS PostgreSQL執行個體的VPC相同。您可以前往RDS管理主控台的資料庫連接頁面,查看目標執行個體的VPC。

      關聯交換器

      選擇公網NAT Gateway執行個體所屬的交換器,需要與RDS PostgreSQL執行個體的交換器相同。您可以前往RDS管理主控台的資料庫連接頁面,查看目標執行個體的交換器。

      訪問模式

      本文選擇稍後配置

    5. 確認訂單頁面確認公網NAT Gateway的配置資訊,選中服務合約並單擊確認訂單

      建立成功後,您可以在公網NAT Gateway頁面查看已建立的公網NAT Gateway執行個體。建立NAT Gateway

  2. 為公網NAT Gateway綁定公網IP(EIP)。

    1. NAT Gateway管理主控台頁面,找到建立的公網NAT Gateway執行個體,單擊執行個體ID,進入基本資料頁。

    2. 切換至綁定的Elastic IP Address頁簽,單擊綁定Elastic IP Address

    3. 綁定Elastic IP Address彈窗中,選擇新購Elastic IP Address並綁定綁定Elastic IP Address

    4. 單擊確定

      綁定成功後,在綁定的Elastic IP Address處查看已綁定的Elastic IP Address。已綁定的Elastic IP Address

  3. 建立SNAT條目。

    1. NAT Gateway管理主控台頁面,找到建立的公網NAT Gateway執行個體,單擊執行個體ID,進入基本資料頁。

    2. 切換至SNAT管理頁簽,單擊建立SNAT條目

    3. 建立SNAT條目頁面,配置以下參數,然後單擊確定建立

      配置

      說明

      SNAT條目粒度

      選擇SNAT條目的粒度。本文以選擇交換器粒度為例:指定交換器下的RDS PostgreSQL執行個體通過配置的公網IP訪問公網。

      選擇交換器

      在下拉式清單中選擇RDS PostgreSQL執行個體的交換器。

      選擇Elastic IP Address地址

      選擇用來提供公網訪問的公網IP。本文以選擇使用單個IP為例,在下拉式清單中選擇已綁定的EIP。

      建立成功後,在SNAT條目列表處查看已配置的SNAT條目。已配置的SNAT

開通公網的目標資料庫配置

開通公網的目標資料庫需要配置白名單,允許公網NAT Gateway綁定的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;