SnowflakeでGCSのバケットを外部ステージに設定してみた
さがらです。
SnowflakeでGCSのバケットを外部ステージに設定してみたので、その内容をまとめてみます。
基本的には下記のドキュメントの内容に沿って進めていきます。
Storage Integrationの定義
まず、Snowflake上で下記のクエリを実行してStorage Integrationを作成します。
必要に応じてSTORAGE_BLOCKED_LOCATIONS
のオプションも定義した上で実行してください。
CREATE STORAGE INTEGRATION <任意のStorage Integration名>
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'GCS'
ENABLED = TRUE
STORAGE_ALLOWED_LOCATIONS = ('gcs://<bucket>/<path>/', 'gcs://<bucket>/<path>/');
連携用のサービスアカウントの取得
先ほど作成したStorage Integrationから、Google Cloudと連携するためのサービスアカウントを取得します。
DESC STORAGE INTEGRATION <作成したStorage Integration名>;
出力された結果のうち、STORAGE_GCP_SERVICE_ACCOUNT
の値を確認します。
Google CloudでカスタムIAMロールを作成
次に、Storage Integrationで確認したサービスアカウントに紐づけるカスタムIAMロールを作成します。
下図は公式ドキュメントからの引用ですが、必要な権限を設定してください。
下図は実際に私が行った際の例です。上図のData loading and unloading
の権限を付与しています。
確認したサービスアカウントに対してカスタムIAMロールを付与
SnowflakeのStorage Integrationで確認したサービスアカウントに対して、カスタムIAMロールを付与します。
Google CloudのIAMの画面からアクセスを許可
を押し、表示された画面で下図のようにサービスアカウントとカスタムロールを指定して保存
を押します。
外部ステージを作成
これで準備が整ったので、外部ステージを作成していきます。
-- 作成したStorage Integrationを別のロールに権限付与
GRANT USAGE ON INTEGRATION <作成したStorage Integration名> TO ROLE <ACCOUNTADMIN以外のロール>;
-- 外部ステージの作成
USE ROLE <上記のクエリでUSAGEを付与したロール>;
CREATE STAGE <任意のステージ名>
URL = 'gcs://<bucket>/<path>/'
STORAGE_INTEGRATION = <作成したStorage Integration名>;
この上で、ステージ上のファイルの情報を取得するクエリを実行してみると、下図のように結果が得られました。
SELECT
METADATA$FILENAME AS FILE_PATH,
METADATA$FILE_LAST_MODIFIED AS LAST_MODIFIED
FROM @<作成したステージ名>
ORDER BY METADATA$FILE_LAST_MODIFIED DESC;