1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Snowflake Apache Iceberg™ table における Secure Data Sharing 機能を試してみた

Last updated at Posted at 2025-03-09

概要

Snowflake での Apache Iceberg™ テーブルにおける Secure Data Sharing(データ共有)機能について検証し、その結果と検証コードを共有します。本記事では、同じ Snowflake リージョン内の 1 つ以上のアカウントへデータを直接共有する機能を対象としています。

image.png

出所:Secure Data Sharingについて | Snowflake Documentation

Iceberg テーブルに対して「FUTURE TABLE」で権限を付与しようとするとエラーとなるため、新規で作成したテーブルには、その都度権限を付与する必要があります。共有元アカウント(プロバイダー)で、共有にテーブルを追加する際の手順でこの挙動を確認できます。

003503: SQL compilation error: Future grant on objects of type TABLE to SHARE is restricted.

image.png

本記事は「SnowflakeにおけるApache Iceberg機能の完全ガイド」シリーズの一部です。
Apache Iceberg機能の全体像やSnowflake上での活用方法について詳しく知りたい方は、以下の記事をご覧ください。

環境準備

Snowflake Catalog 環境の準備

以下の記事で紹介している環境構築手順を、事前に完了しておいてください。

image.png

出所:Snowflake Catalog における Iceberg テーブルの基本的な操作手順 #Spark - Qiita

Snowflake Open Catalog のアカウントを作成

まず、ORGADMIN ロールに切り替えます。

-- ORGADMIN にカレントロールを変更
USE ROLE ORGADMIN;
SELECT CURRENT_ROLE();

image.png

Snowflake Open Catalog が有効な Snowflake アカウントを新規で作成します。

-- データ共有先の Snowflake アカウントを作成
-- ToDo EMAIL と REEGION をかえる必要あり
CREATE ACCOUNT manabian_comsumer_01_account
   ADMIN_NAME = 'comsumer_admin'
   ADMIN_PASSWORD = 'MySecurePassword2025!'
   EMAIL = 'admin@example.com'
   MUST_CHANGE_PASSWORD = FALSE
   EDITION = ENTERPRISE
   REGION = 'AZURE_EASTUS2';

image.png

次に、Snowflake Open Catalog が有効なアカウントの URL を取得します。

-- カウントの URL を取得
SHOW ACCOUNTS LIKE 'manabian_comsumer_01_account';

image.png

上記で作成したアカウントにログインします。

image.png

ワークスペースで以下のクエリを実行して、Data Sharing Account Identifier の値を取得します。必要に応じて、クラスタを作成してください。

SELECT
    CURRENT_ORGANIZATION_NAME() || '.' || CURRENT_ACCOUNT_NAME() AS "Data Sharing Account Identifier";

データベースおよびテーブルの作成

データベースを作成

CREATE OR REPLACE DATABASE data_sharing_db;
USE DATABASE data_sharing_db

image.png

テーブルの作成

標準テーブルと Iceberg テーブルを作成します。

-- 標準テーブルの作成
CREATE OR REPLACE TABLE nation_standard 
    AS
    SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF10.NATION;
-- Iceberg テーブルの作成
CREATE OR REPLACE ICEBERG TABLE nation_iceberg 
    CATALOG = 'SNOWFLAKE'
    EXTERNAL_VOLUME = 'my_azure_sf_volume'
    BASE_LOCATION = 'nation_iceberg'
    AS
    SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF10.NATION;
SHOW TABLES IN DATABASE data_sharing_db;

image.png

直接共有の実施

共有元アカウント(プロバイダー)で共有の作成と権限付与

まず、共有(SHARE)を作成します。

CREATE OR REPLACE SHARE iceberg_share;

image.png

次に、共有に対してデータベースとスキーマの USAGE 権限を付与します。

GRANT USAGE ON DATABASE data_sharing_db TO SHARE iceberg_share;
GRANT USAGE ON SCHEMA data_sharing_db.public TO SHARE iceberg_share;

image.png

続けて、テーブルに対して SELECT 権限を付与します。標準テーブルと Iceberg テーブルでは権限付与方法が異なる点に注意してください。

