
dbt Coreで生成したドキュメントをCloudflare Pagesでホスティングしてみる
データ事業本部のueharaです。
今回は、dbt Coreで生成したドキュメントをCloudflare Pagesでホスティングしてみたいと思います。
はじめに
dbt Coreでは dbt docs generate
コマンドを利用することで、ドキュメントを生成することができます。
出力は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のドキュメントを生成した後直接ファイルをアップロードするためこちらを選択します)
プロジェクト名は今回 dbt-docs-sample
とします。
まったくの空の状態でプロジェクトを作成することはできないため、適当に index.html
を作成し、アップロードします。
私は以下のようにHello Worldだけ書いておきました。(このファイルは後に上書きされるので、何でも大丈夫です)
<html>
Hello World!
</html>
最後に以下のように表示されればプロジェクトの作成は完了です。
アクセスポリシーの設定
このままだと誰でもページが見れるような状態となっているので、アクセスポリシーの設定を行います。
作成したプロジェクトの Settings
から Access policy
を有効化し、 Manage
へと進みます。
すると Application name
の部分に先に作成したプロジェクト名があると思うので選択を行います。
デフォルトだとサブドメインありのみにアクセス制御がかかっている状態(Preview Depolymentにのみアクセス制御がされている状態)だと思いますので、サブドメインがないものについても設定を追加します。
これで Save application
を行い設定は完了です。
デフォルトではメールによるOne-time PIN認証であり、Cloudflareのアカウント作成時のメールアドレスが予め許可対象として追加されています。
別のメールアドレスも追加したい場合は Policies
の Configure rules
から設定が可能です。
API Tokenの作成
後でWranglerを動かすために必要となるCloudflareのAPI Tokenを作成します。
まず、以下のページにアクセスします。
次に、Create Custom Token
に進みます。
Token name
には任意の値を入れ、 Permissions
には Cloudflare PagesにおけるEdit権限を付与します。
作成が完了すると以下のようなページが表示されると思いますので、Tokenをどこかにメモしておいて下さい。
以上でTokenの作成は完了です。
dbt実行環境の準備
今回は手軽に試すため、以前ご紹介した以下の記事をベースにローカルにdbt実行環境を用意します。
以下に、変更点だけ記載をします。
まず compose.yml
について、CloudflareにアクセスするためのアカウントIDとAPI Tokenを環境変数で設定します。
※Wranglerはデフォルトだと認証情報として CLOUDFLARE_ACCOUNT_ID
と CLOUDFLARE_API_TOKEN
を参照するので、その通り設定しています。
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
確認のためページを開くと、先に設定したアクセスポリシーの通りメールアドレスによる認証が求められます。
認証が完了しページを開くと、無事dbtのドキュメントを確認することができました!
最後に
今回は、dbt Coreで生成したドキュメントをCloudflare Pagesでホスティングしてみました。
参考になりましたら幸いです。