KLOUDCAREConfidential · Report KC-20260923-E55FF2

AWS Assessment Report

Prepared by KloudCare for AWS account 123456789012 · Assessed 2026-09-23T10:00:00Z · Observation window 14 days (2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z)

This assessment was read-only. No AWS resources were changed. Savings figures are estimates; review the limitations below before acting on them.

Jump to: Cost Backup Security Governance and operations

Executive summary

2Regions assessed
29Resources discovered
37Findings
9Critical / high
USD 882–1,219Est. monthly savings
USD 4,211Last month spend

Results by area

AreaFindingsCritical / highChecks
Cost12112 of 12 checks found issues
Backup726 of 6 checks found issues
Security13613 of 13 checks found issues
Governance and operations505 of 5 checks found issues

Regions assessed: eu-west-2, ap-southeast-1

Resources by service: ebs: 4, ec2: 8, ecs: 2, elb: 3, lambda: 4, nat-gateway: 2, rds: 2, s3: 4

Savings range covers 9 finding(s) with a price estimate; 3 cost-related finding(s) have no estimate.

High-priority findings

IDSeverityFindingResource
KC-001criticalRoot user has access keys123456789012
KC-002highRDS instance with low utilisation signalsdb-quiet
KC-003highNo active multi-region CloudTrail trail123456789012
KC-004highEBS volume never backed upvol-attached
KC-005highRoot user does not have MFA enabled123456789012
KC-006highIAM user can sign in to the console without MFAalice
KC-007highRDS instance has automated backups disableddb-idle
KC-008highS3 bucket policy makes the bucket publicpublic-website
KC-009highSecurity group allows internet access to sensitive portssg-open-ssh

Need help acting on these findings? Book a free 30-minute review with KloudCare (hello@kloudcare.co.uk).

Important limitations

All findings

IDAreaSeverityConfidenceFindingResourceRegionEst. monthly savings
KC-001SecuritycriticalhighRoot user has access keys123456789012global—
KC-002CosthighmediumRDS instance with low utilisation signalsdb-quieteu-west-2USD 338.72 – 423.40
KC-003SecurityhighhighNo active multi-region CloudTrail trail123456789012global—
KC-004BackuphighhighEBS volume never backed upvol-attachedeu-west-2—
KC-005SecurityhighhighRoot user does not have MFA enabled123456789012global—
KC-006SecurityhighhighIAM user can sign in to the console without MFAaliceglobal—
KC-007BackuphighhighRDS instance has automated backups disableddb-idleeu-west-2—
KC-008SecurityhighhighS3 bucket policy makes the bucket publicpublic-websiteeu-west-2—
KC-009SecurityhighhighSecurity group allows internet access to sensitive portssg-open-ssheu-west-2—
KC-010CostmediummediumEC2 instance type larger than observed CPU demandi-oversizedeu-west-2USD 130.06 – 195.10
KC-011CostmediumhighRDS instance with no database connectionsdb-idleeu-west-2USD 115.84 – 173.76
KC-012CostmediumhighEC2 instance with sustained low CPU utilisationi-idleeu-west-2USD 81.30 – 162.59
KC-013CostmediumhighCompute Optimizer: EC2 instance over-provisionedi-co-overeu-west-2USD 121.40
KC-014CostmediumhighUnattached EBS volumevol-unattachedeu-west-2USD 46.40 – 69.60
KC-015BackupmediumhighNo AWS Backup plan in a region with running workloads123456789012eu-west-2—
KC-016Governance and operationsmediumhighCompute Optimizer: EC2 instance under-provisionedi-busyeu-west-2—
KC-017SecuritymediumhighEBS encryption by default is off123456789012eu-west-2—
KC-018BackupmediumhighEBS volume without a recent backupvol-stale-backupeu-west-2—
KC-019CostmediumhighECS service running more task capacity than it usesmain/apieu-west-2—
KC-020Governance and operationsmediummediumLoad balancer with no healthy targetsalb-brokeneu-west-2—
KC-021SecuritymediumhighGuardDuty threat detection is not enabled123456789012eu-west-2—
KC-022SecuritymediumhighActive access key older than 90 daysdeploy-botglobal—
KC-023Governance and operationsmediumhighRegion with running workloads but no CloudWatch alarms123456789012eu-west-2—
KC-024SecuritymediumhighRDS instance is publicly accessibledb-quieteu-west-2—
KC-025SecuritymediumhighRDS storage is not encrypteddb-idleeu-west-2—
KC-026Governance and operationsmediumhighResource in an unexpected regionsingapore-fnap-southeast-1—
KC-027SecuritymediumhighS3 Block Public Access is not fully enabled for the account123456789012global—
KC-028CostmediumhighS3 bucket without lifecycle ruleslogs-archiveeu-west-2—
KC-029CostlowhighNAT Gateway with low traffic relative to its fixed costnat-quieteu-west-2USD 30.49 – 45.73
KC-030CostlowhighLoad balancer with no registered targetsalb-emptyeu-west-2USD 15.24 – 22.86
KC-031CostlowhighElastic IP address not associatedeipalloc-unusedeu-west-2USD 2.92 – 4.38
KC-032SecuritylowhighEBS volume is not encryptedvol-unattachedeu-west-2—
KC-033CostlowmediumLambda function with very low invocation volumerarely-usedeu-west-2—
KC-034BackuplowhighRDS instance without deletion protectiondb-idleeu-west-2—
KC-035BackuplowhighRDS backup retention shorter than recommendeddb-quieteu-west-2—
KC-036BackuplowhighS3 bucket without versioninglogs-archiveeu-west-2—
KC-037Governance and operationslowhighResource missing required tagssingapore-fnap-southeast-1—

