Skip to main content
ODM Cloud

Reading Your First AWS Bill (Don't Panic)

Your first AWS bill says $47.23 when you expected $3. What happened, why egress dominates, and three simple practices to prevent bill shock.

Eric By — M.S. Geography (GIS spec.), FAA Part 107
Updated October 25, 2026
Reading Your First AWS Bill (Don't Panic)

Updated October 2026: We corrected PIX4Dcloud pricing (there are no $49 or $249 plans; Starter is $1,290/yr), the AWS Budgets console path, how budget alert thresholds work, the EBS “Delete on termination” defaults, the daily cost of an orphaned volume, and our CloudFront, presigned-URL and Glacier guidance. EC2 has no uptime metric, so we replaced the instance-age alarm with a low-CPU alarm that terminates idle instances. We also made clear that per-job egress figures are before AWS’s 100 GB monthly free allowance.

ODM Cloud Series — Crawl / Walk / Run  ·  Article 3 of 10

From zero to a self-hosted cloud processing pipeline

This series builds a production WebODM setup from scratch — starting with the ecosystem fundamentals, moving through AWS spot instance setup and cost control, and finishing with auto-scaling, security, and a head-to-head comparison with commercial platforms. Each article stands alone; read in order to build the full stack.

Pricing note: AWS pricing, spot instance rates, and third-party software costs change frequently. Figures reflect rates as of April 2026 (PIX4Dcloud, S3, CloudFront and data-transfer rates rechecked October 2026) and should be verified against current pricing pages before making infrastructure decisions.

Your first AWS bill arrives. The subject line says “$47.23 due.” You remember spinning up one instance for two hours, processing 500 images, downloading the results, and shutting it down. You expected about $3: roughly $0.30 of compute and a few dollars to download the results. Instead, it’s $47.

Something broke. You left an instance running. You created resources and forgot. Or AWS is scamming you.

None of those are true.

AWS billing has three separate cost buckets — compute, storage, and data transfer — and they don’t behave the way you’d expect. Most guides cover compute and ignore the other two. That’s where the surprises live. Once you understand the breakdown, the $47 makes sense. And you won’t repeat the mistake.


The Three Cost Buckets

AWS charges for three things that matter to WebODM users: EC2 instances (compute), EBS volumes (storage), and data transfer (egress). Each scales independently and appears as a separate line item on your bill.

Compute (EC2). Pay by the second per running instance. r5.2xlarge spot is $0.153/hr. Run 1 hour: charged $0.153. Run 2 hours: charged $0.306. Terminate: billing stops. Intuitive — you know the duration.

Storage (EBS volumes). Pay by GB per month, regardless if instance runs. 200 GB gp3 costs $0.08/GB/month = $16/month. Create April 1, delete April 15: charged about $7.50. Create April 1, forget until May 15: charged about $23. Volumes persist after instance stops. This surprises people.

Data transfer (egress). AWS charges $0.09/GB for data leaving the network. Download results (orthomosaic, point cloud, etc.) and pay. Upload is free. AWS wants your data in, charges to get it out. 30 GB orthomosaic: $2.70. 50 GB archive: $4.50. Process 10 jobs/month, download all: $27–$45/month in egress at list price, before the 100 GB monthly free allowance covered below. Dominates per-job costs but isn’t obvious.

Two stacked horizontal bars on one shared $0 to $20 scale with cost tables below: correct practice totals $3.16 per job (EC2 spot $0.46, EBS $0.00, egress $2.70), while a forgotten 200 GB EBS volume adds a $16.00 copper storage segment for $19.16 per job
Both scenarios on the same scale: one forgotten 200 GB EBS volume turns a $3.16 job into a $19.16 job. Egress (light blue) dominates the correctly managed job; orphaned storage (copper) dominates the mistake.

The #1 Mistake: Leaving an Instance Running

Launch r5.2xlarge, start processing, close your laptop and forget.

On-demand r5.2xlarge: $0.504/hr (vs $0.15 spot). Run a week: 7 × 24 × $0.50 = $84. Run a month: $360.

Nightmare scenario. But entirely preventable — terminate instances immediately after use. Don’t stop “just in case.” Don’t “leave until end of day.” Delete it when you’re done downloading.

Even better: set up a CloudWatch alarm that terminates an instance once it goes idle, meaning low CPU for an hour or more (setup below). That’s a more advanced move. For now, just manually terminate every time.

Discipline: After downloading, before closing your laptop, right-click instance → “Terminate Instance.” Watch it vanish. State changes to “terminated.” Only then are you done.


Storage Costs: The Persistent Surprise

Create a 200 GB EBS volume for your dataset. Processing finishes. Download results. You’re done.

But you don’t delete the volume. It persists. End of month: AWS charges $16 — even though you used the instance 2 hours.

Why: Only the root volume defaults to “Delete on termination” = Yes. An extra data volume you add in the launch console defaults to No, and so does any volume you attach after launch. (The AMI can override these defaults, so check.) Those volumes survive instance termination. That’s useful if the data matters, but most WebODM users don’t need it. You’ve downloaded everything. The volume is waste.

Fix: When launching, check “Delete on Termination” for all EBS volumes. Volumes vanish when instance terminates. No orphaned storage. No surprise charges.

Already created volumes? Check EC2 console: Elastic Block Store → Volumes. Find unattached volumes — these are orphaned. Delete immediately. Each 200 GB orphan costs about $0.53/day ($16/month at $0.08/GB-month).


Data Transfer Costs: The Biggest Per-Job Expense

This is where AWS bills blow up.

AWS charges $0.09/GB for egress (data leaving the network). Uploading is free. Downloading costs.

A typical 500-image dataset produces:

  • Orthomosaic (GeoTIFF): 10–15 GB
  • Point cloud: 5–10 GB
  • DSM (Digital Surface Model): 3–5 GB
  • Textured 3D mesh: 5–10 GB
  • Processing logs and metadata: 1–2 GB

Total output: 25–40 GB per job. At $0.09/GB: $2.25–$3.60 per job in transfer costs alone.

Most guides lead with compute ($0.30 for 2 hours spot) and ignore egress. Egress is 6–10x more expensive than processing.

Cost optimization: AWS gives 100 GB free egress per month, aggregated across all services and regions. The per-job figures in this article are at list price, before that allowance. Process 2–3 jobs/month: no egress cost. Process 10 jobs (300 GB): pay $0.09 × (300 – 100) = $18 egress. Cheap but visible.

Process 50 jobs/month? You’re at $0.09 × (1,500 – 100) = $126/month in egress. At that scale, consider:

CloudFront CDN. Deliver through CloudFront. Caching speeds up repeat downloads but doesn’t make them cheaper, because on pay-as-you-go pricing CloudFront bills every GB it delivers ($0.085/GB in the US, slightly cheaper than direct). The saving is its permanent free tier of 1 TB/month of data transfer out, on top of the 100 GB allowance above. Fetching from an S3 or EC2 origin into CloudFront is free. Under 1 TB/month of client downloads, delivery costs nothing. AWS also sells flat-rate CloudFront plans (from $0 and $15/month) with bundled data transfer and no overage charges; check the CloudFront pricing page to see whether one fits your delivery volume.

S3 Transfer Acceleration. Speeds uploads/downloads but increases egress cost. Not recommended for WebODM.

Presigned URLs. A presigned URL gives a client a time-limited download link to an S3 object, no AWS account needed. Convenient, but it doesn’t avoid egress: the bucket owner pays data transfer. The only S3 setting that shifts the cost is Requester Pays, and that requires the client to make authenticated requests from their own AWS account. Not practical for most clients.

For now: assume $0.09/GB egress. Budget $2.70 for a typical 30 GB job, minus whatever the free 100 GB covers that month.


The Real Per-Job Cost Calculation

Here’s what a 500-image job actually costs on AWS:

Cost componentAmount
EC2 spot (r5.2xlarge, 3 hours × $0.153/hr)$0.46
EBS volume (200 GB, temporary, deleted after)$0.00
Data transfer (30 GB output × $0.09/GB)$2.70
Total per job$3.16

That’s list price, before the 100 GB monthly free egress allowance. 10 jobs/month: $31.60 at list, about $22.60 once the first 100 GB of egress is free. 20 jobs/month: $63.20 at list, about $54.20 with the allowance. Costs stay manageable even at volume.

But if you forget to delete the EBS volume:

Cost componentAmount
EC2 spot (3 hours)$0.46
EBS volume (200 GB, persisting all month)$16.00
Data transfer (30 GB)$2.70
Total per job (with storage mistake)$19.16

One forgotten volume turns $3 into $19. A month of forgotten volumes runs $150+ instead of $30. This is your $47 bill.


Setting Up AWS Budgets and Billing Alerts

Set these up before your first real job. AWS Budgets and CloudWatch alarms catch problems before they get expensive.

Navigate to AWS Budgets. Search “Budgets” in the console, or open the Billing and Cost Management console at console.aws.amazon.com/cost-management and choose Budgets in the navigation pane.

Create a monthly budget:

  • Set $50/month (or whatever feels safe).
  • Add your alert thresholds. AWS doesn’t pick them for you: each threshold is one you configure, as a dollar amount or a percentage of the budget. For the table below, enter $10, $50, $100 and $200, which is 20%, 100%, 200% and 400% of a $50 budget.
  • Email notifications at each threshold (up to 10 addresses per alert).

Recommended alert thresholds for WebODM work:

BudgetAction
$10You’ve spun something up. Sanity check the console.
$50Something is definitely running longer than expected. Investigate immediately.
$100Something is very wrong. Potential runaway instance or forgotten storage.
$200+You have a serious problem or you’ve scaled to production. Verify intentionally.

Process 5 jobs/month (expected ~$15)? Set budget to $50. Above $25 signals something unexpected.

Add a CloudWatch alarm for idle instances. Optional but powerful.

EC2 doesn’t publish an “instance age” or uptime metric, so watch for idleness instead. Go to CloudWatch → Alarms → Create alarm, choose the instance’s CPUUtilization metric (Average), and trigger when it stays below about 10% for an hour or more. A finished WebODM job sits near zero CPU. Under Add EC2 action, choose Terminate this instance. A one-time spot instance can’t be stopped, and a stopped on-demand instance still bills for its EBS volume. Pick a window longer than your upload and download take, so the alarm doesn’t fire before processing starts or while you’re pulling results. Catches forgotten instances before they burn money. Pair with SNS notification for email or Slack alert.

Left panel: recommended alert thresholds at $10, $50, $100 and $200+, shifting from blue to copper as severity rises. Right panel: three numbered setup steps (open AWS Budgets, create a $50 monthly budget, add alerts at 20, 100, 200 and 400 percent of it, which is $10, $50, $100 and $200) and an optional CloudWatch alarm that terminates an instance when CPU stays low
Set up AWS Budgets before your first real job. Spend at $50 means something is running longer than expected; $100 or more means a runaway instance or forgotten storage.

Comparison: Self-Hosted AWS vs. DroneDeploy vs. Pix4D

Here’s the real cost picture when you process at scale:

ScenarioWebODM AWSDroneDeployPIX4Dcloud Starter
5 jobs/month$15–$20$349$108
10 jobs/month$30–$40$349$108
20 jobs/month$60–$80$349$108
50 jobs/month$150–$200$349$108

WebODM figures are list price, before the 100 GB monthly free egress allowance. DroneDeploy is Flight & Analysis at $4,188/yr ($349/month equivalent). PIX4Dcloud Starter is $1,290 billed annually (about $108/month equivalent) with 500 processing credits a year. PIX4Dcloud Pro is $4,490/yr (about $374/month) with 2,500 credits. Pix4D bills processing in credits, not per job, so whether Starter covers 20–50 jobs a month depends on your dataset sizes. Heavy volume may push you to Pro or extra credits.

On sticker price, AWS is cheapest up to about 20 jobs a month. Occasional jobs (under 10/month)? PIX4Dcloud Starter, at about $108/month billed annually, is the least expensive managed option here, and it’s worth it if you’d rather not run infrastructure. At 50 jobs a month, Starter’s $108 looks lower than AWS’s $150–$200, but that’s 600 jobs a year on 500 credits. Unless each job uses about 0.8 credits or less, you’ll be buying more credits or moving to Pro at about $374/month. Regular work (20+ jobs/month)? AWS beats PIX4Dcloud Pro and DroneDeploy; against Starter it depends on credits.

The trade-off is obvious: DroneDeploy and Pix4D handle infrastructure for you. WebODM on AWS means you manage security groups, IAM, EBS, and billing yourself. If the AWS console makes you uncomfortable, DroneDeploy’s simplicity is worth the premium. If you’re technical and processing regularly, AWS pays for itself in a month or two.

Grouped bar chart of monthly cost at 5, 10, 20 and 50 jobs per month: WebODM on AWS as a blue low-to-high range ($15–$20, $30–$40, $60–$80, $150–$200), PIX4Dcloud Starter in light blue at a flat $108 per month equivalent and DroneDeploy in copper at a flat $349 per month equivalent
WebODM on AWS scales with usage, while PIX4Dcloud Starter stays flat at about $108/month and DroneDeploy at $349/month (both billed annually, shown as monthly equivalents). The subscriptions buy managed infrastructure, not lower cost.

Bottom Line

Your $47 bill came from one of three: instance left running, forgotten EBS volume, or egress catching you off-guard.

Three practices prevent it:

  1. Terminate instances immediately. Download results, terminate. Don’t stop. Delete. Billing stops.

  2. Check “Delete on Termination” for all volumes. When instance vanishes, storage goes with it. No orphaned volumes.

  3. Budget $2.70 per 30 GB output. Egress dominates. 10 jobs/month = 300 GB = $18 egress. That’s your per-job cost.

Set an AWS Budgets budget of $50, with alerts you configure at $10, $50, $100 and $200. Alert arrives, log in, verify. Unrecognized instances or volumes? Delete. Takes 30 seconds, saves your month.

The cost structure isn’t punitive — just different from what you’re used to. Learn the three buckets and AWS becomes predictable.

Eric

Written by Eric

M.S. Geography (GIS specialization) from St. Cloud State University, FAA Part 107. Pacific Northwest-based; active public-sector Blue UAS operator. Geospatial background covering spatial data, remote sensing, and coordinate systems — applied to drone mapping workflows and deliverables.

About Eric →