❄️

Organization Listing / Internal Marketplace を使ってみる

がく@ちゅらデータエンジニア(50)です。
みなさん、花粉のパッションを感じてますか!!!
私はとてもとても感じております。杉を燃やし尽くしたい

さて、今日は組織内リスティングとインターナルマーケットプレイスを検証する機会がありましたので、作業メモ的にブログを書くことにします。

Snowflakeでのデータ共有

2025年DataSuperHeroの前田さんがデータ共有の記事を書いてらっしゃいました

https://zenn.dev/dataheroes/articles/1e2b4983f22e90

Snowflakeのデータシェアリングについては

  • Direct Sharing
    • 同一クラウド・リージョンの必要あり
  • Listing
    • Shareの発展型、クロスリージョン
    • 「データ」の共有まで、「データ処理ロジック」は共有できず
    • Marketplaceでの公開可能、有償も可能
  • Native Apps
    • App Packageオブジェクト+リスティング
    • Listingのさらなる発展系
    • 「データ処理ロジック」の共有できるように

Organization Listing / Internal Marketplace

ここに追加で、2024年11月12日に、
Internal Marketplace / Organization ListingがGAになりました。
https://docs.snowflake.com/en/release-notes/2024/other/2024-11-12-organizational-listings

同じ組織限定でデータ製品を共有・公開することができます。
ステップバイステップで検証をしていきたいと思います。

https://docs.snowflake.com/en/user-guide/collaboration/listings/organizational/org-listing-about
※日本語版のページはまだなかった(2025年3月12日現在)

  • Organization Listingは、提供元(プロバイダー)が組織内でデータを安全に共有する手段
  • Internal Maketplaceは、組織内の消費者(コンシューマ)が、↑の信頼できるデータを見つけやすい場所を提供

Organization Listingsとは

  • 組織内でデータ製品を安全に共有できる
  • プロバイダ(提供側)は、APIやSnowsight内にあるProvider Studioを使ってリスト管理可能

Internal Marketplace

  • 社内で利用可能なデータを一元管理、簡単に見つけることができる組織内の場(マーケットプレイス)
  • 外部マーケットプレイスを経由する必要なし、組織専用
  • アクセスは、アカウントターゲティングとロールベースのアクセス制御(RBAC)で管理

Organization listing providers(提供者)

  • 組織で一元管理できる
  • Provider StudioもしくはAPIで組織のリストの作成・管理可能

Organization listing consumers(消費者、被提供者)

  • 組織内専用Internal Marketplaceを開いて、データリソースを見つけてアクセスできる

Create an organizational listing

ここから実際に作成して、検証をしていきます。

https://docs.snowflake.com/en/user-guide/collaboration/listings/organizational/org-listing-create

とその前に、公開するサンプルデータを作っておく

-- 実行環境設定
use role sysadmin;
use warehouse g_tashiro_wh;
create database ORG_MARKETPLACE_DEMO_DB;
create or replace schema FOR_BAR_SCHEMA;

-- 共有するサンプルテーブルの作成
create or replace table table1 (
    project_id string
    , project_name string
);

insert into table1 
values 
('BD1', 'プロジェクトA')
, ('BD2', 'プロジェクトB')
, ('BD3', 'プロジェクトX')
;

create or replace table table2_unshare (
    project_id string
    , project_name string
);

insert into table2_unshare
values 
('BD11', 'プロジェクトAA')
, ('BD12', 'プロジェクトBB')
, ('BD13', 'プロジェクトXX')
;

create or replace view table1_view as 
select * from table1
;

select * from table1;
select * from table2_unshare;
select * from table1_view;

-- ORGADMINで確認する必要はある。もし ORGANIZATION LISTが作成できないようなら、
-- Slack : #ds-snowflaje-user にて確認すべし
/**
SELECT SYSTEM$IS_GLOBAL_DATA_SHARING_ENABLED_FOR_ACCOUNT(
  'SANDBOX'
  );
**/

前提条件:ORGADMINロールを持っている

Organization Listingを使うと以下のことができない(Listing比)

  • プロファイルのカスタム作成
  • マーケットプレイス分析
  • Readerアカウント

CREATE ORGANIZATION LISTING

英語版はこちら

