<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ABRAR ASLAM</title>
    <description>The latest articles on DEV Community by ABRAR ASLAM (@abrar_aslam_69082442c8033).</description>
    <link>https://dev.to/abrar_aslam_69082442c8033</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4181965%2Fe007a0cf-88ae-4705-a6e6-de1e3d3e1120.jpg</url>
      <title>DEV Community: ABRAR ASLAM</title>
      <link>https://dev.to/abrar_aslam_69082442c8033</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abrar_aslam_69082442c8033"/>
    <language>en</language>
    <item>
      <title>The 5 AWS Security Mistakes I Keep Finding in Small Business Accounts</title>
      <dc:creator>ABRAR ASLAM</dc:creator>
      <pubDate>Tue, 20 Oct 2026 11:35:07 +0000</pubDate>
      <link>https://dev.to/abrar_aslam_69082442c8033/the-5-aws-security-mistakes-i-keep-finding-in-small-business-accounts-1k3m</link>
      <guid>https://dev.to/abrar_aslam_69082442c8033/the-5-aws-security-mistakes-i-keep-finding-in-small-business-accounts-1k3m</guid>
      <description>&lt;p&gt;&lt;em&gt;And how to check your own account for each one in about 15 minutes, using only the AWS CLI&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most small businesses on AWS are not hacked through some clever zero-day exploit. They are caught out by settings that took two minutes to get wrong and would take ten minutes to fix.&lt;/p&gt;

&lt;p&gt;The numbers say this is not a big-company problem. The UK Government's Cyber Security Breaches Survey 2025/2026 estimates that &lt;strong&gt;43% of UK businesses&lt;/strong&gt; had a cyber security breach or attack in the previous 12 months, and among those that identified one, &lt;strong&gt;88% said it involved phishing&lt;/strong&gt;. Stolen passwords and leaked keys are how attackers get in.&lt;/p&gt;

&lt;p&gt;And once they are in, they are rarely noticed quickly. IBM's 2025 Cost of a Data Breach findings for the UK put the average time to &lt;strong&gt;identify&lt;/strong&gt; a breach at &lt;strong&gt;148 to 168 days&lt;/strong&gt;. That is around five months of someone else having access to your systems.&lt;/p&gt;

&lt;p&gt;On AWS, the platform itself is rarely the weak point. Under the shared responsibility model, AWS secures the data centres, hardware and services. &lt;strong&gt;You&lt;/strong&gt; are responsible for how your account is configured: who can sign in, what is open to the internet, and whether anyone would notice if something went wrong.&lt;/p&gt;

&lt;p&gt;Here are the five mistakes I see most often, why each one matters, and exactly how to check for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, a two-minute scorecard
&lt;/h2&gt;

