AWS Redshift Federated QueryでRedshiftにアクセスしてみる

AWS RedshiftのFederated QueryはRedshiftからRDSやAuroraのPostgreSQLテーブルにアクセスできる機能です。

PostgreSQLにアクセスできるのであれば、似たインターフェースであるRedshiftにもアクセスできるんじゃないかと期待して試しました。Redshift同士のアクセスです。

結論

できない。(2020/12/02現在)

ドキュメントにもRDS PostgreSQLやAurora PostgreSQLにアクセスする方法が書かれていますが、Redshift同士ができるとは書かれていません。

試すと次のようなエラーメッセージが出ました。

3 is outside the valid range for parameter "extra_float_digits" (-15 .. 2)

検証内容

せっかく試したので、作業ログを残しておきます。クラスタBからクラスタAにアクセスしようとしています。

Redshift同士ではなく、PostgreSQLへのFederated Queryであれば、同等の手順で成功します。

  1. Redshiftクラスタを2つ構築(AとB)。BからAに通信できるようにサブネットやセキュリティグループを適切に設定。
  2. クラスタAの接続パスワードをAWS Secret Managerに保存。
  3. AWS Secret ManagerにアクセスできるIAM Roleを作成。IAM Roleの内容は以下参照。
  4. クラスタBに3で作成のIAM Roleをアタッチ。
  5. クラスタAに適当なテーブルを作成。
  6. クラスタBに外部スキーマを作成。作成のSQLコマンドは以下参照。
  7. クラスタBでSELECTを実行してみる。

手順3で作成のIAM Roleは以下のような内容です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AccessSecret",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:SECRETNAME"
            ]
        }
    ]
}

手順6で外部スキーマを作成するSQLコマンドは以下の内容です。

  • DATABASE 'dev' SCHEMA 'public' の部分はクラスタAでの名前
  • URIクラスタAのエンドポイント
  • IAM_ROLE は手順3で作成したIAM RoleのArn
  • SECRET_ARN はパスワードを保存した Secret Manager のArn
CREATE EXTERNAL SCHEMA fedtest FROM POSTGRES
DATABASE 'dev' SCHEMA 'public'
URI 'AAA.xxxxxxxxxxxx.ap-northeast-1.redshift.amazonaws.com'
PORT 5439
IAM_ROLE 'arn:aws:iam::123456789012:role/ROLENAME'
SECRET_ARN 'arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:SECRETNAME';

以下の通り、エラーになります。

dev=# select * from fedtest.sample1;
ERROR:  
  -----------------------------------------------
  error:  3 is outside the valid range for parameter "extra_float_digits" (-15 .. 2)
  code:      25000
  context:   
  query:     0
  location:  pgclient.cpp:666
  process:   padbmaster [pid=15336]
  -----------------------------------------------

残念。