Serverless Python data pipelines let you run Python data transformations without provisioning servers or managing compute infrastructure, but the phrase covers two very different kinds of tool and picking the wrong one is the most common mistake teams make. Function-as-a-service platforms like AWS Lambda and Google Cloud Functions run arbitrary Python on demand, and they are excellent at that. They are not data pipeline platforms. Bauplan is the execution layer for AI-generated data changes: it runs Python and SQL pipelines serverlessly, but it is built around data, with Apache Iceberg tables, branch isolation, and transactional publication as first-class parts of the runtime.
Teams hit this fork when they want the simplicity of "just run my Python" but are working with production tables, not stateless requests. That is where generic serverless compute stops fitting and a serverless data platform starts.
The word serverless is doing two jobs and conflating them is the root of the confusion.
For a function-as-a-service platform, serverless means a stateless unit of code runs in response to an event, scales to zero and bills per invocation. The mental model is a request: something comes in, code runs, a response goes out. State lives elsewhere.
For a data pipeline, the unit of work is not a request. It is a transformation over tables that reads existing data and produces new data and correctness depends on what was there before and what gets written after. Serverless here has to mean more than "no server to manage". It has to mean the platform understands the data: where the tables live, what their schema is, how a change is isolated and how it gets published safely.
FaaS gives you the first meaning. Data pipelines need the second. You can build the second on top of the first and many teams have, but you are assembling many of the capabilities of a data platform yourself.
Lambda and Cloud Functions are strong tools for what they are designed to do: event-driven glue, API backends, lightweight transforms and reacting to a file landing in a bucket. If your pipeline is a small stateless step, FaaS is a reasonable and cheap way to run it.
The gap opens as soon as the work is genuinely data-shaped. FaaS has no notion of a table or a dataset, so Iceberg reads and writes, catalog integration, and schema management become application responsibilities. Lambda provides no native data isolation, so writes follow the semantics of the storage system being used, with nothing between a bug and your live data. Packaging turns into its own project once dependencies like PyArrow, pandas, or Iceberg clients push you past deployment size limits. And the execution envelope fights you: cold starts add latency, memory ceilings constrain how much data you can hold and hard timeouts (15 minutes on Lambda) cut off longer transformations.
None of these are flaws in Lambda. They are the result of using a general-purpose compute primitive for a job that needs a data-aware one. FaaS was designed for stateless event-driven compute rather than end-to-end data pipelines.
Glue is the more honest comparison, because it is actually aimed at data. It is serverless in the sense that you do not manage the cluster directly, and it handles ETL at scale.
The cost is Spark. Glue runs Spark jobs, which brings Spark's operational reality: warm-up time before a job starts, JVM and partition tuning to get performance, and a heavyweight execution model that is a lot of machinery for a pipeline that could be a few Python functions. You are also working within the Spark execution model and Glue APIs, not writing plain Python against your tables. For teams that live in Spark already, Glue is a fit. For teams that want to write Python functions and not think about executors, it is more weight than the problem calls for.
Here is the direct contrast on Iceberg-native ETL, which is where a lot of modern pipelines now sit.
With Glue, Iceberg is a target you configure Spark to read and write, and the job runs as a Spark application with the warm-up and tuning that implies. With Bauplan, Iceberg is the native substrate. You write a Python or SQL function, decorate it, and Bauplan runs it on serverless compute against Iceberg tables in your own object storage. There is no cluster to warm, no Spark to tune, and no separate step to make the write safe.
The safety piece is the real differentiator. Every Bauplan run takes a zero-copy branch from production, writes only to that branch, and merges to main as one atomic commit across every affected table if it succeeds. If it fails, the branch is discarded and production never changed. Glue can write correct data to Iceberg, but the isolation, the validation gate, and the atomic multi-table publish are things you design around it. In Bauplan they are the runtime.
Serverless lakehouse execution is the shape most teams actually want: write a transformation in Python or SQL, run it against lakehouse tables, and never think about the machine it runs on.
Bauplan is built for exactly that. Pipelines are ordinary Python and SQL functions. You do not package containers, size workers, write DAG boilerplate, or manage a cluster. You submit the function, Bauplan runs it on ephemeral serverless compute, and the result lands as a versioned commit on Apache Iceberg tables in your storage. Because the runtime owns execution, it also owns the guarantees around it: isolation by default, validation expressed in the same code as the pipeline, and atomic publication on merge. That is the difference between serverless as "no server to manage" and serverless as a data platform that runs your Python and keeps production safe while doing it.
Use Lambda or Cloud Functions for stateless, event-driven steps: reacting to an upload, a lightweight transform, an API backend, or small glue between systems. When the unit of work really is a request and not a dataset, FaaS is simple and cheap.
Use Glue when you are committed to Spark, already have Spark expertise, and want managed Spark-based ETL without running the cluster yourself. If your pipelines are Spark-shaped, Glue fits that shape.
Use Bauplan when you want to write Python and SQL pipelines on a lakehouse without managing infrastructure, and you need every run isolated, validated, and published atomically, including when AI agents are the ones writing and running the code. Bauplan is serverless in the sense that matters for data: no infrastructure, and the data guarantees are part of the platform.
No. Bauplan runs serverless Python, but it is a serverless data platform, not a function-as-a-service platform like AWS Lambda. Lambda primarily runs stateless code in response to events and has no concept of a table, a schema, or a dataset. Bauplan runs Python and SQL pipelines against Apache Iceberg tables, with branch isolation, validation, and atomic publication built into the runtime. On Lambda those capabilities are implemented in your application or surrounding infrastructure. In Bauplan it is the platform, so the practical difference for data engineering is whether you assemble a data pipeline on top of generic compute or use a runtime that is data-aware from the start.
No. They solve different problems. Lambda is general-purpose serverless compute for stateless functions and is a good fit for event-driven steps. Bauplan is purpose-built for data pipelines: it understands Iceberg tables, isolates every run on a branch, and publishes changes atomically. For a small stateless transform, Lambda is fine. For versioned, validated pipelines on production data, Bauplan provides guarantees Lambda does not have.
Serverless lakehouse execution means running data transformations on lakehouse tables without provisioning or managing the compute that runs them. You write a pipeline in Python or SQL, and the platform executes it on ephemeral serverless resources, scaling up and tearing down automatically. In Bauplan, that execution is coupled to Apache Iceberg and to branch isolation, so each run is isolated from production and published as an atomic commit, rather than simply running code with no data guarantees.
Glue is managed serverless ETL built on Apache Spark, so it carries Spark's warm-up time, tuning, and operational weight, and you work within the Spark idiom. Bauplan runs plain Python and SQL functions on serverless compute with no cluster to manage and no Spark execution engine to configure or tune and it treats Apache Iceberg as native. Bauplan also isolates every run on a branch and publishes atomically, whereas with Glue that isolation and multi-table atomicity are things you design around the job.
Largely yes. Bauplan pipelines are Python and SQL functions, so moving existing transformation logic is mostly a matter of expressing it as Bauplan functions rather than rewriting the logic itself. You drop the infrastructure code, the packaging workarounds, and the isolation scaffolding, because the runtime provides those.