AWS cloud resources including EC2, RDS, Lambda, ECS/EKS, VPC networking, load balancers, databases, serverless, messaging, and cost optimization. Monitor AWS infrastructure, analyze resource usage, optimize costs, and ensure security compliance.
65
77%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
Optimize this skill with Tessl
npx tessl skill review --optimize ./skills/dt-obs-aws/SKILL.mdMonitor and analyze AWS resources using Dynatrace Smartscape and DQL. Query AWS services, optimize costs, manage security, and plan capacity across your AWS infrastructure.
Use this skill when the user needs to work with AWS resources in Dynatrace. Load the reference file for the task type:
| Task | File to load |
|---|---|
| Inventory and topology queries | (no additional file — use core patterns above) |
| Query AWS metric timeseries (CPU, errors, latency) | Load references/metrics-performance.md |
| VPC topology, security groups, subnet analysis | Load references/vpc-networking-security.md |
| RDS, DynamoDB, ElastiCache investigation | Load references/database-monitoring.md |
| Lambda, ECS, EKS investigation | Load references/serverless-containers.md |
| ALB/NLB topology, API Gateway | Load references/load-balancing-api.md |
| SQS, SNS, EventBridge, MSK | Load references/messaging-event-streaming.md |
| Unattached resources, tag compliance, lifecycle | Load references/resource-management.md |
| Cost savings, unused resources | Load references/cost-optimization.md |
| Capacity headroom, subnet IP, ASG limits | Load references/capacity-planning.md |
| Security audit, encryption, public access | Load references/security-compliance.md |
| SG rule analysis (0.0.0.0/0, open ports) | Load references/security-compliance.md |
| S3 public access, bucket encryption | Load references/security-compliance.md |
| EBS volume encryption audit | Load references/security-compliance.md |
| Cost allocation, chargeback, ownership | Load references/resource-ownership.md |
AWS resources use the AWS_* prefix and can be queried using the smartscapeNodes function. All AWS entities are automatically discovered and modeled in Dynatrace Smartscape.
Compute: AWS_EC2_INSTANCE, AWS_LAMBDA_FUNCTION, AWS_ECS_CLUSTER, AWS_ECS_SERVICE, AWS_EKS_CLUSTER
Networking: AWS_EC2_VPC, AWS_EC2_SUBNET, AWS_EC2_SECURITYGROUP, AWS_EC2_NATGATEWAY, AWS_EC2_VPCENDPOINT
Database: AWS_RDS_DBINSTANCE, AWS_RDS_DBCLUSTER, AWS_DYNAMODB_TABLE, AWS_ELASTICACHE_CACHECLUSTER
Storage: AWS_S3_BUCKET, AWS_EC2_VOLUME, AWS_EFS_FILESYSTEM
Load Balancing: AWS_ELASTICLOADBALANCINGV2_LOADBALANCER, AWS_ELASTICLOADBALANCINGV2_TARGETGROUP
Messaging: AWS_SQS_QUEUE, AWS_SNS_TOPIC, AWS_EVENTS_EVENTBUS, AWS_MSK_CLUSTER
All AWS entities include:
aws.account.id - AWS account identifieraws.region - AWS region (e.g., us-east-1)aws.resource.id - Unique resource identifieraws.resource.name - Resource nameaws.arn - Amazon Resource Nameaws.vpc.id - VPC identifier (for VPC-attached resources)aws.subnet.id - Subnet identifieraws.availability_zone - Availability zoneaws.security_group.id - Security group IDs (array)tags - Resource tags (use tags[TagName])AWS entities use these relationship types:
is_attached_to - Exclusive attachment (e.g., volume to instance)uses - Dependency relationship (e.g., instance uses security group)runs_on - Vertical relationship (e.g., instance runs on AZ)is_part_of - Composition (e.g., instance in cluster)belongs_to - Aggregation (e.g., service belongs to cluster)balances - Load balancing (e.g., target group balances instances)balanced_by - Reverse of balancesDynatrace ingests AWS metrics and exposes them using this naming pattern:
cloud.aws.<service>.<MetricName>.By.<DimensionName>The <service> is the lowercase AWS service name, <MetricName> is the original CloudWatch metric name (case-preserved), and <DimensionName> is the CloudWatch dimension used for splitting.
EC2 examples:
| CloudWatch metric | Dynatrace metric key |
|---|---|
CPUUtilization (by InstanceId) | cloud.aws.ec2.CPUUtilization.By.InstanceId |
StatusCheckFailed (by InstanceId) | cloud.aws.ec2.StatusCheckFailed.By.InstanceId |
NetworkIn (by InstanceId) | cloud.aws.ec2.NetworkIn.By.InstanceId |
DiskReadOps (by InstanceId) | cloud.aws.ec2.DiskReadOps.By.InstanceId |
Other service examples:
| CloudWatch metric | Dynatrace metric key |
|---|---|
RDS CPUUtilization (by DBInstanceIdentifier) | cloud.aws.rds.CPUUtilization.By.DBInstanceIdentifier |
Lambda Invocations (by FunctionName) | cloud.aws.lambda.Invocations.By.FunctionName |
SQS ApproximateNumberOfMessagesVisible (by QueueName) | cloud.aws.sqs.ApproximateNumberOfMessagesVisible.By.QueueName |
ELB RequestCount (by LoadBalancer) | cloud.aws.elasticloadbalancingv2.RequestCount.By.LoadBalancer |
To query a metric:
timeseries cpu = avg(cloud.aws.ec2.CPUUtilization.By.InstanceId),
by: {dt.smartscape_source.id},
from: now()-1h
| limit 10Important: Never refer to these as "CloudWatch alerts" or "CloudWatch metrics" in output. Dynatrace monitors AWS resources natively through its AWS integration — these are Dynatrace metrics ingested from AWS.
All AWS queries build on four core patterns. Master these and adapt them to any entity type.
List resources by type, filter by account/region/VPC/tags, summarize counts:
smartscapeNodes "AWS_*"
| filter aws.account.id == "<AWS_ACCOUNT_ID>" and aws.region == "<AWS_REGION>"
| summarize count = count(), by: {type}
| sort count descTo list a specific type, replace "AWS_*" with the entity type (e.g., "AWS_EC2_INSTANCE"). Add | fields name, aws.account.id, aws.region, ... to select specific columns. Use tags[TagName] for tag-based filtering.
Parse aws.object JSON for detailed configuration fields:
smartscapeNodes "AWS_RDS_DBINSTANCE"
| parse aws.object, "JSON:awsjson"
| fieldsAdd engine = awsjson[configuration][engine]
| summarize db_count = count(), by: {engine, aws.region}Common configuration fields by service:
instanceType, state[name], networkInterfaces[0][association][publicIp]engine, multiAZ, publiclyAccessible, storageEncrypted, dbInstanceClass, storageTypevolumeType, size, stateruntime, memorySizescheme, dnsNamekeyState, keyUsageminSize, maxSize, desiredCapacityavailableIpAddressCount, cidrBlockversioningConfiguration[status]securityGroups (array, use arraySize() to count)Follow relationships between resources:
smartscapeNodes "AWS_ELASTICLOADBALANCINGV2_LOADBALANCER"
| parse aws.object, "JSON:awsjson"
| fieldsAdd dnsName = awsjson[configuration][dnsName], scheme = awsjson[configuration][scheme]
| traverse "balanced_by", "AWS_ELASTICLOADBALANCINGV2_TARGETGROUP", direction:backward, fieldsKeep:{dnsName, id}
| fieldsAdd targetGroupName = aws.resource.name
| traverse "balances", "AWS_EC2_INSTANCE", fieldsKeep: {targetGroupName, id}
| fieldsAdd loadBalancerDnsName = dt.traverse.history[-2][dnsName],
loadBalancerId = dt.traverse.history[-2][id],
targetGroupId = dt.traverse.history[-1][id]Key traversal pairs:
traverse "balanced_by", "AWS_ELASTICLOADBALANCINGV2_TARGETGROUP", direction:backwardtraverse "balances", "AWS_EC2_INSTANCE"traverse "balances", "AWS_LAMBDA_FUNCTION"traverse "belongs_to", "AWS_ECS_CLUSTER"traverse "uses", "AWS_ECS_TASKDEFINITION"traverse "is_part_of", "AWS_RDS_DBCLUSTER"traverse "uses", "AWS_KMS_KEY"traverse "uses", "AWS_EC2_SECURITYGROUP"traverse "runs_on", "AWS_AVAILABILITY_ZONE"traverse "is_attached_to", "AWS_EC2_SUBNET"traverse "is_attached_to", "AWS_EC2_VPC"traverse "is_attached_to", "AWS_EC2_VOLUME", direction: backwardtraverse "uses", "AWS_IAM_ROLE"traverse "uses", "AWS_APIGATEWAYV2_INTEGRATION", direction: backwardtraverse "runs_on", "HOST", direction: backwardsummarize count(), by: {sg.name}fieldsKeep to carry fields through traversals, dt.traverse.history[-N] to access ancestor fieldsGroup resources by any tag for ownership/chargeback:
smartscapeNodes "AWS_*"
| filter isNotNull(tags[<TAG_NAME>])
| summarize resource_count = count(), by: {tags[<TAG_NAME>], type}
| sort resource_count descReplace CostCenter with any tag: Owner, Team, Project, Environment, Application, Department, BusinessUnit. Replace "AWS_*" with a specific type to scope to one service.
Find untagged resources: | filter arraySize(tags) == 0
Load reference files for detailed queries when the core patterns above need service-specific adaptation.
| Reference | When to load | Key content |
|---|---|---|
| vpc-networking-security.md | VPC topology, security groups, subnets, NAT, VPN, peering | VPC resource mapping, SG blast radius, public IP detection |
| database-monitoring.md | RDS, DynamoDB, ElastiCache, Redshift | Multi-AZ checks, engine distribution, subnet groups, dependencies |
| serverless-containers.md | Lambda, ECS, EKS, App Runner | VPC-attached functions, service-to-cluster mapping, container networking |
| load-balancing-api.md | ALB/NLB topology, API Gateway, CloudFront | LB→TG→Instance traversal, listener config, API stage management |
| messaging-event-streaming.md | SQS, SNS, EventBridge, Kinesis, MSK | Queue/topic inventory, streaming analysis, name pattern matching |
| resource-management.md | Resource audits, tag compliance, lifecycle | Unattached resources, deleted resources, tag coverage analysis |
| cost-optimization.md | Cost savings, unused resources, sizing | EBS costs, instance types, runtime distribution, snapshot analysis |
| capacity-planning.md | Capacity analysis, scaling, IP utilization | ASG headroom, subnet IP counts, ECS desired vs running |
| security-compliance.md | Security audits, encryption, public access | SG rule analysis (0.0.0.0/0, open ports), S3 public access block, EBS encryption, SG blast radius, public DB/LB detection, IAM roles |
| resource-ownership.md | Chargeback, ownership, cost allocation | Tag-based grouping, multi-account summaries |
| events.md | Load to check Auto Scaling, Health, and CloudFormation events | CloudFormation, Auto Scaling, AWS Health events |
| workload-detection.md | Load to determine orchestration context and resolution path | LB, ASG, ECS, EKS, Batch detection for blast radius analysis |
| metrics-performance.md | Load to query metric timeseries for a specific resource | DQL timeseries patterns for EC2, Lambda, RDS, SQS, ELB, ECS, DynamoDB |
"AWS_*" wildcards when possible)| limit N for explorationisNotNull() checks before accessing nested fieldsaws.object with JSON parser: parse aws.object, "JSON:awsjson"fieldsAdd configField = awsjson[configuration][field]toString() for complex nested objectscontains() or expandaws.object for detailed security contextpubliclyAccessible, storageEncrypted, and similar flagstags[TagName] for filteringarraySize(tags) for untagged resourcesparse aws.object, "JSON:awsjson"cloud.aws.* naming convention (see AWS Metric Naming Convention)direction:backward for reverse relationships (e.g., target group → load balancer)fieldsKeep to maintain important fields through traversaldt.traverse.history[-N]getNodeName() for human-readable resource namesisNotNull() and isNull()countDistinct() for unique resource counts4991356
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.