このトピックでは、PostgreSQL の外部データラッパー (FDW) 拡張機能を使用して、ApsaraDB RDS for PostgreSQL インスタンスからインターネット経由で外部データベースにアクセスする方法について説明します。
背景情報
ApsaraDB RDS for PostgreSQL インスタンスは、FDW 機能を使用して、MySQL、SQL Server、PostgreSQL、Redis などの他の種類の外部データベースにアクセスできます。RDS for PostgreSQL インスタンスは Virtual Private Cloud (VPC) にデプロイされているため、インターネット経由でデータベースサービスにアクセスするには、インターネット NAT ゲートウェイを設定し、Elastic IP Address (EIP) を関連付ける必要があります。
このトピックでは、インターネット NAT ゲートウェイと EIP を設定して、RDS for PostgreSQL インスタンスがインターネットにアクセスできるようにする方法を説明します。ソースネットワークアドレス変換 (SNAT) エントリを設定することで、RDS for PostgreSQL インスタンスがインターネットにアクセスできるようになります。この方法では、インスタンスのネットワークセキュリティも確保されます。外部ネットワークは、NAT Gateway を介してインスタンスにアクセスすることはできません。
NAT Gateway と SNAT の詳細については、「インターネット NAT ゲートウェイの SNAT 機能を使用したインターネットアクセス」をご参照ください。
前提条件
ターゲットデータベースが利用可能で、インターネット経由でアクセスできること。例:パブリック IP アドレスを持つ MySQL、SQL Server、PostgreSQL、または Redis データベース。
RDS for PostgreSQL インスタンスが作成されていること。詳細については、「RDS for PostgreSQL インスタンスのクイック作成」をご参照ください。
重要RDS for PostgreSQL インスタンスがインターネット経由でターゲットデータベースにアクセスするには、特定の拡張機能が必要です。ご利用の RDS for PostgreSQL インスタンスが必要な拡張機能をサポートしていることを確認してください。さまざまな RDS for PostgreSQL バージョンでサポートされている拡張機能の詳細については、「RDS for PostgreSQL でサポートされている拡張機能のリスト」をご参照ください。
MySQL: mysql_fdw
SQL Server: tds_fdw
PostgreSQL: postgres_fdw
Redis: redis_fdw
ターゲットデータベースと RDS for PostgreSQL インスタンスの両方のアカウントが作成されていること。
ターゲットデータベースのアカウントを作成するには、データベースエンジンの公式ドキュメントをご参照ください。
RDS for PostgreSQL インスタンスのアカウントを作成するには、「アカウントの作成」をご参照ください。
データを含むデータベースがターゲットデータベースに作成されていること。
操作手順
インターネット NAT ゲートウェイの設定
NAT Gateway を作成します。
NAT Gateway コンソールにログインします。
[インターネット NAT ゲートウェイ] ページで、[インターネット NAT ゲートウェイの作成] をクリックします。
(任意) 初めて NAT Gateway を使用する場合は、[インターネット NAT ゲートウェイ] ページの [サービスにリンクされたロールの作成] セクションで、[サービスにリンクされたロールの作成] をクリックします。ロールが作成された後、NAT Gateway を作成できます。
[インターネット NAT ゲートウェイの作成] ページで、次のパラメーターを設定し、[今すぐ購入] をクリックします。
説明次の表には、主要なパラメーターのみが記載されています。すべてのパラメーターの詳細については、「インターネット NAT ゲートウェイの SNAT 機能を使用したインターネットアクセス」をご参照ください。
構成
説明
リージョン
インターネット NAT ゲートウェイを作成するリージョンを選択します。リージョンは、RDS for PostgreSQL インスタンスのリージョンと同じである必要があります。
[ネットワークとゾーン]
インターネット NAT ゲートウェイインスタンスの VPC と vSwitch を選択します。これらは、RDS for PostgreSQL インスタンスの VPC と vSwitch と同じである必要があります。
RDS コンソールの [データベース接続] ページに移動して、ターゲット RDS for PostgreSQL インスタンスの VPC を表示できます。
ネットワークタイプ
このトピックでは、[インターネット NAT ゲートウェイ] が選択されています。
EIP
このトピックでは、[後で設定] が選択されています。
[確認] ページで、インターネット NAT ゲートウェイの構成を確認し、[今すぐ有効化] をクリックします。
インスタンスを作成した後、[インターネット NAT ゲートウェイ] ページで表示できます。