Cost (12 finding(s))

Unused, underutilised and oversized resources, and other ways to reduce your AWS bill.

Estimated savings: USD 882–1,219 per month across 9 finding(s) with a price estimate.

Last month's spend: USD 4,210.55 (2026-08-01 to 2026-09-01, end exclusive; Cost Explorer GetCostAndUsage (UnblendedCost, MONTHLY, grouped by SERVICE))

ServiceCost
Amazon Elastic Compute Cloud - ComputeUSD 2,100.10
Amazon Relational Database ServiceUSD 1,500.45
Amazon Simple Storage ServiceUSD 610.00

Unused resources (5)

KC-011 medium RDS instance with no database connections rds · db-idle · eu-west-2
Check
RDS-IDLE (Unused resources)
Confidence
high
Recommended action
Confirm with the owner, take a final snapshot, then stop or delete the instance.
Risk
Medium; confirm no batch or disaster-recovery use before removal.
Effort
Low
Owner
platform-team
Estimated monthly cost
USD 144.80
Estimated monthly savings
USD 115.84 – 173.76 (Approximate eu-west-2 on-demand list price; excludes discounts, Savings Plans and Reserved Instances)

Evidence

ObservationSourceValueThresholdObservation period
Maximum connections over 336 of 336 expected 60-minute datapointsCloudWatch AWS/RDS/DatabaseConnections0.0maximum < 12026-09-09T10:00:00Z → 2026-09-23T10:00:00Z
Average CPU over 336 of 336 expected 60-minute datapointsCloudWatch AWS/RDS/CPUUtilization2.0%context only2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z

Current configuration

{
  "instance_class": "db.m5.large",
  "status": "available",
  "multi_az": false,
  "backup_retention_days": 0,
  "publicly_accessible": false,
  "deletion_protection": false,
  "storage_encrypted": false
}
KC-014 medium Unattached EBS volume ebs · vol-unattached · eu-west-2
Check
EBS-UNATTACHED (Unused resources)
Confidence
high
Recommended action
Confirm with the owner, take a snapshot if the data may be needed, then delete the volume.
Risk
Low if a snapshot is retained; data is lost if deleted without one.
Effort
Low
Owner
platform-team
Estimated monthly cost
USD 58.00
Estimated monthly savings
USD 46.40 – 69.60 (Approximate eu-west-2 on-demand list price; excludes discounts, Savings Plans and Reserved Instances)

Evidence

ObservationSourceValueThresholdObservation period
Volume state is 'available' (not attached to any instance) at collection time (2026-09-23T10:00:00Z)EC2 DescribeVolumesavailableunknownpoint in time

Current configuration

{
  "size_gb": 500,
  "volume_type": "gp2",
  "state": "available",
  "attached_to": [],
  "encrypted": false,
  "latest_snapshot": ""
}
KC-030 low Load balancer with no registered targets elb · alb-empty · eu-west-2
Check
ELB-NO-TARGETS (Unused resources)
Confidence
high
Recommended action
Confirm with the owner and DNS records, then delete the load balancer.
Risk
Low; check DNS and listeners do not route live traffic before deletion.
Effort
Low
Owner
platform-team
Estimated monthly cost
USD 19.05
Estimated monthly savings
USD 15.24 – 22.86 (Hourly charge only; approximate eu-west-2 on-demand list price; excludes discounts, Savings Plans and Reserved Instances)

Evidence

ObservationSourceValueThresholdObservation period
1 target group(s) with 0 registered targetsELBv2 DescribeTargetGroups / DescribeTargetHealth0unknownpoint in time

Current configuration

{
  "type": "application",
  "target_groups": 1,
  "targets_total": 0,
  "targets_healthy": 0
}
KC-031 low Elastic IP address not associated ec2 · eipalloc-unused · eu-west-2
Check
EIP-UNUSED (Unused resources)
Confidence
high
Recommended action
Release the address unless it is reserved for allow-listing or planned use.
Risk
Low; a released address cannot always be recovered, so check external allow-lists first.
Effort
Low
Owner
platform-team
Estimated monthly cost
USD 3.65
Estimated monthly savings
USD 2.92 – 4.38 (Public IPv4 address charge, the same in every region; excludes discounts, Savings Plans and Reserved Instances)

Evidence

ObservationSourceValueThresholdObservation period
Address has no association to an instance or network interface at collection timeEC2 DescribeAddresses203.0.113.10unknownpoint in time

Current configuration

{
  "public_ip": "203.0.113.10",
  "associated": false
}
KC-033 low Lambda function with very low invocation volume lambda · rarely-used · eu-west-2
Check
LAMBDA-LOW-INVOCATIONS (Unused resources)
Confidence
medium
Recommended action
Confirm whether the function is still required (it may be scheduled monthly or used for incidents). Remove unused functions to reduce attack surface and maintenance.
Risk
Low; confirm triggers and dependencies before removal.
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Total invocations over 3 of 14 expected 1440-minute datapointsCloudWatch AWS/Lambda/Invocations3total < 102026-09-09T10:00:00Z → 2026-09-23T10:00:00Z

