概要
ClickHouse Terraform プロバイダーが、セルフホスト環境と ClickHouse Cloud の双方で ClickStack リソースの管理に対応しました。ダッシュボード、アラート、ソース、保存済み検索、接続、Webhook をバージョン管理下に置き、使い慣れた terraform plan や terraform apply のワークフローで管理できます。
あるサービス向けに構築したダッシュボードが、1つの環境だけで使われ続けることはめったにありません。フィルター、保存済み検索、アラートとともに、ステージング環境や本番環境にも再作成されます。そうした複製が複数存在する場合、それらの同期を維持するにはUI上で同じ変更を繰り返し行い、各環境を手動で確認しなければなりません。
ClickStack の構成も、ほかのインフラと同じワークフローに統合できるようになりました。公式の ClickHouse Terraform プロバイダーが、セルフホスト環境と ClickHouse Cloud の両方において ClickStack リソースをサポートするようになりました。ダッシュボード、アラート、ソース、保存済み検索、接続、Webhook をバージョン管理下に置き、コードレビューを通したうえで、terraform plan や terraform apply で適用できます。
セルフホスト型 ClickStack と Managed ClickStack リソースのサポートは、v3.25 から通常のプロバイダーリリースにてベータ版として利用可能です。本番環境からのフィードバックを受けて、動作や設定内容が変更される可能性があります。
ClickHouse Terraform プロバイダー
ClickHouse は、役割の異なる2つの公式 Terraform プロバイダーを提供しています。
ClickHouse/clickhouse: サービス、プライベートエンドポイント、ClickPipes、組織アクセス、ClickHouse Managed Postgres を含む、ClickHouse Cloud コントロールプレーンのリソースを管理します。ClickHouse/clickhousedbops: ClickHouse インスタンスに接続し、データベースレベルのユーザー、ロール、権限、データベースを管理します。
ClickStack のサポートは ClickHouse/clickhouse に属します。ClickStack ユーザーからのフィードバックでは、セルフホスト環境と Cloud 環境の双方で Terraform への対応が最も要望の多い項目でした。当初は個別の取り組みとして開発を進めていましたが、別のプロバイダーとして公開するとリリースの作業、テスト、ドキュメント、認証コードの重複が生じることがわかりました。
そのため、ClickStack プロバイダーは既存の ClickHouse/clickhouse プロバイダー内の専用サービスモジュールとして追加され、そのリソースとデータソースは ClickHouse Cloud や Postgres の実装から分離されています。ユーザーは単一のプロバイダーをインストールし、同じリリースパスを利用し続けられます。
これにより、ClickHouse Cloud における認証の一貫性も保たれます。ClickStack リソースはプロバイダーの他のリソースと同じ組織 ID と Cloud API 認証情報を使用し、ClickStack サービス ID で対象のデプロイを識別します。セルフホストのオープンソース版 ClickStack は、自身のエンドポイントと個人用 API アクセスキーを使用します。設定方法は後ほど両方紹介します。

ClickStack API 上への構築
Terraform リソースには、予測可能な API コントラクトが必要です。リソース識別子は読み取りや更新をまたいでも一定である必要があります。作成、更新、削除、インポートの動作も明確でなければなりません。エラーにも、plan 時にどのフィールドで問題が起きたかをユーザーに示せる十分な構造が求められます。
2026年初めの ClickStack API の取り組みにより、既存の ClickHouse Cloud サービスパスを通じてオブザーバビリティリソースが公開されました。
/v1/organizations/{organizationId}/services/{serviceId}/clickstack/…
インフラストラクチャツールのサポートにあたり、API 定義の変更も必要でした。インラインスキーマは名前付きの型に置き換えられ、数値フィールドは整数型として一貫して定義され、バリデーションエラーには構造化されたエラー詳細が追加されました。これらの変更により、自動生成されたクライアントから OpenAPI コントラクトを利用できるようになり、Terraform が設定エラーを明確に報告するのに十分な情報が得られるようになりました。
ダッシュボードの管理には追加の要件がありました。ダッシュボードの定義は JSON 形式で提供され、適用前にバリデーションを行う必要があります。terraform plan の実行時、プロバイダーはエンドポイントが利用可能であれば ClickStack のバリデーション API に定義を送信します。これにより、無効な設定は terraform apply が変更を加える前に検知されます。

