AWS Collector
Discover and monitor AWS infrastructure
The AWS collector discovers and continuously monitors AWS infrastructure across compute, networking, storage, database, and serverless services. It connects to one or more AWS accounts and periodically scans all enabled regions, publishing configuration items and relationships for processing.
What Gets Discovered
The collector discovers 23 CI types across 11 AWS services:
| CI Type | AWS Service | Description |
|---|---|---|
aws.account | Organizations/STS | AWS account (containment root for all resources) |
aws.ec2_instance | EC2 | Compute instances |
aws.ec2_ami | EC2 | Machine images (self-owned only) |
aws.autoscaling_group | Auto Scaling | Auto Scaling groups |
aws.vpc | VPC | Virtual private clouds |
aws.subnet | VPC | VPC subnets |
aws.security_group | VPC | Firewall rule sets |
aws.load_balancer | ELBv2 | Application, Network, and Gateway load balancers |
aws.s3_bucket | S3 | Object storage buckets (global, all regions) |
aws.ebs_volume | EBS | Block storage volumes |
aws.ebs_snapshot | EBS | Volume snapshots (self-owned only) |
aws.rds_instance | RDS | Managed database instances |
aws.rds_cluster | RDS | Aurora clusters |
aws.lambda_function | Lambda | Serverless functions |
aws.iam_user | IAM | IAM users with policies, MFA status, and access key metadata |
aws.iam_role | IAM | IAM roles with trust policies (customer-managed, excludes service-linked) |
aws.iam_policy | IAM | Customer-managed IAM policies with policy documents |
aws.ecs_cluster | ECS | Container orchestration clusters |
aws.ecs_service | ECS | Services running on ECS clusters with task definitions and network config |
aws.ecs_task_definition | ECS | Task definitions (latest active revision per family) |
aws.eks_cluster | EKS | Managed Kubernetes control plane |
aws.elasticache_cluster | ElastiCache | Redis, Valkey, or Memcached cache nodes |
aws.elasticache_replication_group | ElastiCache | Redis/Valkey replication groups (HA topology with failover) |
Each resource's AWS Name tag is used as the CI name where available, falling back to the AWS resource ID (e.g., i-0abc123def456).
Prerequisites
- An AWS account with programmatic access
- An IAM user with an access key and secret key
- The IAM policy from the section below attached to that user
The collector only makes read-only API calls. No write permissions are needed or used.
IAM Policy
Create an IAM policy with the following JSON and attach it to the IAM user or role the collector will use. This is the minimum set of permissions required — no broader policies such as ReadOnlyAccess are needed.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ParascopeReadOnly",
"Effect": "Allow",
"Action": [
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:DescribeLaunchConfigurations",
"autoscaling:DescribeTags",
"ec2:DescribeImages",
"ec2:DescribeInstances",
"ec2:DescribeRegions",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSnapshots",
"ec2:DescribeSubnets",
"ec2:DescribeVolumes",
"ec2:DescribeVpcs",
"ecs:DescribeClusters",
"ecs:DescribeServices",
"ecs:DescribeTaskDefinition",
"ecs:ListClusters",
"ecs:ListServices",
"ecs:ListTaskDefinitions",
"eks:DescribeCluster",
"eks:ListClusters",
"eks:ListTagsForResource",
"elasticache:DescribeCacheClusters",
"elasticache:DescribeCacheSubnetGroups",
"elasticache:DescribeReplicationGroups",
"elasticache:ListTagsForResource",
"elasticloadbalancing:DescribeListeners",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:DescribeTags",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:DescribeTargetHealth",
"iam:GetAccessKeyLastUsed",
"iam:GetLoginProfile",
"iam:GetPolicy",
"iam:GetPolicyVersion",
"iam:GetRole",
"iam:GetUser",
"iam:ListAccessKeys",
"iam:ListAttachedRolePolicies",
"iam:ListAttachedUserPolicies",
"iam:ListGroupsForUser",
"iam:ListInstanceProfilesForRole",
"iam:ListMFADevices",
"iam:ListPolicies",
"iam:ListRolePolicies",
"iam:ListRoles",
"iam:ListUserPolicies",
"iam:ListUsers",
"lambda:GetFunction",
"lambda:ListFunctions",
"lambda:ListTags",
"rds:DescribeDBClusters",
"rds:DescribeDBInstances",
"rds:DescribeDBSubnetGroups",
"rds:ListTagsForResource",
"s3:GetBucketEncryption",
"s3:GetBucketLocation",
"s3:GetBucketTagging",
"s3:GetBucketVersioning",
"s3:ListAllMyBuckets",
"sts:GetCallerIdentity"
],
"Resource": "*"
},
{
"Sid": "ParascopeOrganizationsOptional",
"Effect": "Allow",
"Action": [
"organizations:DescribeAccount",
"organizations:ListAccounts"
],
"Resource": "*"
},
{
"Sid": "ParascopeCostExplorerOptional",
"Effect": "Allow",
"Action": [
"ce:GetCostAndUsage"
],
"Resource": "*"
}
]
}The policy is split into three statements. If your account is not part of an AWS Organization, you can remove the ParascopeOrganizationsOptional statement entirely. The collector handles Organizations API access errors gracefully and falls back to sts:GetCallerIdentity for standalone accounts.
The ParascopeCostExplorerOptional statement enables daily cost enrichment. If you do not need per-resource cost data, remove this statement. Cost Explorer must be enabled at the account level (Billing console). See Cost Enrichment below.
Configuration
Each AWS account is configured as a separate Parascope source. Configure credentials and region filters for each source:
| Field | Required | Description |
|---|---|---|
aws_access_key_id | Yes | IAM user access key ID |
aws_secret_access_key | Yes | IAM user secret access key |
aws_role_arn | No | Cross-account IAM role ARN to assume via STS AssumeRole |
aws_external_id | No | External ID for AssumeRole (adds an extra security condition) |
region_allowlist | No | Collect only these regions (comma-separated, e.g. us-east-1,eu-west-1). Default: all enabled regions |
region_denylist | No | Skip these regions. Ignored if region_allowlist is set |
If neither region_allowlist nor region_denylist is set, the collector automatically discovers all regions enabled in your account and collects from all of them.
Multi-Account Setup
Each AWS account is its own source in Parascope. To monitor multiple accounts, add each as a separate source in the collector configuration.
Same-account collection uses the IAM user credentials directly. No role configuration needed.
Cross-account collection uses STS AssumeRole. A common pattern is a single IAM user in a management account that assumes a read-only role in each target account:
-
In each target account, create an IAM role (e.g.,
ParascopeCollectorRole) with the IAM policy above as its permissions policy. Add a trust policy that allows the management account's IAM user to assume it. -
In each target account role's trust policy, optionally specify an
aws:ExternalIdcondition for extra security. -
In Parascope, configure one source per target account:
- Set
aws_access_key_idandaws_secret_access_keyto the management account IAM user credentials - Set
aws_role_arnto the target account role ARN (e.g.,arn:aws:iam::123456789012:role/ParascopeCollectorRole) - Set
aws_external_idif you configured one in the trust policy
- Set
Each source has independent health tracking and circuit breaking — a misconfigured or unreachable account does not block collection from other healthy accounts.
Collected Resources
EC2 Instances
Terminated EC2 instances are excluded. Only instances in pending, running, stopping, or stopped states are collected. Configuration tracked in change history includes instance type, state, VPC/subnet assignment, private and public IPs, attached security groups, AMI ID, availability zone, platform, and tags.
S3 Buckets
S3 buckets are collected globally (once per account, not per region). Each bucket's home region is recorded using GetBucketLocation. Configuration includes encryption status, versioning status, and tags.
EBS Snapshots and AMIs
Both are scoped to self-owned resources only. DescribeSnapshots and DescribeImages are called with OwnerIds=['self'] to avoid returning the millions of public AWS marketplace snapshots and images, which would create noise in your CMDB.
Security Groups
Full ingress and egress rule details are captured in config, including protocol, port ranges, CIDR ranges, and source security group references. Because security group rules define blast radius and compliance posture, changes to rules are tracked in change history.
Aurora Clusters
aws.rds_cluster captures Aurora clusters. Aurora member instances also appear as aws.rds_instance CIs and are linked to their cluster via contains relationships. Standalone RDS instances (non-Aurora) have no parent cluster.
IAM Users, Roles, and Policies
IAM resources are collected globally (once per account, not per region). Users include attached managed policies, group memberships, MFA device status, access key metadata (IDs and last-used dates, never secrets), and inline policy count. Roles include attached policies and instance profile associations. Service-linked roles (path /aws-service-role/) are excluded. Policies are customer-managed only (Scope=Local), including the default version document.
ECS Clusters and Services
Clusters track capacity providers, settings, and task/service counts. Services capture the active task definition, launch type, desired count, network configuration, load balancer bindings, and deployment status. Task definitions collect the latest active revision per family with container definitions, CPU/memory limits, network mode, and execution/task role ARNs.
EKS Clusters
Control plane metadata including Kubernetes version, platform version, VPC networking (subnets, security groups, public/private endpoint access), logging configuration, encryption settings, and the cluster IAM role. OIDC identity provider stored in raw data.
ElastiCache Clusters and Replication Groups
Replication groups are the operational unit for Redis/Valkey HA. Configuration includes engine, version, node type, shard topology (cluster mode, node groups, replicas per shard), automatic failover, Multi-AZ, encryption, and backup settings. Individual cache clusters are nodes within a replication group (Redis) or standalone resources (Memcached). Subnet group names are resolved to VPC subnet IDs.
Relationships
The collector maps the following relationships between AWS resources:
| Source | Relationship | Target |
|---|---|---|
aws.account | contains | aws.vpc |
aws.vpc | contains | aws.subnet |
aws.vpc | contains | aws.security_group |
aws.ec2_instance | runs_on | aws.subnet |
aws.ec2_instance | uses | aws.security_group |
aws.ec2_instance | has_attached | aws.ebs_volume |
aws.ec2_instance | created_from | aws.ec2_ami |
aws.autoscaling_group | has_member | aws.ec2_instance |
aws.autoscaling_group | runs_on | aws.subnet |
aws.autoscaling_group | uses | aws.ec2_ami |
aws.load_balancer | has_member | aws.ec2_instance |
aws.load_balancer | runs_on | aws.subnet |
aws.ebs_snapshot | snapshot_of | aws.ebs_volume |
aws.rds_cluster | contains | aws.rds_instance |
aws.rds_cluster | runs_on | aws.subnet |
aws.rds_cluster | uses | aws.security_group |
aws.rds_instance | runs_on | aws.subnet |
aws.rds_instance | uses | aws.security_group |
aws.lambda_function | uses | aws.vpc |
aws.lambda_function | uses | aws.security_group |
aws.iam_user | uses | aws.iam_policy |
aws.iam_role | uses | aws.iam_policy |
aws.ec2_instance | uses | aws.iam_role |
aws.lambda_function | uses | aws.iam_role |
aws.ecs_cluster | belongs_to | aws.account |
aws.ecs_service | belongs_to | aws.ecs_cluster |
aws.ecs_service | uses | aws.ecs_task_definition |
aws.ecs_service | runs_on | aws.subnet |
aws.ecs_service | uses | aws.security_group |
aws.ecs_service | uses | aws.load_balancer |
aws.ecs_task_definition | uses | aws.iam_role |
aws.eks_cluster | runs_on | aws.vpc |
aws.eks_cluster | runs_on | aws.subnet |
aws.eks_cluster | uses | aws.security_group |
aws.eks_cluster | uses | aws.iam_role |
aws.elasticache_cluster | belongs_to | aws.account |
aws.elasticache_cluster | runs_on | aws.subnet |
aws.elasticache_cluster | uses | aws.security_group |
aws.elasticache_cluster | member_of | aws.elasticache_replication_group |
aws.elasticache_replication_group | runs_on | aws.subnet |
aws.elasticache_replication_group | uses | aws.security_group |
This gives you a navigable VPC topology: account → VPC → subnet → instances, plus security group coverage, EBS attachment chains, load balancer membership, IAM policy attachment graphs, ECS service lineage, EKS cluster networking, and ElastiCache replication topology.
Cross-source correlation also links AWS resources to other Parascope sources:
aws.ec2_instancetokubernetes.node— matched by private IP or hostname, linking EC2 instances to EKS backing nodesaws.rds_instancetopostgresql.server— matched by RDS endpoint hostname, when the PostgreSQL collector monitors the same databaseaws.eks_clustertokubernetes.cluster— matched by cluster name
Cost Enrichment
The AWS collector integrates with AWS Cost Explorer to attach per-resource monthly cost estimates to your AWS CIs.
How It Works
Cost Explorer data is 12-24 hours behind real time, so cost enrichment runs once daily (default: 02:00 UTC) rather than during the collection cycle. The enricher queries Cost Explorer with per-resource granularity, matches resource ARNs to existing CIs, and creates cost allocation records.
Monthly cost is projected from month-to-date data: the daily average multiplied by days in the billing month. This produces a full-month estimate comparable to cost projections from other Parascope sources.
Supported Resources
Cost data is matched to these CI types by resource ARN:
| CI Type | ARN Pattern |
|---|---|
aws.ec2_instance | arn:aws:ec2:*:*:instance/{id} |
aws.ebs_volume | arn:aws:ec2:*:*:volume/{id} |
aws.rds_instance | arn:aws:rds:*:*:db:{id} |
aws.rds_cluster | arn:aws:rds:*:*:cluster:{id} |
aws.s3_bucket | arn:aws:s3:::{name} |
aws.lambda_function | arn:aws:lambda:*:*:function:{name} |
aws.load_balancer | Direct ARN match |
aws.elasticache_cluster | arn:aws:elasticache:*:*:cluster:{id} |
aws.elasticache_replication_group | arn:aws:elasticache:*:*:replicationgroup:{id} |
Prerequisites
- The
ParascopeCostExplorerOptionalIAM policy statement (see IAM Policy above) - Cost Explorer enabled at the AWS account level (Billing console, Account Settings)
- At least one full day of the current billing month elapsed
If Cost Explorer is not enabled, the enricher logs a warning and skips that source. CIs remain fully functional without cost data.
Troubleshooting
AccessDenied errors
The collector logs AccessDenied errors per API call. If you see these, the IAM user is missing a permission. Compare the error message's action against the IAM policy above and add the missing action. Common causes:
- A newer version of the collector added a new API call not in your existing policy
- The
ParascopeOrganizationsOptionalstatement was removed but the account is part of an Organization
API throttling
AWS throttles API calls per account per region. The collector uses boto3's adaptive retry mode, which automatically backs off and retries throttled requests. You do not need to take action — throttled calls are retried automatically. If collection is frequently slow due to throttling on accounts with large resource counts, increase the collection interval.
Region not enabled
If you receive errors about a region not being enabled, that region requires opt-in activation in the AWS console under Account Settings. Either activate the region or add it to region_denylist to skip it.
InvalidClientTokenId
This error means the access key is wrong or has been deactivated. Check that aws_access_key_id and aws_secret_access_key match an active IAM user access key in the AWS console.
Organizations errors
If you see AccessDenied errors specifically from organizations:DescribeAccount or organizations:ListAccounts, the account is not in an AWS Organization or the IAM user lacks the Organizations permissions. This is not a problem — remove the ParascopeOrganizationsOptional statement from your IAM policy and the collector will fall back to sts:GetCallerIdentity for the account CI automatically.
Cost Explorer not enabled
If you see OptInRequired errors in the enrichment logs, Cost Explorer is not enabled for the AWS account. Enable it in the Billing console under Account Settings. Cost Explorer can take up to 24 hours to activate after opt-in. You can also remove the ParascopeCostExplorerOptional statement from the IAM policy to suppress the warnings.
Related Documentation
- Managing Collectors — Collector health and configuration
- Collector Reference: Infrastructure — Kubernetes, Proxmox, OpenStack, and Netbox
- Correlation Engine — Cross-source relationship discovery
- CI Types — Complete CI type reference