$npx -y skills add github/awesome-copilot --skill aws-resource-health-diagnoseAnalyze AWS resource health, diagnose issues from CloudWatch logs and metrics, and create a remediation plan for identified problems.
| 1 | # AWS Resource Health & Issue Diagnosis |
| 2 | |
| 3 | This workflow analyzes a specific AWS resource to assess its health status, diagnose potential issues using CloudWatch logs and metrics, and develop a comprehensive remediation plan for any problems discovered. |
| 4 | |
| 5 | ## Prerequisites |
| 6 | - AWS CLI configured and authenticated |
| 7 | - Target AWS resource identified (name, type, and optionally region/account) |
| 8 | - CloudWatch logging and metrics enabled on the target resource |
| 9 | |
| 10 | ## Workflow Steps |
| 11 | |
| 12 | ### Step 1: Get AWS Diagnostic Best Practices |
| 13 | Fetch `https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/` for monitoring and troubleshooting guidance to inform the diagnostic approach. |
| 14 | |
| 15 | ### Step 2: Resource Discovery & Identification |
| 16 | Locate the target resource using the appropriate AWS CLI command for its type: |
| 17 | |
| 18 | ```bash |
| 19 | # EC2 |
| 20 | aws ec2 describe-instances --filters "Name=tag:Name,Values=<name>" |
| 21 | # Lambda |
| 22 | aws lambda get-function --function-name <name> |
| 23 | # RDS |
| 24 | aws rds describe-db-instances --db-instance-identifier <name> |
| 25 | # ECS |
| 26 | aws ecs describe-services --cluster <cluster> --services <name> |
| 27 | # ALB |
| 28 | aws elbv2 describe-load-balancers --names <name> |
| 29 | # DynamoDB |
| 30 | aws dynamodb describe-table --table-name <name> |
| 31 | # SQS |
| 32 | aws sqs get-queue-attributes --queue-url <url> --attribute-names All |
| 33 | # API Gateway |
| 34 | aws apigatewayv2 get-apis |
| 35 | ``` |
| 36 | |
| 37 | If multiple matches are found, prompt the user to specify region/account. |
| 38 | |
| 39 | ### Step 3: Health Status Assessment |
| 40 | Run service-specific health checks: |
| 41 | |
| 42 | ```bash |
| 43 | # EC2 |
| 44 | aws ec2 describe-instance-status --instance-ids <id> |
| 45 | |
| 46 | # RDS |
| 47 | aws rds describe-db-instances --db-instance-identifier <name> \ |
| 48 | --query 'DBInstances[0].DBInstanceStatus' |
| 49 | |
| 50 | # Lambda - error rate over 24h |
| 51 | aws cloudwatch get-metric-statistics --namespace AWS/Lambda \ |
| 52 | --metric-name Errors --dimensions Name=FunctionName,Value=<name> \ |
| 53 | --start-time $(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ) \ |
| 54 | --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \ |
| 55 | --period 3600 --statistics Sum |
| 56 | |
| 57 | # ECS |
| 58 | aws ecs describe-services --cluster <cluster> --services <name> \ |
| 59 | --query 'services[0].[status,runningCount,desiredCount,pendingCount]' |
| 60 | ``` |
| 61 | |
| 62 | Key health indicators by service type: |
| 63 | - **Lambda**: Error rate, throttle rate, duration P99, concurrent executions |
| 64 | - **RDS**: CPU utilization, FreeStorageSpace, DatabaseConnections, ReadLatency/WriteLatency |
| 65 | - **ECS**: Running vs desired task count, task stop reason |
| 66 | - **ALB**: TargetResponseTime, HTTPCode_ELB_5XX_Count, UnHealthyHostCount |
| 67 | - **SQS**: ApproximateNumberOfMessagesNotVisible, ApproximateAgeOfOldestMessage |
| 68 | - **DynamoDB**: ConsumedReadCapacityUnits, ThrottledRequests, SuccessfulRequestLatency |
| 69 | |
| 70 | ### Step 4: Log & Metrics Analysis |
| 71 | Find log groups and run CloudWatch Logs Insights queries: |
| 72 | |
| 73 | ```bash |
| 74 | # Find log groups |
| 75 | aws logs describe-log-groups --log-group-name-prefix /aws/<service>/<name> |
| 76 | |
| 77 | # Start a query (last 24h errors) |
| 78 | aws logs start-query \ |
| 79 | --log-group-name /aws/lambda/<name> \ |
| 80 | --start-time $(date -u -d '24 hours ago' +%s) \ |
| 81 | --end-time $(date -u +%s) \ |
| 82 | --query-string 'filter @message like /ERROR/ | stats count(*) as errorCount by bin(1h)' |
| 83 | |
| 84 | # Get results |
| 85 | aws logs get-query-results --query-id <id> |
| 86 | |
| 87 | # Lambda cold starts |
| 88 | aws logs start-query \ |
| 89 | --log-group-name /aws/lambda/<name> \ |
| 90 | --start-time $(date -u -d '24 hours ago' +%s) \ |
| 91 | --end-time $(date -u +%s) \ |
| 92 | --query-string 'filter @type = "REPORT" | filter @initDuration > 0 | stats count() as coldStarts by bin(1h)' |
| 93 | |
| 94 | # RDS Performance Insights (if enabled) |
| 95 | aws pi get-resource-metrics \ |
| 96 | --service-type RDS --identifier db:<identifier> \ |
| 97 | --metric-queries '[{"Metric":"db.load.avg"}]' \ |
| 98 | --start-time $(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ) \ |
| 99 | --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \ |
| 100 | --period-in-seconds 3600 |
| 101 | ``` |
| 102 | |
| 103 | Identify: recurring error patterns, correlation with deployments (CloudTrail), performance trends, dependency failures. |
| 104 | |
| 105 | ### Step 5: Issue Classification & Root Cause Analysis |
| 106 | **Severity**: |
| 107 | - **Critical**: Service unavailable, data loss, security incidents |
| 108 | - **High**: Performance degradation, error rates >5%, intermittent failures |
| 109 | - **Medium**: Warnings, suboptimal configuration, minor performance issues |
| 110 | - **Low**: Informational alerts, optimization opportunities |
| 111 | |
| 112 | **Root Cause Categories**: |
| 113 | - Configuration Issues: wrong settings, missing env vars, IAM permission denials |
| 114 | - Resource Constraints: CPU/memory/disk limits, Lambda throttling, RDS connection exhaustion |
| 115 | - Network Issues: security group rules, VPC routing, DNS, NACLs |
| 116 | - Application Issues: code bugs, memory leaks, unhandled exceptions, slow queries |
| 117 | - Dependency Issues: downstream timeouts, SQS/SNS failures, external API limits |
| 118 | - Security Issues: KMS key issues, certificate expiration |
| 119 | |
| 120 | ### Step 6: Generate Remediation Plan |
| 121 | |
| 122 | **Immediate Actions** (Critical): |
| 123 | ```bash |
| 124 | # Lambda throttling — increase reserved concurrency |
| 125 | aw |