EIP をインターネット NAT ゲートウェイに関連付けます。
NAT Gateway コンソールで、作成したインターネット NAT ゲートウェイインスタンスを見つけ、そのインスタンス ID をクリックして [基本情報] ページに移動します。
[関連付けられた EIP] タブで、[EIP の関連付け] をクリックします。
[関連付けEIP] ダイアログボックスで、[EIP を購入して関連付ける] を選択します。

[OK] をクリックします。
EIP が関連付けられると、[関連付けられた EIP] セクションに表示されます。

SNAT エントリを作成します。
NAT Gateway コンソールで、作成したインターネット NAT ゲートウェイインスタンスを見つけ、そのインスタンス ID をクリックして [基本情報] ページに移動します。
[SNAT] タブで、[SNAT エントリの作成] をクリックします。
[SNAT エントリの作成] ページで、次のパラメーターを設定し、[OK] をクリックします。
構成
説明
SNAT エントリ
SNAT エントリの粒度を選択します。このトピックでは、例として [VSwitch 粒度] を使用します。これにより、vSwitch 内の RDS for PostgreSQL インスタンスが、設定されたパブリック IP アドレスを使用してインターネットにアクセスすることが指定されます。
VSwitch の選択
ドロップダウンリストから、RDS for PostgreSQL インスタンスの vSwitch を選択します。
[EIP の選択]
インターネットアクセスを提供するパブリック IP アドレスを選択します。このトピックでは、単一の IP アドレスを例として使用します。ドロップダウンリストから、関連付けられた EIP を選択します。
エントリが作成された後、[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 <EIP_associated_with_the_Internet_NAT_gateway> -p tcp --dport <Redis_port_number> -j ACCEPT
RDS for PostgreSQL インスタンスの設定
RDS for PostgreSQL インスタンスに接続します。詳細については、「PostgreSQL インスタンスへの接続」をご参照ください。
拡張機能を作成します。
説明このトピックでは、インターネット経由でアクセス可能な MySQL データベースを例として使用します。この例では、mysql_fdw 拡張機能が作成されます。
CREATE EXTENSION mysql_fdw;ターゲットデータベースのサーバー定義を作成します。
CREATE SERVER <server_name> FOREIGN DATA WRAPPER mysql_fdw OPTIONS ( host '<public_IP_of_the_target_database>', port '<port_of_the_target_database>' );次の例は、インターネット経由でアクセス可能な MySQL サービス用のコマンドを示しています:
CREATE SERVER mysql_server80 FOREIGN DATA WRAPPER mysql_fdw OPTIONS ( host 'XX.XX.XX.XX', port '3306' );ユーザーマッピングを作成します。これにより、MySQL サーバー定義が RDS for PostgreSQL インスタンスのユーザーにマッピングされます。これにより、RDS for PostgreSQL インスタンスのユーザーがターゲットの MySQL データベースのデータにアクセスできるようになります。
CREATE USER MAPPING FOR <RDS_for_PostgreSQL_username> SERVER <created_server_name> OPTIONS ( username '<username_for_the_target_database>', password '<password_for_the_target_database>' );コマンドの例を次に示します:
CREATE USER MAPPING FOR pg_client SERVER mysql_server80 OPTIONS ( username 'testuser', password 'U123456!' );外部テーブルを作成します。
CREATE FOREIGN TABLE <foreign_table_name> ( id int, name varchar(10) ) SERVER <created_server_name> OPTIONS ( dbname '<database_name_of_the_target_database>', table_name '<table_name_of_the_target_database>' );コマンドの例を次に示します:
CREATE FOREIGN TABLE mysql_fdw_test ( id int, name varchar(10) ) SERVER mysql_server80 OPTIONS ( dbname 'testdb', table_name 'test' );接続をテストします。
これらの設定が完了すると、ご利用の RDS for PostgreSQL インスタンスから外部データベースのテーブルにアクセスできます。
たとえば、
mysql_fdw_testという名前の外部テーブルを作成した場合、RDS for PostgreSQL インスタンスで外部テーブルを直接クエリして、ターゲットデータベースからデータを取得できます。SELECT * FROM mysql_fdw_test;