vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

HPC Terraform のリソース数推移を取得したい

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.*) は対象外
  • null_resourceterraform_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

AWSGoogle 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 を拡充していただけると、幸せになれそうです。