OSSデータカタログAmundsenにRedshiftメタデータをロードしてみた

2021.09.12

どーもsutoです。

登録したデータに対し、「Google検索」のようにデータの検索ができるLyft社製のOSSデータカタログAmundsenというデータ検出およびメタデータエンジンがあります。

今回はEC2上にセットアップしたAmundsenに、Redshift内のテーブルメタデータを読み込んでみました。

AmundsenをEC2にセットアップ

本記事ではAmazon Linux2にAmundsenをセットアップしていきます。

以下の参考記事ではローカルPC(Mac)の手順やUbuntu on EC2でAthenaテーブルを読み込む手順がありますので参考に。

まずはEC2インスタンスを作成します。作成するインスタンスは主に以下のようなパラメータで作成しました。

  • インスタンスタイプ: t3.medium
  • EBS ボリューム: 20GB
  • パブリックIP:有効化
  • セキュリティグループ(SG):5000番を許可
  • IAMロール:AmazonSSMManagedInstanceCoreがアタッチされていること(セッションマネージャでインスタンスにログインして作業するため)

今回のRedshiftは既存で作成されている検証用のものを使用しており、パブリックアクセスが有効となっています。データは以下の開発者ガイドのチュートリアルにあるサンプルデータ(tikitdb)をロードしている状態です。

また、アクセスするRedshiftのSGには上記インスタンスのパブリックIPを許可しています。

インスタンスが起動完了したらセッションマネージャでログインします。

sh-4.2$ sudo su - ec2-user
Last login: Fri Sep 10 01:02:29 UTC 2021 on pts/0
[ec2-user@ip-x-x-x-x ~]$

まずはAmundsenの要件で必要なパッケージをインストールしていきます。

sudo yum -y update
sudo yum install git
sudo yum install python3
echo 'alias python=python3.7' >> ~/.bashrc
source ~/.bashrc
python -V 
# Version3.7になることを確認
curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
sudo yum install --enablerepo=nodesource nodejs
node -v 
# Version12になることを確認

次にDocker-composeをインストールします。

sudo amazon-linux-extras install -y docker
sudo systemctl enable docker
sudo systemctl start  docker
sudo usermod -a -G docker ec2-user
sudo curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo gpasswd -a $USER docker
docker-compose --version
# バージョンが表示されることを確認

ここでインスタンスを再起動を行い、Docker-composeをインストール完了です。

再びログイン後、Elasticsearchのメモリ上限を上げておきます。

sudo vi /etc/sysctl.conf
# vm.max_map_count=262144に変更して保存
sudo sysctl -p
/sbin/sysctl -a
# 変更されていることを確認

git cloneでAmundsenをインストールしてビルド、起動します。

git clone --recursive https://github.com/amundsen-io/amundsen.git
cd amundsen
docker-compose -f docker-amundsen.yml up -d
# docker-compose -f docker-amundsen.yml logs -f    (ログ記録)

これで初期設定は完了です。ブラウザでhttp://<EC2のパブリックIP>:5000にアクセスしAmundsenのWeb画面が表示されることを確認しておきます。

Redshiftスキーマの読み込み

仮想環境を立ち上げ、RedshiftデータロードのPythonスクリプト実行に必要なモジュールをインストールします。その後setup.pyを実行します。

※psycopg2が足りなかったので、手動でインストールしています。(またはrequirements.txtに含めてもOKです)

cd ~/amundsen/databuilder
python3 -m venv venv
source venv/bin/activate
# (venv) $ (ここからvenv環境下で実行します)
pip3 install --upgrade pip
pip3 install -r requirements.txt
pip install psycopg2
python3 setup.py install

次にsample_postgres_loader.pyを以下のように編集します。(このスクリプトはPostgreSQLのデータベースを読み込むものなので、RDS、Redshift、ローカルサーバなどPostgreであればどれでも使用可能です)

vi example/scripts/sample_postgres_loader.py
import logging
   # ~~省略~~
   
# todo: connection string needs to change
def connection_string():
    user = '<Redshiftのユーザ名>'
    password = '<RedshiftユーザのPassword>'
    host = '<Redshiftのエンドポイント>'
    port = '5439'
    db = '<データベース名>'
    return "postgresql://%s:%s@%s:%s/%s" % (user, password, host, port, db)


def run_postgres_job():
    where_clause_suffix = textwrap.dedent("""
        schemaname = '<取り込むスキーマ名>'
    """)
    
   # ~~省略~~
   
    job_config = ConfigFactory.from_dict({
        f'extractor.postgres_metadata.{PostgresMetadataExtractor.DATABASE_KEY}': 'redshift',    # source名をredshiftに変更するためにこちらの行を追記しました(デフォルト名は'postgres'のため)
        f'extractor.postgres_metadata.{PostgresMetadataExtractor.WHERE_CLAUSE_SUFFIX_KEY}': where_clause_suffix,
   
   # ~~省略~~
    
    job_es_table.launch()

スクリプトを実行し、完了後にAmundsenの画面を確認してみます。

python3 example/scripts/sample_postgres_loader.py

テーブル名「users」で検索してSource名が「Redshift」のテーブルが表示されることが確認できました。その他にスキーマ名、列名で検索することもできます。

しかし、文字列の部分一致では検索結果に引っかかりませんでした(例えば”user”で検索してもusersテーブルは表示されませんでした)ので、その辺は注意が必要です。