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