Running a Monitoring Service for Under $20/Month
· 4 min · httptiger.com
The Cost Question
Before serverless, running a URL monitoring service meant paying for servers that sat idle most of the time. A monitoring tool does not need constant compute -- it needs bursts of activity when users submit checks, then nothing. Paying for a server running 24/7 to handle a workload that is active 2% of the time felt wrong.
HTTP Tiger runs entirely on serverless infrastructure, and the monthly bill reflects the actual usage, not the theoretical capacity.
What the Bill Actually Looks Like
Here is a rough breakdown of a typical month with several hundred active users:
- Compute (Lambda): $2-4/month. Functions only run when someone submits a batch of URLs to check. Between checks, the cost is zero. The free tier covers the first million requests per month, which handles a surprising amount of traffic.
- Database (DynamoDB): $3-6/month. Using on-demand billing means you pay per read and write operation rather than provisioning capacity. Usage tracking records, check results, and user data all live here. The auto-expiring records (TTL) for rate limiting mean old data cleans itself up without running scheduled jobs.
- CDN and hosting (CloudFront + S3): $1-2/month. The frontend is static HTML, CSS, and JavaScript served from edge locations. S3 storage for the files costs pennies. CloudFront charges per request, but static assets get cached aggressively.
- API Gateway: $1-3/month. Charges per API call. The REST API handles authentication, URL submissions, and result retrieval.
- Monitoring (CloudWatch): $1-2/month. Logs, metrics, and alarms. This is the one cost that feels disproportionate -- CloudWatch log storage charges add up faster than you would expect.
Total: typically $8-17/month depending on usage volume.
Where Costs Hide
CloudWatch logs are the sneaky one. Every Lambda invocation writes logs, and CloudWatch charges for log ingestion and storage. Without log retention policies, months of accumulated logs can quietly become the largest line item on the bill. Setting a 14-day retention policy on all log groups cut this cost by 80%.
DynamoDB indexes are the other surprise. Every Global Secondary Index on a DynamoDB table is essentially a full copy of the data. Adding an index for a convenient query pattern doubles the write cost for that table. We learned to be intentional about which queries justify an index versus which can use a less efficient scan on rare occasions.
Data transfer is negligible at this scale but would become significant with thousands of concurrent users. Lambda-to-DynamoDB traffic within the same region is free, which is why keeping everything in a single region matters for cost control.
Why Serverless Works for This
URL monitoring has a bursty traffic pattern: a user submits 200 URLs, the system checks them all in 30 seconds, then nothing happens for hours. Serverless pricing aligns perfectly with this pattern. You pay for those 30 seconds of compute and zero for the hours of idle time.
A traditional server-based setup would cost $50-100/month minimum for equivalent capacity (two small instances behind a load balancer, a managed database). The serverless version costs a fraction of that and scales automatically when traffic spikes.