&lt;p&gt;Answer honestly. Each "no" or "not sure" is a gap.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does your AWS root user have MFA, and is it never used for day-to-day work?&lt;/li&gt;
&lt;li&gt;Are all IAM access keys less than 90 days old, and does every key belong to someone who still works with you?&lt;/li&gt;
&lt;li&gt;Are SSH, RDP and database ports closed to the whole internet?&lt;/li&gt;
&lt;li&gt;Is S3 Block Public Access turned on for the whole account?&lt;/li&gt;
&lt;li&gt;Would you get an alert if someone started using your account at 3am?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you answered "yes" to all five, you are ahead of most small businesses. If not, read on.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Before you start:&lt;/strong&gt; every command below is read-only. You need the AWS CLI and credentials with read access (the AWS-managed &lt;code&gt;SecurityAudit&lt;/code&gt; policy is enough). Some commands only cover the region your CLI is set to; there is a script at the end that checks every region at once.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. The root user is unprotected, or still in use
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why it matters.&lt;/strong&gt; The root user is the email address that created the AWS account. It can do anything, including closing the account or changing billing details, and no IAM policy can restrict it. In small companies it is common to find the root user shared between people, used for everyday work, or protected by nothing more than a password. With phishing behind most breaches, a stolen root password is the worst case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam get-account-summary &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'SummaryMap.{RootMFA: AccountMFAEnabled, RootAccessKeys: AccountAccessKeysPresent}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You want &lt;code&gt;RootMFA: 1&lt;/code&gt; and &lt;code&gt;RootAccessKeys: 0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix.&lt;/strong&gt; Turn on MFA for the root user, ideally a hardware security key or passkey. Delete any root access keys. Then stop using root altogether: give each person their own sign-in, preferably through IAM Identity Center, and keep the root credentials somewhere safe for emergencies only.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Long-lived access keys that never expire
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why it matters.&lt;/strong&gt; IAM access keys do not expire on their own. A key created three years ago for a deployment script, a developer's laptop or a contractor who has since left still works today. Keys also leak easily: committed to a Git repository, pasted into a chat, or left in an old &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check.&lt;/strong&gt; The IAM credential report lists every user, their keys, and when each key was last rotated and last used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam generate-credential-report
aws iam get-credential-report &lt;span class="nt"&gt;--query&lt;/span&gt; Content &lt;span class="nt"&gt;--output&lt;/span&gt; text | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;--decode&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; credential-report.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(On older Macs, use &lt;code&gt;base64 -D&lt;/code&gt; instead of &lt;code&gt;base64 --decode&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;Open the CSV and look for keys that are &lt;strong&gt;active&lt;/strong&gt; but were last rotated more than 90 days ago, keys that have &lt;strong&gt;never been used&lt;/strong&gt;, and users who have &lt;strong&gt;no MFA&lt;/strong&gt; or who no longer work with you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix.&lt;/strong&gt; Delete keys nobody uses and rotate the rest. Better still, remove the need for them. People can sign in through IAM Identity Center with short-lived credentials, workloads on AWS can use IAM roles, and CI/CD pipelines such as GitHub Actions and GitLab can use OIDC federation instead of stored keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Servers and databases open to the whole internet
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why it matters.&lt;/strong&gt; A security group rule that allows &lt;code&gt;0.0.0.0/0&lt;/code&gt; on port 22 (SSH), 3389 (RDP), or a database port such as 3306 or 5432 means anyone on the internet can try to connect. Automated scanners find these within minutes. The rule is usually added "temporarily" to debug something, and never removed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ec2 describe-security-groups &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ip-permission.cidr,Values&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0/0 &lt;span class="se"&gt;\&lt;/span&gt;
            &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ip-permission.from-port,Values&lt;span class="o"&gt;=&lt;/span&gt;22,3389,3306,5432 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'SecurityGroups[].[GroupId,GroupName]'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treat the result as a shortlist and open each group to confirm the rule. Check IPv6 rules (&lt;code&gt;::/0&lt;/code&gt;) as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix.&lt;/strong&gt; Remove public access to admin and database ports. Use &lt;strong&gt;AWS Systems Manager Session Manager&lt;/strong&gt; for shell access instead of SSH, which also gives you a log of every session. Keep databases in private subnets, and allow access only from the security groups that need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. S3 buckets that are public by accident
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why it matters.&lt;/strong&gt; Since April 2023, new S3 buckets block public access by default. But older buckets, and buckets where someone switched the protection off to share a file quickly, can still expose data to anyone with the link: customer exports, database backups, invoices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check.&lt;/strong&gt; First, see whether public access is blocked for the whole account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws s3control get-public-access-block &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--account-id&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws sts get-caller-identity &lt;span class="nt"&gt;--query&lt;/span&gt; Account &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that returns an error, or any setting is &lt;code&gt;false&lt;/code&gt;, check individual buckets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws s3api get-bucket-policy-status &lt;span class="nt"&gt;--bucket&lt;/span&gt; YOUR-BUCKET-NAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;"IsPublic": true&lt;/code&gt; means the bucket policy makes it public. &lt;strong&gt;IAM Access Analyzer&lt;/strong&gt; in the console answers the same question for every bucket at once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix.&lt;/strong&gt; Turn on &lt;strong&gt;Block Public Access at the account level&lt;/strong&gt;, unless you have a specific reason not to. If you need to serve public files, such as website images, put them behind &lt;strong&gt;CloudFront&lt;/strong&gt; with a private bucket.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. No logging or alerting, so nobody would notice
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why it matters.&lt;/strong&gt; This one is easy to miss because nothing looks broken. Without an audit trail and threat detection, an attacker using a leaked key, or someone deleting a database by mistake, can go unnoticed for months. Remember the IBM figure: around five months, on average, before a UK breach is even identified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Is there a trail, is it logging, and does it cover every region?&lt;/span&gt;
aws cloudtrail describe-trails &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'trailList[].[Name,IsMultiRegionTrail]'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; table
aws cloudtrail get-trail-status &lt;span class="nt"&gt;--name&lt;/span&gt; YOUR-TRAIL-NAME &lt;span class="nt"&gt;--query&lt;/span&gt; IsLogging

&lt;span class="c"&gt;# Is GuardDuty turned on in this region? (An empty list means no.)&lt;/span&gt;
aws guardduty list-detectors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to fix.&lt;/strong&gt; Create a &lt;strong&gt;multi-region CloudTrail trail&lt;/strong&gt; that writes to a dedicated S3 bucket, and turn on &lt;strong&gt;GuardDuty&lt;/strong&gt; in every region you use. GuardDuty has a 30-day free trial, and the console shows an estimate of the monthly cost before the trial ends. Most importantly, send its findings to an email address someone actually reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: check every region in one go
&lt;/h2&gt;

&lt;p&gt;Attackers like regions you never use, because nobody looks there. This loop checks GuardDuty and open SSH or RDP ports in every region enabled for your account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;region &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;aws ec2 describe-regions &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Regions[].RegionName'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"== &lt;/span&gt;&lt;span class="nv"&gt;$region&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"  GuardDuty detectors: "&lt;/span&gt;
  aws guardduty list-detectors &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$region&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'DetectorIds'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"  Groups open on SSH/RDP: "&lt;/span&gt;
  aws ec2 describe-security-groups &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$region&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ip-permission.cidr,Values&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0/0 &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ip-permission.from-port,Values&lt;span class="o"&gt;=&lt;/span&gt;22,3389 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'SecurityGroups[].GroupId'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An empty GuardDuty line means it is off in that region. Any group IDs on the second line are worth a closer look.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your 15-minute plan
&lt;/h2&gt;

&lt;p&gt;You do not need to fix everything this afternoon. In order of impact:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Minutes 0–5:&lt;/strong&gt; turn on MFA for the root user and delete any root access keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minutes 5–10:&lt;/strong&gt; generate the credential report and deactivate keys that are unused or belong to people who have left.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minutes 10–15:&lt;/strong&gt; turn on S3 Block Public Access for the account.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then, this week: close public admin and database ports, and switch on CloudTrail and GuardDuty everywhere. Those two steps cover the most common way into a business, which is stolen credentials, and make sure you would actually notice if something happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking all of this automatically
&lt;/h2&gt;

&lt;p&gt;The commands above work, but running them across every region, and remembering to repeat them every few months, is the hard part.&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;KloudCare&lt;/strong&gt; we built a &lt;strong&gt;free, read-only AWS assessment&lt;/strong&gt; that checks all five of these, plus wasted spend and backup gaps, in about 10 minutes. It runs &lt;strong&gt;inside your own AWS account&lt;/strong&gt; from a CloudFormation template you can read in full. It cannot change anything, and the report is saved to &lt;strong&gt;your own private S3 bucket&lt;/strong&gt;. Nothing is sent to us unless you choose to share it.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://www.kloudcare.co.uk/assessment.html" rel="noopener noreferrer"&gt;kloudcare.co.uk/assessment.html&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whichever way you check, treat each finding as something to confirm before changing. That open port might be the one your payment provider depends on, so talk to whoever owns it first.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;KloudCare is a London-based AWS consultancy helping small and medium-sized businesses keep their AWS accounts cost-efficient, secure and recoverable. Find out more at &lt;a href="https://www.kloudcare.co.uk" rel="noopener noreferrer"&gt;kloudcare.co.uk&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;UK Government, Cyber Security Breaches Survey 2025/2026: &lt;a href="https://www.gov.uk/government/statistics/cyber-security-breaches-survey-20252026/cyber-security-breaches-survey-20252026" rel="noopener noreferrer"&gt;https://www.gov.uk/government/statistics/cyber-security-breaches-survey-20252026/cyber-security-breaches-survey-20252026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;IBM UK, Cost of a Data Breach Report 2025: &lt;a href="https://uk.newsroom.ibm.com/2025-cost-of-data-breach-UK" rel="noopener noreferrer"&gt;https://uk.newsroom.ibm.com/2025-cost-of-data-breach-UK&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS, Shared Responsibility Model: &lt;a href="https://aws.amazon.com/compliance/shared-responsibility-model/" rel="noopener noreferrer"&gt;https://aws.amazon.com/compliance/shared-responsibility-model/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS, Amazon S3 Block Public Access default for new buckets (April 2023): &lt;a href="https://aws.amazon.com/about-aws/whats-new/2022/12/amazon-s3-automatically-enable-block-public-access-disable-access-control-lists-buckets-april-2023/" rel="noopener noreferrer"&gt;https://aws.amazon.com/about-aws/whats-new/2022/12/amazon-s3-automatically-enable-block-public-access-disable-access-control-lists-buckets-april-2023/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Where Your AWS Money Is Really Going: 7 Places Cloud Waste Hides</title>
      <dc:creator>ABRAR ASLAM</dc:creator>
      <pubDate>Tue, 13 Oct 2026 11:53:32 +0000</pubDate>
      <link>https://dev.to/abrar_aslam_69082442c8033/where-your-aws-money-is-really-going-7-places-cloud-waste-hides-5fei</link>
      <guid>https://dev.to/abrar_aslam_69082442c8033/where-your-aws-money-is-really-going-7-places-cloud-waste-hides-5fei</guid>
      <description>&lt;p&gt;&lt;em&gt;And how to find it in your own account in about 10 minutes, without giving anyone access&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Most AWS bills tell a familiar story. They start small, grow with every new project, and at some point someone in finance asks why the cloud costs more this quarter than last. Nobody is quite sure.&lt;/p&gt;

&lt;p&gt;You are not alone. In Flexera's 2026 State of the Cloud Report, organisations estimated that &lt;strong&gt;29% of their cloud spend is wasted&lt;/strong&gt;, up from 27% the year before and the first rise in five years. &lt;strong&gt;85%&lt;/strong&gt; said managing cloud spend is their top cloud challenge.&lt;/p&gt;

&lt;p&gt;The waste is rarely one dramatic mistake. It is dozens of small things that nobody owns, nobody gets an alert for, and nobody has time to look at. Here are the seven places I find it most often, and how to check for each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Disks left behind after servers are deleted
&lt;/h2&gt;

&lt;p&gt;When you terminate an EC2 instance, its EBS volumes are not always deleted with it. Volumes created separately, or attached with "delete on termination" switched off, stay behind in the &lt;strong&gt;available&lt;/strong&gt; state, attached to nothing and billed every month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; in the EC2 console, open &lt;strong&gt;Volumes&lt;/strong&gt; and filter by state &lt;strong&gt;available&lt;/strong&gt;. Each one is a candidate for removal. Take a snapshot first if the data might matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Load balancers and IP addresses that serve nothing
&lt;/h2&gt;

&lt;p&gt;Load balancers have an hourly charge whether or not they handle traffic. It is common to find one that was created for a test, a migration or a service that no longer exists, still running with &lt;strong&gt;no registered targets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Elastic IP addresses that are not attached to anything also cost money, and since AWS began charging for every public IPv4 address, idle addresses add up across accounts and regions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; look for load balancers whose target groups are empty, and Elastic IPs with no association.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Servers far bigger than their workload
&lt;/h2&gt;

&lt;p&gt;This is usually the largest single source of waste. An instance chosen "to be safe" at launch, or sized for a peak that never came, quietly runs at a few percent CPU for months.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; in CloudWatch, look at &lt;strong&gt;average and maximum CPU over at least 14 days&lt;/strong&gt;. An instance averaging under 10% with peaks under 40% is a strong candidate to downsize, stop or schedule. Remember that CPU does not show memory pressure, so check that too before resizing.&lt;/p&gt;

&lt;p&gt;Older instance generations are worth a look as well. Datadog's State of Cloud Costs report found that &lt;strong&gt;83% of organisations spend an average of 17% of their EC2 budget on previous-generation instances&lt;/strong&gt;, which usually cost more for less performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Databases nobody connects to
&lt;/h2&gt;

&lt;p&gt;RDS instances are easy to forget: a staging database from last year, a copy made for a one-off report, a database for a service that was retired. If it has had &lt;strong&gt;zero connections for two weeks&lt;/strong&gt;, it is a strong candidate to snapshot and remove.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; the CloudWatch metric &lt;strong&gt;DatabaseConnections&lt;/strong&gt;, with the maximum over 14 days.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Containers asking for far more than they use
&lt;/h2&gt;

&lt;p&gt;Containers make it easy to over-provision without noticing. Datadog found that &lt;strong&gt;83% of container costs were associated with idle resources&lt;/strong&gt;, split between clusters with too much spare capacity and workloads requesting more CPU and memory than they need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; compare your ECS services' or Kubernetes pods' CPU and memory &lt;strong&gt;utilisation&lt;/strong&gt; against what they &lt;strong&gt;request&lt;/strong&gt;. Services that average under 20% CPU and 30% memory are usually oversized.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. NAT Gateways with almost no traffic
&lt;/h2&gt;

&lt;p&gt;A NAT Gateway has a fixed hourly cost before any data is processed. A gateway that moves only a few gigabytes a month can cost far more than the traffic justifies, especially when there is one per Availability Zone in a quiet environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; the &lt;strong&gt;BytesOutToDestination&lt;/strong&gt; and &lt;strong&gt;BytesInFromDestination&lt;/strong&gt; metrics. If the monthly total is tiny, consider consolidating gateways, using VPC endpoints for AWS services, or removing them from non-production environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Storage that never gets cleaned up
&lt;/h2&gt;

&lt;p&gt;S3 buckets without lifecycle rules keep every object forever in the most expensive storage class, including incomplete multipart uploads you cannot even see in the console. Logs, exports and backups are the usual culprits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; look for buckets with &lt;strong&gt;no lifecycle rules&lt;/strong&gt;, then agree retention with the owner and add rules to expire old data or move it to cheaper storage classes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why waste keeps coming back
&lt;/h2&gt;

&lt;p&gt;Finding waste once is not the hard part. Keeping it gone is. In Harness's 2025 FinOps in Focus report, &lt;strong&gt;48% of organisations said they do not track idle resources&lt;/strong&gt;, and &lt;strong&gt;86% of developers said it takes at least a week&lt;/strong&gt; to spot idle, orphaned or unused resources and act on them.&lt;/p&gt;

&lt;p&gt;Three habits make the biggest difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tag everything&lt;/strong&gt; with at least an Owner and an Environment, so every resource has someone to ask.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set AWS Budgets and anomaly alerts,&lt;/strong&gt; so a jump in spend is noticed in days, not at the end of the quarter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review regularly.&lt;/strong&gt; A monthly look at the same checks catches new waste before it becomes normal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  And while you are looking: security and backups
&lt;/h2&gt;

&lt;p&gt;In my experience, accounts with forgotten resources often have forgotten risks too: security groups open to the internet on SSH or database ports, users without MFA, unencrypted volumes, and backups that were assumed to exist but do not.&lt;/p&gt;

&lt;p&gt;The stakes are real. The UK Government's Cyber Security Breaches Survey 2025/26 found that &lt;strong&gt;43% of UK businesses&lt;/strong&gt; had a breach or attack in the previous 12 months. And Sophos found that when attackers compromised the backups, median ransomware recovery costs were &lt;strong&gt;eight times higher&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So when you check for waste, check the basics of security and recovery at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking all of this in about 10 minutes
&lt;/h2&gt;

&lt;p&gt;You can work through the list above by hand. It takes a while across every region, but it is worth doing.&lt;/p&gt;

&lt;p&gt;If you would rather automate it, my team at &lt;strong&gt;KloudCare&lt;/strong&gt; built a &lt;strong&gt;free, read-only AWS assessment&lt;/strong&gt; that runs all of these checks, and more, in about 10 minutes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It runs &lt;strong&gt;inside your own AWS account&lt;/strong&gt; from a CloudFormation template you can read in full.&lt;/li&gt;
&lt;li&gt;It is &lt;strong&gt;read-only&lt;/strong&gt;. It cannot change, stop or delete anything, and it never reads your files, databases or secrets.&lt;/li&gt;
&lt;li&gt;The report is saved to &lt;strong&gt;your own private S3 bucket&lt;/strong&gt;. Nothing is sent to us unless you choose to share it.&lt;/li&gt;
&lt;li&gt;Every finding shows its &lt;strong&gt;evidence and observation period&lt;/strong&gt;, the recommended action, the risk of making the change, and an &lt;strong&gt;estimated monthly saving&lt;/strong&gt; based on on-demand prices for your region.&lt;/li&gt;
&lt;li&gt;Delete the stack and everything is removed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can run it here: &lt;strong&gt;&lt;a href="https://www.kloudcare.co.uk/assessment.html" rel="noopener noreferrer"&gt;kloudcare.co.uk/assessment.html&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Treat every saving as a &lt;strong&gt;candidate&lt;/strong&gt;, not an instruction. Confirm with the owner, take a snapshot where data matters, and test changes outside production first. An apparently idle resource can still have a purpose, such as disaster recovery.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;KloudCare is a UK AWS consultancy helping small and medium-sized businesses keep their AWS accounts cost-efficient, secure and recoverable. Find out more at &lt;a href="https://www.kloudcare.co.uk" rel="noopener noreferrer"&gt;kloudcare.co.uk&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flexera, 2026 State of the Cloud Report: &lt;a href="https://www.flexera.com/about-us/press-center/flexera-finds-cloud-value-is-rising-while-ai-waste-grows" rel="noopener noreferrer"&gt;https://www.flexera.com/about-us/press-center/flexera-finds-cloud-value-is-rising-while-ai-waste-grows&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Datadog, State of Cloud Costs: &lt;a href="https://www.datadoghq.com/state-of-cloud-costs/" rel="noopener noreferrer"&gt;https://www.datadoghq.com/state-of-cloud-costs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Harness, FinOps in Focus 2025: &lt;a href="https://harness.io/press-and-news/finops-in-focus-report-2025" rel="noopener noreferrer"&gt;https://harness.io/press-and-news/finops-in-focus-report-2025&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;UK Government, Cyber Security Breaches Survey 2025/2026: &lt;a href="https://www.gov.uk/government/statistics/cyber-security-breaches-survey-20252026/cyber-security-breaches-survey-20252026" rel="noopener noreferrer"&gt;https://www.gov.uk/government/statistics/cyber-security-breaches-survey-20252026/cyber-security-breaches-survey-20252026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sophos, The Impact of Compromised Backups on Ransomware Outcomes (2024): &lt;a href="https://assets.sophos.com/X24WTUEQ/at/539j6fwcmx6wk6whnhxc47/sophos-the-impact-of-compromised-backups-on-ransomware-outcomes-wp.pdf" rel="noopener noreferrer"&gt;https://assets.sophos.com/X24WTUEQ/at/539j6fwcmx6wk6whnhxc47/sophos-the-impact-of-compromised-backups-on-ransomware-outcomes-wp.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloud</category>
      <category>finops</category>
      <category>security</category>
    </item>
  </channel>
</rss>