Current configuration

{
  "runtime": "python3.12"
}

Underutilised resources (2)

KC-002 high RDS instance with low utilisation signals rds · db-quiet · eu-west-2
Check
RDS-LOW-UTILISATION (Underutilised resources)
Confidence
medium
Recommended action
Review memory (FreeableMemory) and IOPS before downsizing one instance size; consider stopping non-production databases outside working hours.
Risk
Medium; resizing causes a short outage (longer for single-AZ).
Effort
Medium
Owner
platform-team
Estimated monthly cost
USD 846.80
Estimated monthly savings
USD 338.72 – 423.40 (One size smaller (~50%); approximate eu-west-2 on-demand list price; excludes discounts, Savings Plans and Reserved Instances)

Evidence

ObservationSourceValueThresholdObservation period
Average CPU over 336 of 336 expected 60-minute datapointsCloudWatch AWS/RDS/CPUUtilization4.0%average < 10%2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z
Maximum hourly CPU over 336 of 336 expected 60-minute datapointsCloudWatch AWS/RDS/CPUUtilization20.0%maximum < 40%2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z
Maximum connections over 336 of 336 expected 60-minute datapointsCloudWatch AWS/RDS/DatabaseConnections15.0context only2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z

Current configuration

{
  "instance_class": "db.r5.xlarge",
  "status": "available",
  "multi_az": true,
  "backup_retention_days": 3,
  "publicly_accessible": true,
  "deletion_protection": true,
  "storage_encrypted": true
}
KC-012 medium EC2 instance with sustained low CPU utilisation ec2 · i-idle · eu-west-2
Check
EC2-LOW-CPU (Underutilised resources)
Confidence
high
Recommended action
Confirm the workload with the owner. If it is not needed, stop or decommission it; if it is needed only at certain times, schedule it; otherwise downsize it. CPU alone does not show memory or network needs, so check those before resizing.
Risk
Medium; resizing or stopping causes downtime and may affect memory-bound workloads.
Effort
Medium
Owner
platform-team
Estimated monthly cost
USD 162.59
Estimated monthly savings
USD 81.30 – 162.59 (50% (downsize) to 100% (stop) of approximate eu-west-2 on-demand list price; excludes discounts, Savings Plans and Reserved Instances)

Evidence

ObservationSourceValueThresholdObservation period
Average CPU over 336 of 336 expected 60-minute datapointsCloudWatch AWS/EC2/CPUUtilization3.2%average < 10%2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z
Maximum hourly CPU over 336 of 336 expected 60-minute datapointsCloudWatch AWS/EC2/CPUUtilization12.0%maximum < 40%2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z

Current configuration

{
  "instance_type": "m5.xlarge",
  "state": "running"
}

Overprovisioned resources (3)

KC-010 medium EC2 instance type larger than observed CPU demand ec2 · i-oversized · eu-west-2
Check
EC2-OVERSIZED (Overprovisioned resources)
Confidence
medium
Recommended action
Test the workload on m5.xlarge in a non-production environment, check memory utilisation (requires the CloudWatch agent), then resize during a maintenance window.
Risk
Medium; resizing requires a stop/start and may affect memory-bound workloads.
Effort
Medium
Owner
platform-team
Estimated monthly cost
USD 325.17
Estimated monthly savings
USD 130.06 – 195.10 (Difference to m5.xlarge; approximate eu-west-2 on-demand list price; excludes discounts, Savings Plans and Reserved Instances)

Evidence

ObservationSourceValueThresholdObservation period
Average CPU over 336 of 336 expected 60-minute datapointsCloudWatch AWS/EC2/CPUUtilization18.0%average < 30%2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z
Maximum hourly CPU over 336 of 336 expected 60-minute datapointsCloudWatch AWS/EC2/CPUUtilization45.0%maximum < 60%2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z
Instance size is xlarge or largerEC2 DescribeInstancesm5.2xlargeunknownpoint in time

Current configuration

{
  "instance_type": "m5.2xlarge",
  "state": "running"
}
KC-013 medium Compute Optimizer: EC2 instance over-provisioned ec2 · i-co-over · eu-west-2
Check
CO-EC2-OVER (Overprovisioned resources)
Confidence
high
Recommended action
Move to c6i.xlarge after testing
Risk
Medium; resizing requires a stop/start.
Effort
Medium
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
USD 121.40 (AWS Compute Optimizer estimate)

Evidence

ObservationSourceValueThresholdObservation period
AWS Compute Optimizer finding 'Overprovisioned'; recommends c6i.xlargeAWS Compute Optimizer GetEC2InstanceRecommendationsCPUOverprovisionedCompute Optimizer lookback 14 dayspoint in time

Current configuration

