Snowflakeデータ共有についてのまとめ

本ブログでは、SnowflakeのData Sharing機能についてまとめました。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業部のnkhrです。本ブログでは、SnowflakeのData Sharing機能についてまとめました。

Data Sharing機能とは、他のアカウントとDatabase内のオブジェクトを共有するための機能です。Snowflakeでは以下のDatabaseオブジェクトを共有できます。(2021/11時点)

  • Tables
  • External tables
  • Secure views
  • Secure materialized views
  • Secure UDFs

Data Sharing機能の特徴

Data Sharing機能の特徴は以下の通りです。

  • 共有されるデータベースはRead-Onlyであり、共有先<Consumer>でデータの修正や削除、追加はできない
  • 共有の操作においてデータコピーや転送は発生しない(データ実体は共有元<Provider>アカウントにあり、データ共有先<Comsumer>アカウントのストレージを消費しない)
  • 共有データベースに対するクエリ実行のCredit消費は、クエリ実行したウェアハウスがあるアカウントで課金される
  • 別Regionや別Cloud Platformと共有を行う場合は、Data Replicationを実施したうえで共有する
  • Business Criticalアカウントから別アカウントに共有する場合は「SHARE_RESTRICTIONS」パラメータを無効にする必要がある( 参考リンク

    • SnowflakeではBusiness CriticalからNo Business Criticalに共有する場合は、直接ではなくProvider側でNo Business Criticalアカウントを作成し、No Business Critical同士で共有することを推奨

共有のイメージは下図のようになります。

※2021/11/24に図を差し替え(共有したDBをCloneするという記載をCopyに修正。2021/11現在、共有したDBのCloneは実施できません)

Shareオブジェクトは、共有するオブジェクトの権限と、共有先アカウント<Consumer>を管理します。Consumer側で、共有されたShareオブジェクトからデータベースを作成します。

  • CREATE DATABASE <任意の名前> FROM SHARE <Provider ACCOUNT ID>.<共有オブジェクト名>;
  • データベースを作成すると権限が付与されているSchemaやTable、Viewが表示されます

センシティブデータ共有(構成例)

公式サイトのサンプルコードをベースに、センシティブなデータの共有構成例について整理しました。サンプルコードに記載されているオブジェクトの関係は以下の通りです。

この構成のポイントは以下の通りです。

  • SchemaをPrivateとPublicにわけ、Public側のSchemaのみUSAGE権限を共有することで、Private Schemaの情報が誤って共有されることを防ぎます
  • Viewで別のSchemaのテーブルを参照したとしても、ViewのSELECT権限を付与するだけで共有できます。(Viewが内部で参照しているテーブルのSELECT権限を渡す必要はないです)
    • この構成では対象としていませんが、異なるDatabaseのTableやViewを参照している場合は、異なるDatabaseに対するREFERENCE_USAGE権限付与が必要です(この場合も参照先TableやSchemaの権限を共有する必要はないです)

共有までの流れ

共有を行う場合は、各アカウントで以下の作業を行います。

  • Provider Account (データ共有元)
    • 共有するSecure Viewやテーブル、UDFなどを作成
    • (オプション) 行の表示制御をsharing_accessテーブルで行う場合は、sharing_accessテーブルにアカウントID(大文字アルファベット)とアカウントが参照できるキー値を設定(サンプルではaccess_idの'STOCK_GROUP_2')
    • Shareオブジェクトを作成
    • ShareオブジェクトにUSAGE(Database, Schema)権限とSELECT権限を付与
    • Shareオブジェクトに共有先アカウントを紐づけ(ADD)
    • 共有元アカウントIDをConsumer側に連絡
  • Consumer Account(データ共有先)
    • 共有先のアカウントIDをProvider側に連絡
    • 共有されたShareオブジェクトを確認
    • 共有元アカウントIDとShareオブジェクトからDatabaseを作成

おわりに

データ共有はSnowflakeでの注目機能の一つです。Data Sharingによりデータ実体は1つのまま、データを共有できるため、SSOT (Single Source of Truth)の実現にも有効な機能だと思います。

データビジネスでの利用だけでなく、自社内のアカウント間(部門アカウントや環境別アカウントなど)でのデータ共有においても使える機能ではないでしょうか。

以上、DA事業部のnkhr (@ttn_nkhr)でした。