Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Modern Data Stack初心者がSnowflake DCRの構築をした話

Modern Data Stack初心者がSnowflake DCRの構築をした話

Makoto Shinohara

November 12, 2023
Tweet

More Decks by Makoto Shinohara

Other Decks in Technology

Transcript

  1. データクリーンルーム(DCR)とは 個人情報を含んでいるデータを中身の情報は見せずに結合して掛け合わせ分析を行うことができる技術及び それが実現できる環境 SnowflakeのDCRではSnowflakeの各種機能(Data Sharing, Stream/Task, Stored Procedure, Row Access

    Policy etc…)を組み合わせて 許可ベースのクエリ実行フレームワークとして実現している KDDI Agile Development Center Corporation KDDIアジャイル開発センター 開発4部 2
  2. 技術スタック Data Cloud Snowflake Workflow Orchestration Snowflake Task Github Actions

    主にdbtの呼び出しに使用 CI/CD Github Actions Transform/Data Modeling dbt Core IaC Terraform KDDI Agile Development Center Corporation KDDIアジャイル開発センター 開発4部 4
  3. Workflow Orchestration データパイプラインの流れ 源泉データは別のSnowflakeアカウントからSecure Data Sharingを利用してシェア 自アカウント内へテーブルの内容をコピー → Snowflake Task

    そのテーブルの内容をdbtで加工 → dbt Core on Github Actions (いい感じの絵をAIに作ってもらおうとしたけど失敗) KDDI Agile Development Center Corporation KDDIアジャイル開発センター 開発4部 5
  4. DCR構築へのTerraformの活用 DCR構築を効率化するためにDCR構築の一連の処理をTerraformのModuleにまとめています 1 module "provider_init" { 2 source = "modules/provider_init"

    3 ... 4 } 5 module "consumer_init" { 6 source = "modules/consumer_init" 7 ... 8 depends_on = [ 9 module.provider_init 10 ] 11 } 12 module "provider_enable_consumer" { 13 source = "modules/provider_enable_consumer" 14 ... 15 depends_on = [ 16 module.provider_init, 17 module.consumer_init 18 ] 19 } KDDI Agile Development Center Corporation KDDIアジャイル開発センター 開発4部 6
  5. Terraformでクエリテンプレートの管理 クエリテンプレートの登録を行うSQLファイルを用意 INSERT INTO ${db_name}.TEMPLATES.DCR_TEMPLATES ( party_account, template_name, template, dimensions,

    template_type ) VALUES ( '${consumer_acct}', '${template_name}', $$${template}$$, '${dimentions}', 'SQL' ); KDDI Agile Development Center Corporation KDDIアジャイル開発センター 開発4部 8
  6. Terraformでクエリテンプレートの管理 yamlファイルにクエリテンプレートの設定を記述 1 templates: 2 - template_name: customer_overlap 3 template:

    | 4 select 5 {% if dimensions %} 6 identifier({{ dimensions[0] }}) 7 {% for dim in dimensions[1:] %} 8 , identifier({{ dim }}) 9 {% endfor %} 10 , {% endif %} 11 count(distinct p.email) as overlap 12 from 13 {{ app_data | sqlsafe }}.cleanroom.provider_customers_vw p, 14 {{ consumer_db | sqlsafe }}.{{ consumer_schema | sqlsafe }}.{{ consumer_table | sqlsafe }} at(time 15 where 16 c.{{ consumer_join_field | sqlsafe }} = p.email 17 ... 18 allowed_columns: 19 - c.petsc.zip 20 - p.status 21 - p.age_band 22 template_type: SQL KDDI Agile Development Center Corporation KDDIアジャイル開発センター 開発4部 9
  7. Terraformでクエリテンプレートの管理 Terraformで読み込む resource "snowsql_exec" "templates" { for_each = { for

    i in local.templates : i.template_name => i } create { statements = templatefile("${path.root}/tftpls/insert_templates.sql.tftpl", { db_name = var.source_database_name consumer_acct = var.consumer_account_locator, template_name = each.value.template_name, template = each.value.template, dimentions = join("|", flatten(each.value.allowed_columns)) }) } delete { statements = "DELETE FROM ${var.source_database_name}.TEMPLATES.DCR_TEMPLATES WHERE TEMPLATE_NAME = '${each.value.t } } KDDI Agile Development Center Corporation KDDIアジャイル開発センター 開発4部 10