はじめに
\コンニチハ/
STORES株式会社でアナリティクスエンジニアをやっているk-0120です。突然ですが、BIツールって何を使われてますか?STORES では現在 Metabase という BIツールを利用しています。GUIによるクエリ生成や各種ビジュアライゼーションなど、所謂BIツールに必要な機能は網羅されているのですが、非エンジニアが自走して使うには JOIN や GROUP BY の概念を理解する必要があり、ややハードルが高いという印象があります。 そこで、より直感的にデータを扱え、dbtとの親和性も高いLightdashというBIツールに注目し、まずは検証環境を構築してみることにしました。
Lightdash にはクラウド版とOSS版がありますが、2025年6月時点ではクラウド版に無料プランはありません。(https://www.lightdash.com/pricing) そこで本記事では、OSS版をGoogle Cloudの Cloud Run と IAP(Identity-Aware Proxy) を用いて、セキュアかつ低コストでホスティングする方法を解説していこうと思います。
完成図
この記事で構築するシステムの構成は以下の通りです。
作成するGoogle Cloudリソース一覧
本記事では、以下のリソースを作成していきます。
- Cloud SQL for PostgreSQL: Lightdash のアプリケーションデータ保存用データベース
- Cloud Storage バケット: CSVエクスポートなど、ファイルの一時保存場所
- サービスアカウント & HMACキー: Cloud Storage へのアクセス認証用
- Secret Manager: データベースのパスワードなどの機密情報を安全に保管
- Artifact Registry: Lightdash のDockerイメージ格納用リポジトリ
- OAuthクライアントID: Googleアカウント認証(IAP/Lightdashログイン)用
- Cloud Build: Dockerイメージのビルド
- Cloud Run: Lightdash アプリケーションの実行環境
前提
- DWHには BigQuery を採用しています。
- 2025年4月のアップデートにより、ロードバランサなしで Cloud Run に IAP を構成できるようになったため、これを活用していきます。(※組織配下にプロジェクトが存在している必要あり)
- 本記事では、まず Lightdash にアクセスできる環境を構築することをゴールとします。
1. Google Cloudリソースの準備
まず、Lightdash のホスティングに必要な各種リソースを準備しきましょう。
サービスアカウントの作成と権限付与
アプリケーション専用のサービスアカウント(lightdash-sa
)を作成し、必要な権限を付与していきます。
1. サービスアカウントの作成
gcloud iam service-accounts create lightdash-sa \ --display-name="Lightdash Service Account"
2. 必要なIAMロールを付与 Cloud Run が他のサービスと連携するために、以下のロールを付与します。
export GCP_PROJECT=$(gcloud config get-value project) export SERVICE_ACCOUNT="lightdash-sa@${GCP_PROJECT}.iam.gserviceaccount.com" # Cloud SQL に接続するためのロール gcloud projects add-iam-policy-binding $GCP_PROJECT \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role="roles/cloudsql.client" # Secret Manager のシークレットにアクセスするためのロール gcloud projects add-iam-policy-binding $GCP_PROJECT \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role="roles/secretmanager.secretAccessor" # Cloud Storage バケットのオブジェクトを管理するためのロール gcloud projects add-iam-policy-binding $GCP_PROJECT \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role="roles/storage.objectAdmin" # BigQuery のデータ閲覧とジョブ実行のためのロール gcloud projects add-iam-policy-binding $GCP_PROJECT \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role="roles/bigquery.dataViewer" gcloud projects add-iam-policy-binding $GCP_PROJECT \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role="roles/bigquery.jobUser"
Secret Manager でシークレットを準備
パスワードやAPIキーなどの機密情報を安全に保管するため、Secret Manager に必要なシークレットを先に作成しておきます。
1. Cloud SQLのパスワードを生成・登録
安全なランダムパスワードを生成し、直接 Secret Manager に保存します。
# openssl コマンドで安全な16進数のランダム文字列(24文字)を生成して登録 openssl rand -hex 12 | tr -d '\n' | \ gcloud secrets create lightdash_postgres_password \ --replication-policy=automatic --data-file=-
2. Lightdash の暗号化キーを生成・登録
# uuidgenコマンドでランダムな文字列を生成して登録 uuidgen | tr -d '\n' | gcloud secrets create lightdash_secret \ --replication-policy="automatic" \ --data-file=-
3. Cloud Storage 用のシークレット(プレースホルダー) 後ほど作成するHMACキーのシークレットを保存するため、空のシークレットを先に作成しておきます。
gcloud secrets create cloud_storage_access_key_secret --replication-policy="automatic"
Cloud SQL インスタンスの作成とパスワード設定
1. インスタンスの作成 スペックは運用フェーズに併せて変えていけば良いため、ひとまず必要最低限のスペックにしておきます。
gcloud sql instances create lightdash \ --database-version=POSTGRES_17 \ --edition=ENTERPRISE \ --region=asia-northeast1 \ --cpu=2 \ --memory=8 \ --storage-size=10
2. postgres
ユーザーのパスワード設定
Secret Manager に保存したパスワードを読み込み、postgres
ユーザーに設定します。
gcloud sql users set-password postgres \ --instance=lightdash \ --password="$(gcloud secrets versions access latest --secret=lightdash_postgres_password | tr -d '\n')"
Cloud Storage バケットとHMACキー
CSVダウンロードや画像ファイルの一時保存場所として、Cloud Storage バケットが必要になります。 Lightdashは内部的にS3 APIを利用するため、互換性のあるHMACキーもあわせて作成しましょう。
1. バケットの作成
gcloud storage buckets create "gs://${GCP_PROJECT}-lightdash" \ --location=asia-northeast1 \ --no-public-access-prevention
2. HMACキーの作成
gcloud storage hmac create $SERVICE_ACCOUNT
コマンドを実行するとaccessId
とsecret
が出力されます。accessId
は後の手順で利用するため、必ず控えておいてください。
3. HMACキーのSecretをSecret Managerに登録
先ほど払い出されたsecret
を、作成済みのcloud_storage_access_key_secret
にバージョンとして追加しておきます。
# 払い出された secret を入力してCtrl+D gcloud secrets versions add cloud_storage_access_key_secret --data-file=-
Artifact Registry リポジトリ
Cloud Build でビルドしたDockerイメージを格納するためのリポジトリを、Artifact Registry に作成します。
gcloud artifacts repositories create lightdash \ --repository-format=docker \ --location=asia-northeast1 \ --description="Lightdash container images"
OAuth 2.0 クライアントID
Googleアカウント認証で Lightdash にログインできるようにする、及びIAP 越しの Cloud Run に lightdash コマンドを実行するために、OAuthクライアントIDを作成します。
この作業はGoogle Cloudコンソールで行います。「APIとサービス > 認証情報」から「認証情報を作成 > OAuth クライアント ID」を選択し、以下のように設定します。
- アプリケーションの種類: ウェブアプリケーション
- 名前:
lightdash-web-app
- 認証済みのリダイレクトURI:
https://lightdash-{{ project-number }}.asia-northeast1.run.app/api/v1/oauth/redirect/google
{{ project-number }}
の部分は、ご自身のプロジェクト番号に置き換えてください。以下のコマンドで確認できます。
gcloud projects describe $GCP_PROJECT --format='value(projectNumber)'
作成後に表示される「クライアントID」と「クライアントシークレット」を、Secret Managerに登録します。
# 払い出されたクライアントIDを入力 gcloud secrets create lightdash_google_oauth_client_id --replication-policy="automatic" --data-file=- # 払い出されたクライアントシークレットを入力 gcloud secrets create lightdash_google_oauth_client_secret --replication-policy="automatic" --data-file=-
2. Lightdash のビルドとデプロイ
リソースの準備が整ったので、Lightdash 本体をビルドしてCloud Run にデプロイします。
Dockerfile と起動スクリプト
ローカルの作業ディレクトリに、以下のDockerfile
とlightdash-entrypoint.sh
を作成します。
公式イメージをベースに、起動時にDBマイグレーションを確実に実行するスクリプトを追加します。
Dockerfile
FROM lightdash/lightdash:latest COPY ./lightdash-entrypoint.sh /usr/bin/lightdash-entrypoint.sh RUN chmod +x /usr/bin/lightdash-entrypoint.sh ENTRYPOINT ["/usr/bin/lightdash-entrypoint.sh"]
lightdash-entrypoint.sh
#!/bin/bash set -e # 一部のテーブルが生成されないバグがあったため、マイグレーション処理を挟んでいます pnpm run --filter backend migrate-production # アプリケーションを起動 exec pnpm start
イメージのビルドとプッシュ
Cloud Build を使い、作成したDockerfile
からイメージをビルドし、Artifact Registry にプッシュします。
Dockerfile
があるディレクトリで以下のコマンドを実行してください。
gcloud builds submit \ --tag="asia-northeast1-docker.pkg.dev/${GCP_PROJECT}/lightdash/lightdash:latest" \ --project=${GCP_PROJECT}
Cloud Run へのデプロイ
それではすべてのリソースを繋ぎこみ、Cloud Run サービスとして Lightdash をデプロイしていきましょう。
1. 事前準備: 環境変数の設定 デプロイコマンドで使う値を、あらかじめ環境変数に設定しておきます。
# プロジェクト番号 export GCP_PROJECT_NUMBER=$(gcloud projects describe $GCP_PROJECT --format='value(projectNumber)') # OAuthクライアントID export GOOGLE_OAUTH_CLIENT_ID=$(gcloud secrets versions access latest --secret="lightdash_google_oauth_client_id") # HMACアクセスキー (作成時に控えたaccessId) export STORAGE_ACCESS_KEY="<YOUR_HMAC_ACCESS_KEY>" # 先ほど控えた accessId をここに設定します
2. デプロイコマンドの実行
gcloud beta run deploy
コマンドで、IAP を有効にしてデプロイします。
gcloud beta run deploy lightdash \ --image="asia-northeast1-docker.pkg.dev/${GCP_PROJECT}/lightdash/lightdash:latest" \ --region=asia-northeast1 \ --service-account=$SERVICE_ACCOUNT \ --platform=managed \ --ingress=all \ --min-instances=1 \ --no-allow-unauthenticated \ --iap \ --add-cloudsql-instances="${GCP_PROJECT}:asia-northeast1:lightdash" \ --set-env-vars="SITE_URL=https://lightdash-${GCP_PROJECT_NUMBER}.asia-northeast1.run.app,AUTH_GOOGLE_ENABLED=true,AUTH_GOOGLE_OAUTH2_CLIENT_ID=${GOOGLE_OAUTH_CLIENT_ID},S3_ENDPOINT=https://storage.googleapis.com,S3_REGION=asia-northeast1,S3_BUCKET=${GCP_PROJECT}-lightdash,S3_ACCESS_KEY=${STORAGE_ACCESS_KEY},PGHOST=/cloudsql/${GCP_PROJECT}:asia-northeast1:lightdash,PGUSER=postgres,PGPORT=5432,PGDATABASE=postgres" \ --set-secrets="AUTH_GOOGLE_OAUTH2_CLIENT_SECRET=lightdash_google_oauth_client_secret:latest,LIGHTDASH_SECRET=lightdash_secret:latest,PGPASSWORD=lightdash_postgres_password:latest,S3_SECRET_KEY=cloud_storage_access_key_secret:latest"
3. デプロイ後の作業
デプロイは完了しましたが、Lightdash をdbtプロジェクトと連携させるには、CLIを使ったセットアップが必要です。 ここでは、IAPで保護された Cloud Run 環境に対して、lightdash CLIコマンドを実行するための設定と手順を解説します。
3.1. Lightdash へのアクセスとPersonal Access Tokenの取得
Cloud Run サービスのURLにアクセス 以下のコマンドでサービスのURLを確認し、ブラウザでアクセスします。
sh gcloud run services describe lightdash --region=asia-northeast1 --format 'value(status.url)'
IAP の認証画面が表示されるので、Googleアカウントでログインします。管理者ユーザーの作成 ログイン後、Lightdash のサインアップページが表示されます。これが表示されればデプロイは成功です。 必要な情報を入力して、最初の管理者ユーザーを作成してください。
- Personal Access Tokenの取得
サインアップが完了すると、最初のプロジェクトを作成するための案内画面が表示されます。
ここには
lightdash login
コマンドの例が記載されており、その末尾にパーソナルアクセストークン(Personal Access Token)が含まれています。 このトークンは後の手順でCLIからの認証に利用するため、必ずコピーして控えておいてください。
3.2. IAP越しのCLI実行準備
ローカルマシンからIAPで保護された Cloud Run に lightdash コマンドを送信するには、特別な設定が必要です。 具体的には、「このOAuthクライアントIDからのプログラムによるアクセスを許可する」という設定をIAPに追加し、コマンド実行時にそのクライアントIDを使って生成した認証トークンを渡します。
1. lightdash CLIのインストール
npm install -g @lightdash/cli@0.1741.0
2. IAP 設定の更新
まず現在の IAP 設定をファイルに書き出し、programmaticClients
を追加して更新します。
# 現在のIAP設定をiap.yamlに書き出す gcloud beta iap settings get \ --project=${GCP_PROJECT} \ --resource-type=cloud-run \ --service=lightdash \ --region=asia-northeast1 \ --format=yaml > iap.yaml # 認証情報作成時に払い出されたOAuthクライアントIDを取得 export GOOGLE_OAUTH_CLIENT_ID=$(gcloud secrets versions access latest --secret="lightdash_google_oauth_client_id") # iap.yamlを修正します。 # accessSettings.oauthSettings に programmaticClients を追加し、 # 取得したOAuthクライアントIDを記述してください。
iap.yaml
の修正例:
accessSettings: oauthSettings: programmaticClients: - YOUR_OAUTH_CLIENT_ID # 取得したOAuthクライアントIDに置き換える name: projects/{{ project-number }}/iap_web/cloud_run-asia-northeast1/services/lightdash
ファイル修正後、以下のコマンドで IAP の設定を更新します。
gcloud beta iap settings set iap.yaml \ --project=${GCP_PROJECT} \ --resource-type=cloud-run \ --service=lightdash \ --region=asia-northeast1
IAP の設定更新後、CLIが利用するサービスアカウント自身がIAPを通過できるよう、アクセス権限を付与します。
gcloud projects add-iam-policy-binding $GCP_PROJECT \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role="roles/iap.httpsResourceAccessor"
3.3. Lightdash プロジェクトの作成
すべての準備が整ったので、CLIから Lightdash プロジェクトを作成します。
1. 環境変数の設定 CLIの実行に必要な情報を環境変数に設定します。
# 3.1で取得したPersonal Access Token export LIGHTDASH_API_KEY="<YOUR_PERSONAL_ACCESS_TOKEN>" # Cloud Run のサービスURL export LIGHTDASH_URL="https://lightdash-$(gcloud projects describe $GCP_PROJECT --format='value(projectNumber)').asia-northeast1.run.app" # IAP 認証用のIDトークンを取得 export IAP_TOKEN=$(gcloud auth print-identity-token \ --audiences=${GOOGLE_OAUTH_CLIENT_ID} \ --impersonate-service-account=${SERVICE_ACCOUNT} \ --include-email)
gcloud auth print-identity-token
コマンドを(サービスアカウントを偽装して)実行するには、コマンドを実行するあなた自身のアカウントに、対象サービスアカウント (lightdash-sa
) に対する「サービスアカウント トークン作成者 (roles/iam.serviceAccountTokenCreator
)」のIAMロールが必要です。
2. lightdash deploy
の実行
dbtプロジェクトのdbt_project.yml
ファイルがあるディレクトリで、以下のコマンドを実行します。
これにより、stores
という名前のLightdashプロジェクトが作成され、dbtプロジェクトの内容が同期されます。
LIGHTDASH_API_KEY="$LIGHTDASH_API_KEY" \ LIGHTDASH_URL="$LIGHTDASH_URL" \ LIGHTDASH_PROXY_AUTHORIZATION="Bearer $IAP_TOKEN" \ lightdash deploy --create stores
dbtプロジェクトが別のディレクトリにある場合は、
--project-dir
オプションでパスを指定してください。
これで、Lightdash 上でdbtプロジェクトのデータを使った分析を開始できます。
おわりに
というわけで、今回は Cloud Runと IAP を使って Lightdash をセルフホストする手順をご紹介してみました。いかがでしたでしょうか?
似たツールとしてLookerがありますが、dbtとの親和性の高さを併せ持つLightdashも今後採用する組織が増えていくのではないかと思います。
これから Lightdash を触ってみようと思っている方の「最初の一歩」として、この記事が少しでもお役に立てば幸いです。
ここまで読んでくださりありがとうございました。