{
  "instance_type": "c5.2xlarge",
  "state": "running"
}
KC-019 medium ECS service running more task capacity than it uses ecs · main/api · eu-west-2
Check
ECS-EXCESS-CAPACITY (Overprovisioned resources)
Confidence
high
Recommended action
Reduce the desired count or task size, or configure target-tracking Service Auto Scaling with a minimum that meets availability needs.
Risk
Low to medium; keep at least two tasks across AZs for production availability.
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Desired task countECS DescribeServices6unknownpoint in time
Average service CPU over 336 of 336 expected 60-minute datapointsCloudWatch AWS/ECS/CPUUtilization8.0%average < 20%2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z
Average service memory over 336 of 336 expected 60-minute datapointsCloudWatch AWS/ECS/MemoryUtilization15.0%average < 30%2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z

Current configuration

{
  "cluster": "main",
  "desired_count": 6,
  "running_count": 6
}

Cost opportunities (2)

KC-028 medium S3 bucket without lifecycle rules s3 · logs-archive · eu-west-2
Check
S3-NO-LIFECYCLE (Cost opportunities)
Confidence
high
Recommended action
Agree retention requirements with the owner, then add lifecycle rules to expire old data, clean up incomplete multipart uploads and transition infrequently accessed data (or enable S3 Intelligent-Tiering).
Risk
Low if retention requirements are confirmed first; expiry permanently deletes objects.
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
No lifecycle rules configuredS3 GetBucketLifecycleConfiguration0unknownpoint in time
Standard storage size over 14 of 14 expected 1440-minute datapointsCloudWatch AWS/S3/BucketSizeBytes2150.4 GB'large' at >= 1 TB2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z

Current configuration

{
  "lifecycle_rules": 0,
  "tags_readable": true,
  "versioning": "Disabled",
  "public_by_policy": false
}
KC-029 low NAT Gateway with low traffic relative to its fixed cost nat-gateway · nat-quiet · eu-west-2
Check
NAT-LOW-TRAFFIC (Cost opportunities)
Confidence
high
Recommended action
Check whether private subnets still need internet egress. Consider consolidating NAT Gateways in the VPC, using VPC endpoints for AWS services, or removing the gateway.
Risk
Medium; removing egress breaks workloads that need outbound internet access.
Effort
Medium
Owner
platform-team
Estimated monthly cost
USD 38.11
Estimated monthly savings
USD 30.49 – 45.73 (Hourly charge only; approximate eu-west-2 on-demand list price; excludes discounts, Savings Plans and Reserved Instances)

Evidence

ObservationSourceValueThresholdObservation period
Bytes sent to destinations over 14 of 14 expected 1440-minute datapointsCloudWatch AWS/NATGateway/BytesOutToDestination1.00 GBcombined total < 5 GB2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z
Bytes received from destinations over 14 of 14 expected 1440-minute datapointsCloudWatch AWS/NATGateway/BytesInFromDestination0.50 GBcombined total < 5 GB2026-09-09T10:00:00Z → 2026-09-23T10:00:00Z

Current configuration

{
  "vpc_id": "vpc-1"
}

Cost checks performed

CheckResultNotes
Unattached EBS volumesIssues found (1)
Unused Elastic IP addressesIssues found (1)
Load balancers with no registered targetsIssues found (1)
RDS databases with no connectionsIssues found (1)
Lambda functions that are rarely invokedIssues found (1)1 item(s) could not be evaluated (see data gaps)
EC2 instances with sustained low CPUIssues found (1)1 item(s) could not be evaluated (see data gaps)
RDS databases with low CPUIssues found (1)1 resource(s) reported under 'RDS databases with no connections' instead
EC2 instance types larger than CPU demandIssues found (1)1 resource(s) reported under 'EC2 instances with sustained low CPU' instead; 1 resource(s) reported under 'AWS Compute Optimizer rightsizing recommendations' instead
AWS Compute Optimizer rightsizing recommendationsIssues found (1)Compute Optimizer has no result yet for 3 running instance(s). New instances need about 30 hours of metrics, and results can take up to a day more to appear.
ECS services with spare task capacityIssues found (1)1 item(s) could not be evaluated (see data gaps)
NAT Gateways with little trafficIssues found (1)
S3 buckets without lifecycle rulesIssues found (1)1 item(s) could not be evaluated (see data gaps)

Backup (7 finding(s))

Whether your servers, databases and files can be recovered after a mistake, failure or attack.

KC-004 high EBS volume never backed up ebs · vol-attached · eu-west-2
Check
EBS-NO-RECENT-BACKUP (Backup and recovery)
Confidence
high
Recommended action
Add the volume (or its instance) to an AWS Backup plan, or schedule snapshots with Data Lifecycle Manager.
Risk
None; snapshots are incremental and do not affect the running instance.
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
No snapshot or AWS Backup recovery point foundEC2 DescribeSnapshots and AWS Backup ListProtectedResourcesunknowna backup within the last 7 dayspoint in time

Current configuration

{
  "size_gb": 100,
  "volume_type": "gp3",
  "state": "in-use",
  "attached_to": [
    "i-busy"
  ],
  "encrypted": true,
  "latest_snapshot": ""
}
KC-007 high RDS instance has automated backups disabled rds · db-idle · eu-west-2
Check
RDS-NO-BACKUPS (Backup and recovery)
Confidence
high
Recommended action
Enable automated backups with a retention period that meets recovery requirements.
Risk
Low; enabling backups may cause a brief I/O suspension on single-AZ instances.
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Backup retention period is 0 daysRDS DescribeDBInstances0unknownpoint in time

