HPC Terraform の課金について調べたメモ。
以前は Terraform Cloud という名称でした。Introducing The Infrastructure Cloud
課金方式
まずは公式の情報を参照します。
HashiCorp Terraform: Enterprise Pricing, Packages & Features
Estimate HCP Terraform Costs - Plans and Features - HCP Terraform | Terraform | HashiCorp Developer
- 管理対象リソース数に基づく従量課金
- Free プランは月500リソースまで利用可能
- Standard プランでは 500 リソースを超過したリソース数に基づいて課金
- 1時間単位で請求 (1時間未満は1時間に切り上げ)
- 1時間 / 1 リソースあたり $0.00014 ($0.0001359)
課金対象リソース
mode = “managed”のリソースをカウントする- Data source (
data.*) は対象外
- Data source (
null_resource、terraform_dataリソースは対象外- count , for_each で作成した場合もカウントされる
WebUIでリソース数の確認
Usage report
"Manage” → “Usage” で “Usage report” が参照できます。
Billable Managed Resources が課金対象リソース数です。

1時間ごとに更新されるとのことで、最新情報しか記載がなく、リソース数推移を確認できるページは用意されていないようです。
Workspace Overview
“Workspaces” → 対象の Workspace” → Overview の Resources にリソース数が出力されています。

こちらは 課金対象外リソースも含むリソース数合計 です。 課金対象リソース数のみに絞った値の出力は無いようです。
Cost Estimation
コスト見積もり機能がありますが、これは HPC Terraform の料金を見積もる機能ではない です。

Overview - Cost Estimation - HCP Terraform | Terraform | HashiCorp Developer
AWS、Google Cloud(GCP)、Azure (現時点でサポートされているのはこの3環境)に作成するリソース、つまりクラウドサービス側の料金を見積もる機能です。
参考: Terraform Cloud with AWS - DEV Community
ちなみにこの機能を有効にしておくと、CLI の実行時ログにも出力もされるようになります。
------------------------------------------------------------------------
Cost estimation:
Resources: 0 of 28 estimated
$0.0/mo +$0.0
課金対象リソースの算出
WebUI 上では全Workspaceの合計数しか確認ができない様なので他の手段で算出を試みます。
a) terraform state list
Command: state list | Terraform | HashiCorp Developer
state ファイル内のリソースをリストアップするコマンドです。 出力から課金対象リソースを算出します。
terraform state list | grep -v -E '(^|\.)(data|null_resource|terraform_data)\.' | wc -l
b) terraform state pull (stateファイル)
Command: state pull | Terraform | HashiCorp Developer
state ファイルを取得するコマンドです。 JSON 形式なので jq コマンドを使用して、 mode = “managed” のリソース数を抽出します。
# state-vertion = 4
terraform state pull | jq -r '.resources[]
| select(.mode == "managed") | .instances | length' \
| awk '{sum += $1} END {print sum}'
c) HPC Terraform API
API Docs - HCP Terraform | Terraform | HashiCorp Developer
“Billable Managed Resources” そのものを返却するAPIは用意されていないようです。
Workspace 情報
List workspaces、Get workspace に “resource-count” を持っていますが、こちらは 課金対象外リソースも含むリソース数合計 です。
TOKEN="Your API Token"
BASE_URL="https://app.terraform.io/api/v2"
ORGANIZATION="Your Organization"
curl -s \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/vnd.api+json" \
--request GET "${BASE_URL}/organizations/${ORGANIZATION}/workspaces" \
| jq -r '.data[].attributes."resource-count"' \
| awk '{sum += $1} END {print sum}'
State 最新情報
Fetch the Current State Version for a Workspace でWorkspaceの最新の state の情報が取得できます。
返却値は state ファイル自体ではありませんが、リソース数を持っているためここから算出します。mode 属性は持っていないので除外方式です。 (state ファイル自体を取得して算出も可能。state pull と同じなため割愛。)
TOKEN="Your API Token"
BASE_URL="https://app.terraform.io/api/v2"
WORKSPACE_ID="Your Workspace ID"
curl -s \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/vnd.api+json" \
--request GET "${BASE_URL}/workspaces/${WORKSPACE_ID}/current-state-version" \
| jq -r '[ .data.attributes.resources[]
| select(.type | startswith("data.") | not)
| select(.type == "null_resource" | not)
| select(.type == "terraform_data" | not)
| .count]' \
| awk '{sum += $1} END {print sum}'
d) Terraform tfe provider
tfe provider に workspace リソースがあるので、tfe_workspace で取得する事も可能です。
state のリソースはありませんので、取得できるのは 課金対象外リソースも含むリソース数合計 です。
terraform {
required_providers {
tfe = {}
}
}
variable "workspace_name" {}
variable "organization" {}
data "tfe_workspace" "this" {
name = var.workspace_name
organization = var.organization
}
output "tfe_workspace_resource_count" {
value = data.tfe_workspace.this.resource_count
}
課金対象リソース数の推移
本題です。
前述のいずれかの方法でデータを取得し、どこかに溜め込めば良さそうです。 1時間ごとの課金なので1時間ごとに実行して monitoring tool へ投げるなどしておくと、より正確に近付けるのではないかと思います。
a), b) は手元にTerraformを実行できる環境が必要ですし、Workspaceごとに実行する必要があります。 d) は複数Workspaceをまとめて取れる点は利点ですが、課金対象リソースの抽出ができません。
今回は大まかな推移がわかれば良いので、日次でスプレッドシートに保存するように GAS を用いてみます。
Fetch resource counts of HPC Terraform
日毎の値を取得ができれば、後はよしなにグラフ化してリソース数の推移を可視化できます。

Enterprise plan だと機能があったりするのかもしれませんが、 公式の Usage report を拡充していただけると、幸せになれそうです。