On this page
- Step 1 — Create the account and pick the Free plan
- Step 2 — Set a budget alert before you build anything
- Step 3 — Host the static frontend on S3 + CloudFront
- Step 4 — Deploy the API with Lambda
- Step 5 — Add a database with DynamoDB
- Step 6 — Confirm everything is free
- Step 7 — Plan for month seven
- Where AI coding assistants get this wrong
- Checklist
- FAQ
- Related topics
- Sources
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.com → Create 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 Management → Budgets → Create 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
- In S3 → Create bucket, name it (e.g.,
myapp-frontend), and leave Block all public access ON. - Upload your built
index.html, CSS, and JS files to the bucket. - In CloudFront → Create distribution, set the origin to your S3 bucket, and enable Origin access control (OAC) so the bucket stays private.
- 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 DynamoDB → Create 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 Management → Free 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.
Related topics
- How to Launch Free Infrastructure on AWS, GCP, or Azure
- How to Deploy Your First Serverless Function on AWS Lambda
- How to Choose a Cloud Provider for Your AI-Generated App
- AWS, GCP, and Azure for Vibecoders: The Services You Actually Need
- Why Did My AI-Generated Terraform Config Almost Delete Production?
- What Is FinOps (Cloud Cost Management)?
- How to Set Up Cloudflare for a Small Project