Current configuration

{
  "instance_class": "db.m5.large",
  "status": "available",
  "multi_az": false,
  "backup_retention_days": 0,
  "publicly_accessible": false,
  "deletion_protection": false,
  "storage_encrypted": false
}
KC-015 medium No AWS Backup plan in a region with running workloads account · 123456789012 · eu-west-2
Check
BACKUP-NO-PLAN (Backup and recovery)
Confidence
high
Recommended action
Create an AWS Backup plan covering EC2, EBS and RDS with retention that meets your recovery requirements, and test a restore.
Risk
None
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
0 AWS Backup plans in a region with running EC2 or RDSAWS Backup ListBackupPlans0unknownpoint in time

Current configuration

{}
KC-018 medium EBS volume without a recent backup ebs · vol-stale-backup · eu-west-2
Check
EBS-NO-RECENT-BACKUP (Backup and recovery)
Confidence
high
Recommended action
Add the volume (or its instance) to an AWS Backup plan, or schedule snapshots with Data Lifecycle Manager.
Risk
None; snapshots are incremental and do not affect the running instance.
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Latest backup (EBS snapshot) was taken at 2026-08-01T00:00:00ZEC2 DescribeSnapshots and AWS Backup ListProtectedResources2026-08-01T00:00:00Za backup within the last 7 dayspoint in time

Current configuration

{
  "size_gb": 50,
  "volume_type": "gp3",
  "state": "in-use",
  "attached_to": [
    "i-oversized"
  ],
  "encrypted": true,
  "latest_snapshot": "2026-08-01T00:00:00Z"
}
KC-034 low RDS instance without deletion protection rds · db-idle · eu-west-2
Check
RDS-NO-DELETION-PROTECTION (Backup and recovery)
Confidence
high
Recommended action
Enable deletion protection on production databases to prevent accidental deletion.
Risk
None
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
DeletionProtection is falseRDS DescribeDBInstancesnounknownpoint in time

Current configuration

{
  "instance_class": "db.m5.large",
  "status": "available",
  "multi_az": false,
  "backup_retention_days": 0,
  "publicly_accessible": false,
  "deletion_protection": false,
  "storage_encrypted": false
}
KC-035 low RDS backup retention shorter than recommended rds · db-quiet · eu-west-2
Check
RDS-SHORT-RETENTION (Backup and recovery)
Confidence
high
Recommended action
Increase the backup retention period to match your recovery requirements.
Risk
None; longer retention increases backup storage cost slightly.
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Automated backups are kept for 3 day(s)RDS DescribeDBInstances3at least 7 dayspoint in time

Current configuration

{
  "instance_class": "db.r5.xlarge",
  "status": "available",
  "multi_az": true,
  "backup_retention_days": 3,
  "publicly_accessible": true,
  "deletion_protection": true,
  "storage_encrypted": true
}
KC-036 low S3 bucket without versioning s3 · logs-archive · eu-west-2
Check
S3-NO-VERSIONING (Backup and recovery)
Confidence
high
Recommended action
Enable versioning on buckets holding important data so deleted or overwritten objects can be recovered, with a lifecycle rule to expire old versions.
Risk
None; old versions add storage cost unless expired.
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Versioning status is DisabledS3 GetBucketVersioningDisabledunknownpoint in time

Current configuration

{
  "lifecycle_rules": 0,
  "tags_readable": true,
  "versioning": "Disabled",
  "public_by_policy": false
}

Backup checks performed

CheckResultNotes
AWS Backup plans in regions with workloadsIssues found (1)
EBS volumes backed up recently (snapshot or AWS Backup)Issues found (2)
RDS automated backups enabledIssues found (1)
RDS backup retention periodIssues found (1)1 resource(s) reported under 'RDS automated backups enabled' instead
RDS deletion protectionIssues found (1)
S3 bucket versioningIssues found (1)1 item(s) could not be evaluated (see data gaps)

Security (13 finding(s))

Common high-risk settings: account access, internet exposure, public data, encryption and threat detection.

KC-001 critical Root user has access keys account · 123456789012 · global
Check
IAM-ROOT-KEYS (Security)
Confidence
high
Recommended action
Delete root access keys and use IAM roles or IAM Identity Center instead.
Risk
Low
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
AccountAccessKeysPresent is 1IAM GetAccountSummaryyesunknownpoint in time

Current configuration

{}
KC-003 high No active multi-region CloudTrail trail account · 123456789012 · global
Check
CLOUDTRAIL-MISSING (Security)
Confidence
high
Recommended action
Create a multi-region trail (or organisation trail) delivering to a protected S3 bucket.
Risk
Low
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
1 trail(s) found; none is multi-region and loggingCloudTrail DescribeTrails["legacy"]unknownpoint in time

Current configuration

{}
KC-005 high Root user does not have MFA enabled account · 123456789012 · global
Check
IAM-ROOT-NO-MFA (Security)
Confidence
high
Recommended action
Enable MFA (preferably hardware or passkey) on the root user.
Risk
Low
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
AccountMFAEnabled is 0IAM GetAccountSummarynounknownpoint in time

Current configuration

