0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人学習用にDatabricks on AWS を Terraform でデプロイしてみた

Last updated at Posted at 2026-01-27

はじめに

本記事では、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

  1. https://accounts.cloud.databricks.com にログイン
  2. 右上のアカウントアイコン → Account settings
  3. Account ID をコピー

3. Service Principal の作成

  1. Databricks Account Console → User management → Service principals
  2. "Add service principal" で作成
  3. OAuth secrets タブ → "Generate secret"
  4. Client IDSecret をコピー
  5. 重要: 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 時のトラブルを回避しやすい。

まとめ

重要なポイント

  1. 公式サンプルを活用: ベストプラクティスに沿った構成を素早く構築
  2. Service Principal に Account Admin 権限必須
  3. 機密情報は .gitignore で除外、環境変数で管理
  4. destroy は 2 段階実行: クラスター → インフラの順
  5. NAT Gateway のコストに注意: 個人開発なら destroy 運用推奨

推奨される運用方法

  • 個人開発・学習: 使用後に destroy してコスト削減
  • チーム開発: クラスター自動停止 + 定期的な環境リセット
  • 本番環境: AWS Secrets Manager + Terraform Cloud で管理

トラブルシューティングの鉄則

Databricks × Terraform 特有の問題は以下の 3 点に集約される:

  1. Provider alias と依存関係: ワークスペース削除前にクラスター削除必須
  2. Databricks API の制約: Metastore、User の削除制限
  3. State と実体の不整合: state rm で対応

参考リンク


サンプルがあったおかげで1からTerraformを書かなくてよく、それが個人学習・個人開発においては非常にメリットでした。必要な時にコマンド一発でDatabricksが立ち上がる環境を手にできたので、次はRAG構築などに挑戦していきたいです。

この記事が Databricks on AWS のデプロイに役立てば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?