<?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: Jonathan Vogel</title>
    <description>The latest articles on DEV Community by Jonathan Vogel (@jvogel).</description>
    <link>https://dev.to/jvogel</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3802327%2F145dca0a-b42c-4355-a0cd-5f56f0054687.jpg</url>
      <title>DEV Community: Jonathan Vogel</title>
      <link>https://dev.to/jvogel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jvogel"/>
    <language>en</language>
    <item>
      <title>Access Denied: What Every AWS Beginner Gets Wrong About IAM</title>
      <dc:creator>Jonathan Vogel</dc:creator>
      <pubDate>Wed, 20 May 2026 19:45:19 +0000</pubDate>
      <link>https://dev.to/aws/access-denied-what-every-aws-beginner-gets-wrong-about-iam-9k1</link>
      <guid>https://dev.to/aws/access-denied-what-every-aws-beginner-gets-wrong-about-iam-9k1</guid>
      <description>&lt;p&gt;&lt;strong&gt;The IAM mental model I wish someone had drawn on a whiteboard for me when I was starting out with AWS.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you want a video to follow along with this blog, you can find it on the &lt;a href="https://youtu.be/9Pk2J_5qnlk" rel="noopener noreferrer"&gt;AWS Developers Youtube Channel&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I spun up a Lambda function and tried to have it read from an S3 bucket only to get Access Denied.&lt;/p&gt;

&lt;p&gt;This wasn't a typo or misconfiguration. I just straight up didn't understand IAM. So I did what every beginner does, I attached AdministratorAccess, the error went away, and I moved on.&lt;/p&gt;

&lt;p&gt;What I didn't think about at the time is that I'd just given that Lambda function permission to do &lt;em&gt;anything&lt;/em&gt; in my account. Delete databases. Create resources that cost money. Access data across every service it had no business touching. All because it needed to read from one S3 bucket.&lt;/p&gt;

&lt;p&gt;I talk to students and developers getting started with AWS all the time, and this is the pattern. Everything goes smooth when you follow the tutorial. When it comes to implementing your own project, you run into a permission blocker. You come up with an easy solution. You slap on AdministratorAccess and now you have a security problem you don't even know about. The Access Denied error was actually trying to help you. It was telling you exactly which permission was missing. You just didn't know how to read it yet.&lt;/p&gt;

&lt;p&gt;This post is the mental model I wish I'd had. Once you understand what I'm about to lay out, Access Denied stops being a wall and starts being a useful message.&lt;/p&gt;

&lt;h2&gt;
  
  
  What IAM Actually Is
&lt;/h2&gt;

&lt;p&gt;IAM stands for &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Identity and Access Management&lt;/a&gt;. Not sure if that name really helps you, let me put it differently.&lt;/p&gt;

&lt;p&gt;IAM is the bouncer at the door of every AWS service. Every time anything happens in your account, whether you click a button in the console, your code calls an API, or a Lambda function tries to read from a database, IAM checks two things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Who are you?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Are you allowed to do this?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the answer to either question is "no," you get Access Denied. Those two questions are the entire foundation. The rest of this post is about how they get answered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Users, Roles and Policies
&lt;/h2&gt;

&lt;p&gt;Three concepts make up the whole model when you're getting started.&lt;/p&gt;

&lt;h3&gt;
  
  
  IAM Users = Employee Badge
&lt;/h3&gt;

&lt;p&gt;An &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;IAM user&lt;/a&gt; is a persistent identity. It represents a person who needs to log into the console or use the CLI. It has long-term credentials, a username and password for the console, or access keys for programmatic access.&lt;/p&gt;

&lt;p&gt;Think of it like an employee badge. It's yours, it has your name on it, and it works every day until someone revokes it.&lt;/p&gt;

&lt;h3&gt;
  
  
  IAM Roles = Visitor Pass
&lt;/h3&gt;

&lt;p&gt;An &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;IAM role&lt;/a&gt; is temporary. It doesn't belong to anyone permanently. Instead, it gets &lt;em&gt;assumed&lt;/em&gt; (borrowed) by whoever needs it at that moment. AWS gives the assumer temporary credentials that expire automatically.&lt;/p&gt;

