
dbt project on Snowflakeでdbtパッケージを使用する方法を確認しつつdbt_external_tablesを試してみた
かわばたです。
dbt project on SnowflakeがGAとなりました。
今回はdbtパッケージをdbt project on Snowflakeで使用していきます。
例として、dbt_external_tablesを使用していきます。
【公式ドキュメント】
対象読者
- dbt project on Snowflakeでdbtパッケージを使用したい方
- dbt_external_tablesについて興味のある方
検証環境と事前準備
検証環境
- Snowflake Enterprise版
事前準備
使用するデータ
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パッケージをダウンロード

The command requires an external access integration to use.
上記のとおり、dbt project on Snowflakeでdbtのパッケージを使用する際は、EXTERNAL ACCESS INTEGRATIONを作成する必要があります。
EXTERNAL ACCESS INTEGRATIONは簡単に説明すると、Snowflakeの中から、インターネット上の外部APIやサイトへ安全にアクセスするための許可証を作る機能となります。
詳細は下記ドキュメントをご確認ください。
【公式ドキュメント】
今回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

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

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

dbt_external_tablesを活用してみる
dbt-labsのdbt_external_tablesパッケージは、クラウドストレージにある外部データを“外部テーブル(external source)”としてdbtのソース定義に登録し、その後自動で外部テーブルを管理(作成・スキーマ同期・パーティションの追加など)できる拡張機能となります。
今回はstage_external_sourcesマクロを使用してsourceを定義します。
主な機能は下記のとおりです。
- 標準モード:テーブルが存在しなければ作成、存在していればリフレッシュのみ
- フルリフレッシュモード:スキーマ変更を含めて再作成
ステージの作成
Citi Bike(NYC)によって提供された自転車シェアのデータを活用して試していきます。
Snowflake入門 - ゼロからはじめるSnowflakeに則りステージを作成しました。
下記の通りとなります。

標準モード
標準モードはデフォルトとなります。
分かりやすくするために、全てのカラムではなく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

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

下記のように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"

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

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







