Snowflakeでシェアをするのに必要な権限が変わっていた件

## はじめに

Snowflakeの特徴としてデータシェア機能があります。
これはSnowflakeアカウントを跨いでデータを安全かつ簡単に共有できる機能です。

この機能に関連して、2024年7月のアップデートで重要な変更が行われました。

<https://docs.snowflake.com/en/release-notes/bcr-bundles/2024_07/bcr-1734>

> New privilege MANAGE SHARE TARGET replaces CREATE SHARE to add accounts to shares


しかし、どうやらこのアップデート後の仕様と公式ドキュメントとの間で齟齬が発生している模様で、混乱を招きます。

-> 公式ドキュメントの該当部分 : [Create and configure shares
](https://docs.snowflake.com/en/user-guide/data-sharing-provider)

> Maintaining shares
You must use a role with the OWNERSHIP privilege on a share and the CREATE SHARE global privilege to manage shares.

ドキュメントに従ってやってみると「あれ？ドキュメント通りに設定したけどシェアができないぞ？」みたいな事象が発生しているのではないでしょうか？
少なくとも私はドンピシャでこの罠にハマりました。

この記事では、私が実際に経験した問題と解決方法を共有します。

## ポイント

- 2024年7月のアップデートで、新しいグローバル権限 `MANAGE SHARE TARGET` が登場
- これに伴いカスタムロールでシェアを行うためには「`シェアに対するOWNERSHIP権限`」「`CREATE SHARE（グローバル権限）`」「`MANAGE SHARE TARGET（グローバル権限）`」の3つの考慮が必要になった
- 公式ドキュメントは未だに更新されていないっぽいので要注意


## 問題の背景

再掲ですが、こちらのアップデート情報

<https://docs.snowflake.com/en/release-notes/bcr-bundles/2024_07/bcr-1734>

なんと、2024年7月の変更から半年以上経過した現在（2025年2月時点）でも、公式ドキュメントには以下の古い情報しか記載されていませんでした：

- シェアに対するOWNERSHIP権限
- CREATE SHARE（グローバル権限）

しかし、実際にはこの設定だけでは、シェアターゲットの管理（共有先アカウントの追加・削除）ができなくなっています。

## 変更の詳細

### 変更前（2024年7月以前）

- CREATE SHARE権限に以下の両方の機能が含まれていた(ということになる)
  - SHAREの作成
  - シェアターゲットの管理（共有先アカウントの追加・削除）

### 変更後（2024年7月以降）

- 機能が分離され、より細かな権限管理が可能になった：
  - CREATE SHARE権限：シェアの作成機能のみを担当する権限
  - MANAGE SHARE TARGET権限：新しく導入された、シェアターゲットの管理専用の権限
  
この変更により、シェアの作成とターゲットの管理を異なるロールに割り当てることが可能になりました。

> This new privilege enhances security and control by allowing organizations to assign specific privileges based on job roles.

とのことで、セキュリティ強化を目的として、従来の権限でカバーできていた操作を分離して、新しい権限を新設してその権限でできる様にしたと。より細かく制御ができる様になったということですね。

なお、コミュニティにもこの件について記事がありました。

[Insufficient privileges to operate on share despite holding the CREATE SHARE privilege
](https://community.snowflake.com/s/article/insufficient-privileges-to-operate-on-share-with-create-share-privilege)

## 対応方法

上記の変更があったので、これまでの手順やコードでは対応しきれなくなりました。
これは仕方ないので追従しましょう。

カスタムロールでデータシェアを管理する場合、以下の手順で権限を付与します。

```sql
-- 「share_admin_role」というカスタムロールでシェアを管理しているものとして...

-- グローバル権限を付与するために ACCOUNTADMIN が必要
USE ROLE ACCOUNTADMIN;

-- シェア作成用の権限
GRANT CREATE SHARE ON ACCOUNT TO ROLE share_admin_role;

-- (NEW) シェアターゲット管理用の新権限
GRANT MANAGE SHARE TARGET ON ACCOUNT TO ROLE share_admin_role;
```

これで今まで通り以下が実行できる様になります。

```SQL
USE ROLE share_admin_role;
ALTER SHARE my_share ADD ACCOUNTS = '<account_name_or_locator>';  -- 実際のアカウント名やロケーターに置き換えてください
```


## 実際の動作と注意点

もしかするとご利用中のアカウント次第で違いがあるかもしれませんが、少なくとも私の環境では以下の様な挙動が確認されました。

### アカウントによる挙動の違い

実際の検証で以下のような興味深い挙動の違いが確認されました：

- **既存アカウント**：
  - 追加の権限設定なしでも従来通りシェア機能が動作
      - つまり CREATE SHARE権限のみで、シェアターゲットの管理も可能
      - もしかしたら、1度でもCREATE SHARE 権限を付与したロールでシェアをしたことがあるアカウントに限られる挙動なのかもしれない
  - `SHOW GRANTS TO ROLE ...` でみる限り MANAGE SHARE TARGET 権限は明示的に付与されていなかった

- **新規アカウント**：
  - 新しく作成されたアカウントでは、同じ権限設定では動作せず
  - MANAGE SHARE TARGET 権限の明示的な付与が必要

この違いは公式サポートの回答でも明確に説明されておらず、実際の運用で発見された事象です。

一応、[アップデートの記事](https://docs.snowflake.com/en/release-notes/bcr-bundles/2024_07/bcr-1734)には...

> After this behavior change bundle is enabled, roles with CREATE SHARE will automatically receive MANAGE SHARE TARGET to ensure compatibility.

と書いてあるので、裏で対応してくれていたのでしょうか。

### 運用上の注意点

- 既存のCREATE SHARE権限を持つロールには、互換性維持のため自動的にMANAGE SHARE TARGET権限が付与されるとされているが、明示的な付与が必要な場合がある
- IaC等で権限管理を行っている場合は、アカウントの作成時期によって必要な設定が異なる可能性がある
- 新規アカウントで、カスタムロールを用いてシェア機能を管理する場合は、MANAGE SHARE TARGET権限も付与すること
- (当然かもですが) ACCOUNTADMINには自動的にMANAGE SHARE TARGET権限が付与される模様
    - 新規アカウントでもACCOUNTADMINなら特に気にせずシェア先の追加ができた

## おわりに

私の開発プロジェクトでは、Snowflakeの構築手順を整備しており、これまでは特に問題なく同じ手順で構築できていました。

タイミング悪くこの事象に遭遇してしまい、流石に焦りました...

おそらくこの先どこかしらで公式ドキュメントが更新されるかと思いますが、ドキュメントが追いついていない現時点では、参考になれば幸いです。

(おさらいがてら、URLを再掲)
- ドキュメント : https://docs.snowflake.com/en/user-guide/data-sharing-provider
- アップデート情報 : https://docs.snowflake.com/en/release-notes/bcr-bundles/2024_07/bcr-1734
- コミュニティ : https://community.snowflake.com/s/article/insufficient-privileges-to-operate-on-share-with-create-share-privilege

以上です。