[Redshift] DataAPIを使ってpsqlっぽくSQL実行するコマンドを作ってみた。

Redshift Data APIを使用して、psqlライクにSQLクエリを実行するコマンド
2021.02.12

Redshiftテーブルから簡単な情報を取得したい場合など 手元のコマンドラインからサクッと取得できたら便利です。 しかし、Redshiftの場合、踏み台などを経由しないとアクセスできないところにあることが多く、 VPNの設定や踏み台サーバ内での作業が必要だったりで、意外と面倒です。

まさにそういった課題を解決する機能としてDataAPIがあります。 ただ、DataAPIは非同期にクエリを投げるため、 結果の取得が面倒だったりなど、使い慣れていないと"サクッと"ではなくなってしまいます。 ということで、psqlでクエリを実行するのと同じ感じで実行できるコマンドを作ってみました。

なおスクリプトのDataAPIを使用する部分は、 以前Lambdaで実行した際の記事でご紹介したコードとほぼ同一です。 DataAPIについての概要などについても下記の記事を参考にして頂ければと思います。

サブネットもセキュリティグループも考慮不要!Lambda関数からData API for Redshiftでクエリ実行してみた。

ツール

配布場所

https://github.com/cm-hirano-shigetoshi/redshift-dataapi-synchronously

インストール

redshiftというファイルを保存して(単一ファイルなので、わざわざcloneしなくても十分)、 chmod +x redshiftで実行権限をつけたら、 必要に応じてPATHが通っているディレクトリに配置して下さい。

検証環境

  • Python: 3.9.1
  • boto3: 1.17.2

確認事項

boto3からDataAPIを使用するため、それなりに新しいboto3である必要があります。 必要に応じて最新のものに更新して下さい。

また、RedshiftのノードタイプなどによってはDataAPIが使用できない可能性もあるので、 以下のAWS CLIコマンドなどで接続ができるかを確認すると良いと思います。

# DataAPIが使えるかの確認に、テーブル一覧を取得する
aws redshift-data list-tables --cluster-identifier <ClusterName> --database <Data> --db-user <User>

使い方

# ファイル保存されたクエリを実行する場合
redshift -C <ClusterName> -D <Database> -U <User> -f sample01.sql
# クエリを直接与える場合
redshift -C <ClusterName> -D <Database> -U <User> -c 'select * from some_table;'

ClusterNameはクラスタ一覧のここに出ているものです。 (クラスタのエンドポイント等ではないので注意して下さい)

実行例

試しにselect文を実行してみます。 AWSアカウントを指定する必要がありますので、

AWS_PROFILE=hoge_account

のように、コマンドの前に環境変数に目的のAWS CLIプロファイル名を設定します。

$ AWS_PROFILE=hoge_account redshift -C test-cluster-01 -D test -U test_user -c 'select * from public.test_table limit 10;'
Enter MFA code for arn:aws:iam::123456789012:mfa/cm-hirano.shigetoshi:
aaaa    123
bbbb    456

テーブルの中身のデータが取れました! 結果はタブ区切りで取得できます。 なお、カラム名は取得できないので大きいテーブルを見るのはちょっと辛いと思います。

また、データを取得しないクエリの場合は、完了するとQUERY FINSHEDが表示されます。

$ AWS_PROFILE=hoge_account redshift -C test-cluster-01 -D test -U test_user -c 'drop table public.test_table;'
Enter MFA code for arn:aws:iam::123456789012:mfa/cm-hirano.shigetoshi:
QUERY FINSHED

まとめ

RedshiftへのSQL実行を気軽に行うことができるコマンドを作成しました。

DataAPIを使用するので、VPCやサブネットなどを気にする必要がなく、 手元のターミナルから実行できます。 じっくりデータを見るような用途ではなく、さっと実行したい時にお使い下さい。