データ分析基盤「カスタマーストーリー アナリティクス」がSnowflakeに対応しました! ~CSA JMCでSnowflake連携を行うための設定手順~

2020.09.09

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

弊社プロダクトのカスタマーストーリー アナリティクス(Customer Story Analytics:CSA)が、Snowflakeに対応しました。対応サービスはCSA Job Management Console(CSA JMC)です。

対応機能としては、まずは「SQLクエリをSnowflakeに対して実行できる」という第一歩からとはなりますが、今後は更に機能追加を行っていく予定です。当エントリでは「CSA JMC」でSnowflake連携を行うにあたり「Snowflake環境の準備」および「CSA JMCで必要なサイト設定」についてご紹介します。

「CSA」の概要についてはこちらの記事をご参照ください。

また、「CSA JMC」バージョン5.0の概要については、こちらの記事で紹介しています。

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

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

  • CSA JMC v5.0.0

Snowflake環境の準備

まずはCSA JMCから接続するSnowflake環境の準備を行っていきます。なお、ここではSnowflakeアカウントは開設済みであることを前提としています。

また、Snowflake上での権限やユーザー、データの管理については、色々な考え方やポリシーがあると思いますが、ここでは以下の考え方をベースとしてCSA JMCに接続するための準備を行います。

  • CSA用に新規に専用の「ロール」を作成する
  • CSA用に新規に専用の「仮想ウェアハウス」を作成し、該当ロールで利用可能とする
  • CSA用に新規に専用の「データベース」を作成し、該当ロールで利用可能とする
  • CSA用に新規に専用の「ユーザー」を作成し、該当ロールに所属させる

「ロール」の作成

はじめに権限管理のベースとなる「ロール」から作成していきます。「ロール」はカスタムロールを作成し、ベストプラクティスに従ってSYSADMINを上位ロールに設定します。

-- カスタムロールを作成
USE ROLE USERADMIN;
CREATE ROLE "CSA" COMMENT = 'Role for CSA';
GRANT ROLE "CSA" TO ROLE "SYSADMIN";

「仮想ウェアハウス」の作成と「ロール」の割り当て

次に「仮想ウェアハウス」の作成と「ロール」の割り当てを行います。仮想ウェアハウスCSA_WHXSMALLサイズとし、1分(60秒)で自動サスペンドするようにします。また、カスタムロールCSAに対して、作成した仮想ウェアハウスCSA_WHUSAGEOPERATE権限を付与します。

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

-- 権限をカスタムロールへ付与
USE ROLE SECURITYADMIN;
GRANT USAGE   ON WAREHOUSE CSA_WH TO CSA;
GRANT OPERATE ON WAREHOUSE CSA_WH TO CSA;

「データベース」の作成と「ロール」の割り当て

続いて「データベース」の作成と「ロール」の割り当てを行います。また、カスタムロールCSAに対して、作成したデータベースCSAと、そのスキーマCSA.PUBLICOWNERSHIP権限を付与します。

-- データベースを作成
USE ROLE SYSADMIN;
CREATE DATABASE CSA;

-- 権限をカスタムロールへ付与
USE ROLE SECURITYADMIN;
GRANT OWNERSHIP ON DATABASE CSA        TO CSA;
GRANT OWNERSHIP ON SCHEMA   CSA.PUBLIC TO CSA;

「ユーザー」の作成と「ロール」の割り当て

最後に「ユーザー」の作成と「ロール」の割り当てを行います。

ユーザーには明示的にDEFAULT_ROLEDEFAULT_WAREHOUSEに先程作成したものを、DEFAULT_NAMESPACEPUBLICスキーマを割り当てています。また「CSA JMC」でのみ利用するユーザなので、MUST_CHANGE_PASSWORDFALSEとして初回パスワード変更を不要としています。

作成したユーザは、カスタムロールCSAに所属させて準備完了です。

-- ユーザーを作成
USE ROLE USERADMIN;
CREATE USER "CSA_ADMIN"
  PASSWORD = '************************'
  LOGIN_NAME = 'CSA_ADMIN'
  DISPLAY_NAME = 'CSA_ADMIN'
  FIRST_NAME = 'CSA'
  LAST_NAME = 'ADMIN'
  EMAIL = 'sample@foobar.com'
  DEFAULT_ROLE = "CSA"
  DEFAULT_WAREHOUSE = 'CSA_WH'
  DEFAULT_NAMESPACE = 'PUBLIC'
  MUST_CHANGE_PASSWORD = FALSE
;
GRANT ROLE "CSA" TO USER "CSA_ADMIN";

CSA JMCで必要なサイト設定

