Apache Superset の構築
Apache Superset は OSS のデータ可視化・BI プラットフォームです。直感的な UI でダッシュボードやチャートを作成でき、多様なデータソースに接続できます。 このページでは、Superset を Azure の PaaS 上に構築する手順をまとめます。Superset 本体は App Service の Linux コンテナで動かし、メタデータ DB に Azure Database for PostgreSQL、セッション・キャッシュに Azure Cache for Redis を使います。設定ファイル superset_config.py はカスタム Docker イメージに含め、Azure Container Registry(ACR)経由で App Service に配置します。
構成
図を読み込み中…
| コンポーネント | Azure サービス | 役割 |
|---|---|---|
| Superset 本体 | App Service (Linux コンテナ) | Web UI・API サーバー |
| メタデータ DB | Azure Database for PostgreSQL | ダッシュボード定義・ユーザー情報の保存 |
| セッション/キャッシュ | Azure Cache for Redis | セッション管理・クエリキャッシュ |
構築の流れは次のとおりです。
図を読み込み中…
事前準備
- Azure CLI(
azコマンド) - Azure サブスクリプション
az group create \
--name rg-superset \
--location japaneastAzure Database for PostgreSQL
フレキシブルサーバーを作成し、Superset 用のデータベースを作ります。App Service からの接続を許可するため、Azure サービスからのアクセスを有効にします。
# サーバーの作成
az postgres flexible-server create \
--resource-group rg-superset \
--name psql-superset \
--location japaneast \
--admin-user supersetadmin \
--admin-password "<パスワード>" \
--sku-name Standard_B1ms \
--tier Burstable \
--version 16 \
--storage-size 32
# データベースの作成
az postgres flexible-server db create \
--resource-group rg-superset \
--server-name psql-superset \
--database-name superset
# ファイアウォール設定
az postgres flexible-server firewall-rule create \
--resource-group rg-superset \
--name psql-superset \
--rule-name AllowAllAzureServices \
--start-ip-address 0.0.0.0 \
--end-ip-address 0.0.0.0WARNING
0.0.0.0 から 0.0.0.0 へのルールは「Azure サービスへのアクセスを許可」を意味します。本番環境では App Service の送信 IP を固定し、IP 制限を厳密に設定してください。
Azure Cache for Redis
インスタンスを作成し、後で App Service の環境変数に設定するアクセスキーを取得しておきます。
az redis create \
--resource-group rg-superset \
--name redis-superset \
--location japaneast \
--sku Basic \
--vm-size c0
az redis list-keys \
--resource-group rg-superset \
--name redis-superset \
--query primaryKey \
--output tsvApp Service
プランと Web アプリの作成
Linux コンテナ用のプランを作成し、公式 Docker イメージ(apache/superset)で Web アプリを作ります。
az appservice plan create \
--resource-group rg-superset \
--name plan-superset \
--location japaneast \
--is-linux \
--sku B2
az webapp create \
--resource-group rg-superset \
--plan plan-superset \
--name app-superset \
--deployment-container-image-name apache/superset:latest環境変数
Superset の動作に必要な環境変数をアプリケーション設定として登録します。
| 変数名 | 値 |
|---|---|
DATABASE_URL | postgresql+psycopg2://supersetadmin:<パスワード>@psql-superset.postgres.database.azure.com/superset |
REDIS_URL | rediss://:<Redisアクセスキー>@redis-superset.redis.cache.windows.net:6380/0 |
SECRET_KEY | 任意のランダム文字列(32 文字以上推奨) |
az webapp config appsettings set \
--resource-group rg-superset \
--name app-superset \
--settings \
DATABASE_URL="postgresql+psycopg2://supersetadmin:<パスワード>@psql-superset.postgres.database.azure.com/superset" \
REDIS_URL="rediss://:<Redisアクセスキー>@redis-superset.redis.cache.windows.net:6380/0" \
SECRET_KEY="<ランダムな秘密鍵>"INFO
Azure Cache for Redis への接続は TLS が必須のため、スキームは redis:// ではなく rediss://(s 付き)を使います。ポートも 6379 ではなく 6380 になります。
設定ファイル superset_config.py
PostgreSQL と Redis を使う設定を記述します。値はすべて上の環境変数から読みます。
import os
# データベース接続
SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL")
# Redis キャッシュ設定
CACHE_CONFIG = {
"CACHE_TYPE": "RedisCache",
"CACHE_DEFAULT_TIMEOUT": 300,
"CACHE_KEY_PREFIX": "superset_",
"CACHE_REDIS_URL": os.environ.get("REDIS_URL"),
}
# セルリー(非同期タスク)設定
class CeleryConfig:
broker_url = os.environ.get("REDIS_URL")
result_backend = os.environ.get("REDIS_URL")
CELERY_CONFIG = CeleryConfig
# セッション設定
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = "Lax"
# Superset のシークレットキー
SECRET_KEY = os.environ.get("SECRET_KEY")カスタムイメージで設定ファイルを渡す
設定ファイルをコンテナに渡すには、カスタム Docker イメージを作るのが最もシンプルです。
FROM apache/superset:latest
USER root
COPY superset_config.py /app/pythonpath/superset_config.py
USER supersetビルドしたイメージを ACR に Push し、App Service で使います。
# ACR の作成
az acr create \
--resource-group rg-superset \
--name acrsuperset \
--sku Basic
# Docker イメージのビルドと Push
az acr build \
--registry acrsuperset \
--image superset-custom:latest .
# App Service でカスタムイメージを使用
az webapp config container set \
--resource-group rg-superset \
--name app-superset \
--docker-custom-image-name acrsuperset.azurecr.io/superset-custom:latest \
--docker-registry-server-url https://acrsuperset.azurecr.ioApp Service から ACR へのアクセスには、マネージド ID を使うのがベストプラクティスです。
# システム割り当てマネージド ID を有効化
az webapp identity assign \
--resource-group rg-superset \
--name app-superset
# ACR の AcrPull ロールを付与
PRINCIPAL_ID=$(az webapp identity show \
--resource-group rg-superset \
--name app-superset \
--query principalId \
--output tsv)
ACR_ID=$(az acr show \
--resource-group rg-superset \
--name acrsuperset \
--query id \
--output tsv)
az role assignment create \
--assignee $PRINCIPAL_ID \
--role AcrPull \
--scope $ACR_IDSuperset の初期設定
App Service の SSH コンソール(Azure Portal → App Service → SSH)または az webapp ssh コマンドで接続し、初期化コマンドを実行します。
# データベースのマイグレーション
superset db upgrade
# 初期データのロード
superset init
# 管理者ユーザーの作成
superset fab create-admin \
--username admin \
--firstname Admin \
--lastname User \
--email admin@example.com \
--password "<管理者パスワード>"App Service の URL(https://app-superset.azurewebsites.net)にアクセスし、作成した管理者アカウントでログインできることを確認します。ログイン後、「Settings → Database Connections」からデータソースを追加し、ダッシュボードを作成できれば構築完了です。
本番運用に向けて検討すること
- App Service のスケールアップ・スケールアウト設定
- PostgreSQL・Redis のファイアウォール規則の厳格化
- VNet 統合による通信の閉域化
- Key Vault を使ったシークレット管理
- Celery Worker の追加(非同期クエリの実行)