dbt Cloud から Cloud Run にお引越し
dbt Cloud のプロジェクトを作った際に Github でコード管理していたのでまずはクローンする。
Dockerfile を追加
とりあえずこのサイトにあったイメージを使ってみる。
FROM ghcr.io/dbt-labs/dbt-core:1.2.3
RUN pip install dbt-bigquery
WORKDIR /dbt
ENV PROJECT hogehoge
ENV DATASET test
ENV KEY_FILE /credentials/key.json
COPY profiles.yml.template .
RUN eval "echo \"$(cat profiles.yml.template)\"" > profiles.yml
COPY dbt_project.yml .
COPY packages.yml .
RUN dbt deps
COPY . .
ENTRYPOINT [ "dbt" ]
BigQuery 用の設定のために profiles.yml を用意
default:
target: prd
outputs:
prd:
type: bigquery
method: service-account
project: ${PROJECT}
dataset: ${DATASET}
threads: 1
keyfile: ${KEY_FILE}
※ 注意で、default
って部分が dbt_project.yml の profile: default
の値と一緒でないと動かなかった。
試しに ENTRYPOINT を修正して run-operation を実行してみると成功!
ちなみに以下は外部テーブルつくる operation ですね。
ENTRYPOINT [ "dbt", "run-operation", "stage_external_sources", "--vars", "{'ext_full_refresh': 'true'}" ]
09:16:18 3 of 3 START external source datalake.table
09:16:18 3 of 3 (1) create or replace external table `hogehoge`.`datalake`.`table`( ...
09:16:19 3 of 3 (1) None (0 processed)
ビルドして Artifact Registry に push
docker build -t asia-northeast1-docker.pkg.dev/hogehoge/repositoy/dbt:latest .
docker push asia-northeast1-docker.pkg.dev/hogehoge/repositoy/dbt:latest
Cloud Run(ジョブ)にデプロイしていく。
イメージはさっき push したものを使う。
ENTRYPOINT には dbt
のみ指定しているのでオプションをコマンドで以下のように渡してあげる。
profiles.yml で認証方法をサービスアカウントで指定したためジョブにキーをマウントする。
json ファイルを Secret Manger にアップして予め登録しておく。
ここらへんもっとうまいやり方があるのかもしれない…
ちなみに IAM に登録しているロールは以下
profiles.yml で指定した dataset が dbt Cloud だとデフォルトで dbt_prd
になっている?ので同じになるように修正した。
(dbt Cloud の profiles.yml はどこにあるんだろう 🤔 )
あとは Cloud Run 側で実行するだけ。
コマンドを変えて複数のジョブを定義することで --models tag:xxx
のいろいろな tag で実行できるようにした。