この記事はなに?
GoogleCloudPlatform(GCP)のGoogleComputeEngine(GCE)インスタンス上で、CLI版のdbtを動かしてBigQueryにテーブルを生成する過程をまとめた記事になります。
GCEインスタンスの作成
基本的にはデフォルトの設定をいじらず、費用もかけたくなかったためこちらの情報をもとに選択しつつ、今回はDocker経由でdbtの実行環境を作るため、イメージとしてContainer-Optimized OSを選択し作成しました。
| 項目 | 値 |
|---|---|
| 名前 | dbt |
| リージョン | us-central1(アイオワ) |
| シリーズ | E2 |
| マシンタイプ | e2-micro(2 vCPU、1GBメモリ) |
| OS | Container Optimized OS |
| バージョン | Container-Optimized OS 85-13310.1453.1 LTS |
| ブートディスクの種類 | 標準永続ディスク |
| サイズ | 10 |
接続用のポートを開けておく
ファイアウォールからtcp:8081を許可するタグを作って、先程作ったGCEインスタンスに付与しておきます。
ローカルからssh接続
ローカルPCにCloud SDKをインストールし、gcloudコマンドを使って先程作ったインスタンスにsshで接続します。
※ブラウザウィンドウでも接続はできるので、この辺はお好みで。
$ gcloud compute ssh --zone "us-central1-a" "dbt" --project "{{GCPのプロジェクト名}}"
# 作業用のディレクトリを作成しておく
$ mkdir works
$ exit
サービスアカウントの作成
dbtを通してBigQueryにテーブルを生成するため、BigQueryにアクセスする権限を持つサービスアカウントを作成しておきます。
本来は必要最小限の権限を付与するべきですが、今回は勉強用のため、サービスアカウントに対してBigQuery管理者の権限を付与しました。
また、dbtのコマンド実行時に認証が走るため、JSON形式で認証鍵をダウンロードし、GCEインスタンスにアップロードしておきます。
$ gcloud compute scp --project "{{GCPのプロジェクト名}}" --zone "us-central1-a" --recurse {{ファイルパス}} {{GCPのユーザー名}}@dbt:/home/{{GCPのユーザー名}}/works
必要なファイルを作成
作業用ディレクトリとして作ったworksディレクトリ配下に必要なファイルを作っていきます。
FROM python:3.9.12-slim-bullseye
ARG dbt_bigquery_ref=dbt-bigquery@v1.0.0
# System setup
RUN apt-get update \
&& apt-get dist-upgrade -y \
&& apt-get install -y --no-install-recommends \
git \
ssh-client \
software-properties-common \
make \
build-essential \
ca-certificates \
libpq-dev \
vim \
&& apt-get clean \
&& rm -rf \
/var/lib/apt/lists/* \
/tmp/* \
/var/tmp/*
# Env vars
ENV PYTHONIOENCODING=utf-8
ENV LANG=C.UTF-8
# Update python
RUN python -m pip install --upgrade pip setuptools wheel --no-cache-dir
# dbt-bigquery
RUN python -m pip install --no-cache-dir "git+https://github.com/dbt-labs/${dbt_bigquery_ref}#egg=dbt-bigquery"
COPY profiles.yml /root/.dbt/profiles.yml
WORKDIR /usr/app/dbt/
VOLUME /usr/app
ENTRYPOINT tail -f /dev/null
name: 'sample_project'
version: '1.0.0'
profile: 'sample_project'
config-version: 2
models:
sample_project:
marts:
schema: mart
materialized: table
sample_project:
target: dev
outputs:
dev:
type: bigquery
method: service-account
project: {{GCPのプロジェクトID}}
dataset: analysis
threads: 3
keyfile: /usr/app/dbt/{{認証鍵のJSONファイル}}
models/martsディレクトリ配下に、モデル生成の検証用SQLを作っておきます。
SELECT
1
コンテナに接続して、BigQueryにテーブルを生成する
$ docker build -t dbt-bigquery .
$ docker run -d -v $PWD:/usr/app/dbt -p 8081:8081 dbt-bigquery
$ docker exec -it {{コンテナID}} /bin/bash
$ dbt run