Hanatare's PaPa

Make life a little richer.

Virtual Space of Hanatare's PaPa

人生をほんの少しだけ充実させる

【Architecture】dbtとSnowflakeを使ってデータパイプライン構築する(基盤構築編)

生成AIの台頭によって、エンジニアに求められるスキルは、生成AIを含む様々なアプリケーションをインテグレートさせてクライアントの業務を実現させるための力が求められいるように感じます。その中で、個人的にデータインテグレーションはよりその重要度を増してきています。こうしたデータ分析基盤を作るという分野に興味を持たれている方も増えてきているのではないかなと思います。ただ、一方でこうしたことを学ぶための環境は、限られていて一個人では様々なサービスを使うことは難しかったりします。そういった中で、今回は、可能な限り無料で利用できるサービスを使い、データ変換パイプラインの構築を行っていきたいと思います。

少し記事の内容が長くなるので2回に分けてご紹介したいと思いますので、是非読んでいただけたら嬉しいです。

記事のポイント
  • dbtとSnowflakeの役割を理解する
  • 完全に無料の範囲で、データパイプライン構築の第一歩を踏み出すための環境を構築する
  • SnowflakeのPartner Connectを使い、簡単かつ迅速にdbt Cloudとの連携を完了させる

概要 - Snowflakeとdbtについて

最近、データの世界で「ELT」という言葉をよく耳にします。これは、データをExtract(抽出)し、データウェアハウスにLoad(格納)し、その後でTransform(変換・加工)するという考え方です。今回は以下のSnowflakeとdbtを組み合わせ、柔軟で管理しやすく、スケールするデータ基盤を構築します。具体的には、Snowflakeに存在するサンプルデータ(生データ)を、dbtを使って変換し、誰でも分析しやすい綺麗なデータマートを構築するまでの一連の流れを実践したいと思います。

Snowflake

ELTプロセスにおける、巨大で高性能な「データを保管・処理する倉庫(データウェアハウス)」の役割を担います。

dbt (data build tool)

その倉庫の中で、SQLを使って原材料(生データ)を製品(分析用データ)へと美しく加工する「職人」です

前提 - 無料枠を使うための注意点

今回の記事で紹介する範囲ではすべて無料で利用ができます。しかし、それは「無料枠」という範囲内で作業を収めることで無料になるとしています。そのため、期日をすぎたり、想定以上の実行を行ってしまうと課金になってしまいますのでご注意ください。

Snowflakeの無料トライアル

$400分のクレジットを提供しますが、設定を誤ると数日で使い切ってしまう可能性があります。

dbt Cloudの無料プラン

モデル実行回数の上限がありますが、開発中の実行はカウントされないという仕様があります。

今回使う各サービスの無料枠と、その注意点をまとめた比較表

サービス (Service) プラン名 (Plan Name) 主な制限 (Key Limitations) 賢く使うためのTips (Tips for Smart Usage)
Snowflake Free Trial 30日間 または $400分のクレジット消費まで ウェアハウスサイズはX-SMALLを選択する。 ウェアハウスの自動サスペンド(自動停止)を5分に設定し、無駄なクレジット消費を徹底的に防ぐ 。
dbt Cloud Developer Plan 1 Developer seat、月間3,000回の本番ジョブでのモデル実行成功数 開発環境(IDE)でのdbt runはカウント対象外 。テストやseedなどもカウントされないため、開発中は回数を気にせず試行錯誤できる。

環境準備

それでは、早速環境の方を準備していきたいと思います。

Snowflakeでデータウェアハウスを準備する

まずはデータの「倉庫」となるSnowflakeを準備します。

Snowflake無料トライアルへのサインアップ

以下にアクセスし、必要事項を記入します。

signup.snowflake.com

エディションは「Standard」、クラウドプロバイダーは任意(AWS, Azure, GCPなど、お好きなものを)を選択してください。今回の記事ではプロバイダの差は特に関係ありません。

メール認証を完了させると、専用のSnowflakeアカウントURLが発行されます。このURLはログイン時に使うので、ブックマークしておきましょう。

サンプルデータのロード

Snowflakeには、サンプルデータとして事前に準備されたデータ(TASTY_BYTES)があるので、今回はそのデータを使います。

Snowflakeにログインし、左メニューから「Projects」>「Worksheets」をクリックします。

右上の「+」ボタンから「SQL Worksheet」を選択し、新しいワークシートを作成します。

以下のSQLをワークシートに貼り付け、一行ずつ(または全選択して)実行します。

-- Step 1: ロールとウェアハウスの設定
-- ACCOUNTADMINは強力な権限を持つロールです。
USE ROLE ACCOUNTADMIN;
-- COMPUTE_WHはトライアルアカウントにデフォルトで存在するウェアハウスです。
USE WAREHOUSE COMPUTE_WH;

