Share
Embed
dbt と Snowflake と tag
Cross Data Platforms Meetup #3
2026/08/24 開催
dbt と Snowflake と tag というタイトルで、3種類のタグの違いや使い分けなどについて話しました。
https://cdpm.connpass.com/event/402171/
Kosaku Ono
August 24, 2026
Transcript
30 slides
-
Cross Data Platform Meetup #3 dbt と Snowflake と tag
2026/08/24 株式会社Finatextホールディングス 大野巧作 / @Kevinrobot34 © 2026 Finatext Holdings Ltd. -
アジェンダ 1. イントロダクション 2. dbt tag 3. Snowflake Query tag
4. Snowflake Object tag 5. まとめ 6. Appendix © 2026 Finatext Holdings Ltd. 1 -
イントロダクション 自己紹介 • • • 名前:大野巧作 ◦ 大体けびんと呼ばれています ◦ X
/ GitHub / Zenn / SpeakerDeck などは @Kevinrobot34 ◦ Data Superhero 2026 役職 ◦ VP of Data & AI @ Finatext Holdings Ltd. ◦ Data Engineer / Data Platform Engineer @ Nowcast Inc. 経歴 ◦ 2020年ナウキャスト新卒入社 ▪ POSデータのパイプライン作成・運用、分析 ▪ Snowflake x dbt x Terraform な社内データ基盤構築・運用 ◦ 2025年から VP of Data & AI ▪ グループ全体のデータ・AI活用の促進など © 2026 Finatext Holdings Ltd. 3 -
イントロダクション 3種のタグ dbt-snowflake を使っていると、実は3種類の「タグ」が設定できます。 # dbt_project.yml models: my_project: +tags: ['daily']
+query_tag: 'dbt_prod' +table_tag: "MANAGED_BY='dbt-repo'" 本日は dbt tag / Query Tag / Object Tag のそれぞれの性質や使い分けについて紹介します! どれも重要ですが、特に Snowflake の object tag(table_tag)は 権限管理・コスト管理・オブジェクト管理と、最近できることが増えています。 © 2026 Finatext Holdings Ltd. 4 -
dbt tag dbt tag について • • • dbt tag
は dbt の世界でのタグ # models/lake_hoge.sql ◦ 文字列、もしくは文字列のリストを {{ config( tags として指定するだけ tags=["freq_daily", "layer_lake"], ◦ この tags をつけても Snowflake 側には ) }} 何も影響はない 具体例 ◦ 実行頻度や、レイヤーの情報など select ... dbt のコマンドの selector として利用可能 ◦ “dbt build --select tag:freq_daily” で日次で実行するものだけ選択するなど ◦ 複数指定も可能 ▪ “dbt ls --select tag:tag1,tag:tag2” : カンマは and 条件 ▪ “dbt ls --select tag:tag1 tag:tag2” : 空白は or 条件 © 2026 Finatext Holdings Ltd. 6 -
dbt tag 乱用は危険 • • • dbt tag は非常に便利ですが、 雑に扱うと少し危険です
◦ 表記揺れが増える(daily / freq_daily) ◦ tag の付与漏れ ◦ 消していいタグが分からなくなる ◦ etc ↓ dbt seed や dbt-elementary などを組み合わせれば、 CIで意図しないタグの使い方を検出できる 詳細は右のテックブログで! https://zenn.dev/finatext/articles/snowflake-dbt-tag-validation © 2026 Finatext Holdings Ltd. 7 -
Snowflake Query Tag Snowflake Query Tag について • • •
• • Query Tag は Snowflake における optional なセッションレベルパラメーター Snowflake のクエリに対して、文字列(最大2000字)を紐づけることができる機能 セッションレベルであれば特に追加の権限も必要なく、すぐ利用可能 Snowsight のクエリ詳細の画面や、 ACCOUNT_USAGE.QUERY_HISTORY で参照可能 適切に Query Tag を設定しているとモニタリングがしやすくなるため重要 # Alter クエリのイメージ alter session set query_tag='session_query_tag'; © 2026 Finatext Holdings Ltd. 9 -
Snowflake Query Tag dbt での Query Tag 設定方法 • •
dbt-snowflake では query_tag の設定がサポートされている ◦ セッションレベルでの設定となる ◦ モデルでの設定の場合、該当のモデルの実行の前に alter session が実行される ▪ 詳細は set_query_tag マクロ参照 ◦ set_query_tag マクロを上書きすると、モデル名が入るように設定することも可能。 文字列そのままだと利用しにくいため、 JSON 形式で記入するのが良いです。 ◦ dbt project 名やモデル名などを含めておくと参照しやすくなります。 ◦ どのような監視をしたいかに合わせ、適宜 JSON の形式を決めておくのが重要です。 select try_parse_json(query_tag)['dbt_project']::string as dbt_project_name, count(*) as num_executions, avg(total_elapsed_time/1000) as avg_total_elapsed_time_s from snowflake.account_usage.query_history where start_time > '2026-08-22'::date group by dbt_project_name; © 2026 Finatext Holdings Ltd. 10 -
Snowflake Query Tag dbt での Query Tag 設定方法 • •
直接 query_tag を設定したり、自分で set_query_tag を上書きしても良いです SELECT.dev が出している dbt-query-tags (旧 dbt-snowflake-query-tags) のパッケージを 利用するという手もあります。 ◦ このパッケージの場合は query tag だけではなく、コメントも追加してくれます ◦ ナウキャストではこれらのパッケージを使いつつ、 SELECT.dev も利用して dbt Project ごと・ dbt モデルごとのコストを確認できるような監視体制を構築しています dbt-snowflake-query-tag は deprecated で dbt-query-tag になっているので要注意 © 2026 Finatext Holdings Ltd. https://findy-tools.io/products/select/385/333 11 -
Snowflake Object Tag Snowflake Object Tag について • • •
• • Object Tag は Snowflake においてはスキーマレベルのオブジェクト その名の通り Snowflake の様々なオブジェクトに割り当てることができる ◦ 例:User / Warehouse / DB / Schema / Table / Columns / etc ◦ 以下のような DDL で事前に作成しておく必要がある Key-Value 形式で、タグの値は文字列のみ なぜ重要か? → 様々な「管理」に利用できるから ◦ コスト管理 ◦ オブジェクト管理 ◦ 権限管理 dbt との関わり ◦ Table とタグ付けすることでオブジェクト管理に利用できる ◦ Column にタグ付けすることで、権限管理(マスキング)に利用できる # Tag の DDL サンプル CREATE TAG cost_center ALLOWED_VALUES 'finance', 'engineering'; © 2026 Finatext Holdings Ltd. 13 -
Snowflake Object Tag Object Tag によるコスト管理 • • (ここは dbt
関係ないです ) Budget / Quota の機能を利用すると、コスト管理や可視化ができますが、 管理対象にするオブジェクトは Object Tag ベースでの列挙が基本となっています。 ◦ このコスト管理の文脈では User や Warehouse へのタグ付けが重要 ◦ 詳細は右下のブログなどが詳しいです https://zenn.dev/snowflakejp/articles/snowflake-per-user-quota © 2026 Finatext Holdings Ltd. 14 -
Snowflake Object Tag Table Tag によるオブジェクト管理 • • dbt-snowflake では
Table へのタグ付けのために table_tag という設定値がサポートされている table_tag に ”<tag_name> = ‘<value>’” と設定すれば良い ◦ <tag_name> には完全修飾子を入れることもできる ◦ コンパイルすると CTAS に with tag として組み込まれる ◦ 落とし穴もあるので要注意(詳細は Appendix に) # dbt_project.yml models: +table_tag: "DB2.SCH2.MANAGED_BY_TAG = 'dbt-repo'" # compiled query create or replace transient table DB1.SCH1.TABLE_A copy grants with tag (DB2.SCH2.MANAGED_BY_TAG = 'dbt-repo') as ( select ... ) © 2026 Finatext Holdings Ltd. 15 -
Snowflake Object Tag Table Tag によるオブジェクト管理 • 使用例:MANAGED_BY タグ ◦
対象のオブジェクトが管理されているレポジトリ名を値として指定できるようにしておく ◦ Snowsight でオブジェクトを見た時にどこで管理されているものか一目瞭然になり便利 # Tag の DDL サンプル CREATE TAG MANAGED_BY ALLOWED_VALUES 'tf-repo', 'dbt-repo'; © 2026 Finatext Holdings Ltd. 16 -
Snowflake Object Tag Column Tag による権限管理 • • Column Tag
を利用して Dynamic Masking させられるようにしたりできます ◦ いわゆる ABAC(属性ベースのアクセス制御) ◦ タグがついたカラムについて、マスキングを行いデータを保護できる ちょうど最近タグベースでのポリシーのサポートが広がったところ(PuPr) ◦ Masking Policy のみでなく、 Row Access Policy などもサポート対象に ◦ 詳細はこちら https://docs.snowflake.com/en/user-guide/tag-based-policies タグオブジェクト マスキングポリシーを 紐づけて作成 テーブル・カラム マスキングポリシー 特定のロールでのみ マスクしないなど テーブルのカラムに タグを適宜紐づけ ポリシーを適用 © 2026 Finatext Holdings Ltd. 17 -
Snowflake Object Tag Column Tag による権限管理 • • • dbt-snowflake
native には Columns タグはサポートされてはいない ◦ 適宜マクロを書いて、 Column にタグ付けさせることが可能 ◦ 以下のクエリを適宜組み立て、 post-hook で発火させるイメージ ◦ ALTER TABLE table_1 MODIFY COLUMN col_a SET TAG tag_name = tag_val; この辺りの dbt パッケージもあります ◦ infinitelambda/dbt_tags ナウキャストでのこの辺りの実践事例は以下の資料などでまとめているので、 良ければご覧ください。 DataOps Night #11 データ基盤にコンテキストレイヤー導入しはじめた話 ユーザビリティと機密保護を両立するガバナンス https://speakerdeck.com/kaeton/dataopsnight-number-11 © 2026 Finatext Holdings Ltd. 18 -
Snowflake Object Tag Table / Column へのタグ付けに必要な権限 • タグオブジェクトに関する権限は以下があります ◦
CREATE TAG on Schema ◦ APPLY on Tag / READ on Tag / Ownership on Tag • タグ付けの対象が Table でも Column であっても以下の権限が必要になります ◦ タグオブジェクトに関する権限 ▪ タグが含まれる Database / Schema の Usage 権限 ▪ タグに対する Apply 権限 ◦ タグ付けするオブジェクトに関する権限 ▪ タグを紐づけるテーブルの Ownership 権限 • dbt を利用する場合にはここは基本的にあるはずなので問題なし © 2026 Finatext Holdings Ltd. 19 -
まとめ dbt と Snowflake にまつわる3種のタグ 3種のタグについて細かく見てきました。それぞれ使い分けて、良き dbt-snowflake ライフを! dbt tag
query tag object tag 実体 dbt の config Snowflake セッションパラメーター Snowflake スキーマオブジェクト 対象 dbt model session (query) テーブルやカラムなど 各種オブジェクト データ型 文字列 / 文字列のリスト 文字列(2000字まで) Key-Value (バリューは文字列) 設定方法 in dbt tags query_tag テーブル:table_tag カラム :マクロ経由 主な利用方法 node selection クエリに対する情報の付加 モニタリングでの利用 コスト管理、権限管理、 オブジェクト管理など © 2026 Finatext Holdings Ltd. 21 -
Appendix 参考資料 • • • dbt tag ◦ https://docs.getdbt.com/reference/resource-configs/tags ◦
https://docs.getdbt.com/reference/node-selection/set-operators ◦ https://zenn.dev/finatext/articles/snowflake-dbt-tag-validation query tag ◦ https://docs.snowflake.com/en/sql-reference/parameters#query_tag ◦ https://select.dev/posts/snowflake-query-tags ◦ https://github.com/get-select/dbt-query-tags ◦ https://docs.getdbt.com/reference/resource-configs/snowflake-configs#query-tags ◦ https://findy-tools.io/products/select/385/333 ◦ https://zenn.dev/finatext/articles/3ea3e4459aef37 object tag ◦ https://docs.snowflake.com/en/sql-reference/sql/alter-table-column ◦ https://docs.snowflake.com/en/user-guide/tag-based-policies ◦ https://docs.snowflake.com/en/user-guide/security-access-control-privileges#tag-privileges ◦ https://docs.snowflake.com/en/user-guide/object-tagging/work#summary-of-ddl-commands-operations-and-privileges ◦ https://zenn.dev/snowflakejp/articles/snowflake-per-user-quota ◦ https://nulab.com/ja/blog/nulab/snowflake_dbt_pii_safe/ ◦ https://zenn.dev/dataheroes/articles/996125bc1737c1 ◦ https://tech.layerx.co.jp/entry/dbt-authorized-models ◦ https://tech.layerx.co.jp/entry/dbt-snowflake-rap-enforcement ◦ https://speakerdeck.com/kaeton/dataopsnight-number-11 © 2026 Finatext Holdings Ltd. 23 -
Appendix Query Tag にモデル名を入れる場合の注意点 • • このドキュメントにもあるように、 set_query_tag を更新し、 model.name
を適宜参照するようにすること で、 query_tag にモデル名を入れることができる 注意点 ◦ 適宜 JSON の形式にしておいた方が後で参照はしやすくなる ◦ set_query_tag は各モデルの materialization が始まる際に発火し、 alter session set query_tag を実 行することになる。そのため、もしモデルの build が失敗すると、必要な alter session が実行されず、 前のモデルの query_tag のまま別のモデルが実行される可能性がある {% macro set_query_tag() -%} {% set new_query_tag = model.name %} {% if new_query_tag %} {% set original_query_tag = get_current_query_tag() %} {{ log("Setting query_tag to '" ~ new_query_tag ~ "'. Will reset to '" ~ original_query_tag ~ "' after materialization.") }} {% do run_query("alter session set query_tag = '{}'".format(new_query_tag)) %} {{ return(original_query_tag)}} {% endif %} {{ return(none)}} {% endmacro %} © 2026 Finatext Holdings Ltd. 24 -
Appendix dbt-snowflake の table_tag の注意点 • • • 先に述べたように、 table_tag
を設定すると、 CREATE OR REPLACE TABLE … WITH TAG の形でタグが テーブルに付与されることになります この DDL でのタグの付与には、「テーブルを作り直す際にしかタグの付与を行えない・更新できない」とい う弱点があるので要注意です dbt-snowflake には row_access_policy という RLS のための config もあります。 ◦ こちらでも同様の問題があり、以下の記事で詳しく触れられています。 ◦ https://tech.layerx.co.jp/entry/dbt-snowflake-rap-enforcement © 2026 Finatext Holdings Ltd. 25 -
Appendix COPY TAGS in CREATE OR REPLACE TABLE • CREATE
OR REPLACE TABLE をする際に、 COPY TAGS を追記しておくと、置き換えられる元テーブルとそ のカラムのタグが、新しいテーブルでも維持されるようになるという機能 ◦ COPY GRANTS と似た感じの機能 ◦ 2026/04/02 に出た機能です ▪ https://docs.snowflake.com/en/release-notes/2026/other/2026-04-02-create-table-copytags-ga ◦ 詳細は以下 ▪ https://docs.snowflake.com/en/sql-reference/sql/create-table#label-create-table-usage-n otes-copy-tags • dbt-adapters でも既に PR はマージされています ◦ https://github.com/dbt-labs/dbt-adapters/issues/1857 ◦ https://github.com/dbt-labs/dbt-adapters/pull/1858 ◦ おそらく dbt-snowflake 1.12 で取り込まれるはず © 2026 Finatext Holdings Ltd. 26 -
Appendix Object Tag の継承と伝播 タグの設計における重要な要素として、「継承(inheritance)」と「伝播(propagation)」がある • • 継承(inheritance) ◦ Snowflake
の Securable Object Hierarchy にしたがって、タグが継承されるという機能 ◦ 全アカウント全オブジェクトで暗黙的に行われる ◦ 具体例 ▪ Table のタグは、 Column にも付与される ▪ Account のタグは、 Database や Schema にも付与される ◦ https://docs.snowflake.com/en/user-guide/object-tagging/inheritance 伝播(propagation) ◦ テーブルなどの依存関係やデータの移動をトリガーに、ソースオブジェクトからターゲットオブジェク トへとタグを伝播させる機能 ◦ タグ作成時の PROPAGATE の設定を明示的に行うことで有効化される ◦ 継承されたタグでは伝播されないなどの制約もあるので注意 ◦ 具体例 ▪ 依存関係 :ビューの定義を踏まえて、ソーステーブルのタグがビューに伝播される ▪ データ移動:CTASやDMLなどでのデータの移動に伴いタグも伝播 ◦ https://docs.snowflake.com/en/user-guide/object-tagging/propagation © 2026 Finatext Holdings Ltd. 27 -
Appendix Object Tag に関する制約 • Tag Quota ◦ 単一のオブジェクトに付与できるタグは最大50種類まで(これはテーブル自体へのタグ付けも該当) ◦
またカラムに関しては、あるテーブルの全てのカラムへのタグ付けを全て合算して、最大50種類のタグ 付けが可能 ▪ あくまで種類で数えるので、 tag1 というタグを50個のカラムに紐づけても、まだ残り49種類のタ グをカラムに紐づけることが可能 ◦ https://docs.snowflake.com/en/user-guide/object-tagging/introduction#tag-quotas • Edition の制限 ◦ タグの作成と設定自体は全てのアカウントで利用可能 ◦ しかし以下の機能に関しては Enterprise Edition 以上が必要 ▪ Tag Propagation ▪ Tag-based masking policy ◦ https://docs.snowflake.com/en/user-guide/object-tagging/introduction#capabilities-that-requi re-enterprise-edition © 2026 Finatext Holdings Ltd. 28