&lt;p&gt;Think of it like a visitor pass at an office. You check in, you get a badge, it works for a few hours, then it stops working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb.&lt;/strong&gt; If it's a person logging in, that's a user. If it's a service doing something, a Lambda function, an EC2 instance, another AWS account, that's a role. Roles are how Lambda functions access S3, how EC2 instances talk to DynamoDB and how one AWS account talks to another. The credentials are always short-lived, so there's nothing sitting around that could be stolen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Policies = Permission Slip
&lt;/h3&gt;

&lt;p&gt;A &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;policy&lt;/a&gt; is a JSON document that says "this identity is allowed to do these actions on these resources." You attach policies to users or roles. Without a policy attached, an IAM identity can do nothing. You have to explicitly grant every single permission.&lt;/p&gt;

&lt;p&gt;A simple policy looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"s3:GetObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::my-bucket/*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This says: allow reading objects from one specific S3 bucket. Nothing else.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Mental Model
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;user&lt;/strong&gt; or &lt;strong&gt;role&lt;/strong&gt; is &lt;em&gt;who you are&lt;/em&gt;. A &lt;strong&gt;policy&lt;/strong&gt; is &lt;em&gt;what you're allowed to do&lt;/em&gt;. Identity plus permission. That's the whole thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Least Privilege Principle
&lt;/h2&gt;

&lt;p&gt;This is the one concept that makes everything in IAM make sense. It applies across all of computer security, not just cloud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Least privilege means: give every identity only the permissions it needs to do its job. Nothing more.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You already saw the wrong version in my story. I gave a Lambda function permission to do everything because it needed to do one thing. AdministratorAccess makes the error go away, but it also means anything in your account can do anything to your account.&lt;/p&gt;

&lt;p&gt;That's like giving every employee in a company a key that opens every door because they needed to open one.&lt;/p&gt;

&lt;p&gt;The right approach is to figure out exactly which actions your identity needs, on exactly which resources, and grant only that. That Lambda function I mentioned at the start? The policy it actually needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"s3:GetObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::my-bucket/*"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One action. One bucket. If that function ever gets compromised, the damage is limited to reading objects from one bucket, not your entire account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr93ou0btgdyypbajc2m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr93ou0btgdyypbajc2m.png" alt="Screenshot of AdministratorAccess policy vs scoped policy side by side" width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"But figuring out exact permissions sounds like a lot of work." It can take some extra minutes upfront. AWS gives you a tool called &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;IAM Access Analyzer&lt;/a&gt; that looks at what your identity actually used over a period of time and generates a scoped policy based on real activity. You let your service run, then Access Analyzer tells you what it actually needed. You don't have to guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your IAM Starter Checklist
&lt;/h2&gt;

&lt;p&gt;I share this with every student setting up a new AWS account. Bookmark it and come back at the end of every project.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Lock down your root user
&lt;/h3&gt;

&lt;p&gt;When you first create an AWS account, you start as the &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;root user&lt;/a&gt;. Root can do anything, including things no other identity can do, like closing the account entirely. It's the "break glass in case of emergency" identity.&lt;/p&gt;

&lt;p&gt;Enable &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;MFA&lt;/a&gt; on root immediately. That's multi-factor authentication, so even if someone gets your password, they still can't log in without your second factor. Then stop using root for daily development.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Set up daily access
&lt;/h3&gt;

&lt;p&gt;For day-to-day work, create a separate identity. If you're learning on a personal account, an IAM user with MFA works fine. If you're working with a team or thinking about production, &lt;a href="https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;IAM Identity Center&lt;/a&gt; is the current best practice. It gives you temporary credentials and scales well when you add team members.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Use roles for services
&lt;/h3&gt;

&lt;p&gt;When you build things, Lambda functions, EC2 instances, anything running code, use roles. They don't need long-lived access keys. They need roles with temporary credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Start with managed policies, then tighten
&lt;/h3&gt;

&lt;p&gt;AWS has &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;pre-built managed policies&lt;/a&gt; for common use cases. They're a reasonable starting point when you're learning. As you understand what your application actually needs, narrow the permissions down. You don't have to write perfect policies on day one, but you should be moving toward least privilege over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Never put access keys in your code
&lt;/h3&gt;

