STORES Product Blog

こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。

Cloud Run + IAP で Lightdash をホスティングしてみた

はじめに

\コンニチハ/

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

コマンドを実行するとaccessIdsecretが出力されます。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 と起動スクリプト

ローカルの作業ディレクトリに、以下のDockerfilelightdash-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の取得

  1. Cloud Run サービスのURLにアクセス 以下のコマンドでサービスのURLを確認し、ブラウザでアクセスします。 sh gcloud run services describe lightdash --region=asia-northeast1 --format 'value(status.url)' IAP の認証画面が表示されるので、Googleアカウントでログインします。

  2. 管理者ユーザーの作成 ログイン後、Lightdash のサインアップページが表示されます。これが表示されればデプロイは成功です。 必要な情報を入力して、最初の管理者ユーザーを作成してください。

  1. 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 を触ってみようと思っている方の「最初の一歩」として、この記事が少しでもお役に立てば幸いです。

ここまで読んでくださりありがとうございました。