❄️

【Alation】【Snowflake】Alation-Snowflakeの接続と連携データの制限

2024/05/12に公開

本記事で参考になるケース

  • alationにsnowflakeを連携して、カタログを作りたい
  • alationに取り込まれるデータは制限したい
  • AlationのCustom extraction queriesの例が公式にもなかったため参考が欲しい # 202505現在

記事の概要

  • AlationとSnowflakeへの接続を行う
  • Alationに取り込むデータベース、スキーマ等はある程度制限したい
  • とりあえずメタデータ(データベース,スキーマ,テーブル, カラム情報)だけを連携させる

方法

Alation - Snowflake間の接続準備

参考:Alation公式Snowflakes接続セットアップ

  1. Snowflake内でAlationがメタデータをSnowflakeから読み取る用のユーザを作成

今回はメタデータだけを連携する. したがって公式で示されている権限はほとんど不要

CREATE ROLE <alation_role>;
CREATE WAREHOUSE <warehouse_name>;
CREATE USER <alation_user> PASSWORD='*****' DEFAULT_ROLE = <alation_role> MUST_CHANGE_PASSWORD = TRUE;
GRANT ROLE <alation_role> TO USER <alation_user>;
GRANT USAGE ON WAREHOUSE <warehouse_name> TO ROLE <alation_role>;
GRANT USAGE ON DATABASE <DBNAME> TO ROLE <alation_role>;
GRANT USAGE ON ALL SCHEMAS IN DATABASE <DBNAME> TO ROLE <alation_role>;
GRANT REFERENCES ON ALL TABLES IN DATABASE <BDNAME> TO ROLE <alation_role>;

ここでいうREFERENCESはテーブルの中身を見ることはできないがテーブル構成/カラムなどは閲覧できる権限である

※セキュリティを高めるためにalation_userの接続もとでIP制限をしておこう
しかし、AlationのIPはAlation利用者内で共有であるため、あくまで気休めであることに注意

Alationが利用するIP
を参考にalation_userにNetwork Policyを設定する

CREATE OR REPLACE NETWORK POLICY <alation_nw_policy> ALLOWED_IP_LIST = ('52.195.197.8/29');
ALTER USER <alation_user> set NETWORK_POLICY = <alation_nw_policy>;
  1. Alation用Snowflakeユーザを登録

Alationの
Sources Manage Settings → Database名
から設定をしていこう

詳細はAlation公式より

AlationとSnowflakeとの接続がとれるるところまで確認

さて、ここからさらにAlationが刈り取るメタデータを制限する
Custom extraction queries (optional)を設定する

Alation - Metadata Extraction - Custom extraction queries (optional)

参考クエリを載せていく.

Catalog Query

連携するデータベースを制限したい

SELECT DATABASE_NAME AS CATALOG 
FROM SNOWFLAKE.ACCOUNT_USAGE.DATABASES 
WHERE DELETED IS NULL AND DATABASE_NAME='<detabase名>'

Schema Query

連携するスキーマを制限したい

SELECT CATALOG_NAME AS CATALOG, SCHEMA_NAME AS SCHEMA, COMMENT AS  REMARKS 
FROM SNOWFLAKE.ACCOUNT_USAGE.SCHEMATA 
WHERE DELETED IS NULL 
AND TRIM(SCHEMA_NAME) !='' AND CATALOG_NAME=<DBNAME> AND SCHEMA_NAME=<SCHEMANAME>

Table Query

連携するテーブルを制限したい

SELECT TABLE_CATALOG AS CATALOG, TABLE_SCHEMA AS SCHEMA, TABLE_NAME, 'TABLE' AS TABLE_TYPE, COMMENT AS  REMARKS 
FROM SNOWFLAKE.ACCOUNT_USAGE.TABLES 
WHERE DELETED IS NULL AND TABLE_TYPE = 'BASE TABLE' 
AND TRIM(TABLE_NAME) !='' AND TABLE_CATALOG=<DBNAME> 
AND TABLE_SCHEMA =<TABLENAME>

Column Query

連携するカラムを制限したい

SELECT TABLE_CATALOG AS CATALOG, TABLE_SCHEMA AS SCHEMA, TABLE_NAME, 
DECODE(DATA_TYPE,'TEXT','VARCHAR' || '(' || CHARACTER_MAXIMUM_LENGTH || ')',
'NUMBER',DATA_TYPE || '(' || NUMERIC_PRECISION ||','|| NUMERIC_SCALE || ')', 
DATA_TYPE) AS TYPE_NAME, 
DATA_TYPE, COLUMN_NAME, ORDINAL_POSITION, 
IS_NULLABLE, COMMENT AS REMARKS, COLUMN_DEFAULT 
FROM SNOWFLAKE.ACCOUNT_USAGE.COLUMNS 
WHERE DELETED IS NULL 
AND TRIM(COLUMN_NAME) NOT IN ('','SYS_MV_SOURCE_PARTITION','METADATA$ROW_VERSION') 
AND TRIM(TABLE_NAME) !='' AND CATALOG=<DBNAME>
AND SCHEMA =<SCHEMANAME>
AND COLUMN_NAME !=<COLUMN_NAME>

Function Query

連携する関数を制限したい

SELECT FUNCTION_CATALOG AS CATALOG ,FUNCTION_SCHEMA AS SCHEMA, FUNCTION_NAME, COMMENT AS  REMARKS, '' AS FUNCTION_DEFINITION, ARGUMENT_SIGNATURE, FUNCTION_ID 
FROM SNOWFLAKE.ACCOUNT_USAGE.FUNCTIONS 
WHERE DELETED IS NULL AND CATALOG=<DBNAME>
AND SCHEMA =<SCHEMANAME>
AND FUNCTION_NAME =<FANCNAME>
他、View、TagなどもCustom extraction queriesの利用が可能である. 適宜利用してみるといい感じにできるかも!

(...正直力尽きた)
Alationの接続検証時にSnowflakeのQuery Historyを見ることでどんなクエリがAlationから叩かれているかを確認できますので、そちらをご参考にしてください.

Discussion