パパエンジニアのアウトプット帳

30歳に突入した1児のパパエンジニアのブログ

VPCピアリング越しのAurora(PostgreSQL)にRedshiftのFederated Queryで接続する

お仕事でRedshiftのFederated Queryを試してみたのでそのメモ。
ネットで見つかるやつは大体パブリックなネットワークとか同じVPC内のやつなので、仕事の環境のようにVPCが分かれている環境の場合に繋ぐのに苦労した。


やることはほぼ参考記事と同じだけど、拡張されたVPCのルーティングを有効にするのがポイント


  1. Secrets ManagerにAuroraの接続情報を保存
  2. Secrets Managerを利用できるIAMロールを作成
  3. Redshiftクラスターの作成
    "クラスターのアクセス許可 (オプション)"で上記で作成したIAMロールを追加
    "ネットワークとセキュリティ"の"拡張されたVPCのルーティング"を有効にする(重要)
  4. External SCHEMAの作成
CREATE EXTERNAL SCHEMA IF NOT EXISTS apg
FROM POSTGRES
DATABASE '接続するデータベース名'
URI 'Auroraのエンドポイント' PORT 5432
IAM_ROLE '2.のIAMロールのARN'
SECRET_ARN '1.のSecrets ManagerのARN';


※ 拡張されたVPCのルーティングを有効にするとRedshiftのコンソールのクエリエディターが利用できなくなるので、別途EC2など立ててpsqlコマンでredshiftに接続します


これでFederated Queryのセットアップが完了したので、RedshiftからSQLでAuroraにアクセスできるようになりました。

(参考)
PostgreSQL への横串検索を使用した開始方法 - Amazon Redshift

[新機能] Amazon Redshift Federated QueryがGAになったので試してみました | DevelopersIO

遭遇したエラー

timeout expired

これは色々な原因が考えられるので特定が難しいです...
今回の場合は、拡張されたVPCのルーティングを有効にするにしないとSQLを実行してもこのエラーになりました。
同じ手順で拡張されたVPCのルーティングを有効にするにしている場合は、ネットワーク設定の不備が有力なのでセキュリティグループの設定などをしっかりと見直しましょう。

ERROR:
  -----------------------------------------------
  error:  timeout expired

  code:      25000
  context:
  query:     0
  location:  pgclient.cpp:473
  process:   padbmaster [pid=13916]
  -----------------------------------------------

ちゃんとDB名指定しているのにdoes not existになる

これも少しハマったのですが、DB名にMyAppDevみたいな大文字小文字が混ざったDB名にしていると何故か全て小文字の"myappdev"でアクセスしようとするのでmy_app_devみたいなDB名にしましょう。
何か回避する方法がありそうですがまだ分かっていません...

(追記)
サポートで教えてもらったのですがSET downcase_delimited_identifier TO OFF; すると大文字小文字混じりのDB名でもいけるようになりました!

ERROR:
  -----------------------------------------------
  error:  FATAL:  database "myappdev" does not exist

  code:      25000
  context:
  query:     0
  location:  pgclient.cpp:473
  process:   padbmaster [pid=14497]
  -----------------------------------------------