SnowflakeのS3外部ステージが問題なく利用できるかを各クラウドプラットフォームで試してみた
こんにちは!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
╒═══════════════════════════════════════════════╤══════╤══════════════════════════════════╤══════════════════════════════╕ │ 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
╒═══════════════════════════════════════════════╤══════╤══════════════════════════════════╤══════════════════════════════╕ │ 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
╒═══════════════════════════════════════════════╤══════╤══════════════════════════════════╤══════════════════════════════╕ │ 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バケットを外部ステージとして利用することが出来そうです。
どなたかのお役に立てば幸いです。それでは!