Monitor VPC, RDS & DynamoDB
Monitor AWS VPC subnets, RDS instances, and DynamoDB tables with a single consolidated integration.
groundcover supports monitoring AWS VPC subnets, RDS instances, and DynamoDB tables through a single consolidated aws data integration. Instead of configuring one integration per signal, you configure the AWS account, region(s), role, and scrape interval once, and enable one capability block per signal: vpc, dynamodb, and rds. Every enabled capability inherits the same region/role/interval settings — there's no per-capability override. If you need to cover a different account, region, or role for a given capability, create a second aws integration.
What each capability collects
vpc- subnet IPv4 capacity (available and total addresses) viaDescribeSubnets.dynamodb- per-table item count and size viaDescribeTable.rds- instance-level gauges viaDescribeDBInstances, plus OS-level metrics (CPU, memory, swap, tasks) from RDS Enhanced Monitoring, read from theRDSOSMetricsCloudWatch Logs group.
Enabling rds only surfaces Enhanced Monitoring data for instances that already have it turned on. Enhanced Monitoring involves two separate roles: an RDS monitoring role, trusted by monitoring.rds.amazonaws.com, that RDS itself assumes to publish OS metrics to the RDSOSMetrics CloudWatch Logs group; and groundcover's own roleArn above, used only to read that already-published log group. Turn Enhanced Monitoring on via the RDS console (Modify → Additional configuration → Enable Enhanced Monitoring) or the AWS CLI (--monitoring-interval set to a non-zero value and --monitoring-role-arn set to the RDS monitoring role) - groundcover doesn't create or assume that role, it only reads the stream once AWS is already producing it.
Setting it up
In the app
Navigate to Data Sources and select AWS Enhanced, then follow the wizard:
Configuration - grant groundcover the required permissions (same IAM role setup as Ingest CloudWatch Metrics) and provide the Role ARN.
Regions selection - pick the AWS regions to collect from; enabled services are discovered across every selected region.
Services to monitor - turn on
VPC,DynamoDB, and/orEnhanced RDS, whichever you run. Each service can optionally be narrowed to specific resources (subnet IDs, table names, or DB instance identifiers) - leave the list empty to monitor everything the role can see. At least one service must be enabled.Ingestion settings - set the scrape interval and any custom labels.
Via Terraform or the API
Configure it using the groundcover_dataintegration resource with type = "aws":
For the full configuration reference, validation rules, and emitted metrics/labels, see the groundcover_dataintegration resource docs on the Terraform Registry.
Required IAM permissions
The role referenced by roleArn needs the permissions below in addition to the standard cross-account trust relationship.
Shared / identity permissions
Required regardless of which capabilities are enabled.
sts:GetCallerIdentity
*
Resolve the account ID for labeling (best-effort).
iam:ListAccountAliases
*
Resolve the account alias for labeling (best-effort).
vpc capability
ec2:DescribeSubnets
Paginated; optionally filtered by subnet ID.
rds capability
rds:DescribeDBInstances
Paginated; optionally filtered by DB instance ID.
logs:GetLogEvents
Scoped to the RDSOSMetrics log group - needed for Enhanced Monitoring OS metrics per instance.
dynamodb capability
dynamodb:ListTables
Only called when no table names are configured (auto-discovery mode).
dynamodb:DescribeTable
Called per table - either discovered or explicitly configured.
Suggested minimal IAM policy
rds:DescribeDBInstances and ec2:DescribeSubnets don't support resource-level restriction and must use Resource: "*". logs:GetLogEvents can be scoped to the RDSOSMetrics log group as shown above. If you'd rather restrict DynamoDB access to specific tables instead of allowing discovery, scope the dynamodb:* actions to those tables' ARNs and set dynamodb.tableNames in the integration config accordingly - just omit dynamodb:ListTables in that case, since discovery won't be used.
Last updated
