dbt Cloudでプライベートなリポジトリをpackageとしてインストールしてみた #dbt

2022.07.01

さがらです。

dbt Cloudでプライベートなリポジトリをpackageとしてインストールしてみたので、その方法について本記事でまとめてみます。

プライベートなリポジトリをpackageとしてインストールする必要性

まず、dbtにおいてプライベートなリポジトリをインストールする必要性について考えてみます。

一番ユースケースとして考えられるのは、社内でdbtのリポジトリを複数に分けて管理する必要があり、別リポジトリで定義したmodelやmacroを使用したいというケースだと思います。

dbtを運用する時のリポジトリの管理については、dbt公式からも1つ記事が書かれています。

この記事では1つのリポジトリだけでやりくりしようとしたとき、このような問題があると記述されています。(Option 1のWeaknessesの意訳です。)

  • 対象のリポジトリ1つで、多くのissueを管理したり、複数のpull requestが同時に発生し得る
  • 管理するmodelが多くなる場合、1つのビジネスユニットのモデリングにしか携わらない開発者がいても、何百ものファイルを読まないといけない
  • pull requestの承認が難しい(誰がどのチームの承認を得るか?チーム間で使用されるcore modelの変更を誰が承認するか?)

一方で、複数のリポジトリに分けて管理したり、他のリポジトリをpackageとしてインストールする方法についても選択肢の1つとして挙げられています。 (下図は前述のリンク先の記事のOption 2とOption 4の引用です。)

そのため、リポジトリを分けてpackageとしてインストールすることについては、dbt公式としても想定している内容なのです。

やってみた

ということで早速、dbt Cloudでプライベートなリポジトリをpackageとしてインストールする手順をまとめていきます!

前提

  • Gitホスティングサービス:GitHub
  • dbtのバージョン:1.0.0

また、インストールの検証のためリポジトリを2つに分けていますが、このような構成にしています。

インストールするリポジトリ:sourceからstagingにあたるmodelを管理

インストール先のリポジトリ:martにあたるmodelだけを管理

GitHubでPersonal Access Tokenを取得

まず、dbtでインストール対象となるプライベートなリポジトリを参照できるGitHubアカウント上で、Personal Access Tokenを取得します。

この手順については、こちらの公式Docに図と共にわかりやすくまとまっているため、ご覧ください。

ここで大事なポイントは、Generate tokenを押した後に生成されたAccess Tokenの内容を忘れずにコピーしておいてください。

dbt CloudでEnvironment Variablesを設定

続いて、先程取得したAccess Tokenをdbt CloudのEnvironment Variablesに設定していきます。

dbt CloudにおけるEnvironment Variableは、一般的な「環境変数」に該当するものです。詳細は下記Docをご覧ください。

まず、「インストール先のリポジトリ」と紐づくdbt projectを選択します。

画面左上のメニューバーから、「Environments」を押します。

新しい環境変数を定義するため、「+ Add New Variable」を押します。

以下のように入力し、保存するアイコンを押します。

  • KEY:DBT_ENV_SECRET_というprefixをつけた上で、任意の名前を入力します。このprefixは必須です
  • PROJECT DEFAULT:GitHubで取得したAccess Tokenの値を貼り付けます

保存をすると、下図のようにAccess Tokenの一部が暗号化された状態で環境変数が登録されます。

プライベートなリポジトリのインストール

先程定義した環境変数も使用して、プライベートリポジトリのインストールをします。

インストール先のリポジトリと紐づくdbt projectにおいて、packages.ymlを開きます。※もしpackages.ymlがない場合は、dbt_project.ymlと同じ階層に作成します。

packages.yml内で、下記のように記述します。env_varについては、{{env_var(先程作成した環境変数のKEY名)}}というように入力します。

packages:
  - git: "https://{{env_var('DBT_ENV_SECRET_GIT_CREDENTIAL')}}@github.com/dbt-labs/awesome_repo.git" # git HTTPS URL

下図は私が検証した際の実際の記述内容です。

このpackages.ymlをSaveしたら、dbt depsコマンドを実行します。(表示される警告については、こちらの公式Docにある通りwarn-unpinned: falseを指定すると、警告を出さないようにはできます。)

これにより、packageとしてプライベートなリポジトリをインストールできました!

プライベートなリポジトリをインストールしたときの挙動

あとはおまけなのですが、プライベートなリポジトリをインストールすることでどういった挙動となるか、確認してみます。

リネージが作られるか?

インストールしたリポジトリ上のmodelをref()で参照している場合でも、問題なくリネージは生成可能です。

Docではどのように見えるか?

Doc上ではインストールしたリポジトリの情報も併せて記載され、Doc上でもリネージはインストールしたリポジトリのmodelも含めて表示可能です。

最後に

dbt Cloudでプライベートなリポジトリをpackageとしてインストールする方法についてまとめてみました。

dbtの活用が広がっていくと、どうしても1リポジトリでは管理しきれなくなってくるものです。そんな時はリポジトリを分けて管理し、必要に応じて別リポジトリをインストールする構成を検討してみてはいかがでしょうか!