RedshiftとQuickSightの間にあるちょっとした隙間を埋めるツール 『redshift-data-set-annotator』

この記事はAWS Analytics Advent Calendar 2022の13日目です。
こんにちは、SREチーム所属の@mashiikeです。

皆様 Amazon RedshiftとAmazon QuickSightを使ってますでしょうか?
こちらの記事はこの2つのサービスの間に存在しているちょっとした隙間に関しての記事になります。
それは、カラムコメントとデータセットのフィールド名にまつわる話になります。

メタデータ と QuickSightのデータセット

皆様、Amazon Redshift上にデータマートをたくさん作っていると思いますが、そのデータマートのメタデータをどうやって管理していますか?
最近のデータカタログ製品は非常に便利で、そういった製品を使って管理しているという方もいると思います。

筆者は実はデータカタログ製品に疎く、今まで『えっ? 必要ならDWHのテーブルコメントとカラムコメントにデータを入れていけばよくね?』という感じでいました。

例えば Tonamelという大会プラットフォームサービスのデータ基盤では以下のようなクエリを発行すると

with comments as (
    select 
        colcom.objsubid as index
        ,schemaname
        ,relname as tablename 
        ,attname as columnname 
        ,trim('\n' from description) as comment
    from pg_stat_user_tables, pg_attribute 
    left join pg_description colcom ON pg_attribute.attnum = colcom.objsubid and pg_attribute.attrelid = colcom.objoid
    where pg_attribute.attrelid = pg_stat_user_tables.relid
)
select 
    *
from comments
where schemaname = '<schema_name>'
    and tablename = '<table_name>'
order by 1,2,3,4

このように、カラムコメントが手に入ります。SQLを使える人はカラムコメントを見れば、なんとなくどういう情報が入っているのかがわかります。
これらのカラムコメントはdbtというツールを使って、コード管理されているのでETLなどでカラムの情報をエンジニアが知りたい場合は実質コードを見ればわかります。

では、このテーブルをQuickSightのデータセットとして取り込むとどうなるでしょう?

こうなります。カラム名はRedshiftでクエリを書きやすいように、アルファベットとアンダースコアのみで書くようにしていますので、パット見よくわからないフィールドがたくさん並びます。 QuickSightのデータセットはRedshiftのテーブルのカラムコメントを参照して、いい感じにフィールド名を入れてくれるみたいなことは当然ないです。 Tonamelチームの場合、QuickSightを使う人は日本人がほとんどなので、これはユーザーフレンドリーではありません。

ですので、今までは 手作業で、繰り返し、無の境地で、フィールド名を変更し説明を埋めていきました。 ここにRedshiftとQuickSightの間でちょっとした隙間があるようなのです。

発端として

先日、約150も列を持つワイドテーブルなデータマートが生まれました。 このテーブルを見て、私は思ってしまいました。

えっ、コレ手作業でフィールド名変更していくの?
あれ?これって・・・もしかして トイル?

cloud.google.com

「トイルとは、手作業、繰り返される、自動化が可能、戦術的、長期的な価値がない、サービスの成長に比例して増加する、といった特徴を持つ作業です。」 トイルの例としては次のようなものがあります。

・割り当てリクエストの処理
・データベース スキーマ変更の適用
・重要性の低いモニタリング アラートの確認
・プレイブックからのコマンドのコピーと貼り付け

ここに挙げたすべての例に共通する特徴は、エンジニアが頭で判断する必要がないということです。

頭で判断する必要なく、機械的にただただ、テーブルのカラムコメントを元に、QuickSightのデータセットのフィールド名を変更していくこの作業。。。まさしくトイルです。
データエンジニア かつ SREである自分としては、コレはそのままにしてはおけません。

そこで作ったのが redshift-data-set-annotator です。

github.com

redshift-data-set-annotator

このツールがやることは非常にシンプルです。

QuickSightのデータセットの情報を取得し、Redshiftがデータソースならば、そのテーブルのカラムコメントを取得し、フィールド名や説明を埋める

現状ではカラムコメントの1行目を論理名として、データセットのフィールド名に指定する。
2行目以降を説明としてデータセットのフィールドの説明に設定する。

この2つに事を行います。

では、実際に動かしてみましょう。

$ redshift-data-set-annotator version
redshift-data-set-annotator v0.0.1
$ redshift-data-set-annotator configure                                                            
default profile is serverless?: (yes/no) [no]: no
Enter cluster identifier : warehouse
Enter db user: admin
2022/12/09 18:40:27 [info] Saved configuration file: /Users/ikeda-masashi/.config/redshift-data-set-annotator/config.json
$ redshift-data-set-annotator annotate --data-set-id <data-set-id> --dry-run
2022/12/09 18:42:39 [info] ************* start dry run ****************
2022/12/09 18:42:41 [info] rename field `organization_uid` to `主催団体ID`
2022/12/09 18:42:41 [info] Update 主催団体ID (`organization_uid`) field description
2022/12/09 18:42:41 [info] rename field `competition_uid` to `大会ID`
2022/12/09 18:42:41 [info] Update 大会ID (`competition_uid`) field description
2022/12/09 18:42:41 [info] rename field `payment_uid` to `支払いのID (PK)`
2022/12/09 18:42:41 [info] Update 支払いのID (PK) (`payment_uid`) field description
2022/12/09 18:42:41 [info] rename field `payment_status` to `[支払い] 状態`
2022/12/09 18:42:41 [info] Update [支払い] 状態 (`payment_status`) field description
... 中略 ...
2022/12/09 18:42:41 [info] rename field `competition_page_view_count` to `[大会] ページビュー数`
2022/12/09 18:42:41 [info] rename field `comeptition_first_access_at` to `[大会] 最初のアクセス時刻`
2022/12/09 18:42:41 [info] rename field `comeptition_last_access_at` to `[大会] 最後のアクセス時刻`
2022/12/09 18:42:41 [info] *************  end dry run  ****************
$ redshift-data-set-annotator annotate --data-set-id <data-set-id>

このツールは、4日ほど前に生まれたばかりのまだ未熟なツールですが、やりたかったことは実現できているようです。

このツールによって私のトイルは、また一つ減ったのでした。
redshift-data-set-annotator の今後の展望ですが以下のようなことを考えています。

  • カラムコメントのフォーマットとしてTOML形式を取り扱えるようにして、構造的なメタデータを管理できるようにしたい。
  • 論理的なカラムのグループ情報を取り扱い、データセットのフォルダ構造を設定できるようにしたい。
  • カラムレベルパーミッションをカラムコメントに基づいて設定できるようにしたい。

ゆっくりと日々の業務で使いつつ育てていこうかと思います。

おわりに

今回は、今まで手作業で修正していた QuickSightのフィールド名と説明をRedshift上にあるTableのカラムコメントに基づいて埋めるツールの話をしました。
だいぶニッチな用途であるということは承知しておりますが、同様にお困りの方は使ってみてください。
機能要望も受け付けております。日本語で。

カヤックでは、隙間を埋めるツールに興味があるエンジニアも募集しています。

hubspot.kayac.com