はじめに
本記事では、Databricks を AWS 上に Terraform を使ってデプロイする手順と、実際に遭遇した問題の解決方法を解説します。個人開発や学習環境での利用を想定していますが、本番環境への応用も可能です。
前提条件
- AWS アカウントと適切な権限
- Terraform インストール済み
- Databricks アカウント
- GitHub CLI (
gh) インストール済み(推奨)
デプロイ構成の概要
以下のリソースが作成されます:
- VPC、サブネット、NAT Gateway
- S3 バケット(ルートストレージ)
- IAM ロール(クロスアカウントアクセス用)
- Databricks ワークスペース
- Unity Catalog(データガバナンス機能)
公式サンプルの取得
GitHub CLI を使って必要な部分だけ取得します:
# 一時ディレクトリに clone
gh repo clone databricks/terraform-databricks-examples /tmp/databricks-examples -- --depth 1
# 必要な部分だけコピー
cp -r /tmp/databricks-examples/examples/aws-workspace-uc-simple ./terraform
cp -r /tmp/databricks-examples/modules ./
# 後片付け
rm -rf /tmp/databricks-examples
最終的なディレクトリ構成:
project-root/
├── terraform/
│ ├── main.tf
│ ├── variables.tf
│ └── terraform.tfvars
└── modules/
├── aws-base/
├── databricks-workspace/
└── unity-catalog/
設定ファイルの準備
必要な値の取得
1. AWS 設定
aws_profile = "default"
region = "ap-northeast-1"
cidr_block = "10.4.0.0/16"
2. Databricks Account ID
- https://accounts.cloud.databricks.com にログイン
- 右上のアカウントアイコン → Account settings
- Account ID をコピー
3. Service Principal の作成
- Databricks Account Console → User management → Service principals
- "Add service principal" で作成
- OAuth secrets タブ → "Generate secret"
- Client ID と Secret をコピー
- 重要: Roles タブで Account Admin を付与
4. その他の設定
my_username = "yourname@example.com"
databricks_users = ["yourname@example.com"]
databricks_metastore_admins = ["yourname@example.com"]
unity_admin_group = "metastore-admins"
workspace_name = "learning-workspace"
tags = {
Environment = "Development"
ManagedBy = "Terraform"
}
デプロイ実行
cd terraform
terraform init
terraform plan
terraform apply
完了まで 10〜15 分程度かかります。
よくあるエラーと解決方法
1. モジュールが見つからない
エラー:
Error: Unreadable module directory
Unable to evaluate directory symlink: GetFileAttributesEx ..\..\modules
原因: modules/ ディレクトリがコピーされていない
解決: 上記の「公式サンプルの取得」手順で modules もコピーする
2. Account Admin 権限不足
エラー:
Error: cannot read service principal: This API is disabled for users without account admin status.
解決: Service Principal に Account Admin ロールを付与
3. Metastore 上限エラー
エラー:
Error: cannot create metastore: This account has reached the limit for metastores
解決: Databricks Account Console から不要な Metastore を削除
4. Provider 設定エラー
エラー:
invalid Databricks Workspace configuration - host is not a workspace host
原因: Unity Catalog module で誤った provider を使用
解決: モジュール内で provider = databricks.workspace を明示的に指定
5. ユーザー削除エラー
エラー:
Error: cannot delete user: Not allowed to activate or deactivate user
解決: Terraform state から削除(実ユーザーは残しても問題なし)
terraform state rm 'databricks_user.unity_users["user@example.com"]'
Terraform Destroy の注意点
サブネット削除が停止する問題
症状: terraform destroy 実行時、サブネットの削除が 10 分以上停止
原因: Databricks クラスターのワーカーノードが残っており、ENI が in-use 状態
解決手順:
# 1. サブネット内の ENI を確認
aws ec2 describe-network-interfaces \
--filters "Name=subnet-id,Values=<SUBNET_ID>" \
--query 'NetworkInterfaces[*].[NetworkInterfaceId,Attachment.InstanceId]' \
--output table
# 2. インスタンスを強制終了
aws ec2 terminate-instances --instance-ids <INSTANCE_ID>
# 3. 5 分待機後、terraform destroy を再実行
terraform destroy
安全な削除スクリプト
クラスターを先に削除してから全体を削除する 2 段階アプローチ:
#!/bin/bash
# safe_destroy.sh
echo "=== Safe Destroy Script ==="
# Step 1: クラスター削除
echo "クラスターを削除中..."
terraform destroy \
-target=databricks_cluster.unity_catalog_cluster \
-auto-approve
# Step 2: 待機
echo "削除完了を待機中(30秒)..."
sleep 30
# Step 3: 残りのリソース削除
echo "残りのリソースを削除中..."
terraform destroy
echo "=== 完了 ==="
使用方法:
chmod +x safe_destroy.sh
./safe_destroy.sh
機密情報の管理
.gitignore の設定
cat >> .gitignore << 'EOF'
# Terraform
*.tfvars
.env
terraform/.terraform/
terraform/terraform.tfstate*
terraform/.terraform.lock.hcl
EOF
環境変数による管理(推奨)
# .env ファイル(.gitignore に追加必須)
export TF_VAR_databricks_account_id="xxx"
export TF_VAR_databricks_client_id="xxx"
export TF_VAR_databricks_client_secret="xxx"
# 使用時
source .env
terraform plan
コスト管理
Databricks のコスト構造
- ワークスペース作成のみ: ほぼコストなし
- クラスター起動時: EC2 + Databricks 利用料が発生
- クラスター停止時: コスト停止
NAT Gateway の問題
最もコストがかかるリソース:
- 時間課金: $0.062/時間 ≒ 月 $45(東京リージョン)
- データ転送料: $0.062/GB
- 停止不可: 削除するしかない
コスト削減の選択肢
オプション 1: 使用後に destroy(個人開発向け)
# 使い終わったら
terraform destroy
# 次回使用時(10-15分)
terraform apply
コスト: ほぼゼロ
オプション 2: PrivateLink 構成(セキュリティ重視)
公式サンプルの aws-databricks-modular-privatelink を使用:
- NAT Gateway 不要
- VPC エンドポイント使用: 月 $60〜70 程度
- コスト削減ではなく、セキュリティ強化が目的
オプション 3: クラスター自動停止
ワークスペース内でクラスターの自動停止を設定(推奨: 30分)
ベストプラクティス
Terraform で管理すべきクラスター
- 本番 Job クラスター(ETL、ML パイプライン)
- チーム共有クラスター
UI で管理すべきクラスター
- 個人の開発用クラスター
- アドホックな分析用クラスター
デモ・検証用途は UI 管理の方が destroy 時のトラブルを回避しやすい。
まとめ
重要なポイント
- 公式サンプルを活用: ベストプラクティスに沿った構成を素早く構築
- Service Principal に Account Admin 権限必須
- 機密情報は .gitignore で除外、環境変数で管理
- destroy は 2 段階実行: クラスター → インフラの順
- NAT Gateway のコストに注意: 個人開発なら destroy 運用推奨
推奨される運用方法
- 個人開発・学習: 使用後に destroy してコスト削減
- チーム開発: クラスター自動停止 + 定期的な環境リセット
- 本番環境: AWS Secrets Manager + Terraform Cloud で管理
トラブルシューティングの鉄則
Databricks × Terraform 特有の問題は以下の 3 点に集約される:
- Provider alias と依存関係: ワークスペース削除前にクラスター削除必須
- Databricks API の制約: Metastore、User の削除制限
- State と実体の不整合: state rm で対応
参考リンク
サンプルがあったおかげで1からTerraformを書かなくてよく、それが個人学習・個人開発においては非常にメリットでした。必要な時にコマンド一発でDatabricksが立ち上がる環境を手にできたので、次はRAG構築などに挑戦していきたいです。
この記事が Databricks on AWS のデプロイに役立てば幸いです。