dbt project on Snowflakeでdbtパッケージを使用する方法を確認しつつdbt_external_tablesを試してみた

dbt project on Snowflakeでdbtパッケージを使用する方法を確認しつつdbt_external_tablesを試してみた

2025.11.24

かわばたです。

dbt project on SnowflakeがGAとなりました。
今回はdbtパッケージをdbt project on Snowflakeで使用していきます。

例として、dbt_external_tablesを使用していきます。

【公式ドキュメント】
https://hub.getdbt.com/

https://hub.getdbt.com/dbt-labs/dbt_external_tables/latest/

対象読者

  • dbt project on Snowflakeでdbtパッケージを使用したい方
  • dbt_external_tablesについて興味のある方

検証環境と事前準備

検証環境

  • Snowflake Enterprise版

事前準備

使用するデータ
https://www.snowflake.com/ja/developers/guides/getting-started-with-snowflake-ja/#11

Citi Bike(NYC)によって提供された自転車シェアのデータを活用しています。

データベースおよびステージの作成

-- 自分のデータベース・スキーマを作成
CREATE DATABASE IF NOT EXISTS KAWABATA_DBT_EXTERNAL;
CREATE SCHEMA IF NOT EXISTS KAWABATA_DBT_EXTERNAL.STAGE;

--  ファイルフォーマットの作成
create or replace file format my_csv_format
  type='csv'
  compression = 'auto' field_delimiter = ','
  record_delimiter = '\n'
  skip_header = 0
  field_optionally_enclosed_by = '\042'
  trim_space = false
  error_on_column_count_mismatch = false
  escape = 'none'
  escape_unenclosed_field = '\134'
  date_format = 'auto'
  timestamp_format = 'auto'
  null_if = ('')
  comment = 'file format for ingesting data for zero to snowflake'
;

-- 管理者権限
USE ROLE ACCOUNTADMIN;

-- データベースへのアクセス権
GRANT USAGE ON DATABASE KAWABATA_DBT_EXTERNAL TO ROLE KAWABATA_DBT_DEV_ROLE;

-- スキーマへのアクセス権
GRANT USAGE ON SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;
GRANT CREATE STAGE ON SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;
GRANT CREATE EXTERNAL TABLE ON SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;

-- ステージへの権限
GRANT USAGE ON ALL STAGES IN SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;
GRANT USAGE ON FUTURE STAGES IN SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;

--  スキーマ内のテーブル(外部テーブル含む)へのSELECT権限
GRANT SELECT ON ALL TABLES IN SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;
GRANT SELECT ON ALL VIEWS IN SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;

--  (推奨) 将来作られるテーブルも自動で見えるようにしておく
GRANT CREATE VIEW ON SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;
GRANT CREATE TABLE ON SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;
GRANT SELECT ON FUTURE VIEWS IN SCHEMA KAWABATA_DBT_EXTERNAL.STAGE TO ROLE KAWABATA_DBT_DEV_ROLE;

実際に試してみた

dbtパッケージをダウンロード

2025-11-24_20h15_31

The command requires an external access integration to use.

上記のとおり、dbt project on Snowflakeでdbtのパッケージを使用する際は、EXTERNAL ACCESS INTEGRATIONを作成する必要があります。

EXTERNAL ACCESS INTEGRATIONは簡単に説明すると、Snowflakeの中から、インターネット上の外部APIやサイトへ安全にアクセスするための許可証を作る機能となります。
詳細は下記ドキュメントをご確認ください。

【公式ドキュメント】
https://docs.snowflake.com/en/sql-reference/sql/create-external-access-integration

今回dbtパッケージを取得できるように下記設定にしました。

-- External Access Integration
  USE ROLE ACCOUNTADMIN;

-- 1. 接続先(GitHub/dbt Hub)を許可するネットワークルール
CREATE OR REPLACE NETWORK RULE dbt_network_rule
  MODE = EGRESS
  TYPE = HOST_PORT
  VALUE_LIST = ('github.com', 'api.github.com', 'codeload.github.com', 'hub.getdbt.com');

-- 2. 外部アクセス統合の作成
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION dbt_external_access_integration
  ALLOWED_NETWORK_RULES = (dbt_network_rule)
  ENABLED = TRUE;

-- 3. dbtを実行するユーザー/ロールに権限付与
GRANT USAGE ON INTEGRATION dbt_external_access_integration TO ROLE [あなたのロール];

packages.ymlを下記のように設定しました。
今回はdbt_external_tablesを試したいので、この設定にしています。

packages:
  - package: dbt-labs/dbt_external_tables
    version: 0.11.1

2025-11-24_16h58_05