-- 標準テーブルの権限を付与
GRANT SELECT ON ALL TABLES IN DATABASE data_sharing_db
    TO SHARE iceberg_share;
-- Iceberg テーブルの権限付与
GRANT SELECT ON ALL ICEBERG TABLES IN DATABASE data_sharing_db
    TO SHARE iceberg_share;

image.png

FUTURE TABLE を用いた権限付与はエラーとなります。

-- 今後作成される標準テーブルの権限を付与
GRANT SELECT ON FUTURE  TABLES IN DATABASE data_sharing_db
    TO SHARE iceberg_share;
-- Iceberg テーブルの権限付与
GRANT SELECT ON FUTURE ICEBERG TABLES IN DATABASE data_sharing_db
    TO SHARE iceberg_share;

003503: SQL compilation error: Future grant on objects of type TABLE to SHARE is restricted.

image.png

付与済みの権限を確認します。

SHOW GRANTS TO SHARE iceberg_share;

image.png

共有先アカウントを追加します。

-- 共有先アカウントで取得した Data Sharing Account Identifier の値をセット
SET data_sharing_account_identifier = 'MTIRXWM.MANABIAN_COMSUMER_01_ACCOUNT';
ALTER SHARE iceberg_share
    ADD ACCOUNTS = $data_sharing_account_identifier;

image.png

共有先アカウント(コンシューマー)にて共有を使ったデータベースの作成

まず、共有先アカウントで有効な共有を表示し、iceberg_share が存在することを確認します。

SHOW SHARES;

image.png

下記のクエリで owner_account_and_name 列の値を確認します。

SHOW SHARES;
SELECT
    CONCAT($3, '.', $4) AS owner_account_and_name
    ,$3 AS owner_account
    ,$4 AS name
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));

image.png

iceberg_shareowner_account_and_name 列の値をもとに共有の詳細を確認します。

DESC SHARE MTIRXWM.ZJA50722.ICEBERG_SHARE;

image.png

取得した owner_account_and_name を使用してデータベースを作成します。

CREATE OR REPLACE DATABASE ICEBERG_SHARE_01_DB
    FROM SHARE MTIRXWM.ZJA50722.ICEBERG_SHARE;
USE DATABASE ICEBERG_SHARE_01_DB;

image.png

作成したデータベースにテーブルが含まれていることを確認します。

SHOW TABLES IN DATABASE ICEBERG_SHARE_01_DB;

image.png

テーブルに対してクエリを発行できることを確認します。

SELECT
    *
    FROM
        NATION_STANDARD
    LIMIT
        3;
SELECT
    *
    FROM
        NATION_ICEBERG
    LIMIT
        3;

image.png

共有元アカウント(プロバイダー)でのテーブル追加

新規テーブル作成後に共有へ権限付与

共有元アカウント(プロバイダー)で新しいテーブルを作成します。

-- Iceberg テーブルの作成
CREATE OR REPLACE ICEBERG TABLE customer_iceberg
    CATALOG = 'SNOWFLAKE'
    EXTERNAL_VOLUME = 'my_azure_sf_volume'
    BASE_LOCATION = 'custmer_iceberg'
    AS
    SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF10.CUSTOMER;

image.png

作成したテーブル customer_iceberg が、まだ共有に含まれていないことを確認します。

SHOW GRANTS TO SHARE iceberg_share;

image.png

全ての Iceberg テーブルを共有に追加し、customer_iceberg が共有に追加されたことを確認します。

-- Iceberg テーブルの権限付与
GRANT SELECT ON ALL ICEBERG TABLES IN DATABASE data_sharing_db
    TO SHARE iceberg_share;
SHOW GRANTS TO SHARE iceberg_share;

image.png

共有先アカウント(コンシューマー)でのクエリ実行

最後に、共有先アカウント(コンシューマー)で新たに追加された customer_iceberg テーブルに対するクエリが可能であることを確認します。

SELECT
    *
    FROM
        CUSTOMER_ICEBERG
    LIMIT
        3;

image.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?