&lt;p&gt;Putting keys directly in source code is a bad idea. They should never be in config files or any variable pushed to Git. Use roles instead. If you ever accidentally push AWS keys to a public repo, rotate them immediately. Bots scan for exposed keys within minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What to Do&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lock down root&lt;/td&gt;
&lt;td&gt;Enable MFA, stop using root daily&lt;/td&gt;
&lt;td&gt;Root = key that opens all doors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set up daily access&lt;/td&gt;
&lt;td&gt;IAM user (learning) or Identity Center (teams)&lt;/td&gt;
&lt;td&gt;Limits root exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use roles for services&lt;/td&gt;
&lt;td&gt;Lambda, EC2 get roles, not users&lt;/td&gt;
&lt;td&gt;Temporary credentials, nothing to steal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start managed, then tighten&lt;/td&gt;
&lt;td&gt;Use AWS managed policies first&lt;/td&gt;
&lt;td&gt;Don't guess permissions on day one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No keys in code&lt;/td&gt;
&lt;td&gt;Use roles, not hardcoded credentials&lt;/td&gt;
&lt;td&gt;Bots scan for exposed keys within minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What I Tell Students Who Are Afraid of IAM
&lt;/h2&gt;

&lt;p&gt;Every time someone tells me "I just attach AdministratorAccess because IAM is confusing," I tell them the same thing. The confusion comes from not having the mental model. Now you have it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Users&lt;/strong&gt; are people. &lt;strong&gt;Roles&lt;/strong&gt; are services. &lt;strong&gt;Policies&lt;/strong&gt; define what any of them can do. &lt;strong&gt;Least privilege&lt;/strong&gt; means only what you need, nothing more. And &lt;strong&gt;Access Denied&lt;/strong&gt; is IAM telling you exactly which permission is missing. Read the error. It's trying to help you.&lt;/p&gt;

&lt;p&gt;Next time you get Access Denied, and you will, don't reach for AdministratorAccess. Check the policy. You've got this.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The best time to learn IAM was when you created your AWS account. The second best time is right now.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/free/?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Click here for more info on AWS Free Tier.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>security</category>
      <category>aws</category>
      <category>cloud</category>
    </item>
    <item>
      <title>You Deleted Everything and AWS Is Still Charging You</title>
      <dc:creator>Jonathan Vogel</dc:creator>
      <pubDate>Fri, 13 Mar 2026 18:33:50 +0000</pubDate>
      <link>https://dev.to/aws/you-deleted-everything-and-aws-is-still-charging-you-1hnd</link>
      <guid>https://dev.to/aws/you-deleted-everything-and-aws-is-still-charging-you-1hnd</guid>
      <description>&lt;p&gt;&lt;strong&gt;The AWS cleanup checklist I wish someone had given me when I was starting out with cloud.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I talk to computer science students regularly. There's one fear that comes up more than almost anything else: "I am worried about spinning up stuff in the cloud and charges getting out of control."&lt;/p&gt;

&lt;p&gt;I used to feel this. Some time ago, I set up a relational database on RDS, some virtual machines as EC2 instances, an S3 bucket to upload some data. After I was done, I deleted everything on the AWS console. Deleted my database. Terminated my instances. Then I got a bill I wasn't expecting.&lt;/p&gt;

&lt;p&gt;Didn't everything get deleted? Literally AWS told me "deleting" in the console. I didn't think anything was running. What happened?&lt;/p&gt;

&lt;p&gt;That experience stuck with me. As I work with students building on AWS, I see the exact same thing happen to them. Last semester alone, I heard some version of this story from students.&lt;/p&gt;

&lt;p&gt;I'm gonna walk us through what's actually going on and give you a checklist to eliminate this fear when building out on AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Actually Charging You After You "Delete Everything"
&lt;/h2&gt;

&lt;p&gt;Here's an example. You delete your RDS instance at the end of a semester project. Makes sense. Project's done. But during deletion, AWS offers to create a final snapshot of your database. It's a checkbox. You probably don't even register that it's there. You click through, the database goes away, and that snapshot sits in your account quietly costing you money.&lt;/p&gt;

&lt;p&gt;Same thing with EC2. You terminate your instances and depending on how your volumes were configured, the EBS volumes that were attached don't always get deleted with the instance. They're still there, billing. Invisible unless you know where to look.&lt;/p&gt;