Snowflake側の設定が完了したので、今度は「CSA JMC」のサイト設定を行います。メニューの「サイト管理 > サイト設定」から設定画面へ移ります。

接続設定

まずは「Snowflake接続」タブの接続設定からです。

Snowflakeへの接続情報として必要な情報は以下のとおりです。

  • ユーザ名
  • パスワード
  • アカウント
  • ロール
  • ウェアハウス
  • データベース
  • スキーマ

それぞれ、先程Snowflakeで作成したものを指定していきます。「アカウント」については、SnowflakeログインURLのsnowflakecomputing.com より前の値がアカウントになります。例えば https://xy12345.ap-northeast-1.aws.snowflakecomputing.com/ の場合には、xy12345.ap-northeast-1.awsとなります。

入力が完了したら「接続テスト」をクリックして、接続に問題がないことを確認し「保存」します。

構成要素設定

つぎに「構成要素設定」タブです。

こちらでは「データ連携用S3バケット」、「SQL用S3バケット」、「プログラム用S3バケット」を設定します。それぞれ以下のような用途となります。

  • データ連携用S3バケット
    • Snowflake にロードするファイルを配置するバケット
  • SQL用S3バケット
    • CSA の構成要素として登録する SQL を保管するバケット
  • プログラム用S3バケット
    • CSA の構成要素として登録する Python プログラムを保管するバケット

まずはS3バケットを用意する必要がありますので、AWS管理コンソールにログインして、それぞれ作成していきます。

S3バケットの作成

今回はそれぞれ以下の名前のバケットを作成します。

  • データ連携用S3バケット
    • devio-snowflake-v5-copy-bucket
  • SQL用S3バケット
    • devio-snowflake-v5-sql-bucket
  • プログラム用S3バケット
    • devio-snowflake-v5-program-bucket

バケットのパブリックアクセス設定については「全てブロック」した形で問題ありません。また、バケットポリシーについても、追加設定は必要ありません。

「データ連携用S3バケット」にはデータ連携で用いるためのフォルダが必要となります。以下の6つのフォルダを作成してください。

  • init
  • manual
  • hourly
  • daily
  • weekly
  • monthly

これでS3バケットの作成ができました。次に、このバケットに対するアクセス権限の設定をIAMロールのインラインポリシーに対して行う必要があります。

IAMロールのインラインポリシー設定

対象となるIAMロールは2つあり、「ECSタスク IAMロール」と「Lambda IAMロール」の2つです。こちらは、先程確認した「CSA JMC」の「構成要素設定」タブに表示されていたものです。

AWS管理コンソールから該当のIAMロールを開いて、「〜app-s3-policy」という名前が付いているインラインポリシーに対して以下のように追加設定を行います。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::xxxxxxxxxxxxxxx-csa-data-bucket",
                "arn:aws:s3:::xxxxxxxxxxxxxxx-csa-system-bucket",
                "arn:aws:s3:::devio-snowflake-v5-copy-bucket",
                "arn:aws:s3:::devio-snowflake-v5-sql-bucket",
                "arn:aws:s3:::devio-snowflake-v5-program-bucket"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::xxxxxxxxxxxxxxx-csa-data-bucket/*",
                "arn:aws:s3:::xxxxxxxxxxxxxxx-csa-system-bucket/*",
                "arn:aws:s3:::devio-snowflake-v5-copy-bucket/*",
                "arn:aws:s3:::devio-snowflake-v5-sql-bucket/*",
                "arn:aws:s3:::devio-snowflake-v5-program-bucket/*"
            ],
            "Effect": "Allow"
        }
    ]
}

「ECSタスク IAMロール」と「Lambda IAMロール」の両方に対して設定を行ったら完了です。

構成要素設定にバケットを設定する

最後に改めて「CSA JMC」の画面に戻り、バケットを設定します。先程作成した以下のバケットをそれぞれ入力して「保存」します。

  • データ連携用S3バケット
    • devio-snowflake-v5-copy-bucket
  • SQL用S3バケット
    • devio-snowflake-v5-sql-bucket
  • プログラム用S3バケット
    • devio-snowflake-v5-program-bucket

これで、CSA JMCでSnowflake連携を行うための設定が完了しました。

まとめ

以上、CSA JMCでSnowflake連携を行うための設定についてご紹介しました。次回以降は、具体的な利用方法を含めご紹介していきたいと思います。

お知らせ

2020/09/29(火)にCSアナリティクスが対応している各データウェアハウス(Redshift、BigQuery、Snowflake)と、CSアナリティクスについての解説を行うウェビナーを開催予定です。ご興味がありましたら是非お申し込みください。