-- Step 2: データベースとスキーマの作成
-- これからロードするサンプルデータ専用のデータベースを作成します。
CREATE OR REPLACE DATABASE TASTY_BYTES_SAMPLE_DATA;
-- スキーマはデータベース内の論理的なグループ分けです。
CREATE OR REPLACE SCHEMA TASTY_BYTES_SAMPLE_DATA.RAW_POS;

-- Step 3: テーブルの作成
-- TASTY_BYTESのメニュー情報を格納するテーブルを作成します。
CREATE OR REPLACE TABLE TASTY_BYTES_SAMPLE_DATA.RAW_POS.MENU (
    MENU_ID NUMBER(19,0),
    MENU_TYPE_ID NUMBER(38,0),
    MENU_TYPE VARCHAR(16777216),
    TRUCK_BRAND_NAME VARCHAR(16777216),
    MENU_ITEM_ID NUMBER(38,0),
    MENU_ITEM_NAME VARCHAR(16777216),
    ITEM_CATEGORY VARCHAR(16777216),
    ITEM_SUBCATEGORY VARCHAR(16777216),
    COST_OF_GOODS_USD NUMBER(38,4),
    SALE_PRICE_USD NUMBER(38,4)
);

-- Step 4: 外部ステージの作成
-- SnowflakeがデータをロードするためにアクセスするS3バケット上の場所を定義します。
-- ここで定義したFILE_FORMATが、このステージを使うCOPYコマンドのデフォルトになります。
CREATE OR REPLACE STAGE TASTY_BYTES_SAMPLE_DATA.PUBLIC.BLOB_STAGE
    URL = 's3://sfquickstarts/tastybytes/'
    FILE_FORMAT = (TYPE = CSV, SKIP_HEADER = 1);

-- Step 5: データのロード 
COPY INTO TASTY_BYTES_SAMPLE_DATA.RAW_POS.MENU
    FROM (
        SELECT
            $1,  -- MENU_ID
            $2,  -- MENU_TYPE_ID
            $3,  -- MENU_TYPE
            $4,  -- TRUCK_BRAND_NAME
            $5,  -- MENU_ITEM_ID
            $6,  -- MENU_ITEM_NAME
            $7,  -- ITEM_CATEGORY
            $8,  -- ITEM_SUBCATEGORY
            $9,  -- COST_OF_GOODS_USD
            $10  -- SALE_PRICE_USD
        FROM @TASTY_BYTES_SAMPLE_DATA.PUBLIC.BLOB_STAGE/raw_pos/menu/
    );

-- Step 6: ロードの確認
-- テーブルにデータが正しく入ったか確認しましょう。
SELECT * FROM TASTY_BYTES_SAMPLE_DATA.RAW_POS.MENU LIMIT 10;

最後のSELECT文を実行した結果、メニューデータが表示されれば成功です!これでデータ変換の準備が整いました。

dbt CloudとSnowflakeを連携させる(Partner Connect活用)

ここから、dbtとSnowflakeを接続します。接続にあたってSnowflakeのPartner Connect機能を使います。Partner Connect機能を使うことで、面倒な接続設定の大部分が自動化され、数クリックで安全な連携が可能になります。

Partner Connectの設定

Snowflakeの画面で、左メニューの「Data Products」>「Partner Connect」を選択します。

検索バーに「dbt」と入力し、dbtのタイルをクリックします。

ポップアップが表示されたら、「Connect」ボタンをクリックします。

「Activate」ボタンが表示されたら、クリックしてdbt Cloudを有効化します。

Snowflake側で何が動いているか

この自動化は非常に便利ですが、何が起きているかを知っておくことが重要です。将来的に権限エラーなどで困ったときに、「dbt CloudはPC_DBT_ROLEというロールでSnowflakeにアクセスしているんだな」と理解していることが、問題解決の助けになります。

  • dbt連携用のSnowflakeユーザー (PC_DBT_USER)、ロール (PC_DBT_ROLE)、ウェアハウス (PC_DBT_WH) が作成される。
  • これらの接続情報が安全にdbt Cloudに渡され、接続設定が自動的に構成される。

dbt Cloud側の設定

Partner Connectの処理が終わると、自動的にdbt Cloudの画面に遷移します。アカウント作成を完了させ、プロジェクト設定に進みましょう。

アカウントを作成するとダッシュボードの画面が表示されます。ダッシュボード右側の歯車マークから設定を確認します。

ここでは初期設定の状態を確認します。 特にRepositoryとDevelopment Connectionにdbt Cloud側で作成されたGitHubリポジトリと、Snowflakeが接続先になっていることを確認しておきます。

まとめ

今回は、Snowflakeとdbt Cloudの無料環境を構築しデータパイプラインを試す準備までのところをまとめました。次の記事ではより実践的にdbtの機能を活かしてデータパイプラインの構築を進めていきたいと思います。よければ次の記事も読んでいただけますと幸いです。今回の記事がデータ変換パイプラインの構築をしたい方の参考になっていれば幸いです。