Internal Marketplaceに公開

  1. Snowsightへログイン
  2. (左の柱ナビゲータ)Data Project -> Provider Studio を選択
  3. +Create listing」をクリック
  4. My organization : Internal Marketplace を選択

  5. Switch tole to create a listing, 「ACCOUNTADMIN」
    リスティングを作るROLEを指定します。(ACCOUNTADMINしか選択できなかった・・・)
  6. Untiteled Listingの画面になる(Draft)
  7. 「+Add data product」を選択、「+ Select」をクリック
    1. 公開するオブジェクトを設定します。
    2. DatabaseとSchemaを選択したあとに、下記のデータオブジェクト種で選択できる
      1. Table
      2. DynamicTable
      3. View
      4. Secure Views
      5. Secure Functions
    3. Share identifierってのが出るのでメモっておく
    4. Saveをクリック
  8. 次に誰がアクセスできるかを設定する
    1. 「+ Access control」をクリックする
    2. 「Access and discovery」 を設定
    3. Grant access
      1. Entire organization : 組織ないなら誰でも
      2. Selected accounts and roles : 選択されたアカウントとロールのみ
      3. No accounts or roles are pre-approved (デフォルト):データ製品はリクエストよって利用可能
      4. Accountsを設定
      5. 今回は、1アカウントで、そのアカウントではすべてのRoleで閲覧可能 と設定
    4. Additional setup needed
      1. Review listing auto-fulfillment settings : 異なるリージョンに自動的にListingする際に、どのくらいの頻度で反映(=リプリケーション)をするか?を設定
      2. Data Product refresh : データ更新方式
        1. Time interval : ◯日毎など
          1. Minutes : ◯分毎
          2. Hours : ◯時間毎
          3. Day(s) : ◯日毎
          4. Week(s) : ◯週毎
        2. Scheduled time : 同時の日時/頻度を設定できる
          1. dairy
          2. weekly
          3. monthly
          4. Custome
    5. Allow discovery : 誰がリストを見つけることができますか?
      1. Entire organization : 組織内の誰でもリストを検索し、アクセスをリクエストできる
      2. Selected accounts and roles : 選択されたアカウントとロールのみがリストを検出できて、アクセスをリクエストできる
      3. Not discoverable by users without access : アクセス権のないユーザはリスト自体を見つけることができない
    6. Approver contact
      1. Use custom email or URL しか選択ができなかった
      2. (Use profile contactはグレー選択不可)
      3. リストを公開するのにApproveが必要な場合に飛んできそうだが、今回の設定ではメールは発砲されなかった。
  9. TitleとUniform Listing Locator(ULL)を指定する
    • <注意>ここのTitle(=ULL)には、「-」が入らないように
      • create database from listing する際に、ULLをダブルクォートで括らねばならなくなる
    • ULLとは、リストとそのデータ製品を 1つとして表す一意の識別子
    • リスト名はタイトルとは異なる
    • 完全な ULL は、記号 '$' で区切られた 3 つの要素で構成
      • 最初の要素はプロバイダーの組織名、
      • 2番目の要素はプロバイダー プロファイル 「INTERNAL」
      • 3 番目の要素はリスト名
  1. Detailsにて、Support Contact を追加する
  2. 画面右上部の「Publish」がクリックできるようになるので、クリック

次に、コンシューマ側のInternal Marketplace を見てみる
公開を許可したアカウントにログインして

  • Data Product -> Marketplace
  • Internal Marketplace タグをクリック(ちょっと分かりづらい)

対象となるLISTを選択して、「Get」をクリック

EmailのVerifyをしてなかったかもしれない・・・・
こんな画面がでたので、EmailのVerifyをする

お使いのメーラでぽちっと(私はGmailで)

最低10分かかるって言われてますね。

Requested : 3 minutes ago ってでましたので、もうちょっとまってみます。

ページを再読込すると「Query in worksheet」ボタンが出たのでクリックします。

Snowsightから、ワークシートに移動、Data Productsってのができてる!(始めて見た)

共有されたリストからDatabaseを作る

CREATE DATABASE <name> FROM LISTING '<listing_global_name>';

だったが、SYSADMINでやったので、上記設定は不要だった
※カスタムロールでやる場合は、CREATE DATABASE権限とIMPORT LISTING IMPORT ORGANIZATION LISTING権限が必要

use role sysadmin;
use warehouse compute_wh;

select * from ORGDATACLOUD$INTERNAL$LIST_DEMO_FOR_KS.FOR_DEMO_SCHEMA.INFO1;
select * from ORGDATACLOUD$INTERNAL$LIST_DEMO_FOR_KS.FOR_DEMO_SCHEMA.INFO1_VIEW;