{}
KC-006 high IAM user can sign in to the console without MFA iam · alice · global
Check
IAM-USER-NO-MFA (Security)
Confidence
high
Recommended action
Require MFA for this user, or move people to IAM Identity Center.
Risk
None
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
User has a console password and no MFA deviceIAM GetLoginProfile / ListMFADevices0unknownpoint in time

Current configuration

{
  "console_access": true,
  "mfa_devices": 0,
  "access_keys": []
}
KC-008 high S3 bucket policy makes the bucket public s3 · public-website · eu-west-2
Check
S3-PUBLIC-BUCKET (Security)
Confidence
high
Recommended action
Confirm the bucket is meant to be public (for example a website). If not, remove the public statement; for websites, serve through CloudFront with origin access control instead.
Risk
Medium; public consumers of the bucket will lose access.
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
PolicyStatus.IsPublic is trueS3 GetBucketPolicyStatusyesunknownpoint in time

Current configuration

{
  "lifecycle_rules": 1,
  "tags_readable": true,
  "versioning": "Enabled",
  "public_by_policy": true
}
KC-009 high Security group allows internet access to sensitive ports ec2 · sg-open-ssh · eu-west-2
Check
SG-OPEN-TO-WORLD (Security)
Confidence
high
Recommended action
Restrict the rule to known IP ranges or a VPN. Use AWS Systems Manager Session Manager instead of opening SSH or RDP, and keep databases in private subnets. Delete the group if unused.
Risk
Medium; confirm which clients need access before narrowing the rule.
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Ingress from 0.0.0.0/0 or ::/0 allows: SSH (22)EC2 DescribeSecurityGroups["SSH (22)"]unknownpoint in time

Current configuration

{
  "group_name": "legacy-admin",
  "vpc_id": "vpc-1",
  "open_rules": [
    {
      "protocol": "tcp",
      "from_port": 22,
      "to_port": 22,
      "sources": [
        "0.0.0.0/0"
      ],
      "exposed": [
        "SSH (22)"
      ]
    }
  ]
}
KC-017 medium EBS encryption by default is off account · 123456789012 · eu-west-2
Check
EBS-DEFAULT-ENCRYPTION-OFF (Security)
Confidence
high
Recommended action
Turn on EBS encryption by default in this region so every new volume is encrypted.
Risk
None; existing volumes are not affected.
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
EbsEncryptionByDefault is falseEC2 GetEbsEncryptionByDefaultnounknownpoint in time

Current configuration

{}
KC-021 medium GuardDuty threat detection is not enabled account · 123456789012 · eu-west-2
Check
GUARDDUTY-OFF (Security)
Confidence
high
Recommended action
Enable GuardDuty (it has a 30-day free trial) and route its findings to email or chat.
Risk
None
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
No GuardDuty detector in a region with resourcesGuardDuty ListDetectors0unknownpoint in time

Current configuration

{}
KC-022 medium Active access key older than 90 days iam · deploy-bot · global
Check
IAM-OLD-ACCESS-KEYS (Security)
Confidence
high
Recommended action
Rotate the key, or better, replace long-term keys with IAM roles or IAM Identity Center.
Risk
Low; update every application using the key before deactivating it.
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Active access key(s) created on …ABCD: 2025-01-15T00:00:00ZIAM ListAccessKeys1rotated within 90 dayspoint in time

Current configuration

{
  "console_access": false,
  "mfa_devices": 0,
  "access_keys": [
    {
      "id_suffix": "ABCD",
      "status": "Active",
      "created": "2025-01-15T00:00:00Z"
    },
    {
      "id_suffix": "EFGH",
      "status": "Inactive",
      "created": "2024-01-15T00:00:00Z"
    }
  ]
}
KC-024 medium RDS instance is publicly accessible rds · db-quiet · eu-west-2
Check
RDS-PUBLIC (Security)
Confidence
high
Recommended action
Disable public accessibility unless required and restrict security group ingress.
Risk
Medium; clients connecting over the internet will lose access.
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
PubliclyAccessible is trueRDS DescribeDBInstancesyesunknownpoint in time

Current configuration

{
  "instance_class": "db.r5.xlarge",
  "status": "available",
  "multi_az": true,
  "backup_retention_days": 3,
  "publicly_accessible": true,
  "deletion_protection": true,
  "storage_encrypted": true
}
KC-025 medium RDS storage is not encrypted rds · db-idle · eu-west-2
Check
RDS-UNENCRYPTED (Security)
Confidence
high
Recommended action
Encryption cannot be enabled in place: restore an encrypted copy from a snapshot and switch applications over during a maintenance window.
Risk
Medium; requires a migration and a short outage.
Effort
Medium
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
StorageEncrypted is falseRDS DescribeDBInstancesnounknownpoint in time

Current configuration

{
  "instance_class": "db.m5.large",
  "status": "available",
  "multi_az": false,
  "backup_retention_days": 0,
  "publicly_accessible": false,
  "deletion_protection": false,
  "storage_encrypted": false
}
KC-027 medium S3 Block Public Access is not fully enabled for the account account · 123456789012 · global
Check
S3-ACCOUNT-BPA-OFF (Security)
Confidence
high
Recommended action
Turn on all four account-level S3 Block Public Access settings unless a bucket must be public.
Risk
Medium; check no bucket intentionally serves public content first.
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
One or more account-level Block Public Access settings are offS3 Control GetPublicAccessBlocknounknownpoint in time

