AuroraからRedshiftデータを参照する方法

#はじめに
Aurora(PostgreSQL)からRedshiftのデータを参照する方法を整理。

#データ連携方法
①dblinkのみで連携
②postgres_fdwのみで連携
③postgres_fdwとdblinkで連携
※postgres_fdwとdblinkの違いは参考URLの記事を参照。

#環境
【Redshift】
インスタンス：dc2.large × 1ノード
※Redshiftのバージョンは2021/4/10時点での最新バージョンを使用
【Aurora】
PostgreSQL12.4

Redshiftにテーブル「tbl_red1」を作成し、当該テーブルをAuroraから参照。

#①dblinkのみで連携
###事前準備

```SQL
dba=> #拡張モジュールをインストール
dba=> create extension dblink;
CREATE EXTENSION
dba=> \dx
                                 List of installed extensions
  Name   | Version |   Schema   |                         Description
---------+---------+------------+--------------------------------------------------------------
 dblink  | 1.2     | public     | connect to other PostgreSQL databases from within a database
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language

```

###データ取得
```SQL
dba=> SELECT * FROM dblink('host=xxxx port=5439 dbname=dbr user=reduser1 password=xxxx',$REDSHIFT$SELECT col1, col2 FROM public.tbl_red1$REDSHIFT$) AS t1 (col1 varchar, col2 varchar);
 col1 | col2
------+------
 111  | AAA
 222  | BBB
(2 rows)
```
※dblink_connectを使った実行も可能。（下記参照）
[PostgreSQLガイドdblink](https://www.postgresql.jp/document/12/html/contrib-dblink-function.html)
[PostgreSQLガイドdblink_connect](https://www.postgresql.jp/document/12/html/contrib-dblink-connect.html)

#②postgres_fdwのみで連携
###事前準備
```SQL
dba=> #拡張モジュールをインストール
dba=> create extension postgres_fdw;
CREATE EXTENSION
dba=> \dx
                                    List of installed extensions
     Name     | Version |   Schema   |                         Description
--------------+---------+------------+--------------------------------------------------------------
 plpgsql      | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgres_fdw | 1.0     | public     | foreign-data wrapper for remote PostgreSQL servers

dba=> #外部サーバ情報を作成
dba=> CREATE SERVER srv_redshift FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'xxxx', port '5439', dbname 'dbr', sslmode 'require');
CREATE SERVER
dba=> \des
            List of foreign servers
     Name     |  Owner   | Foreign-data wrapper
--------------+----------+----------------------
 srv_redshift | auruser1 | postgres_fdw

dba=> #ユーザマッピング情報を作成
dba=> CREATE USER MAPPING FOR auruser1 SERVER srv_redshift OPTIONS (user 'reduser1', password 'xxxx');
CREATE USER MAPPING
dba=> \deu
  List of user mappings
    Server    | User name
--------------+-----------
 srv_redshift | auruser1
```
###データ取得
```SQL
dba=> CREATE FOREIGN TABLE tbl_red1 (col1 char(3),col2 varchar(3)) SERVER srv_redshift;
CREATE FOREIGN TABLE
dba=> select * from tbl_red1;
 col1 | col2
------+------
 111  | AAA
 222  | BBB
(2 rows)
```

#③postgres_fdwとdblinkで連携
###事前準備
上記①と②の事前準備を実施

###データ取得
```SQL
dba=> SELECT * FROM dblink('srv_redshift',$REDSHIFT$SELECT col1, col2 FROM public.tbl_red1$REDSHIFT$) AS t1 (col1 varchar, col2 varchar);
 col1 | col2
------+------
 111  | AAA
 222  | BBB
(2 rows)
```

#参考URL
[RedshiftとAurora(PostgreSQL)でdblinkを貼る方法](https://goodbyegangster.hatenablog.com/entry/2018/08/08/013545)
[外部データとの連携 ～FDWで様々なデータソースとつなぐ～](https://lets.postgresql.jp/documents/technical/fdw)
[PostgreSQL dblink & postgres_fdw](https://www.se-from30.com/aws/postgresql-dblink-postgres_fdw/#:~:text=%E3%81%A9%E3%81%A1%E3%82%89%E3%82%82%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E9%96%93%E3%81%AE,%E9%80%9A%E4%BF%A1%E3%82%92%E8%A1%8C%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)
[PostgreSQL9.3 新機能を検証してみた Vol.2](https://www.ashisuto.co.jp/corporate/column/technical-column/detail/1198469_2274.html)