- 片岡久人
- 約 2,200 文字
- 400 View
目次
はじめに
CNCF連載の6本目です、データ変換ツール「dbt(data build tool)」をDockerコンテナ化し、Kubernetes上で実行する手順を紹介します。
私がCNCFやKubernetesに関して触れたのは今回が初めてですが、Kubernetesの学習の一環として、実際に手を動かしながらクラウドネイティブ技術を体験してみたいという思いで取り組みました。
1. 今回の記事でやりたいこと
本記事では、以下のステップを通して、dbtモデルの準備から、それをコンテナにしてKubernetes上で動かすまでを体験します。
- dbtで作成したデータ変換モデルを、Dockerコンテナ化
- 作成したコンテナをKubernetesクラスタにデプロイ
- Kubernetes上でdbtを実行し、BigQueryにデータを書き込む
2. dbtのモデルを実装
- dbtプロジェクトの作成やモデル実装方法は、dbt Core × BigQueryを使ったデータ変換をやってみたこちらの記事などを参照してください。
- 本記事では下記のような構成になっていることを想定しています。
<your_repositry>/ |
dbt_project.ymlの実装
name: 'dbt_project' |
profiles.ymlの実装
dbt_trial: |
3. dbtの実装をコンテナ化
ここでは、dbtプロジェクトをDockerコンテナとしてパッケージ化する手順を説明します。前提として、Docker Desktopがインストールされ、稼働していることをご確認ください。Docker DesktopでのKubernetesの利用方法については、公式ドキュメントなどを参考にしてください。
3.1 Dockerイメージを作成
dbtプロジェクトを含んだDockerイメージを作成します。dbt公式イメージ(ghcr.io/dbt-labs/dbt-bigquery)をベースにすることで、簡単に環境を構築できます。
Dockerfileの例
# dbt公式イメージを利用(BigQuery用) |
3.2 コンテナのビルドコマンド
docker build -t dbt_trial . |
- 上記コマンドで
dbt_trialという名前のDockerイメージが作成されます。
4. コンテナ化したものをKubernetesでデプロイする
作成したdbtコンテナイメージをKubernetesクラスタにデプロイし、実行する準備をします。
4.1 CinfigMap作成
dbtの認証情報が含まれる profiles.yml をKubernetesのConfigMapとして登録します。これにより、機密情報をコンテナイメージに含めることなく、Kubernetesから安全にアプリケーションに提供できます。
# dbt_trial配下のprofiles.ymlをConfigMapとして追加 |
4.2 Kubernetesの設定ファイル(CronJob)を作成
dbtをKubernetes上で実行するための「Jobリソース」の設定ファイルを作成します。Jobリソースは、決められた処理を一度だけ、または定期的に実行するためのものです。今回は、定期実行ではなく手動で実行することを想定しているため、suspend: true(一時停止状態)に設定した「CronJobリソース」をテンプレート(ひな形)として利用します。
ファイル名は kubernetes/dbt-run-cron-job.yml とします。
dbt-run-cron-job.yamlの例
apiVersion: batch/v1 |
BigQueryの認証方式について
上記の例では、ローカル開発環境での簡易性を考慮し、ホストPCの gcloud コマンドで設定された認証情報(OAuth)を hostPath ボリュームとしてコンテナにマウントしています。実運用環境のKubernetesクラスタでBigQueryと連携する場合は、GCPサービスアカウントキーをSecretとして安全にマウントしたり、Workload IdentityのようなKubernetesネイティブな認証方式を利用することが推奨されます。
4.3 Kubernetesにデプロイするコマンド
作成したCronJob設定ファイルをKubernetesクラスタに適用します。
kubectl apply -f kubernetes/dbt-run-cron-job.yml |
これでKubernetesクラスタにCronJobリソースが登録されました。このCronJobは、dbtコマンドを実行するためのJobのテンプレートとして機能します。
4.4 デプロイが成功したか確認するコマンド
CronJobリソースが正しくデプロイされたかを確認します。
kubectl get cronjobs |
5. Kubernetes上でdbtを実行する
デプロイされたCronJobをテンプレートとして利用し、dbtを実行するJobを作成します。
5.1 Jobを実行するコマンド
kubectl create job --from=cronjob/dbt-job dbt-job-run |
5.2 実行が成功したか確認
kubectl get jobs |
- Jobの COMPLETIONS が 1/1 や STATUS が Complete になっていれば、OKです。
5.3 実行結果の確認
kubectl logs job/dbt-run # applyで作成したJob名(例:dbt-run)に合わせてコマンドを修正してください。 |
ログからdbtの実行が成功していることが確認できます。最後に、BigQueryのコンソールで実際にテーブルが作成されているかを確認しましょう。
まとめ
dbtプロジェクトをDockerコンテナ化し、KubernetesのCronJobテンプレートを利用してJobとして実行する一連の手順をご紹介しました。
ローカル環境でも本番環境さながらのデータパイプライン構築が体験でき、ConfigMapによる設定ファイルの管理、Kubernetes Jobリソースの利用、ホストパスボリュームを用いた認証情報のマウントなど、Kubernetesの基本的な概念と実践的な使い方を学ぶことができました。
これを応用することで、CI/CDパイプラインへの組み込みや、クラウド環境のKubernetesクラスタへのデプロイなどの足掛かりができたので、挑戦していこうと思います。