&lt;p&gt;And then there's this one that gets people: &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Elastic IPs&lt;/a&gt;. When you terminate an instance, the Elastic IP doesn't get deleted with it. It just sits there, unattached, costing you a few dollars per month. Not huge, but it adds up when you forget about it. That one catches people off guard.&lt;/p&gt;

&lt;p&gt;None of this is hidden. It's all documented. But nobody tells you to look for it when you're learning, and the console doesn't wave a red flag that says "hey, you still have billable resources over here."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Frustrates Me
&lt;/h2&gt;

&lt;p&gt;Here's the part that actually gets to me as a Developer Advocate. When a student gets a surprise bill, they don't usually think "I missed a step in my cleanup." They think "AWS secretly charges you even after you delete stuff." They tell their classmates and that becomes the narrative. I've heard it in person, on discord, etc. "Be careful with AWS, they'll charge you for nothing." It's not cool because it can scare people away from learning skills that would genuinely help their careers.&lt;/p&gt;

&lt;p&gt;AWS doesn't charge you in mysterious ways. It charges you in specific, predictable ways that nobody taught you to look for. That's a knowledge gap. The purpose of this post is to shed some light on this.&lt;/p&gt;

&lt;h2&gt;
  
  
  There's a Better Way Now
&lt;/h2&gt;

&lt;p&gt;Here's something I wish existed when I was starting out. AWS now has a &lt;a href="https://aws.amazon.com/free/?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;free account plan&lt;/a&gt; where you get $100 in credits just for signing up, and you can earn up to $200 total by completing activities like launching an EC2 instance or creating a budget. The key part: you literally cannot be billed. There's no scenario where you wake up to a surprise charge. When your credits run out or six months pass, whichever comes first, your account just closes. That's it. No bill.&lt;/p&gt;

&lt;p&gt;If you want more flexibility -- say you're working on a longer project or you don't want to risk your account closing mid-semester -- you can choose the paid account plan instead. You still get the same $200 in credits, but your account stays open after they're used up. The tradeoff is that you &lt;em&gt;can&lt;/em&gt; be billed beyond your credits, which is exactly why the billing alarm later in this post matters. Set that up on day one and you're covered.&lt;/p&gt;

&lt;p&gt;I've been guiding more students toward these options lately and it keeps coming up enough that I'll probably write a dedicated post about it soon.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cleanup Checklist
&lt;/h2&gt;

&lt;p&gt;This is what I share with every student I work with now. I tell them to bookmark it and come back to it at the end of every project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start With Your Bill, Not Your Console
&lt;/h3&gt;

&lt;p&gt;Before you click around trying to find leftover resources, go to &lt;a href="https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-what-is.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;AWS Billing Dashboard&lt;/a&gt; from the AWS console. Look at the current month's charges broken down by service. This tells you exactly which services are costing money right now.&lt;/p&gt;

&lt;p&gt;If you see a charge for RDS, go check RDS. If you see a charge for EC2, go check EC2. Let this be your map.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Resource Explorer
&lt;/h3&gt;

&lt;p&gt;Looking for an exhaustive list of everything going on in your AWS account across all regions?&lt;/p&gt;

&lt;p&gt;Instead of clicking through every service console in every region hoping you didn't forget something, &lt;a href="https://docs.aws.amazon.com/resource-explorer/latest/userguide/welcome.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Resource Explorer&lt;/a&gt; gives you a single search interface across your entire account. All services. All regions. One view.&lt;/p&gt;

&lt;p&gt;That last part matters more than you'd think. I've seen students create resources in &lt;strong&gt;us-east-1&lt;/strong&gt; for a tutorial and &lt;strong&gt;us-west-2&lt;/strong&gt; for a class project, then only check one region during cleanup and assume everything's gone. Resource Explorer solves that completely. Resource Explorer in the console. If your account is truly clean, you'll see very little. If it's not, you'll see exactly what's still hanging around.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check the Usual Suspects
&lt;/h3&gt;

