pogi
Reference

Terraform cost

The resource types pogi prices, usage keys, statuses, defaults, limits, regions and price data for pogi cost and the Terraform tab.

The resource types, usage keys, defaults and limits behind pogi cost and the console's Terraform tab. For the steps, see Estimate Terraform cost. For the reasoning, see How Terraform cost works.

Basis: on-demand list prices, 730 hours a month, USD. No free tier, discounts or tax.

Priced resource types

AWS

ServiceTypes
EC2aws_instance, aws_autoscaling_group, aws_ebs_volume
VPC and networkingaws_eip, aws_nat_gateway, aws_vpc_endpoint, aws_lb, aws_alb, aws_route53_zone, aws_cloudfront_distribution
Databasesaws_db_instance, aws_rds_cluster, aws_rds_cluster_instance, aws_elasticache_cluster, aws_elasticache_replication_group, aws_dynamodb_table, aws_opensearch_domain, aws_msk_cluster
Containersaws_eks_cluster, aws_eks_node_group, aws_ecs_service
Serverless and messagingaws_lambda_function, aws_sqs_queue, aws_sns_topic, aws_kinesis_stream
Storage, logs and keysaws_s3_bucket, aws_cloudwatch_log_group, aws_secretsmanager_secret, aws_kms_key

Google Cloud

These types have price rules, but no Google Cloud prices are in pogi yet, so each row shows unpriced ("pogi has no Google Cloud prices yet") and is listed under "Not priced". See Price data.

google_compute_instance, google_compute_disk, google_compute_address, google_compute_router_nat, google_compute_forwarding_rule, google_container_cluster, google_container_node_pool, google_sql_database_instance, google_redis_instance, google_storage_bucket, google_cloud_run_v2_service, google_cloudfunctions2_function, google_pubsub_topic, google_bigquery_dataset.

Azure

azurerm_linux_virtual_machine, azurerm_windows_virtual_machine, azurerm_managed_disk, azurerm_public_ip, azurerm_nat_gateway, azurerm_lb, azurerm_application_gateway, azurerm_kubernetes_cluster, azurerm_kubernetes_cluster_node_pool, azurerm_service_plan, azurerm_linux_function_app, azurerm_windows_function_app, azurerm_mssql_database, azurerm_postgresql_flexible_server, azurerm_mysql_flexible_server, azurerm_redis_cache, azurerm_cosmosdb_account, azurerm_storage_account, azurerm_servicebus_namespace.

Free types

These cost nothing on their own. They show as free. Anything billed by use is priced on the resource that carries it.

  • AWS: VPCs, subnets, gateways, route tables and associations, security groups and their rules, network ACLs, DHCP options, aws_eip_association; IAM roles, policies, users, groups and instance profiles, aws_key_pair; launch templates and configurations, autoscaling policies, database, cache and parameter groups, load balancer listeners, listener rules, target groups and attachments; aws_ecs_cluster, aws_ecs_task_definition, aws_eks_addon, Lambda permissions and aliases; S3 bucket policy, versioning, ACL, public access block, ownership and encryption settings; SQS and SNS policies, SNS subscriptions, aws_cloudwatch_log_stream, aws_kms_alias, aws_secretsmanager_secret_version and aws_route53_record.
  • Google Cloud: google_compute_network, google_compute_subnetwork, google_compute_firewall, google_compute_route, google_compute_router, google_compute_network_peering, google_compute_instance_group, google_compute_health_check, service accounts and their keys, google_project_service, project, service account and bucket IAM members and bindings, google_project_iam_policy and google_project_iam_custom_role.
  • Azure: resource groups, virtual networks, subnets, network security groups and rules, route tables and routes, network interfaces, application security groups, peerings, user-assigned identities, role assignments and definitions, locks, disk attachments, load balancer rules, pools, probes and NAT rules, storage containers, azurerm_mssql_server and its firewall rules, database, configuration and firewall rules of the Postgres and MySQL flexible servers, Service Bus queues, topics and subscriptions, Linux and Windows web apps, and azurerm_network_watcher.

Resources from other providers (random_, null_ and so on) show as free with the note "not a cloud resource". A type not in any list above is unpriced.

Statuses

StatusMeans
knownEvery input came from the files.
assumedpogi used a default and says so in the row's notes.
usageOnly usage charges are left, and no usage is known. The unit price shows. The row counts $0.
needsA value pogi must have is unknown or missing, or has no price. The row says what. It counts $0.
freeCosts nothing on its own.
unpricedNo price rule for this type. It adds nothing, and the output says the real bill could be higher.

A default that is the provider's own documented default isn't an assumption. A guess is, and the row says "assumed …".

Usage keys

Set these in a usage file, under the resource's address. Run pogi cost <path> --usage-template to list the keys a folder's resources read.

TypeKeys
aws_instance, aws_autoscaling_groupos (linux or windows)
aws_lambda_functionmonthly_requests, avg_duration_ms
aws_lb, aws_albmonthly_lcu_hours
aws_nat_gateway, aws_vpc_endpointmonthly_gb_processed
aws_s3_bucketstorage_gb, monthly_get_requests, monthly_put_requests
aws_dynamodb_tablestorage_gb, monthly_read_request_units, monthly_write_request_units
aws_sqs_queue, aws_kms_key, aws_secretsmanager_secretmonthly_requests
aws_sns_topicmonthly_requests, monthly_http_deliveries, monthly_email_deliveries, monthly_mobile_push_deliveries
aws_kinesis_streammonthly_put_payload_units, monthly_gb_in, monthly_gb_out
aws_cloudwatch_log_groupmonthly_ingested_gb, storage_gb
aws_cloudfront_distributionmonthly_gb_out, monthly_http_requests, monthly_https_requests
aws_rds_clusterstorage_gb, monthly_io_requests
aws_rds_cluster_instanceavg_acus (Aurora Serverless)
aws_msk_clusterstorage_gb
aws_opensearch_domainwarm_storage_gb
aws_route53_zonemonthly_queries
google_storage_bucketstorage_gb, monthly_class_a_requests, monthly_class_b_requests
google_bigquery_datasetstorage_gb, long_term_storage_gb
google_pubsub_topicmonthly_gb_published
google_compute_router_natmonthly_gb_processed, nat_vm_count
google_compute_forwarding_rulemonthly_gb_processed
google_cloud_run_v2_service, google_cloudfunctions2_functionmonthly_requests, avg_duration_ms
azurerm_lb, azurerm_nat_gatewaymonthly_gb_processed
azurerm_application_gatewayavg_capacity_units, monthly_gb_processed
azurerm_linux_function_app, azurerm_windows_function_appmonthly_executions, monthly_gb_seconds
azurerm_storage_accountstorage_gb, monthly_read_operations, monthly_write_operations
azurerm_cosmosdb_accountstorage_gb, ru_per_second, autoscale_max_ru_per_second, monthly_request_units
azurerm_mssql_databasestorage_gb, monthly_vcore_hours
azurerm_servicebus_namespacemonthly_operations
azurerm_managed_disk, VMs, node poolsmonthly_disk_operations

A key must be snake_case. A value is a number that isn't negative, except os. A row's details in the console list the keys it reads.

What is assumed

A row notes each default it used. Some examples:

Whenpogi assumes
The files name no regionThe cloud's usual one: us-east-1, us-central1 or eastus.
An EC2 instance's AMILinux, unless the AMI lookup or os: windows in the usage file says otherwise.
A root disk size is not set8 GB, with the type the image sets (gp3 for AWS).
A public address is not setNo public IPv4 address.
An address, NAT or load balancer is usedAttached to something. An unused address costs more.
Spot or preemptible VMsThe on-demand rate. Spot prices aren't in the price lists.
A cluster autoscalesThe minimum node count.
An Aurora Serverless clusterIts minimum capacity, unless avg_acus is set.
A regional GKE cluster3 zones, unless node_locations is set.
A value unknown until applyA stated default, or the row shows needs.

Other notes name what is left out: for example global table replicas, the Infrequent Access log class (priced as Standard), CloudFront prices outside the US, and CloudWatch Logs storage beyond 7 days of retention.

A count or for_each that pogi can't work out counts as 1 instance, with a warning.

Limits

LimitValue
Files read from a folder2,000
Bytes of files read50 MB in total. A plan file can be up to 50 MB.
Resource instances from count, for_each and modules20,000
Module nesting16 levels
Usage file1 MB
Console upload: variable files, what-if sizes or modules in one request1,000 each
Console upload: one form field64 KB
Diagram: a module starts as one box above40 blocks

pogi reads .tf, .tf.json, .tfvars and .tfvars.json files, and .terraform/modules. It skips other hidden folders, node_modules and symbolic links. Going over a limit is an error that names the limit.

Regions

Prices follow the resource's region. A resource gets its region, in order, from its own region, zone or location, then from its provider block, and for Azure and Google Cloud, from a resource it refers to. See How Terraform cost works.

CloudRegions with pricesDefault
AWS34 public regions, from af-south-1 to us-west-2us-east-1
Azure59 regions, such as eastus, westeurope and japaneasteastus
Google CloudNone yetus-central1

A size or charge that isn't sold in a region shows as needs, with "no price for … in ".

Price data

The prices are built into pogi. There is one snapshot per cloud, made from the cloud's own price list before each release. pogi never downloads prices.

CloudDateSource
AWS2026-10-20AWS Price List bulk files, on-demand rows
Azure2026-10-20Azure Retail Prices API, pay-as-you-go list prices
Google Cloudnone yetThe data file is a placeholder. Every priced Google Cloud type shows unpriced, and pogi cost sizes says there are no Google Cloud sizes to list.

The header of pogi cost output, and the console, name the date and source of each cloud in use.

What is not covered

  • Free tiers, committed-use, savings plans, reserved and spot prices, enterprise discounts and tax.
  • Paid operating system licenses other than Windows (such as RHEL, SUSE and SQL Server).
  • Currencies other than USD.
  • Data transfer between regions and to the internet, unless a type has a usage key for it.
  • Resource types not listed above: they show as unpriced.
  • Terragrunt, Pulumi and CloudFormation. pogi reads Terraform files and plans.
  • Values that exist only after apply. A plan gives more of them than a folder does.

See also

On this page