dbt Coreで生成したドキュメントをCloudflare Pagesでホスティングしてみる

dbt Coreで生成したドキュメントをCloudflare Pagesでホスティングしてみる

Clock Icon2025.02.27

データ事業本部のueharaです。

今回は、dbt Coreで生成したドキュメントをCloudflare Pagesでホスティングしてみたいと思います。

はじめに

dbt Coreでは dbt docs generate コマンドを利用することで、ドキュメントを生成することができます。

https://docs.getdbt.com/reference/commands/cmd-docs

出力はhtmlおよびjsonファイルで構成されるので、これを不特定多数で確認するためにはどこかにホスティングする必要があります。

今回はそのホスティング先をCloudflare Pagesにして確認をしてみます。

なお、Cloudflare PagesのホスティングにはGitHub Actionsのワークフローにおけるアクションとして cloudflare/wrangler-action を利用するケースをよくみるのですが、今回はAWS ECSなどでdbtを動作させるといったケースも見据え、CloudflareのWranglerを直接使用することにします。

Cloudflare Pagesの準備

プロジェクトの作成

まず、Cloudflare Pagesにアクセスして、ログイン(サインアップがまだの方はサインアップ)を行います。

Get started with Workers & Pages からPagesを選択し、direct uploadを選択します。(Gitとの連携もできるのですが、今回はdbtのドキュメントを生成した後直接ファイルをアップロードするためこちらを選択します)

20250227_dbt_01

プロジェクト名は今回 dbt-docs-sample とします。

20250227_dbt_02

まったくの空の状態でプロジェクトを作成することはできないため、適当に index.html を作成し、アップロードします。

20250227_dbt_03

私は以下のようにHello Worldだけ書いておきました。(このファイルは後に上書きされるので、何でも大丈夫です)

index.html
<html>
    Hello World!
</html>

最後に以下のように表示されればプロジェクトの作成は完了です。

20250227_dbt_04

アクセスポリシーの設定

このままだと誰でもページが見れるような状態となっているので、アクセスポリシーの設定を行います。

作成したプロジェクトの Settings から Access policy を有効化し、 Manage へと進みます。

20250227_dbt_05

すると Application name の部分に先に作成したプロジェクト名があると思うので選択を行います。

デフォルトだとサブドメインありのみにアクセス制御がかかっている状態(Preview Depolymentにのみアクセス制御がされている状態)だと思いますので、サブドメインがないものについても設定を追加します。

20250227_dbt_06

これで Save application を行い設定は完了です。

デフォルトではメールによるOne-time PIN認証であり、Cloudflareのアカウント作成時のメールアドレスが予め許可対象として追加されています。

別のメールアドレスも追加したい場合は PoliciesConfigure rules から設定が可能です。

API Tokenの作成

後でWranglerを動かすために必要となるCloudflareのAPI Tokenを作成します。

まず、以下のページにアクセスします。

https://dash.cloudflare.com/profile/api-tokens

次に、Create Custom Token に進みます。

20250227_dbt_07

Token name には任意の値を入れ、 Permissions には Cloudflare PagesにおけるEdit権限を付与します。

20250227_dbt_08

作成が完了すると以下のようなページが表示されると思いますので、Tokenをどこかにメモしておいて下さい。

20250227_dbt_09

以上でTokenの作成は完了です。

dbt実行環境の準備

今回は手軽に試すため、以前ご紹介した以下の記事をベースにローカルにdbt実行環境を用意します。

https://dev.classmethod.jp/articles/dbt-easy-setup-with-psql/

以下に、変更点だけ記載をします。

まず compose.yml について、CloudflareにアクセスするためのアカウントIDとAPI Tokenを環境変数で設定します。

※Wranglerはデフォルトだと認証情報として CLOUDFLARE_ACCOUNT_IDCLOUDFLARE_API_TOKEN を参照するので、その通り設定しています。

compose.yml
services:  
  dbt:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: dbt_demo
    volumes:
      - ./dbt:/dbt
    environment: 
      DB_HOST: postgres
      DB_PORT: 5432
      DB_USER: test_user
      DB_PASSWORD: test_pass
      DB_NAME: demo_db
+     CLOUDFLARE_ACCOUNT_ID: <YOUR CLOUDFLARE ACCOUNT ID>
+     CLOUDFLARE_API_TOKEN: <YOUR CLOUDFLARE API TOKEN>
    depends_on: 
      - postgres
    ports:
      - "8080:8080"

  postgres:
    image: postgres:latest
    container_name: postgres_demo
    environment: 
      POSTGRES_USER: test_user
      POSTGRES_PASSWORD: test_pass
      POSTGRES_DB: demo_db
    ports:
      - "5432:5432"

Dockerfileについては、CloudflareのWranglerのインストールを追記します。

FROM python:3.11

# ワーキングディレクトリを設定
WORKDIR /dbt

+# Node.jsとnpmのインストール
+RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
+    && apt-get install -y nodejs
+
+# Cloudflareのwranglerのインストール
+RUN npm install -g wrangler

# pythonのライブラリをインストール
COPY requirements.txt /tmp/requirements.txt
RUN pip install --no-cache-dir -r /tmp/requirements.txt

# 設定ファイルのコピー
COPY profiles.yml /tmp/profiles.yml

ENTRYPOINT [ "/bin/sh", "-c" ]

# プロジェクトの作成
CMD ["mkdir -p ~/.dbt && \
      if [ ! -f ~/.dbt/profiles.yml ]; then mv /tmp/profiles.yml ~/.dbt/profiles.yml; fi && \
      if [ ! -d /dbt/demo_db ]; then dbt init demo_db --profile demo_db --target /dbt; fi && \
      tail -f /dev/null"]

あとは上記の記事に従い、環境を立ち上げれば完了です。

$ docker-compose up --build -d

実行確認

上記で立ち上げたdbt環境に入り、dbtの実行とドキュメント生成を行います。

# dbtの実行
$ dbt run
(結果省略)

# ドキュメント作成
$ dbt docs generate
06:00:41  Running with dbt=1.9.2
06:00:41  Registered adapter: postgres=1.9.0
06:00:42  Found 3 models, 1 seed, 15 data tests, 2 sources, 433 macros
06:00:42  
06:00:42  Concurrency: 1 threads (target='dev')
06:00:42  
06:00:42  Building catalog
06:00:42  Catalog written to /dbt/demo_db/target/catalog.json

実行が完了したら、Cloudflare Pagesにドキュメントをアップロードします。

# アップロード用ファイルのコピー
$ mkdir -p docs && cp -r target/*.json target/index.html docs/

# アップロード
$ npx wrangler pages deploy docs --project-name dbt-docs-sample
✨ Success! Uploaded 0 files (6 already uploaded) (0.22 sec)

🌎 Deploying...
✨ Deployment complete! Take a peek over at https://0c8b9737.dbt-docs-sample.pages.dev

確認のためページを開くと、先に設定したアクセスポリシーの通りメールアドレスによる認証が求められます。

20250227_dbt_10

認証が完了しページを開くと、無事dbtのドキュメントを確認することができました!

20250227_dbt_11

最後に

今回は、dbt Coreで生成したドキュメントをCloudflare Pagesでホスティングしてみました。

参考になりましたら幸いです。

参考文献

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.