Snowflakeの外部ステージ設定が『データ統合基盤 CSアナリティクス』を使うと簡単&自動で設定出来るようになります!

2020.10.28

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

SnowflakeにおいてS3からデータロードを行うためには、以下のイメージのようにSnowflake側では「ストレージ統合」および「外部ステージ」を、AWS側では「 IAMロール」を作成してS3バケットを参照できるように準備をする必要があります。

弊社プロダクトのデータ分析基盤「カスタマーストーリー アナリティクス」においてもv5.1.0までは、以下のエントリで解説しているように事前に準備をする必要がありました。

この事前準備は「Snowflake側の設定」および「AWS側の設定」をそれぞれ手動で行う必要があり少々手間だったのですが、このたび v5.2.0 において自動で設定されるようになりましたので、本エントリではこの機能について紹介したいと思います。

CSA JMCの挙動確認バージョン

当エントリの内容は以下のCSA JMCバージョンで挙動を確認しています。

  • CSA JMC v5.2.0

SnowflakeにおけるS3からのデータロードについて

まずは改めてSnowflakeでS3からデータロードを行うにあたって、何が必要かを説明したいと思います。

Snowflakeの「ストレージ統合」と「外部ステージ」

Snowflakeには「ストレージ統合」および「外部ステージ」とよばれるものを利用して、外部クラウドストレージ(ここではS3)を参照できる仕組みがあります。

イメージとしては以下となります。

作成手順としては、まずSnowflake上に「ストレージ統合」を作成し、加えてAWS上で「IAMロール」の作成を行う必要があります。

その上で、作成した「ストレージ統合」を利用する「外部ステージ」をデータベース上に作成することで、クエリベースでS3上のオブジェクトをロード対象として扱うことができるようになります。

CSA JMCによる外部ステージ作成の自動化について

CSA JMCではv5.1.0までは、ユーザー様に上記準備を行っていただく必要があったのですが、v5.2.0からはこれを自動で作成・設定するようになりました。

また、それぞれの作成単位ですがイメージとしては以下のような関係となります。

CSA JMCで「サイト」が作成されると、「IAMロール」と「ストレージ統合」が作成され、「サイト」の設定画面において「データ連携用S3バケット」が設定されると、「インラインポリシー」と「外部ステージ」が作成される仕組みとなっています。

実際に試してみる

では、CSA JMCを利用して実際に試してみたいと思います。CSA JMCで設定を行い、その結果として「AWS側」と「Snowflake側」で、どのように設定がされたかを確認していきます。

CSA JMCの設定

まずはSnowflakeサイトを作成し、サイト設定画面の「Snowflake接続」タブで接続設定を行います。

ここまでは、いままでと変わりません。

次に、「構成要素設定」でS3バケットを設定します。ここも、見た目はいままでと変わりませんが、v5.2.0からは「データ連携用S3バケット」が自動で「外部ステージ」として設定されるようになります。

AWS側の確認

設定が終わったら、まずはAWS側を確認してみます。

以下のように新しくインラインポリシーをもったIAMロールが作成されています。

インラインポリシーは以下のようなポリシーとなっており、「データ連携用S3バケット」に指定したバケットに対する操作を許可しています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion"
            ],
            "Resource": "arn:aws:s3:::csa-devio-snowflake-copy/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::csa-devio-snowflake-copy"
        }
    ]
}

また「信頼関係」も設定がされています。これはSnowflakeの「ストレージ統合」から確認できる設定値が自動設定されています。

AWS側は以上の設定が自動でされており、Snowflake側との連携が可能な状態となっていることが確認できました。

Snowflake側の確認

次にSnowflake側の設定を確認してみます。

SHOW INTEGRATIONSで新規に追加されている「ストレージ統合」について、以下のクエリで詳細を確認してみます。

DESC INTEGRATION "v5demo-csa-snowflake_stage_demo";

STORAGE_ALLOWED_LOCATIONSには、CSA JMCで指定したS3バケットの「データ連携用S3バケット」が設定されています。また、STORAGE_AWS_ROLE_ARNには、先程AWS環境で確認したIAMロールが設定されていることも分かります。

STORAGE_AWS_IAM_USER_ARNSTORAGE_AWS_EXTERNAL_IDについても、先程確認したIAMロールで「信頼関係」として設定されていた値と一致していることが分かります。

次に、肝心の「外部ステージ」も確認します。こちらもSHOW STAGESで新規に追加されている「外部ステージ」について、以下のクエリで詳細を確認してみます。

USE DATABASE CSA;
DESC STAGE "v5demo-csa-snowflake_stage_demo_csa_devio_snowflake_copy";

STAGE_INTEGRATIONには先程確認した「ストレージ統合」が指定されています。またSTAGE_LOCATIONには、CSA JMCで指定したS3バケットの「データ連携用S3バケット」がURL形式で指定されています。

試しにLISTコマンドを実行すると、S3バケット上のファイルがちゃんと参照できていることが分かりますね。

LIST @"v5demo-csa-snowflake_stage_demo_csa_devio_snowflake_copy";

まとめ

以上、CSA JMCのv5.2.0における「Snowflakeの外部ステージ利用設定」の自動設定機能についてご紹介しました。表には出ない地味な機能ですが、外部ステージに関する設定を手動で行う手間が省けるようになりましたので、便利になったかと思います。

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