保存が完了したら、下記のようにDepsを選択し、赤枠を押下し、表示されたポップアップより作成したEXTERNAL ACCESS INTEGRATIONを設定し実行します。

2025-11-24_16h59_45

下記のようにdbtパッケージをダウンロードすることができました。
2025-11-24_17h03_06

dbt_external_tablesを活用してみる

dbt-labsのdbt_external_tablesパッケージは、クラウドストレージにある外部データを“外部テーブル(external source)”としてdbtのソース定義に登録し、その後自動で外部テーブルを管理(作成・スキーマ同期・パーティションの追加など)できる拡張機能となります。

今回はstage_external_sourcesマクロを使用してsourceを定義します。
主な機能は下記のとおりです。

  • 標準モード:テーブルが存在しなければ作成、存在していればリフレッシュのみ
  • フルリフレッシュモード:スキーマ変更を含めて再作成

ステージの作成

Citi Bike(NYC)によって提供された自転車シェアのデータを活用して試していきます。
Snowflake入門 - ゼロからはじめるSnowflakeに則りステージを作成しました。

下記の通りとなります。
2025-11-24_17h11_02


標準モード

標準モードはデフォルトとなります。
分かりやすくするために、全てのカラムではなく4カラムのみ設定しました。
sources.ymlは下記のとおり設定しました。

version: 2

sources:
  - name: trips_source
    database: KAWABATA_DBT_EXTERNAL
    schema: STAGE
    loader: Snowflake

    tables:
      - name: trips
        description: "CITIBIKE"
        external:
          location: "@KAWABATA_DBT_EXTERNAL.STAGE.CITIBIKE_TRIPS"
          # ここにファイルフォーマット定義をインラインで記述
          file_format: KAWABATA_DBT_EXTERNAL.STAGE.my_csv_format
        columns:
          - name: tripduration
            data_type: integer
          - name: starttime
            data_type: timestamp
          - name: stoptime
            data_type: timestamp
          - name: start_station_id
            data_type: integer

外部テーブルが作成されていない場合、マクロを実行してからdbt runする形になります。

dbt run-operation stage_external_sources

2025-11-24_17h23_51

下記のように外部テーブルにデータが入っていることが確認できました。
指定した4カラムとVALUEカラムに値が格納されています。
2025-11-24_18h31_57

下記のようにsources.ymlに対して、全カラムを指定しても外部テーブルを作成した後は既存のカラム構成を保持したままなので、上記のカラム構成のままとなります。

version: 2

sources:
  - name: trips_source
    database: KAWABATA_DBT_EXTERNAL
    schema: STAGE
    loader: Snowflake

    tables:
      - name: trips
        description: "CITIBIKE"
        external:
          location: "@KAWABATA_DBT_EXTERNAL.STAGE.CITIBIKE_TRIPS"
          # ここにファイルフォーマット定義をインラインで記述
          file_format: KAWABATA_DBT_EXTERNAL.STAGE.my_csv_format
        columns:
          - name: tripduration
            data_type: integer
          - name: starttime
            data_type: timestamp
          - name: stoptime
            data_type: timestamp
          - name: start_station_id
            data_type: integer
          - name: start_station_name
            data_type: string
          - name: start_station_latitude
            data_type: float
          - name: start_station_longitude
            data_type: float
          - name: end_station_id
            data_type: integer
          - name: end_station_name
            data_type: string
          - name: end_station_latitude
            data_type: float
          - name: end_station_longitude
            data_type: float
          - name: bikeid
            data_type: string
          - name: membership_type
            data_type: string
          - name: usertype
            data_type: string
          - name: birth_year
            data_type: integer
          - name: gender
            data_type: integer


フルリフレッシュモード

既存の情報を再作成する場合はフルリフレッシュモードを使用します。
sources.ymlは先ほど設定した全カラム指定したものとなります。

dbt run-operation stage_external_sources --vars "ext_full_refresh: true"

2025-11-24_19h42_09

下記のように外部テーブルにデータが入っていることが確認できました。

2025-11-24_19h44_52

最後に

dbtパッケージをdbt project on Snowflakeでダウンロードする方法を試してみましたが、External Access Integrationを作成しないといけないのは盲点でした。
(dbt Platformで慣れてしまったため)
ただ一度設定してしまえばスムーズにダウンロードできるので、特に運用上不具合が生じるケースはあまりないのではないかと考えています。
dbt_external_tablesを使用してみましたが、外部ステージのデータをsourceとして定義できるのは良いですね。
この記事が何かの参考になれば幸いです!

この記事をシェアする

FacebookHatena blogX

関連記事