注意: 以前のバージョンの ClickStack などによってバリデーションエンドポイントが利用できない場合、プロバイダーは terraform plan をブロックする代わりに警告を出力します。その場合、バリデーションは terraform apply まで延期されます。
これらの変更により、オープンソース版と Managed ClickStack デプロイの両方で、ClickHouse Terraform プロバイダーを介して ClickStack リソースを管理できるようになりました。
ClickStack リソースの使用
以下の例では ClickHouse Cloud 上の Managed ClickStack を構成するためにプロバイダーを使用していますが、同じ clickhouse_clickstack_dashboard リソースはオープンソースのセルフホスト型 ClickStack でも動作します。リソースの定義は同じですが、認証とチームスコープの設定が両デプロイ方式で異なります。
Terraform 1.5 以降、ClickHouse プロバイダーのバージョン 3.25 以上、既存の Managed ClickStack サービスが必要です。また、以下のダッシュボードの例では、OpenTelemetry ログソースと ClickHouse 接続が構成済みであることを前提としています。
ClickHouse Cloud API キーの作成
プロバイダーはお使いの環境に代わって ClickHouse Cloud API を呼び出します。ClickHouse Cloud コンソールで Organization → API keys を開き、New API key を選択して、Service Admin または Org Admin 権限を持つキーを作成します。キー ID とシークレットを安全な場所に保存してください。
また、秘密情報ではない 2 つの識別子も必要です。
- ClickHouse Cloud 組織の組織 ID。
- Terraform で管理したい Managed ClickStack サービスのサービス ID。
両方とも Cloud コンソールからコピーしてください。サービス ID は、同じ組織内の別の ClickHouse サービスではなく、ClickStack を開く対象のサービスのものであることを確認してください。
> Cloud とセルフホストの認証情報 - ClickHouse Cloud では、組織 ID、Cloud API キー ID、Cloud API シークレット、ClickStack サービス ID を使用します。Managed ClickStack サービスは 1 つのチームに対応するため、Cloud リソースでチームを設定しないでください。一方、セルフホストの ClickStack では、代わりに CLICKSTACK_ENDPOINT と CLICKSTACK_API_KEY を使用します。このキーは、ClickStack UI で作成したパーソナル API アクセスキーである必要があります。デフォルト以外のチームの場合は、リソースの team 属性に対象のチーム ID を設定します。エイリアスのない同一の provider ブロック内で、Cloud とセルフホストの認証情報を混在させて設定しないでください。
Cloud 認証情報のエクスポート
プロバイダーは環境変数から認証情報を読み取ります。これにより、Terraform ファイルから認証情報を排除し、`terraform.tfvars` へのシークレットのコミットを防ぐことができます。
export CLICKHOUSE_ORG_ID="<organization-id>"
export CLICKSTACK_SERVICE_ID="<managed-clickstack-service-id>"
export CLICKHOUSE_CLOUD_API_KEY="<api-key-id>"
export CLICKHOUSE_CLOUD_API_SECRET="<api-key-secret>"> セルフホスト環境の場合は、上記の Cloud 向け環境変数を以下に置き換えます:
export CLICKSTACK_ENDPOINT="https://clickstack.example.com"
export CLICKSTACK_API_KEY="<personal-api-access-key>"デプロイパイプラインで Terraform を実行する場合は、CI システムのシークレットストアを使用してください。変数名は同じままで構いません。
今回の例では、ダッシュボードオブジェクトを読み込みます。これらは ClickStack のソースとコネクションを ID で参照します。利用可能な値は、上記でエクスポートした認証情報を使って ClickStack API から取得できます。
curl --silent \
--user "${CLICKHOUSE_CLOUD_API_KEY}:${CLICKHOUSE_CLOUD_API_SECRET}" \
"https://api.clickhouse.cloud/v1/organizations/${CLICKHOUSE_ORG_ID}/services/${CLICKSTACK_SERVICE_ID}/clickstack/sources" \
| jq -r '["SOURCE_ID","KIND","CONNECTION_ID","NAME"], (.result[] | [.id, .kind, .connection, .name]) | @tsv' \
| column -t -s $'\t'ダッシュボードでクエリを実行したいログソースと、それに対応するコネクションの ID をコピーします。それらを Terraform の入力変数として渡します:
export TF_VAR_logs_source_id="68d20d409bc8769c8984585f"
export TF_VAR_connection_id="68b6b6dd5d2cada7d1c593ac"プロバイダーの設定
サンプルのための空ディレクトリを作成し、[main.tf](http://main.tf) に以下のプロバイダー設定を追加します:
terraform {
required_version = ">= 1.5.0"
required_providers {
clickhouse = {
source = "ClickHouse/clickhouse"
version = "~> 3.24.0"
}
}
}
provider "clickhouse" {}
variable "logs_source_id" {
type = string
}
variable "connection_id" {
type = string
}> 上記の 4 つの環境変数から Cloud の設定が提供されるため、ここでの provider ブロックは空になっています。セルフホスト環境でデフォルト以外のチームを対象とする場合にのみ、ダッシュボードリソースに team = var.team_id を追加してください。
ダッシュボードの定義
main.tf にダッシュボードリソースを追加します。この例では、サービスごとのイベント数を時系列でカウントするログチャートを 1 つ作成します:
variable "logs_source_id" {
description = "ID of the ClickStack logs source used by the dashboard"
type = string
}
resource "clickhouse_clickstack_dashboard" "simple_logs" {
dashboard_json = jsonencode({
name = "simple logs dashboard"
tiles = [
{
name = "Log count over time by service",
id = "9kcn995dbkdxjlw3jj28k"
x = 0
y = 0
w = 24
h = 11
config = {
name = "Logs over time"
sourceId = var.logs_source_id
displayType = "line"
granularity = "auto"
alignDateRangeToGranularity = true
select = [
{
aggFn = "count"
aggCondition = ""
aggConditionLanguage = "lucene"
valueExpression = ""
}
]
where = ""
whereLanguage = "lucene"
groupBy = "ServiceName"
}
}
]
filters = []
containers = []
})
}
output "dashboard_id" {
value = clickhouse_clickstack_dashboard.simple_logs.id
}dashboard_json の値は ClickStack v2 ダッシュボード API に対応しています。これを jsonencode 内に記述することで、JSON 文字列を手動で組み立てることなく Terraform 変数を利用できます。
今すぐ始める
自社のデータで ClickHouse の動作を試してみませんか?わずか数分で ClickHouse Cloud を使い始めることができ、300 ドル分の無料クレジットも進呈されます。
サインアップ変更の計画と適用
ディレクトリを初期化し、設定のフォーマットと検証を行ってから、実行計画を確認します。
terraform init
terraform fmt
terraform validate
terraform planClickStack リソースはベータ版です。Terraform は検証時および計画時にベータ版に関する警告を出力しますが、これは想定通りの挙動です。実行計画に追加対象の clickhouse_clickstack_dashboard リソースが 1 つ含まれていることを確認し、適用します。
dalemcdiarmid@Mac clickstack_terraform % terraform apply
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# clickhouse_clickstack_dashboard.simple_logs will be created
+ resource "clickhouse_clickstack_dashboard" "simple_logs" {
+ dashboard_json = jsonencode(
{
+ containers = []
+ filters = []
+ name = "simple logs dashboard"
+ tiles = [
+ {
+ config = {
+ alignDateRangeToGranularity = true
+ displayType = "line"
+ granularity = "auto"
+ groupBy = "ServiceName"
+ name = "Logs over time"
+ select = [
+ {
+ aggCondition = ""
+ aggConditionLanguage = "lucene"
+ aggFn = "count"
+ valueExpression = ""
},
]
+ sourceId = "68d20d409bc8769c8984585f"
+ where = ""
+ whereLanguage = "lucene"
}
+ h = 11
+ id = "9kcn995dbkdxjlw3jj28k"
+ name = "Log count over time by service"
+ w = 24
+ x = 0
+ y = 0
},
]
}
)
+ id = (known after apply)
+ normalized_json = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
dashboard_id = "6a7daffaecf5dee21ed130c6"適用が完了したら、対象サービスの ClickStack → Dashboards を開きます。新しいダッシュボードには両方のタイルが含まれているはずであり、Terraform はそのダッシュボード ID を出力として表示します。

> 信頼できる情報源(Single Source of Truth)を 1 つに保つ: ダッシュボードの管理は、Terraform か ClickStack UI のどちらか一方のみで行ってください。ダッシュボードリソースは UI での編集をドリフトとして検出しません。これらの変更は dashboard_json が更新されるまで維持されますが、更新された時点で Terraform がダッシュボード定義を置き換えるため、上書きされる可能性があります。
ダッシュボード名、タグ、またはタイルの設定を変更し、再度 terraform plan を実行して、適用前に更新内容を確認します。一時的なテストデプロイの場合は、作業完了後にダッシュボードを削除します。
terraform destroy既存ダッシュボードの管理
既存のダッシュボードは、terraform import を使って Terraform の管理下に置くことができます。まず対応するリソースブロックを追加し、ダッシュボードを ID でインポートします。
terraform import clickhouse_clickstack_dashboard.collectors <dashboard-id>デフォルト以外のチームにあるセルフホスト型ダッシュボードの場合は、インポート ID として <team-id>/<dashboard-id> を使用します。完全なスキーマとインポートの動作については、ClickStack ダッシュボードリソースのドキュメントに記載されています。
これまでリソースを手動で作成してきた方向けに、既存の ClickHouse リソースを Terraform 設定へ簡単にインポートできるようにもしました。ClickStack 上で Terraform の管理下に置きたいリソース(下図のダッシュボードなど)を開き、Terraform アイコンを選択して、生成された import ブロックを .tf ファイルにコピーし、terraform plan -generate-config-out=generated-dashboard.tf コマンドを実行するだけです。このワークフローには Terraform 1.5 以降が必要です。
既存のリソースをすべて一括エクスポートして、リソース設定を生成することもできます。

エクスポートしたファイルを使用すれば、ClickStack のデプロイ全体を Terraform の管理下に置くことができます。例えば以下のようになります。
cp ~/Downloads/hyperdx-import.tf .
terraform init
terraform plan -generate-config-out=generated-dashboard.tfまとめ
ClickStack リソースも、他のインフラストラクチャと同じレビューおよびデプロイプロセスに従えるようになりました。これにより、各チームは環境間でオブザーバビリティ設定を再現したり、適用前に変更内容を確認したり、インポート機能によって既存リソースを Terraform の管理下に置くことができます。
この取り組みを ClickHouse/clickhouse に統合したことで、Managed ClickStack においてもプロバイダーが 1 つにまとまり、リリースパスと認証方法が一貫したものになります。また、エンドポイントと個人用の API アクセスキーを指定すれば、同じリソースをオープンソースのセルフホスト版 ClickStack に対しても使用できます。
ClickStack のサポートは、プロバイダーのバージョン 3.25.0 から利用可能です。まずはプロバイダーのドキュメントを確認し、既存のダッシュボードで試してみてください。問題や予期しない挙動を見つけた場合は、プロバイダーの GitHub リポジトリからご報告をお願いします。
今すぐ始める
自社のデータで ClickHouse の動作を試してみませんか?わずか数分で ClickHouse Cloud を使い始めることができ、300 ドル分の無料クレジットも進呈されます。
サインアップ


