The Finatext Tech Blog

THE Finatext Tech Blog

Follow publication

Snowflake における権限管理とコスト管理

--

こんにちは、Finatextグループのナウキャストでデータエンジニアをしているけびん(X: @Kevinrobot34 ) です。

先日「みんなの考えた最強のデータ基盤アーキテクチャ2024前半おまとめ拡大版SP!」というイベントに登壇し、 Snowflake でデータ基盤を作る際に大事になる権限管理とコスト管理の方法について、ナウキャストの事例を紹介させていただきました。

要は「ロールの階層・ロールの分け方」「ウェアハウスの分け方」をどうするかという話で、ナウキャストの場合は以下のような構成にしています。

ナウキャストにおけるロール・ウェアハウスの構成のイメージ図。一部検証中の部分もあります。

これらについてポイントを改めて紹介します。

このロール・ウェアハウス構成を見る前に、Snowflakeにおける権限管理とコスト管理のポイントを整理しておきましょう。

Snowflake の権限管理

Snowflake における権限管理は DAC と RBAC を組み合わせたようなものとなっています。

  • オブジェクトの権限はロールに付与される
  • オブジェクトはロールに所有される
  • ロールはユーザーに付与される
https://docs.snowflake.com/en/user-guide/security-access-control-overview より

また Snowflake ではロールの階層構造を作ることが可能です。これにより、親のロールは子孫のロールの権限も継承することになります。

https://docs.snowflake.com/en/user-guide/security-access-control-overview より

またロールにも主要なもので Account Role と Database Role の2種類あり、どれを使うか?もポイントになります。Database Role については以下の記事が分かりやすいです。

よって Snowflake の権限管理における具体的なポイントとしては

  • ロールをどう切り分けるか
  • ロールの階層をどう作るか
  • ロールとして Account Role と Database Role のどちらを作るか

などがあります。

Snowflake のコスト管理

Snowflake ではウェアハウスが計算資源であり、これを何秒使ったかで課金されます。ウェアハウスは簡単にいくつでも作ることができまたウェアハウス別でコストを確認するのは容易です。

よって Snowflake のコスト管理ではウェアハウスをどう切り分けるかがポイントになります。

ちなみにコスト管理の観点以外にも、ワークロードごとにウェアハウスを切り分けておくことは大事です。例えばウェアハウスを共有してしまうと、あるワークロードの重い処理が別のワークロードに影響を与えてしまうといったこともあり得ます。

ロール・ウェアハウスの全体像

改めてナウキャストのロール・ウェアハウスの全体像を見てみましょう。

ナウキャストにおけるロール・ウェアハウスの構成のイメージ図。一部検証中の部分もあります。

ポイントとしては以下のあたりになります。

  • ロールについては Service / Functional / Access Role 層の3つのグループを作り管理
  • Service / Functional Role 層は Account Role で、 Access Role 層は Database Role で実装する
  • Access Role 層で必要に応じて階層を一つ作る
  • ウェアハウスについては Service / Functional Role 層でロールとセットで作成する

Service / Functional / Access Role 層などは以下のブログなど、最近よく見かけますが、ウェアハウスの組み合わせ方などでナウキャスト独自の工夫をしています。

層ごと詳しく見ていきましょう。

Access Role 層について

Access Role 層は各オブジェクトの細かい権限を隠蔽し程よくまとめておくことで、ロールの付与の有無で権限を管理できるようにするための層です。

例えば、「ある Schema の任意の table の read 権限」を用意するためには

  • Database の USAGE
  • Schema の USAGE
  • All Tables の SELECT
  • Future Tables の SELECT

の4つの権限が必要です。これらを一つのロールに table-select にまとめておくことで、このロールを Functional / Service Role に付与するかどうかで簡単に table の read 権限を付与することができ、管理が楽になります。

Access Role 層のロールはあくまで権限をまとめて利用しやすくしたもののため、 Database Role で実装するのが便利です。これにより

  • ウェアハウスの権限は付与できないため、ウェアハウスの乱立を防げる
  • Access Role 層のロールを直接ユーザーに付与することを防ぐ
  • Snowsight のロール選択画面に Access Role 層のロールは表示させない

といったことが可能になります。

Functional Role 層について

Functional Role 層は人間の利用するユーザーのためのロールを管理する層です。 Type property が PERSON のユーザーに付与するためのロールを管理しているとも言えます。

この層ではロールだけでなく、ウェアハウスもセットで管理するようにしています。これにより権限管理とコスト管理を同時に考えやりやすくしています。

Functional Role 層のロールはユーザーに付与しウェアハウスの利用権限も付与する必要があるため Account Role で実装します。

また、Functional Role 層同士で階層は作らず、 Access Role 層の Database Role を適切に付与することで権限管理するようにしています。必要以上に階層が増えると認知負荷が増え権限管理が難しくなるためです。

Service Role 層について

Service Role 層はシステムの利用するユーザーのためのロールを管理する層で、 Type property が SERVICEのユーザーに付与するためのロールを管理しているとも言えます。
ロール付与対象のユーザーがシステムであること以外は全て Functional Role 層と同じです。

システムの利用するユーザーと人間の利用するユーザーが使うロール・ウェアハウスを別々のものにしておくというのがポイントになります。

  • システムと人間とで似たような権限を使うことが多いかと思いますが、ロールを共有してしまうと過度に強い権限のロールが使われていく傾向が出てしまい、最小権限の法則に反しよくないです。
  • またコスト管理の観点からは、システムと人間が使うウェアハウスは分離しておかないと定期バッチとAdhocな開発・分析のコストの分離が面倒になります。

これらのポイントから Functional Role 層と Service Role 層を分けておくことにしています。

おわりに

ナウキャストでは一緒に働く仲間を募集中です!興味のある方はTwitter で @Kevinrobot34 にご連絡ください! 会社紹介ページも是非ご覧ください!

また最近 Finatext グループ公式のエンジニア向けXアカウント @FinatextDev も作成しさまざまな発信をしているのでぜひフォローしてください!

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Written by Kevinrobot34

Data Scientist, Data Engineer at Nowcast Inc. / Kaggle: Master / AtCoder: Blue

No responses yet

Write a response