On this page
  1. Step 1 — Create the account and pick the Free plan
  2. Step 2 — Set a budget alert before you build anything
  3. Step 3 — Host the static frontend on S3 + CloudFront
  4. Step 4 — Deploy the API with Lambda
  5. Step 5 — Add a database with DynamoDB
  6. Step 6 — Confirm everything is free
  7. Step 7 — Plan for month seven
  8. Where AI coding assistants get this wrong
  9. Checklist
  10. FAQ
    1. Will AWS charge me when my free tier ends?
    2. Is EC2 still free for 12 months on AWS?
    3. Can I run a database for free on AWS?
    4. Why does my AI-generated AWS config cost money on the free tier?
    5. How much traffic can a free AWS app handle?
  11. Related topics
  12. Sources
tutorial

How to Deploy Your First App on AWS for Free

Deploy a web app on AWS for $0: Free plan account, budget alert, S3 + CloudFront frontend, Lambda + DynamoDB backend, all inside always-free limits.

Quick answer

  • New AWS accounts choose a Free or Paid plan; both start with $100 in credits (up to $200) plus 30+ always-free services.
  • The free stack is S3 + CloudFront for the frontend, Lambda for the API, and DynamoDB for data — all inside always-free limits.
  • Set an AWS Budgets alert before you create anything, and know that the Free plan closes automatically after 6 months.
  • Accounts created before July 15, 2025 keep the legacy 12-month free tier; this tutorial is for new accounts.

Step 1 — Create the account and pick the Free plan

Go to aws.amazon.comCreate an AWS Account and choose the Free plan. AWS requires a credit or debit card for identity verification — it will not charge it while you’re on the Free plan — and you’ll get $100 in credits immediately, with up to $100 more from completing onboarding activities in the Explore AWS widget (launching an EC2 instance, deploying a Lambda function, creating a budget alert, and similar).

How to verify it worked: the Cost and Usage widget on the console Home page shows your $100 credit balance and a 6-month countdown.

Step 2 — Set a budget alert before you build anything

In the console, open Billing and Cost ManagementBudgetsCreate a budget, and set a monthly budget of $10-20 with email alerts at 50%, 80%, and 100% of the threshold.

How to verify it worked: the budget appears in the list with a Healthy status. This also counts as one of the credit-earning onboarding activities.

Step 3 — Host the static frontend on S3 + CloudFront

  1. In S3Create bucket, name it (e.g., myapp-frontend), and leave Block all public access ON.
  2. Upload your built index.html, CSS, and JS files to the bucket.
  3. In CloudFrontCreate distribution, set the origin to your S3 bucket, and enable Origin access control (OAC) so the bucket stays private.
  4. Copy the distribution’s HTTPS domain name.

How to verify it worked: opening https://<your-distribution>.cloudfront.net/ in a browser serves your site. Do not enable public-read on the bucket — public buckets are the #1 cause of AWS data leaks, and CloudFront serving private buckets is free (1 TB of transfer + 10M requests/month).

Step 4 — Deploy the API with Lambda

Create a Lambda function with a Function URL (auth type NONE for a public test endpoint). The full walkthrough is in How to Deploy Your First Serverless Function on AWS Lambda — the short version:

curl "https://YOUR-ID.lambda-url.REGION.on.aws/?name=Ada"

How to verify it worked: the response is {"message": "Hello, Ada!"} with an HTTP 200. Lambda’s always-free tier covers 1 million requests and 400,000 GB-seconds of compute per month — a low-traffic API stays inside it indefinitely.

Step 5 — Add a database with DynamoDB

In DynamoDBCreate table, name it visits, set the partition key to id (String), and keep On-demand capacity. DynamoDB’s always-free tier covers 25 GB of storage plus monthly read/write capacity. Wire the Lambda handler to write a row on each request, or add a /visits endpoint that counts them.

How to verify it worked: after invoking the function, Explore items in the DynamoDB console shows the new row.

Step 6 — Confirm everything is free

Open Billing and Cost ManagementFree Tier page. It shows each service’s usage against its monthly limit.

How to verify it worked: every line is under its limit and your projected bill reads $0. Check this page monthly — it’s the only place AWS tells you a service is about to leave the free tier.

Step 7 — Plan for month seven

The Free plan expires at the earlier of 6 months from signup or when your credits are exhausted — AWS closes the account automatically and retains your data for 90 days. To keep the app running on the always-free services (S3, CloudFront, Lambda, DynamoDB), upgrade to the Paid plan before then: you keep the always-free allowances, remaining credits apply to any charges until they expire 12 months after signup, and you’re only billed for usage beyond the free limits.

How to verify it worked: after upgrading, the console shows a Paid plan and the always-free services still show $0 usage.

Where this bites vibecoders

The AI that generated your app was trained on the old AWS — 12-month free EC2, RDS, public S3 buckets — and it will happily generate that architecture for a new account that no longer has it. The new Free plan changes the rules: EC2 and RDS consume credits instead of being free, and the account closes if you don’t upgrade. “It ran free for a year” advice from 2024 will get you a deleted project in 2026. Follow the always-free stack in this guide and read the plan terms before you upgrade anything.

Where AI coding assistants get this wrong

  • Generating EC2, NAT Gateway, ALB, and EKS for a small app, all of which consume credits on new accounts.
  • Making S3 buckets public-read for a static site instead of serving them through CloudFront with OAC.
  • Hardcoding API keys in Lambda code instead of environment variables.
  • Omitting AWS Budgets from generated setup scripts, so nothing flags when the free tier ends.
  • Assuming the 12-month free tier still exists — it doesn’t for accounts created after July 15, 2025.

Checklist

  • Create the account on the Free plan and note the $100 credit + 6-month clock
  • Set an AWS Budgets alert ($10-20) before creating resources
  • Host the frontend on S3 + CloudFront with the bucket private
  • Deploy the API on Lambda with secrets in environment variables
  • Use DynamoDB (25 GB always free) instead of RDS
  • Confirm $0 projected bill on the Free Tier page
  • Upgrade to the Paid plan before month 6 to keep always-free services
  • Add Cloudflare or keep CloudFront in front to control egress

FAQ

Will AWS charge me when my free tier ends?

On the Free plan, no — the account closes automatically at 6 months or when your credits run out, whichever comes first. Your data is retained for 90 days; upgrading to a Paid plan within that window recovers it. On the Paid plan, pay-as-you-go billing starts once credits are exhausted.

Is EC2 still free for 12 months on AWS?

Only for accounts created before July 15, 2025, which keep the legacy 12-month tier (750 hours of t2.micro/t3.micro). New accounts get $100-200 in credits and 30+ always-free services instead — there is no longer a free EC2 instance beyond the trial credits.

Can I run a database for free on AWS?

Yes: DynamoDB gives 25 GB of storage plus monthly read/write capacity, always free. Managed Postgres/MySQL via RDS is only free on legacy accounts (pre-July 2025); on new accounts an RDS instance consumes your credits, so use DynamoDB for a $0 stack.

Why does my AI-generated AWS config cost money on the free tier?

Because it generates the enterprise stack — NAT Gateway, Application Load Balancer, EKS, Multi-AZ RDS — which has never been free and now also consumes credits. Strip it to S3 + CloudFront + Lambda + DynamoDB and you stay inside the always-free limits.

How much traffic can a free AWS app handle?

Roughly: 1M Lambda requests/month, 25 GB in DynamoDB, and 1 TB of CloudFront egress. That comfortably covers a personal project or early startup; a Hacker News front page is a different story. When you approach a limit, the Free Tier page shows it before the bill does.

Sources

Share: