Resource Types

The Resource Types view shows all Terraform resource types in your infrastructure, with counts and quick access to instances of each type.

Overview

Resource types are the building blocks of Terraform configurations:

  • aws_instance - EC2 instances
  • aws_s3_bucket - S3 buckets
  • google_compute_instance - GCE VMs
  • azurerm_virtual_machine - Azure VMs

Stategraph catalogs every resource type across all your states.

Accessing Resource Types

Via UI

  1. Navigate to Inventory > Types in the sidebar
  2. Browse the list of all resource types
  3. See instance counts for each type
  4. Click a type to see all instances of that type

Via API

Get a summary of resource types (see instances docs for getting STATE_ID):

curl "http://localhost:8080/api/v1/states/$STATE_ID/resources/summary" \
  -H "Authorization: Bearer $STATEGRAPH_API_KEY"

Response:

{
  "aws_instance": { "instances": 20 },
  "aws_security_group": { "instances": 15 },
  "aws_subnet": { "instances": 6 },
  "aws_iam_role": { "instances": 12 }
}

Type Analysis

Count All Types

SELECT type, count(*) as type_count
FROM resources
GROUP BY type
ORDER BY count(*) DESC

Types by Provider

The provider value is the full Terraform provider source address
(e.g. provider["registry.terraform.io/hashicorp/aws"]), so match it with LIKE:

-- AWS resources
SELECT type, count(*) as type_count
FROM resources
WHERE provider LIKE '%hashicorp/aws%'
GROUP BY type
ORDER BY count(*) DESC

-- Google Cloud resources
SELECT type, count(*) as type_count
FROM resources
WHERE provider LIKE '%hashicorp/google%'
GROUP BY type
ORDER BY count(*) DESC

-- Azure resources
SELECT type, count(*) as type_count
FROM resources
WHERE provider LIKE '%hashicorp/azurerm%'
GROUP BY type
ORDER BY count(*) DESC

Unique Types per State

count(DISTINCT ...) is not supported; dedupe with a CTE, then count:

WITH state_types AS (
  SELECT state_id, type
  FROM resources
  GROUP BY state_id, type
)
SELECT state_id, count(*) AS types
FROM state_types
GROUP BY state_id
ORDER BY types DESC

Common Resource Types

AWS

Type Description
aws_instance EC2 instances
aws_security_group Security groups
aws_iam_role IAM roles
aws_s3_bucket S3 buckets
aws_subnet VPC subnets
aws_vpc Virtual private clouds
aws_lambda_function Lambda functions
aws_db_instance RDS instances

Google Cloud

Type Description
google_compute_instance Compute Engine VMs
google_storage_bucket Cloud Storage buckets
google_container_cluster GKE clusters
google_sql_database_instance Cloud SQL instances

Azure

Type Description
azurerm_virtual_machine Virtual machines
azurerm_storage_account Storage accounts
azurerm_kubernetes_cluster AKS clusters
azurerm_sql_server SQL servers

Type-Specific Queries

EC2 Instances by Type

SELECT i.attributes#>>'{instance_type}' AS instance_type, count(*) AS instance_count
FROM instances AS i
INNER JOIN resources AS r
  ON i.resource_address = r.address AND i.state_id = r.state_id
WHERE r.type = 'aws_instance'
GROUP BY i.attributes#>>'{instance_type}'
ORDER BY count(*) DESC

S3 Buckets by Region

SELECT i.attributes#>>'{region}' AS region, count(*) AS region_count
FROM instances AS i
INNER JOIN resources AS r
  ON i.resource_address = r.address AND i.state_id = r.state_id
WHERE r.type = 'aws_s3_bucket'
GROUP BY i.attributes#>>'{region}'
ORDER BY count(*) DESC

RDS Instances by Engine

SELECT i.attributes#>>'{engine}' AS engine, count(*) AS engine_count
FROM instances AS i
INNER JOIN resources AS r
  ON i.resource_address = r.address AND i.state_id = r.state_id
WHERE r.type = 'aws_db_instance'
GROUP BY i.attributes#>>'{engine}'
ORDER BY count(*) DESC

Lambda Functions by Runtime

SELECT i.attributes#>>'{runtime}' AS runtime, count(*) AS runtime_count
FROM instances AS i
INNER JOIN resources AS r
  ON i.resource_address = r.address AND i.state_id = r.state_id
WHERE r.type = 'aws_lambda_function'
GROUP BY i.attributes#>>'{runtime}'
ORDER BY count(*) DESC

Resource Categories

Group resource types by category:

Compute Resources

SELECT type, count(*) as type_count
FROM resources
WHERE type IN (
  'aws_instance',
  'aws_lambda_function',
  'aws_ecs_service',
  'google_compute_instance',
  'azurerm_virtual_machine'
)
GROUP BY type
ORDER BY count(*) DESC

Storage Resources

SELECT type, count(*) as type_count
FROM resources
WHERE type IN (
  'aws_s3_bucket',
  'aws_ebs_volume',
  'google_storage_bucket',
  'azurerm_storage_account'
)
GROUP BY type
ORDER BY count(*) DESC

Network Resources

SELECT type, count(*) as type_count
FROM resources
WHERE type IN (
  'aws_vpc',
  'aws_subnet',
  'aws_security_group',
  'aws_network_interface',
  'google_compute_network',
  'google_compute_subnetwork',
  'azurerm_virtual_network',
  'azurerm_subnet'
)
GROUP BY type
ORDER BY count(*) DESC

Security Resources

SELECT type, count(*) as type_count
FROM resources
WHERE type IN (
  'aws_iam_role',
  'aws_iam_policy',
  'aws_iam_user',
  'aws_kms_key',
  'aws_secretsmanager_secret'
)
GROUP BY type
ORDER BY count(*) DESC

Type Distribution Analysis

Types per Workspace

SELECT state_id, type, count(*) as type_count
FROM resources
GROUP BY state_id, type
ORDER BY state_id, count(*) DESC

New Resource Types

Find types that only appear in certain states (potentially new additions):

WITH type_states AS (
  SELECT type, state_id
  FROM resources
  GROUP BY type, state_id
)
SELECT type, count(*) AS states_count
FROM type_states
GROUP BY type
HAVING count(*) = 1
ORDER BY type

Most Common Types

SELECT type, count(*) as type_count
FROM resources
GROUP BY type
ORDER BY count(*) DESC
LIMIT 10

Monitoring Type Growth

Track how resource types grow over time by comparing counts periodically:

-- Current counts
SELECT type, count(*) as type_count
FROM resources
GROUP BY type
ORDER BY count(*) DESC

Save these queries to a Dashboard for regular monitoring.

Best Practices

  1. Monitor growth - Track type counts over time
  2. Review distribution - Ensure resources are distributed appropriately
  3. Check for drift - Compare expected vs actual type counts
  4. Identify outliers - Look for unexpected resource types

Next Steps