dbt Cloud×Snowflakeでdbt cloneコマンドの挙動を確認してみた

dbt Cloud×Snowflakeでdbt cloneコマンドの挙動を確認してみた

Clock Icon2025.02.27

さがらです。

dbt cloneコマンドをdbt Cloud×Snowflakeで使ってみたとき、どのような挙動となるのかを確かめてみたので、本記事でその内容をまとめてみます。

dbt cloneについて

https://docs.getdbt.com/reference/commands/clone

dbt cloneの大まかな仕様としては、下記の仕様となっています。

  • Snowflake、Databricks、BigQueryといったゼロコピークローンに対応している製品:各ゼロコピークローン機能を用いたクローンを行う
  • 他のゼロコピークローンに対応していない製品:select * from tableのviewを作成する

主な使い所としては、以下のケースが考えられると思います。

  • CI jobsでIncremental Modelを先にクローンすることで、CI Jobsのビルドコストを削減する
  • Production Environmentのみにあるテーブルやビューも含めて、開発用スキーマにすべてまとめることで、開発中のデータアプリケーションやBIツールからの参照を容易にする

前提条件

基本的にはdbt CloudのIDE上でdbt cloneコマンドを試すのですが、コマンド実行前に対象のスキーマであるdbt_ssagaraの中身は空にしておきます。

2025-02-27_10h41_18

一方で、対象のdbt projectのProduction Environmentに設定しているDeploy Jobにより、下図のようにproductionスキーマにテーブルとビューが作られている状態とします。

2025-02-27_10h43_42

パターン1:IDEで「Defer to staging/production」をオフにした場合

IDEで「Defer to staging/production」をオフにした状態でdbt cloneコマンドを実行してみます。

2025-02-27_10h46_03

すると、下図のようにエラーとなりました。これは、dbt cloneではstateを指定することが必須であるためです。dbt Cloudの場合は「Defer to staging/production」を有効化することでこのstateの指定をコマンドから行うことなく、staging/productionのEnvironment

2025-02-27_10h49_00

パターン2:IDEで「Defer to staging/production」をオンにして、何も既存Modelを編集していない場合

IDEで「Defer to staging/production」をオンにした状態でdbt cloneコマンドを実行してみます。また、既存のModelは何も編集していない状態で実行してみます。

2025-02-27_10h57_52

すると、下図のように実行がされ、Snowflakeのdbt_ssagaraスキーマを見てみると、テーブルとビューそれぞれが作られていました。

2025-02-27_10h59_28

2025-02-27_11h50_44

パターン3:IDEで「Defer to staging/production」をオンにして、既存Modelを編集している場合

もう一度、IDEで「Defer to staging/production」をオンにした状態でdbt cloneコマンドを実行してみます。先ほどのパターン2と変えて、Production EnvironmentでDeploy Jobsを実行済の既存Modelを編集している場合にどうなるかを確認してみます。

今回は、model_amodel_cを変更してみました。

2025-02-27_11h28_07

すると、先ほどのパターン2と変わらず、編集していたmodel_amodel_cも含めたModelもCloneされました。

2025-02-27_11h32_48

2025-02-27_11h50_44

パターン4:IDEで「Defer to staging/production」をオンにして、既存Modelを編集しており、excludeオプションを追加した場合

もう一度、IDEで「Defer to staging/production」をオンにした状態でdbt cloneコマンドを実行してみます。先程のパターン3と変えて、Production EnvironmentでDeploy Jobsを実行済の既存Modelを編集した上で、--exclude state:modified+を追加したdbt cloneコマンドを実行してみます。

編集したModelはパターン3と変えずに、model_amodel_cを変更しています。

2025-02-27_11h37_30

すると、編集していたmodel_amodel_cはcloneされませんでした!IDEで編集したModelとその下流のModelをCloneしたくない場合は、--exclude state:modified+を追加して実行すれば良さそうですね。

2025-02-27_11h41_40

2025-02-27_11h52_56

注意点:本番用と開発用でdbtのロールを分けている場合

これまでの検証では基本的にDevelopment EnvironmentとProduction Environmentで同じロールを用いて検証していたのですが、仮にDevelopment EnvironmentとProduction Environmentで異なるロールを使っている場合、Development Environmentで使用するロールが、Production Environmentのテーブル・ビューに対してSELECT権限がないとdbt cloneコマンドはエラーとなります

以下は、「Development Environment:SAGARA_DEV_ROLE」、「Production Environment:SAGARA_ADMIN_ROLE」を用いた場合の例です。

  • 上手くいく例:Production Environmentのテーブル・ビューに対してSELECT権限あり

2025-02-27_11h16_00

2025-02-27_11h16_36

2025-02-27_11h17_09

  • 上手くいかない例:Production Environmentのテーブル・ビューに対してSELECT権限なし

2025-02-27_11h18_53

2025-02-27_11h20_16

最後に

dbt Cloud×Snowflakeでdbt cloneコマンドの挙動を確認してみました。

有効に使えるとコンピュートリソースやストレージコストを削減でき、非常に便利な機能だと思います!ぜひご活用ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.