Snowflakeでデータ基盤を もう一度作り直すなら / rebuilding-data-platform-with-snowflake
by
pei0804
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
© 2025 Snowflake Inc. All Rights Reserved 初期段階で検討しておきたいこと Snowflakeでデータ基盤を もう一度作り直すなら 近森 淳平 pei Data Superhero
Slide 2
Slide 2 text
https://speakerdeck.com/pei0804/strongest-data-architecture-discussion
Slide 3
Slide 3 text
Snowflakeベースのデータ基盤を構築してから、 ちょうど3年が経ちました。 この間、弊社の株主、経営体制、開発体制、肩書。 Snowflake自体の進化やChatGPTの登場など、 会社、業界、私自身にも目まぐるしい変化がありました。 それらの変化を超えてきたからこそ、 普遍的に重要だったと思える設計判断がいくつかあります。 ぼくの最高を構築してから3年
Slide 4
Slide 4 text
今日話すこと 私自身の3年間のデータ基盤運用経験と、 SnowVillageで共有された『あるある』から見えてきた、 初期から考慮すべき設計の勘所についてです。 これから基盤を作る皆さんのヒントになれば幸いです。 また、既に構築済みの方にとっては、 いまの辛さの原因を知る手がかりになるかもしれません。
Slide 5
Slide 5 text
アジェンダ ● 自己紹介 ● アカウントはどう分けるべきか? ● どのツールを選ぶか? ● Functional Roleをどう設計するか? ● データベースをどう分けるか ● おまけ:細かいけど重要
Slide 6
Slide 6 text
アジェンダ ● 自己紹介 ● アカウントはどう分けるべきか? ● どのツールを選ぶか? ● Functional Roleをどう設計するか? ● データベースをどう分けるか ● おまけ:細かいけど重要
Slide 7
Slide 7 text
自己紹介 ぺい @pei0804 近森淳平(チカモリ ジュンペイ) VP of Data @ CARTA ZERO / CARTA HOLDINGS 2024, 2025 Snowflake Data Superheroes
Slide 8
Slide 8 text
アジェンダ ● 自己紹介 ● アカウントはどう分けるべきか? ● どのツールを選ぶか? ● Functional Roleをどう設計するか? ● データベースをどう分けるか ● おまけ:細かいけど重要
Slide 9
Slide 9 text
アカウントはどう分けるべきか? アカウントの粒度は、早い段階で決める必要があります。 そして後から変更が困難なため、重要な判断です。 結論から言うと、「分けることで何が得られるのか?」に 明確に答えられないなら、分割は避けるべきです。
Slide 10
Slide 10 text
分かれすぎたアカウントの苦労話 ありがちなのが、プロダクトごとにアカウントを分けるパターンです。 立ち上げ期はうまく回りますが、活用が進むと課題が出てきます。 例えば、複数プロダクトのデータを組み合わせて新しい インサイトを得たいケース。アカウントが分かれていると、 まずシェアリングの設定から始めなければならず、 ちょっとした調査でも一苦労です。かといって後から統合しようにも、 別々に育ったものを1つにまとめるのは容易ではありません。
Slide 11
Slide 11 text
アカウントを分ける観点 では、アカウントを分けるべきケースは? 判断の軸は以下の3点です。 ● 機密レベル ● データレジデンシー ● エディション
Slide 12
Slide 12 text
機密レベル 同じアカウント内で、機密性が違うデータが共存する場合、 ロールの権限設定ミスが事故に直結する構造になります。 一方、機密性の高いデータを別アカウントに分離すれば、 「誰がアクセスできるか」という判断そのものが単純になります。 ただし、アカウント管理の手間は増えるため、 漏洩リスクと管理コストを天秤にかけて判断しましょう。
Slide 13
Slide 13 text
データレジデンシー データの保存場所に関する法的・契約的な要件です。 仮に特定の地域にデータを置く必要がある場合、 Snowflakeは、リージョンやクラウドプロバイダーごとに アカウントを作成する仕組み上、分割が事実上必須となります。
Slide 14
Slide 14 text
エディション Snowflakeのエディションによって機能と価格が異なるため、 用途に応じて使い分けることがあります。 例えば、データ変換を行うアカウントはStandardで、 機密データを扱うアカウントはBusiness Criticalといった具合。 ですが、分けることによる管理コストもあるので、 そこも考慮しつつ、どこまで分けるか考えましょう。
Slide 15
Slide 15 text
基本、理由がないなら、 アカウントは、1つで良い!
Slide 16
Slide 16 text
アジェンダ ● 自己紹介 ● アカウントはどう分けるべきか? ● どのツールを選ぶか? ● Functional Roleをどう設計するか? ● データベースをどう分けるか ● おまけ:細かいけど重要
Slide 17
Slide 17 text
どのツールを選ぶか? Snowflakeを効果的に活用するには、 Snowflake単体で完結しない領域が必ず出てきます。 初期段階から「どのツールを採用するか」という判断が 求められますし、運用が進む中でも選定の局面は繰り返し訪れます。 ただし、ツールは導入より撤退の方がはるかに難しい。 これを念頭に置いておく必要があります。
Slide 18
Slide 18 text
導入したツールが全く使われなければ、消すだけで済みます。 厄介なのは、中途半端に業務へ浸透してしまったケースです。 特にオーナー不在の状態になると、年単位で放置されることも 珍しくありません。誰かが決断するまで、残り続けます。 だからこそ、「このツールがないと本当に問題は解決しないのか?」 見極めるコストは、導入前に必ず払うべきです。 ツールの撤退は大変
Slide 19
Slide 19 text
無闇にツールを増やさない。 導入するなら、ちゃんとやり切る。
Slide 20
Slide 20 text
https://speakerdeck.com/pei0804/selecting-the-right-data-technology
Slide 21
Slide 21 text
https://findy-tools.io/companies/cartazero/145/36
Slide 22
Slide 22 text
多くのユーザーが抱える課題を、 Snowflakeがネイティブ機能で解決するケースは 珍しくありません。 今すぐ解決すべき課題でなければ、 待つことも有効な選択肢の一つです。 待てば、Snowflakeが 解決してくれることもある 参考:https://www.snowflake.com/en/blog/snowflake-acquire-select-star/
Slide 23
Slide 23 text
アジェンダ ● 自己紹介 ● アカウントはどう分けるべきか? ● どのツールを選ぶか? ● Functional Roleをどう設計するか? ● データベースをどう分けるか ● おまけ:細かいけど重要
Slide 24
Slide 24 text
ロール設計の全体像 ● Access Role ○ データベース、オブジェクトへのアクセス権限を定義する。 ○ このロールで直接操作はしない。 ● Functional Role ○ 人間のユーザーが使う。 ○ Access Roleを組み合わせて構成。 ● Service Role ○ ツール、アプリケーションが使う。 ○ Access Roleを組み合わせて構成。
Slide 25
Slide 25 text
ロール設計の全体像 https://select.dev/posts/snowflake-rbac-best-practices
Slide 26
Slide 26 text
Functional Roleをどう設計するか? Access Roleは対象と操作の組み合わせで機械的に決められます。 Service Roleは多くの場合、最小権限の原則に従えば問題ありません。 一方、Functional Roleは誰にどの権限を与えるかの判断が伴います。 この判断は組織構造やビジネス要件に依存するため、 普遍的に使える設計パターンがありません。 ● 部署で分ける? ● 職種で分ける? ● 兼務者はどうする?
Slide 27
Slide 27 text
Functional Roleの設計方針 Who(誰であるか)ではなく、What(何をするか)で設計する。 組織構造は変わりやすい。 データへのアクセスパターンは変わりにくい。 変わりにくいものに依存した設計の方が安定します。
Slide 28
Slide 28 text
Who設計の落とし穴 ENGINEERやANALYSTのように役割ごとにロールを分けがちですが、 クロスファンクショナルな協業が始まると破綻します。 例えば、ANALYSTがENGINEERのダッシュボードを見たい時。 回避策は、ANALYSTにENGINEERロールも付与することになります。 しかし、当然逆のケースも出てきて、 最終的には全員が両方のロールを持ち、分けた意味がなくなっていく。
Slide 29
Slide 29 text
Whatで設計するとは Whatで設計するとは、「データを見る」のような行為で ロールを分けることです。 ENGINEERやANALYSTのような役割ではなく、 何をするかを軸にロールを設計します。 では、実際どのくらいの粒度で作ると良いのか?
Slide 30
Slide 30 text
「データを見る」ロールの設計例 「データを見る」ためのロールは1つだけ作る。 このロールは基本的にすべてのデータを閲覧でき、 NotebookやStreamlitも作成できます。 機微データへのアクセス制御が必要な場合にのみ、別途ロールを追加する。 狙いもなしに「このデータを見る」のように対象で分けると、 データのサイロをデータ基盤上に再現することになります。 見せてはいけないデータがないなら、 全員が同じデータを見れる状態の方が管理も活用もスムーズです。
Slide 31
Slide 31 text
TIPS: READONLYという名前は実態に合わない 「データを見る」ロールにREADONLYと名付けると、 実態に合わないケースがよくあります。 例えば、StreamlitやNotebookでデータを見る場合、 オブジェクトを「作る」行為が伴います。 READONLYなのに書き込み権限が必要になるのです。 私は「データを見る」ロールにDATA_EXPLORERと名付けました。 「データを探索する」という行為を表現した名前です。
Slide 32
Slide 32 text
アジェンダ ● 自己紹介 ● アカウントはどう分けるべきか? ● どのツールを選ぶか? ● Functional Roleをどう設計するか? ● データベースをどう分けるか ● おまけ:細かいけど重要
Slide 33
Slide 33 text
データベースをどの粒度で切るか データパイプライン(dbtなど)が扱うデータベースは、 初期段階では3つあれば十分です。よく見かけるのは以下の構成です。 ● RAW / PREP / PROD(当スライドはこれを前提に話します) ● RAW / STAGING / MART ● Bronze / Silver / Gold
Slide 34
Slide 34 text
各層の役割例 ● RAW ○ 全てのデータが最初に到着する場所。加工は行わない。 ● PREP ○ データの変換と品質担保を行う場所。分析可能な状態に整える。 ● PROD ○ エンドユーザーに提供するデータを置く場所。 BIツールやアプリケーションはここを参照する。
Slide 35
Slide 35 text
https://speakerdeck.com/pei0804/churadata-event-dbt-2022
Slide 36
Slide 36 text
RAWデータベースを分けるパターン ● RAW_{NAMESPACE}_{LOADER} ○ RAW_NETSUITE_LOADMAN, RAW_NETSUITE_FIVETRAN ローダー名を含めるのは、一見アンチパターンに見えますが、 実運用上のメリットがあります。 ローダー専用のデータベースであれば、 他ツールとの設定競合を気にせずデフォルト設定で運用できます。 また、不具合時の影響範囲を限定でき、 ローダー切り替え時の移行も容易です。
Slide 37
Slide 37 text
PRODデータベースを分けるパターン ● PROD_{NAMESPACE} ○ PROD_PARTNER_A, PROD_PRODUCT_B PROD層を分けるのは、主にデータの公開範囲を制御したい場合です。 データを外部に提供する。機密レベルで分離したいケースで有効です。 スキーマレベルで細かく権限管理するより、運用が簡単です。
Slide 38
Slide 38 text
専用データベース AlertやStreamlitなどのオブジェクトは、必ずどこかのスキーマに属します ただし、先程の3層のデータベースとは独立して管理したいことがあります。 そのような場合に、用途に特化したデータベースを作ります。 私はこれを「専用データベース」と呼んでいます。 命名ルールは特にありませんが、 オーナーチーム名と、本番か実験用かを区別する命名が多いです。
Slide 39
Slide 39 text
アジェンダ ● 自己紹介 ● アカウントはどう分けるべきか? ● どのツールを選ぶか? ● Functional Roleをどう設計するか? ● データベースをどう分けるか ● おまけ:細かいけど重要
Slide 40
Slide 40 text
Terraformで全てのリソースを管理しない Terraformは変更頻度が低く、再利用したい土台の管理に集中させます。 全てを管理することは本質ではなく、仮に大量のオブジェクトを管理すると Planに1時間かかる状態に陥ります。 具体的には、アカウントオブジェクト(Warehouse、Database、Role、User)、アク セス制御(GRANT)、インテグレーション(Snowpipe、External Table)などは Terraformで管理するのがおすすめです。
Slide 41
Slide 41 text
PoCという名前でリソースを作らない PoCと名付けたリソースは一時的なものとして作られますが、 実際には削除されずに一生残り続けます。 特に「これ便利じゃん」って使われ始めると消せなくなります。 最初から本番運用を想定した命名規則で作成するか、 削除期限を明確にして問答無用で削除しましょう。
Slide 42
Slide 42 text
Access Roleに `_` Prefixつける _READ_RAW_DATABASEのように先頭にアンダースコアをつけることで、 Functional Roleと視覚的に区別できます。 機能的な違いはありませんが、ロール一覧画面ではAccess Roleと Functional Roleを見分ける手段が提供されていないため、 命名規則による区別が効果的です。 また、アルファベット順でソートされた際に Access Roleがまとまって表示されるため、一覧性も向上します。
Slide 43
Slide 43 text
ロールの階層は深くしすぎない ロール階層はUser → Functional Role → Access Roleというシンプルな 一方向の流れに留めます。逆にAccess Role同士やFunctional Role同士 で階層化すると、権限のデバッグが困難になるためです。 例えば、Functional Roleをネストさせた場合、 「このユーザーはなぜこのテーブルにアクセスできるのか」を 特定するために複数のロールを順に辿る必要が生じ、 トラブルシューティングの時間が大幅に増加します。
Slide 44
Slide 44 text
PREPはUTCのTIMESTAMP_TZに統一する RAWレイヤーではソースシステムの形式をそのまま保持しますが、 PREPは全てUTCのTIMESTAMP_TZ型に統一します。 データを見るたびに「これはどのタイムゾーンか」を確認する手間が 発生するため、統一することが重要です。 TIMESTAMP_NTZでUTCを保存することも可能ですが、 TIMESTAMP_TZはタイムゾーンオフセットが明示されるため、 データの可読性が向上します。オフセット情報による追加のストレージ コストは、一般的なデータ量であれば無視できる範囲です。
Slide 45
Slide 45 text
STATEMENT_TIMEOUT_IN_SECONDSを設定 クエリの最大実行時間 デフォルトは2日間ですが、実運用では長すぎることがほとんどです。 終わらないクエリが何時間も動き続け、 想定外のコストが発生するリスクがあります。 例えば、アカウントレベルで3600秒(1時間)程度に設定しておけば、 問題のあるクエリを自動的に停止できます。 適切な値は用途によって異なりますが、 デフォルトのまま運用することはおすすめしません。
Slide 46
Slide 46 text
DATA_RETENTION_TIME_IN_DAYSは7日 Time Travel(履歴データ保持)の日数 デフォルトは1日ですが、誤削除やバグによるデータ破壊に気づくまでには数日 かかることがあります。特に週末を挟んだ場合、 1日の保持期間では復旧が間に合いません。 初期段階で7日程度に設定しておくことを推奨します。 期間は後から延ばすことができますが、過去に遡って適用することは できません。ストレージコストは増加しますが、 重要なデータを失うリスクと比較すれば許容できる範囲です。
Slide 47
Slide 47 text
ウェアハウスのAUTO_SUSPENDは60秒 非アクティブ時の自動停止までの待機時間 初期値は10分(600秒)ですが、この設定は多くの場合、長すぎます。 基本的には60秒でサスペンドするように設定しておきましょう。 ただし、ワークロードによっては頻繁な停止と起動が 最小課金時間60秒と相性が悪く、 かえってコストが増えるケースもあります。
Slide 48
Slide 48 text
まとめ
Slide 49
Slide 49 text
本当に必要か?を足す前に考えよう。 消す方が大変。
Slide 50
Slide 50 text
どれだけ考えても、間違える時はある。 けど、続けてさえいれば、やり直せる。
Slide 51
Slide 51 text
© 2025 Snowflake Inc. All Rights Reserved THANK YOU