AWS Lambda vs Azure Functions: the free tier and pricing, compared
People ask which one is cheaper expecting a winner. For anything small the honest answer is: neither, in a way you will ever feel. The interesting difference is buried in how each one counts your milliseconds.
New to cloud? CAMPUX is a free, build-first course. Start here →
AWS Lambda and Azure Functions hand you almost the same free grant — roughly one million requests and 400,000 GB-seconds of compute free every month, and that grant resets monthly rather than expiring after a year. So for a side project or a light production workload, both are effectively free. The one real pricing difference is billing granularity: Lambda bills execution time in 1-millisecond increments, while Azure Functions' Consumption plan rounds each run up to the nearest 100 milliseconds — which makes very short, bursty functions cheaper on Lambda once you outrun the free tier.
That is the whole money story in two sentences, and most comparison articles bury it under a table of numbers that will be stale by the time you read them. I would rather tell you where the numbers stop mattering and where they start.
The free tier is the same, and it is genuinely free
Both platforms price serverless functions on two axes: how many times your function runs, and how much memory-time it burns while running. That second unit, the GB-second, is one gigabyte of allocated memory held for one second. A function set to 512 MB running for two seconds costs one GB-second. Get the shape of that unit in your head and serverless pricing stops being mysterious.
As of 2026, both AWS and Microsoft give you a perpetual monthly free grant of about 1,000,000 requests and 400,000 GB-seconds of execution. It resets every month, for the life of the account. This is not the 12-month new-account trial you get on virtual machines — the EC2 and Azure VM free windows expire; the functions grant does not. That distinction matters more than any per-request price. It means a cron job, a webhook receiver, a small API, or a scheduled cleanup can run for years and cost you nothing.
Do the arithmetic on 400,000 GB-seconds and you see how much room that is. A modest 128 MB function running for 300 milliseconds uses 0.0375 GB-seconds per call. The free grant covers roughly ten million such calls a month before the compute meter even starts. Most hobby projects never come close.
At side-project scale the price isn't a tie-breaker. It's a rounding error on both.
Where Lambda's 1ms billing wins
Now the one place the platforms genuinely diverge on money. Once you exhaust the free grant, both charge for compute by the GB-second — but they measure the duration differently before they multiply.
Lambda rounds your execution time to the nearest millisecond. Azure Functions on the default Consumption plan rounds each execution up to the nearest 100 milliseconds. If your function does its work in 12 milliseconds, Lambda bills you for 12 and Azure bills you as if it took 100. That is an eight-times overcount on that dimension — but only for functions short enough for the rounding to dominate.
So the pattern where Lambda pulls ahead on cost is specific: very short executions, called very often, past the free tier. Think a high-volume validation endpoint or a lightweight event transformer that finishes in single-digit or low-double-digit milliseconds, firing millions of times a day. There the 100ms floor is pure tax. For a function that runs 300ms, 800ms, or two seconds, the rounding is noise and the two platforms land within cents of each other.
The 100ms rounding is a property of the Azure Functions Consumption plan specifically. The newer Flex Consumption plan changed the billing model, and the Premium and dedicated App Service plans bill for reserved instances rather than per-execution — so the 1ms-vs-100ms line is a Lambda-vs-Consumption comparison, not a permanent law of Azure. If your workload is genuinely dominated by tiny fast functions, that is a reason to look at Flex Consumption, not just to jump ship to AWS.
The full comparison
Everything that differs between the two, side by side. Prices move constantly, so I have described the pricing model and the fixed facts rather than quoting per-request dollars that will be wrong next quarter — check each provider's calculator for live numbers before you commit.
| AWS Lambda | Azure Functions | |
|---|---|---|
| Monthly free grant | ~1,000,000 requests + 400,000 GB-seconds, perpetual (resets monthly) | ~1,000,000 requests + 400,000 GB-seconds, perpetual (resets monthly) |
| Billing rounding | Duration billed to the nearest 1 ms | Consumption plan rounds each execution up to the nearest 100 ms; Flex Consumption uses a revised model |
| Cold starts | Yes on standard concurrency; eliminated with paid Provisioned Concurrency | Yes on Consumption; eliminated with Premium (pre-warmed) or Flex Consumption always-ready instances |
| Max execution duration | 15 minutes per invocation (hard cap) | ~5 min default on Consumption (configurable up to ~10); effectively unbounded on Premium/Dedicated |
| Language support | Node.js, Python, Java, .NET, Go, Ruby; plus custom runtimes and container images | C#/.NET, JavaScript/TypeScript, Python, Java, PowerShell; plus custom handlers |
| Hosting plans | On-demand (pay-per-use); Provisioned Concurrency for warm instances; SnapStart for select runtimes | Consumption (pay-per-use), Flex Consumption, Premium (pre-warmed + VNet), Dedicated App Service plan |
| Triggers & bindings | Rich event sources (S3, DynamoDB, SQS, SNS, EventBridge, API Gateway); you write the client code for outputs | Declarative triggers and output bindings (Blob, Queue, Cosmos DB, Service Bus, Event Grid, Event Hubs) — less glue code to move data in and out |
| Sits closest to | The AWS ecosystem — IAM, the AWS SDKs, EventBridge | The Azure ecosystem — Entra ID identity, Storage, Cosmos DB, the rest of your resource group |
The bindings are the Azure argument
The feature that pulls people toward Azure Functions is not price — the free tier already settled that — it is bindings. On Lambda, a trigger tells your function when to run; getting data out to another service is code you write with the SDK. Azure Functions gives you both an input and an output binding, declared as configuration. A function can be triggered by a new blob landing in Storage, receive that blob as a parameter, and write its result straight into a Cosmos DB container — with the plumbing declared, not hand-coded.
When your data, your identity, and your queues already live in Azure, that closeness is the whole point. A function reacting to a Blob Storage upload, a Cosmos DB change feed, or a Service Bus message sits inside the same resource group and authenticates with the same Entra identity as everything around it. You are not building a bridge between two clouds; you are wiring one box to the box beside it. That is the practical reason to reach for Functions, and it has nothing to do with which one shaves a fraction of a cent off a million requests.
So which one — honestly
If you are starting cold with no existing footprint, this is not a decision worth agonising over on price, because there is no price to speak of at the scale you will start at. Pick the cloud you want to build a career or a product in, and use its functions.
For a CAMPUX reader, that tilt is toward Azure, and the reason is honest: the value here is fluency in one ecosystem deep enough to be trusted with it, and Functions is where the rest of your Azure stack becomes reachable in a few lines. When the tie-breaker is "which one lives next to my data and my identity," Functions wins for anyone already in Azure. Reach for Lambda when your workload is genuinely the pathological case — millions of sub-20ms executions past the free tier where 100ms rounding turns into a real bill — or when the rest of your world is already AWS.
Either way, do not choose from a table. Build a small one on each, watch it bill nothing for a month, and let the triggers your app actually needs make the call. When you are ready to build the Azure side for real, Class 41 walks through Azure Functions end to end, and the code-practice sandbox lets you write and run one without leaving the browser.
Common questions
Is Azure Functions cheaper than AWS Lambda?
At small scale, neither is cheaper in any way you will feel — both give you roughly a million requests and 400,000 GB-seconds of compute free every month, so hobby and side-project workloads run at zero on either. Where they diverge is billing granularity: Lambda bills execution time in 1-millisecond increments, while Azure Functions' Consumption plan rounds each execution up to the nearest 100 milliseconds. For very short, very frequent functions that rounding makes Lambda measurably cheaper once you are past the free grant. For everything longer-running the difference washes out.
Do AWS Lambda and Azure Functions have a free tier that expires?
No — this is the good part. The Lambda and Azure Functions monthly free grants are perpetual, not a 12-month trial. You get roughly a million requests and 400,000 GB-seconds of compute reset every single month, for as long as the account exists. That is different from the 12-month EC2 or Azure VM free windows, which do expire. Serverless functions are one of the few places you can run something small forever and pay nothing.
Which has faster cold starts, Lambda or Azure Functions?
Both suffer cold starts on their cheapest consumption tiers, and both sell a way out of them. Cold start time depends heavily on runtime and package size — a small Node or Python function is quick on either; a heavy .NET or Java one is slower on both. To eliminate cold starts you pay for a warm tier: Lambda has Provisioned Concurrency, and Azure Functions has the Premium plan (pre-warmed instances) or the Flex Consumption plan's always-ready instances. If your app is already .NET, Azure Functions has the tighter runtime story.
When should I choose Azure Functions over AWS Lambda?
Choose Azure Functions when the rest of your app already lives in Azure. The triggers and bindings are the real pull: a function that fires on a Blob Storage upload, a Cosmos DB change feed, a Service Bus message, or an Event Grid event, and writes its output to another Azure service with almost no glue code. If your data and identity are already in Azure, Functions sits closest to them and the declarative bindings save you the plumbing you would hand-write on Lambda.