Current configuration

{}
KC-032 low EBS volume is not encrypted ebs · vol-unattached · eu-west-2
Check
EBS-UNENCRYPTED (Security)
Confidence
high
Recommended action
Create an encrypted copy from a snapshot and replace the volume during maintenance.
Risk
Medium; replacing a volume needs a short outage.
Effort
Medium
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Encrypted is falseEC2 DescribeVolumesnounknownpoint in time

Current configuration

{
  "size_gb": 500,
  "volume_type": "gp2",
  "state": "available",
  "attached_to": [],
  "encrypted": false,
  "latest_snapshot": ""
}

Security checks performed

CheckResultNotes
Root user access keysIssues found (1)
Root user MFAIssues found (1)
MFA for IAM users with console accessIssues found (1)
Age of active IAM access keysIssues found (1)
Multi-region CloudTrail loggingIssues found (1)
GuardDuty threat detectionIssues found (1)
Security groups open to the internet on sensitive portsIssues found (1)
Public S3 bucket policiesIssues found (1)1 item(s) could not be evaluated (see data gaps)
Account-level S3 Block Public AccessIssues found (1)
Publicly accessible RDS databasesIssues found (1)
RDS storage encryptionIssues found (1)
EBS volume encryptionIssues found (1)
EBS encryption by defaultIssues found (1)

Governance and operations (5 finding(s))

Monitoring, reliability and tagging that keep the account manageable.

Monitoring and reliability (3)

KC-016 medium Compute Optimizer: EC2 instance under-provisioned ec2 · i-busy · eu-west-2
Check
CO-EC2-UNDER (Monitoring and reliability)
Confidence
high
Recommended action
Consider moving to t3.large to reduce performance risk
Risk
Medium; resizing requires a stop/start.
Effort
Medium
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
AWS Compute Optimizer finding 'Underprovisioned'; recommends t3.largeAWS Compute Optimizer GetEC2InstanceRecommendationsCPUUnderprovisionedCompute Optimizer lookback 14 dayspoint in time

Current configuration

{
  "instance_type": "t3.medium",
  "state": "running"
}
KC-020 medium Load balancer with no healthy targets elb · alb-broken · eu-west-2
Check
ELB-NO-HEALTHY-TARGETS (Monitoring and reliability)
Confidence
medium
Recommended action
Investigate target health checks, or remove the load balancer if it is no longer used.
Risk
Low
Effort
Low
Owner
platform-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
0 of 2 registered targets healthy at collection timeELBv2 DescribeTargetHealth0unknownpoint in time

Current configuration

{
  "type": "application",
  "target_groups": 1,
  "targets_total": 2,
  "targets_healthy": 0
}
KC-023 medium Region with running workloads but no CloudWatch alarms account · 123456789012 · eu-west-2
Check
MONITORING-NO-ALARMS (Monitoring and reliability)
Confidence
high
Recommended action
Add alarms for instance status checks, CPU, storage and database health.
Risk
None
Effort
Low
Owner
Account owner
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
0 metric alarms defined in a region with running EC2 or RDSCloudWatch DescribeAlarms0unknownpoint in time

Current configuration

{}

Tagging and governance (2)

KC-026 medium Resource in an unexpected region lambda · singapore-fn · ap-southeast-1
Check
REGION-UNEXPECTED (Tagging and governance)
Confidence
high
Recommended action
Confirm the resource is intended. Consider an SCP that restricts unused regions.
Risk
Low
Effort
Low
Owner
asia-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Resource region is not in the expected list (eu-west-2)Resource inventoryap-southeast-1unknownpoint in time

Current configuration

{
  "runtime": "python3.12"
}
KC-037 low Resource missing required tags lambda · singapore-fn · ap-southeast-1
Check
TAGS-MISSING (Tagging and governance)
Confidence
high
Recommended action
Add the Environment tag(s) and enforce them with Tag Policies or IaC checks.
Risk
None
Effort
Low
Owner
asia-team
Estimated monthly cost
not estimated
Estimated monthly savings
—

Evidence

ObservationSourceValueThresholdObservation period
Missing required tag(s): EnvironmentResource tags["Owner"]unknownpoint in time

Current configuration

{
  "runtime": "python3.12"
}

Governance and operations checks performed

CheckResultNotes
CloudWatch alarms in regions with workloadsIssues found (1)
Load balancers with no healthy targetsIssues found (1)
Under-provisioned EC2 instances (Compute Optimizer)Issues found (1)Compute Optimizer has no result yet for 3 running instance(s). New instances need about 30 hours of metrics, and results can take up to a day more to appear.
Required tags on resourcesIssues found (1)
Resources in unexpected regionsIssues found (1)

Data gaps (6)

Signals that could not be evaluated. These are unknown, not zero, and no utilisation claim is made for them.

ServiceResourceRegionSignalReason
ec2i-nometricseu-west-2CPUUtilizationNo CloudWatch datapoints returned for the observation window
s3restricted-bucketeu-west-2Lifecycle configurationLifecycle configuration could not be read
ecsmain/workereu-west-2CPUUtilization, MemoryUtilizationOne or both service metrics unavailable
lambdano-datapointseu-west-2InvocationsNo datapoints in the window. Lambda publishes no Invocations datapoints for periods with no invocations, so this is consistent with an unused function but is not proof of it.
s3restricted-bucketeu-west-2VersioningBucket versioning status could not be read
s3restricted-bucketeu-west-2Bucket policy statusBucket policy status was not collected

