【Snowflake】Snowflake ~ ストレージ統合 ~

■ はじめに

Snowflakeのストレージ統合(Storage Integration)について
予習をする

目次

【1】ストレージ統合(Storage Integration)
【2】利点
【3】基本操作
 1)ストレージ統合作成
 2)ストレージ統合確認
 3)ストレージ統合の一覧表示
【4】権限付与
【5】その他の操作
 1)ストレージ統合の変更
【6】アクセスエラーについて

【1】ストレージ統合(Storage Integration)

https://docs.snowflake.com/ja/sql-reference/sql/create-storage-integration.html

より抜粋
~~~~~
外部クラウドストレージ用に生成されたIDおよび
アクセス管理(IAM)エンティティを許可またはブロックされたストレージの場所
(Amazon S3、Google Cloud Storage、またはMicrosoft Azure)の
オプションセットとともに格納するSnowflakeオブジェクト
~~~~~
 => 分かりづれ、、、
 => クラウドストレージ(S3/Google Cloud Storage/Microsoft Azure)と
  Snowflakeとを接続するためのオブジェクト
 => クラウドストレージにアクセスする際には、
  この「ストレージ統合」を経由して、接続する

【2】利点

1)ステージの作成時/データのロードまたはアンロード時に
  認証情報の提供を回避できる
 => データのロードまたはアンロードについては、
  以下の関連記事を参照のこと

Snowflake ~ 基本編 / データロード ~
https://dk521123.hatenablog.com/entry/2021/11/15/221245
Snowflake ~ データ アンロード ~
https://dk521123.hatenablog.com/entry/2022/07/04/172738

【3】基本操作

1)ストレージ統合作成

https://docs.snowflake.com/ja/sql-reference/sql/create-storage-integration.html

-- AWS/S3の場合
CREATE STORAGE INTEGRATION 【ストレージ統合名】
    TYPE = EXTERNAL_STAGE
    STORAGE_PROVIDER = S3
    ENABLED = TRUE
    STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::【S3のAWSアカウントID】:role/【ロール名】'
    STORAGE_ALLOWED_LOCATIONS = ('s3://【S3のバケット名】/【パス】/')
;

STORAGE_AWS_ROLE_ARN

* S3バケットに対する権限を付与するIAMロールのARN

STORAGE_ALLOWED_LOCATIONS

* ストレージの場所(S3バケットなど。複数指定可能)

補足:実際にAWS S3に接続する場合
https://docs.snowflake.com/ja/user-guide/data-load-s3-config-storage-integration.html

より抜粋
~~~~~~~~~~~~~~~~~
ステップ1:S3バケットのアクセス許可を構成する
ステップ2: IAM AWS ロールを作成する
ステップ3:Snowflakeでクラウドストレージ統合を作成する
ステップ4:Snowflakeアカウントの AWS IAM ユーザーを取得する
ステップ5:バケットオブジェクトにアクセスするために IAM ユーザー権限を付与する
ステップ6:外部ステージを作成する
~~~~~~~~~~~~~~~~~

詳細は、下記の公式ドキュメントを一読した方がいいかも。

https://docs.snowflake.com/ja/user-guide/data-load-s3-config-storage-integration.html

2)ストレージ統合確認

https://docs.snowflake.com/ja/sql-reference/sql/desc-integration.html

DESC INTEGRATION 【ストレージ統合名】;

補足

* アクセス制限がどのようにされているかが確認できる
# PROPERTY Value メモ
1 ENABLED true 有効・無効
2 STORAGE_PROOVIDER s3 ストレージ種類
3 STORAGE_ALLOWED_LOCATIONS s3://your-bucket 許可しているパス
4 STORAGE_VLOCKED_LOCATIONS ブロックしているパス
5 STORAGE_AWS_IAM_USER_ARN arn:aws:iam::xxxx:user/xxxx Snowflakeアカウント用に作成された AWS IAM ユーザ
6 STORAGE_AWS_ROLE_ARN arn:aws:iam::xxxxx:role/myrole S3バケットに対する権限を付与するIAMロールのARN
7 STORAGE_AWS_EXTERNAL_ID MYACCOUNT_SFCRole=xxx/xxxx 信頼関係を確立するために必要な外部 ID

https://docs.snowflake.com/ja/user-guide/data-load-s3-config-storage-integration.html

3)ストレージ統合の一覧表示

https://docs.snowflake.com/ja/sql-reference/sql/show-integrations.html

SHOW INTEGRATIONS;

SHOW INTEGRATIONS LIKE '【絞り込みたいパターン】' ;
-- SHOW INTEGRATIONS LIKE 'demo%'

【4】権限付与

-- 使用権限付与
GRANT USAGE
  ON INTEGRATION <your_integration_name>
  TO ROLE <your_role>;

-- 所有権付与
GRANT OWNERSHIP
   ON INTEGRATION <your_integration_name>
  TO ROLE <your_owner_role>
  COPY CURRENT GRANTS; 

https://docs.snowflake.com/ja/sql-reference/sql/grant-privilege.html
https://docs.snowflake.com/ja/sql-reference/sql/grant-ownership.html

【5】その他の操作

1)ストレージ統合の変更

例1:ストレージ統合を有効にする

-- alter storage integration <your_integ> set <item> = <value>;
alter storage integration myint set enabled = true;

https://docs.snowflake.com/ja/sql-reference/sql/alter-storage-integration.html

例2:アクセスできるS3バケットを複数にする

ALTER STORAGE INTEGRATION
  your_integ
SET
  -- ( ) で 配列を表現
  STORAGE_ALLOWED_LOCATIONS = ('s3://your-bucket-name1/', 's3://your-bucket-name2/');

【6】アクセスエラーについて

* 以下の関連記事を参照のこと

エラー「Failure using stage area. ... AccessDenied」時の対応
https://dk521123.hatenablog.com/entry/2022/10/27/195547

参考文献

https://dev.classmethod.jp/articles/snowflake-s3-integration-by-cfn/
https://blog.serverworks.co.jp/snowflake-import-from-s3
https://dmscube.com/view/post/0/38558

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ 基本編 / ステージ ~
https://dk521123.hatenablog.com/entry/2022/09/01/220643
Snowflake ~ 基本編 / データロード ~
https://dk521123.hatenablog.com/entry/2021/11/15/221245
Snowflake ~ データ アンロード ~
https://dk521123.hatenablog.com/entry/2022/07/04/172738
Snowflake ~ テストデータ作成 / generator ~
https://dk521123.hatenablog.com/entry/2022/06/20/095659
Snowflake ~ Partition構成のデータを取り込む ~
https://dk521123.hatenablog.com/entry/2022/10/28/000925
エラー「Failure using stage area. ... AccessDenied」時の対応
https://dk521123.hatenablog.com/entry/2022/10/27/195547
エラー「Error assuming AWS_ROLE」時の対応
https://dk521123.hatenablog.com/entry/2022/11/25/175912