&lt;p&gt;Even with Resource Explorer, it helps to know the specific things that catch people. These are the ones I see come up a lot:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snapshots (EBS and RDS)&lt;/strong&gt; Check EC2 -&amp;gt; Snapshots and RDS -&amp;gt; Snapshots. Common silent cost I see among students. They get created automatically, often during deletion workflows, and nobody thinks to look for them. &lt;a href="https://docs.aws.amazon.com/ebs/latest/userguide/ebs-snapshots.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;These snapshot costs can add up&lt;/a&gt; - something like 100 GB could be $5/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unattached EBS Volumes&lt;/strong&gt; Go to EC2 -&amp;gt; Volumes and filter by state: "available." If a volume shows "available," it's not attached to anything. It's just sitting there being billed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elastic IPs&lt;/strong&gt; Check EC2 -&amp;gt; Elastic IPs. If any are listed and not associated with a running instance, release them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT Gateways&lt;/strong&gt; If you followed a VPC tutorial with public and private subnets, check &lt;a href="https://aws.amazon.com/vpc/pricing/?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;VPC -&amp;gt; NAT Gateways&lt;/a&gt;. These run about $32/month whether you're pushing traffic through them or not. If you don't need it, delete it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set Up a Billing Alarm
&lt;/h2&gt;

&lt;p&gt;This takes two minutes and it's the single most important thing you can do on a new AWS account. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-create.html?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Billing -&amp;gt; Budgets&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a low budget, say $5 or $10&lt;/li&gt;
&lt;li&gt;Set an alert at 80% of that threshold&lt;/li&gt;
&lt;li&gt;Add your email&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I Tell Students Who Are Afraid to Start
&lt;/h2&gt;

&lt;p&gt;Every time I meet a student who communicates to me in a way that signals "I'm scared of cloud billing getting out of control," I tell them the same thing. That fear is valid. Every dollar matters when you're a student. Once you understand where surprise charges actually come from, which is a pretty short list, the fear goes away.&lt;/p&gt;

&lt;p&gt;The students who get burned are the ones who don't know about snapshots, orphaned volumes, and unattached Elastic IPs. Now you do.&lt;/p&gt;

&lt;p&gt;I tell students these three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want zero billing risk, choose the free account plan when you sign up. You get up to $200 in credits and you cannot be charged. The tradeoff is that your account closes when credits run out or after six months. If you'd rather keep your account open longer, go with the paid plan -- you get the same credits, just set up a billing alarm so nothing sneaks past you.&lt;/li&gt;
&lt;li&gt;Set up a billing alarm no matter which plan you pick&lt;/li&gt;
&lt;li&gt;Bookmark this checklist and come back to it at the end of every project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start the account. Build the project. Learn the skills. And when the semester ends, come back to this checklist.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Where to Look&lt;/th&gt;
&lt;th&gt;What to Do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Billing by service&lt;/td&gt;
&lt;td&gt;Billing Dashboard -&amp;gt; Bills&lt;/td&gt;
&lt;td&gt;See which services are charging you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All resources, all regions&lt;/td&gt;
&lt;td&gt;Resource Explorer&lt;/td&gt;
&lt;td&gt;Find anything still alive in your account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snapshots&lt;/td&gt;
&lt;td&gt;EC2 -&amp;gt; Snapshots, RDS -&amp;gt; Snapshots&lt;/td&gt;
&lt;td&gt;Delete what you don't need&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orphaned EBS volumes&lt;/td&gt;
&lt;td&gt;EC2 -&amp;gt; Volumes -&amp;gt; filter "available"&lt;/td&gt;
&lt;td&gt;Delete unattached volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elastic IPs&lt;/td&gt;
&lt;td&gt;EC2 -&amp;gt; Elastic IPs&lt;/td&gt;
&lt;td&gt;Release unassociated IPs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAT Gateways&lt;/td&gt;
&lt;td&gt;VPC -&amp;gt; NAT Gateways&lt;/td&gt;
&lt;td&gt;Delete if project is done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Billing alarm&lt;/td&gt;
&lt;td&gt;Billing -&amp;gt; Budgets&lt;/td&gt;
&lt;td&gt;Set one up before you do anything else&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Or to avoid any billing entirely, choose the free account plan when signing up. You still get credits, but you are never billed. Note: when you run out of credits (or 6 months pass, whichever comes first), AWS closes your account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/free/?trk=23ae1f57-152e-4145-9aa7-04a603514f54&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Click here for more info on AWS Free Tier.&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The best time to set up a billing alert was when you created your account. The second best time is right now.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>aws</category>
      <category>tutorial</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