Resource inventory (29)

ServiceTypeIDNameRegionDetailsTags
ec2instancei-idlei-idleeu-west-2instance_type=m5.xlarge, state=running2
ec2instancei-oversizedi-oversizedeu-west-2instance_type=m5.2xlarge, state=running2
ec2instancei-busyi-busyeu-west-2instance_type=t3.medium, state=running2
ec2instancei-nometricsi-nometricseu-west-2instance_type=t3.large, state=running2
ec2instancei-co-overi-co-overeu-west-2instance_type=c5.2xlarge, state=running2
ec2instancei-stoppedi-stoppedeu-west-2instance_type=m5.large, state=stopped2
ebsvolumevol-unattachedvol-unattachedeu-west-2volume_type=gp2, size_gb=500, state=available, encrypted=False2
ebsvolumevol-attachedvol-attachedeu-west-2volume_type=gp3, size_gb=100, state=in-use, encrypted=True2
ebsvolumevol-stale-backupvol-stale-backupeu-west-2volume_type=gp3, size_gb=50, state=in-use, encrypted=True2
ebsvolumevol-backed-upvol-backed-upeu-west-2volume_type=gp3, size_gb=50, state=in-use, encrypted=True2
ec2elastic-ipeipalloc-unusedeipalloc-unusedeu-west-2public_ip=203.0.113.10, associated=False, service_managed=None2
ec2elastic-ipeipalloc-usedeipalloc-usedeu-west-2public_ip=203.0.113.11, associated=True, service_managed=None2
nat-gatewaynat-gatewaynat-quietnat-quieteu-west-2vpc_id=vpc-1, connectivity_type=None2
nat-gatewaynat-gatewaynat-busynat-busyeu-west-2vpc_id=vpc-2, connectivity_type=None2
elbload-balanceralb-emptyalb-emptyeu-west-2type=application, scheme=None, targets_total=02
elbload-balanceralb-livealb-liveeu-west-2type=application, scheme=None, targets_total=22
elbload-balanceralb-brokenalb-brokeneu-west-2type=application, scheme=None, targets_total=22
rdsdb-instancedb-idledb-idleeu-west-2instance_class=db.m5.large, engine=None, multi_az=False, status=available2
rdsdb-instancedb-quietdb-quieteu-west-2instance_class=db.r5.xlarge, engine=None, multi_az=True, status=available2
s3bucketlogs-archivelogs-archiveeu-west-2lifecycle_rules=0, versioning=Disabled2
s3bucketmanaged-bucketmanaged-bucketeu-west-2lifecycle_rules=2, versioning=Enabled2
s3bucketpublic-websitepublic-websiteeu-west-2lifecycle_rules=1, versioning=Enabled2
s3bucketrestricted-bucketrestricted-bucketeu-west-2lifecycle_rules=None, versioning=None0
ecsservicemain/apimain/apieu-west-2launch_type=None, desired_count=6, running_count=62
ecsservicemain/workermain/workereu-west-2launch_type=None, desired_count=3, running_count=32
lambdafunctionrarely-usedrarely-usedeu-west-2runtime=python3.12, memory_mb=None2
lambdafunctionno-datapointsno-datapointseu-west-2runtime=python3.12, memory_mb=None2
lambdafunctionbusybusyeu-west-2runtime=nodejs20.x, memory_mb=None2
lambdafunctionsingapore-fnsingapore-fnap-southeast-1runtime=python3.12, memory_mb=None1

Recommended next steps

  1. Address 8 critical/high security and backup finding(s) first: KC-001, KC-003, KC-004, KC-005, KC-006….
  2. Confirm ownership of 4 unused resource(s) and remove them after snapshots where relevant.
  3. Review 5 sizing finding(s) with workload owners and test changes outside production.
  4. Agree a tagging standard and enforce it through IaC and AWS Organizations Tag Policies.
  5. Agree an owner and target date for each accepted finding, then re-run the assessment to confirm.

Get help from KloudCare

This report estimates USD 882–1,219 of potential monthly savings. It also found 9 critical or high-priority issue(s). KloudCare can go through these findings with you and carry out the changes safely.

Book a free review

Email hello@kloudcare.co.uk · www.kloudcare.co.uk

Methodology

Approximate on-demand list price for each resource's region; excludes discounts, Savings Plans and Reserved Instances. Price-table estimates are shown as +/-20% ranges.

Required tags: Owner, Environment · Expected regions: eu-west-2 · Compute Optimizer: Active

ThresholdValue
min_metric_coverage0.8
ec2_low_cpu_avg10.0
ec2_low_cpu_max40.0
ec2_oversized_avg30.0
ec2_oversized_max60.0
ec2_oversized_min_sizexlarge
rds_low_cpu_avg10.0
rds_low_cpu_max40.0
nat_low_traffic_gb5.0
ecs_low_cpu_avg20.0
ecs_low_memory_avg30.0
lambda_low_invocations10
s3_large_bucket_tb1.0
backup_max_age_days7
rds_min_retention_days7
iam_key_max_age_days90

Collection errors (0)

None.