SnowflakeのS3外部ステージが問題なく利用できるかを各クラウドプラットフォームで試してみた

2020.11.06

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

Snowflakeは複数のクラウドプラットフォームに対応しており、現在は「Amazon Web Service(AWS)」、「Google Cloud Platform」、「Microsoft Azure」の どのプラットフォーム上で動かすかを環境作成時に選択することができます。

また、データをSnowflakeにロードする際には「外部ステージ」として設定した各クラウドストレージ上(Amazon S3、Google Cloud Storage、Microsoft Azure)のデータをロードすることができますが、その際にSnowflake自体がどのクラウドプラットフォーム上で動いているかは問われません。

当エントリでは、実際に各クラウドプラットフォームの環境でS3バケットを外部ステージとして定義し、同様に動作するかを試してみたいと思います。

前提

検証の為には、以下の記事のようにSnowflake側での「ストレージ統合」、「外部ステージ」の作成や、S3バケットが存在するAWS側での「IAMロール」、「IAMポリシー」の設定が必要となります。

この設定はちょっと手間なのですが、ちょうど最近弊社プロダクトでこの連携自動化に対応したので、こちらの機能を利用しつつ検証してみたいと思います。

また、ユーザーは今回は検証のため「ACCOUNTADMIN」ロールを持つユーザを利用し、「仮想ウェアハウス」、「データベース」については事前に以下のクエリで作成しておきます。(各オブジェクトの作成も今回は「ACCOUNTADMIN」ロールで済ませてしまいます

-- ロール切り替え
USE ROLE ACCOUNTADMIN;

-- 仮想ウェアハウスを作成
CREATE WAREHOUSE STAGE_TEST_WH WITH WAREHOUSE_SIZE = 'XSMALL' WAREHOUSE_TYPE = 'STANDARD' AUTO_SUSPEND = 60 AUTO_RESUME = TRUE;

-- データベースを作成
CREATE DATABASE STAGE_TEST_DB;

各クラウドプラットフォームのSnowflake環境で上記クエリを実行して準備完了です。

確認方法について

まずはSnowflakeの環境を、以下のクエリで確認しておきます。

-- ROLE, WAREHOUSE, DATABASEを設定
USE ROLE ACCOUNTADMIN;
USE WAREHOUSE STAGE_TEST_WH;
USE DATABASE STAGE_TEST_DB;

-- 現在のリージョンを確認
SELECT CURRENT_REGION();

つぎに、本エントリでは詳細は省きますが「CSA JMC」で「サイト」を作成し、サイトの設定を行うことで、自動で外部ステージ作成までを一気に行います。

その後、Snowflake側で「ストレージ統合」と「外部ステージ」を、それぞれ以下のようなクエリで問題なく作成されているかを確認します。

-- ストレージ統合の確認
SHOW INTEGRATIONS;
SELECT
  "name",
  "type",
  "category",
  "enabled"
FROM
  TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE
  "name" = 'ootakadaisuke-csa-stage_test_aws';
-- 外部ステージの確認
SHOW STAGES;
SELECT
  "name",
  "database_name",
  "schema_name",
  "region",
  "type"
FROM
  TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE
  "name" = 'ootakadaisuke-csa-stage_test_aws_ootakadaisuke_csa_data_bucket';

最後に、LISTコマンドで問題なくS3バケット上のオブジェクトが見えているか確認します。

-- S3上のオブジェクトを確認
LIST @"ootakadaisuke-csa-stage_test_aws_ootakadaisuke_csa_data_bucket"/sample.csv;

各環境で確認してみる

では、さっそく確認していってみましょう。

Amazon Web Service(AWS)

まずはAWSからです。「CSA JMC」での設定後のそれぞれの確認結果です。

現在のリージョンを確認

╒════════════════════╕                                                          
│ CURRENT_REGION()   │
╞════════════════════╡
│ AWS_AP_NORTHEAST_1 │
╘════════════════════╛
1 Row(s) produced. Time Elapsed: 0.101s

ストレージ統合の確認

╒══════════════════════════════════╤════════════════╤══════════╤═════════╕      
│ name                             │ type           │ category │ enabled │
╞══════════════════════════════════╪════════════════╪══════════╪═════════╡
│ ootakadaisuke-csa-stage_test_aws │ EXTERNAL_STAGE │ STORAGE  │ true    │
╘══════════════════════════════════╧════════════════╧══════════╧═════════╛
1 Row(s) produced. Time Elapsed: 1.976s

外部ステージの確認

╒════════════════════════════════════════════════════════════════╤═══════════════╤═════════════╤════════════════╤══════════╕
│ name                                                           │ database_name │ schema_name │ region         │ type     │
╞════════════════════════════════════════════════════════════════╪═══════════════╪═════════════╪════════════════╪══════════╡
│ ootakadaisuke-csa-stage_test_aws_ootakadaisuke_csa_data_bucket │ STAGE_TEST_DB │ PUBLIC      │ ap-northeast-1 │ EXTERNAL │
╘════════════════════════════════════════════════════════════════╧═══════════════╧═════════════╧════════════════╧══════════╛
1 Row(s) produced. Time Elapsed: 0.893s

S3上のオブジェクトを確認

╒═══════════════════════════════════════════════╤══════╤══════════════════════════════════╤══════════════════════════════╕
│ name                                          │ size │ md5                              │ last_modified                │
╞═══════════════════════════════════════════════╪══════╪══════════════════════════════════╪══════════════════════════════╡
│ s3://ootakadaisuke-csa-data-bucket/sample.csv │   32 │ fe95ecec86881f210429b825222a0f24 │ Thu, 5 Nov 2020 10:01:53 GMT │
╘═══════════════════════════════════════════════╧══════╧══════════════════════════════════╧══════════════════════════════╛
1 Row(s) produced. Time Elapsed: 3.564s

特に問題なくS3バケットを外部ステージとして認識しており、オブジェクトも見れていますね。

Google Cloud Platform

次に、GCPです。

現在のリージョンを確認

╒══════════════════╕                                                            
│ CURRENT_REGION() │
╞══════════════════╡
│ GCP_US_CENTRAL1  │
╘══════════════════╛
1 Row(s) produced. Time Elapsed: 0.164s

ストレージ統合の確認

╒══════════════════════════════════╤════════════════╤══════════╤═════════╕      
│ name                             │ type           │ category │ enabled │
╞══════════════════════════════════╪════════════════╪══════════╪═════════╡
│ ootakadaisuke-csa-stage_test_gcp │ EXTERNAL_STAGE │ STORAGE  │ true    │
╘══════════════════════════════════╧════════════════╧══════════╧═════════╛
1 Row(s) produced. Time Elapsed: 0.809s

外部ステージの確認

╒════════════════════════════════════════════════════════════════╤═══════════════╤═════════════╤════════════════╤══════════╕
│ name                                                           │ database_name │ schema_name │ region         │ type     │
╞════════════════════════════════════════════════════════════════╪═══════════════╪═════════════╪════════════════╪══════════╡
│ ootakadaisuke-csa-stage_test_gcp_ootakadaisuke_csa_data_bucket │ STAGE_TEST_DB │ PUBLIC      │ ap-northeast-1 │ EXTERNAL │
╘════════════════════════════════════════════════════════════════╧═══════════════╧═════════════╧════════════════╧══════════╛
1 Row(s) produced. Time Elapsed: 0.919s

S3上のオブジェクトを確認

╒═══════════════════════════════════════════════╤══════╤══════════════════════════════════╤══════════════════════════════╕
│ name                                          │ size │ md5                              │ last_modified                │
╞═══════════════════════════════════════════════╪══════╪══════════════════════════════════╪══════════════════════════════╡
│ s3://ootakadaisuke-csa-data-bucket/sample.csv │   32 │ fe95ecec86881f210429b825222a0f24 │ Thu, 5 Nov 2020 10:01:53 GMT │
╘═══════════════════════════════════════════════╧══════╧══════════════════════════════════╧══════════════════════════════╛
1 Row(s) produced. Time Elapsed: 1.996s

こちらも外部ステージ、オブジェクト共に問題なく見れていますね。

Microsoft Azure

最後にAzureです。

現在のリージョンを確認

╒═════════════════════╕                                                         
│ CURRENT_REGION()    │
╞═════════════════════╡
│ AZURE_SOUTHEASTASIA │
╘═════════════════════╛
1 Row(s) produced. Time Elapsed: 0.296s

ストレージ統合の確認

╒════════════════════════════════════╤════════════════╤══════════╤═════════╕    
│ name                               │ type           │ category │ enabled │
╞════════════════════════════════════╪════════════════╪══════════╪═════════╡
│ ootakadaisuke-csa-stage_test_azure │ EXTERNAL_STAGE │ STORAGE  │ true    │
╘════════════════════════════════════╧════════════════╧══════════╧═════════╛
1 Row(s) produced. Time Elapsed: 1.014s

外部ステージの確認

╒══════════════════════════════════════════════════════════════════╤═══════════════╤═════════════╤════════════════╤══════════╕
│ name                                                             │ database_name │ schema_name │ region         │ type     │
╞══════════════════════════════════════════════════════════════════╪═══════════════╪═════════════╪════════════════╪══════════╡
│ ootakadaisuke-csa-stage_test_azure_ootakadaisuke_csa_data_bucket │ STAGE_TEST_DB │ PUBLIC      │ ap-northeast-1 │ EXTERNAL │
╘══════════════════════════════════════════════════════════════════╧═══════════════╧═════════════╧════════════════╧══════════╛
1 Row(s) produced. Time Elapsed: 0.776s

S3上のオブジェクトを確認

╒═══════════════════════════════════════════════╤══════╤══════════════════════════════════╤══════════════════════════════╕
│ name                                          │ size │ md5                              │ last_modified                │
╞═══════════════════════════════════════════════╪══════╪══════════════════════════════════╪══════════════════════════════╡
│ s3://ootakadaisuke-csa-data-bucket/sample.csv │   32 │ fe95ecec86881f210429b825222a0f24 │ Thu, 5 Nov 2020 10:01:53 GMT │
╘═══════════════════════════════════════════════╧══════╧══════════════════════════════════╧══════════════════════════════╛
1 Row(s) produced. Time Elapsed: 4.171s

こちらも問題ありませんね。

まとめ

以上、各クラウドプラットフォームの環境でS3バケットの外部ステージが同様に動作するか検証してみました!

「外部ステージ」を利用する際には、まずは「ストレージ統合」を作成しますが、パラメータでSTORAGE_PROVIDERを指定します。今回はS3を指定して作成したことで、Snowflakeがどのクラウドプロバイダー上にホストされているかは関係なく、AWSのS3を外部ステージとして扱うことができていました。

Snowflakeアカウントをホストするクラウドプロバイダーに関係なく、Amazon S3、Google Cloud Storage、またはMicrosoft Azureクラウドストレージをサポートするようにストレージ統合を構成できます。

実際に検証した通り、どのクラウドプラットフォームでも全く問題ありませんでしたので、特にSnowflake側の環境は気にせずにS3バケットを外部ステージとして利用することが出来そうです。

どなたかのお役に立てば幸いです。それでは!