CREATE or REPLACE DATABASE DB_FROM_LIST_DEMO_FOR_KS FROM LISTING 'ORGDATACLOUD$INTERNAL$LIST_DEMO_FOR_KS';

use database DB_FROM_LIST_DEMO_FOR_KS;
show schemas;
use schema FOR_DEMO_SCHEMA;
show tables;
show views;

こんな感じでコンシューマ側で、Databaseとして読み込むことができた。

ただ、カスタムロールでもできるように検証しておきたい

ドキュメントを見ると、LISTからデータベースを作るにはいくつか権限が必要と記載がありました

  • CREATE DATABASE
  • IMPORT LISTING

ただ、このIMPORT LISTINGという権限は、Snowflakeには存在しませんでした。

use role accountadmin;
create or replace role listing_test_func_role;
grant role listing_test_func_role to role sysadmin;
grant usage on warehouse compute_wh to role listing_test_func_role;

とやって

use role listing_test_func_role;
create or replace database LISTING_DEMO_FOR_KS_DB from listing 'ORGDATACLOUD$INTERNAL$LISTING_DEMO_FOR_KS';

とやると

CREATE DATABASE権限がないと怒れられます。

use role accountadmin;
grant create database on account to role listing_test_func_role;
use role listing_test_func_role;
create or replace database LISTING_DEMO_FOR_KS_DB from listing 'ORGDATACLOUD$INTERNAL$LISTING_DEMO_FOR_KS';

と権限を付与して、LISTINGからDATABASEを作ると・・・

Insufficient privileges to operate on data_exchange_listing 'ORGDATACLOUD$INTERNAL$LISTING_DEMO_FOR_KS'

というエラーが出ました。
IMPORT SHAREを付与してやってみてもエラーは変わらず、わからん・・・・・
ので、ACCOUNTADMINができるのだからACCOUNTADMINに付与されてる権限を見てみよう・・・

use role accountadmin;
show grants to role accountadmin;


なんかおるーーーーーーー
※2025年3月13日現在ドキュメントには記載はなかった!記載はなかった!!!!!(英語版にも)

use role accountadmin;
grant import organization listing on account to listing_test_func_role;

use role listing_test_func_role;
create or replace database LISTING_DEMO_FOR_KS_DB from listing 'ORGDATACLOUD$INTERNAL$LISTING_DEMO_FOR_KS';

Database:LISTING_DEMO_FOR_KS_DBを作成することができました。

use database LISTING_DEMO_FOR_KS_DB;
use schema for_ks_schema;
use warehouse COMPUTE_WH;

show tables;
select * from LISTING_DEMO_FOR_KS_DB.for_ks_schema.info1;
select * from LISTING_DEMO_FOR_KS_DB.for_ks_schema.info1_view;

LISTINGで共有されたテーブルとビューが閲覧できました。

別のカスタムロールで上のDBをみたい

-- 別のロールでみたい
use role securityadmin;
create or replace role listing_test_func_role2;
grant role listing_test_func_role2 to role sysadmin;
grant usage on warehouse COMPUTE_WH to role listing_test_func_role2;

use role listing_test_func_role2;
show databases;

この時点では、当然データベースは見れません。

use role list_ikps_for_ks_db;
grant imported privileges on database LIST_IKPS_FOR_KS_DB to role listing_test_func_role2;

imported privileges 権限を付与することで、他のカスタムロール

use role listing_test_func_role2;
show databases;
use database LIST_IKPS_FOR_KS_DB;
show schemas;
use schema FOR_KS_SCHEMA;
show tables;
use warehouse COMPUTE_WH;
select * from info1;

まとめ

先日、GAになったばかりの組織リスティング/インターナルマーケットプレイスについて検証を行いおこないました。
ダイレクトシェアリングは扱ったことはあったのですがリスティング(組織)は初めてでしたが、ダイレクトシェアリングの進化系ということで、使い勝手もよく、組織内アカウント同士での安全なデータ共有ができるのでとても良いなぁと感じています。

  • 別リージョン同士、組織内限定でデータの共有ができます。
  • 別リージョン間でリスティングするためには、ORGADMINが必要(データ提供を行うアカウント(プロバイダー)にたいして、GLOBAL_DATA_SHARINGの許可を与える)
    • 自動フルフィルメントでリージョン間同期を有効にする必要がある
  • import organization listingっていう組織リスティング向けの権限が生えてた
ちゅらデータ株式会社

Discussion