Back to blog

Designing a Cloud-Agnostic Data Lakehouse: A Reference Architecture for Public Sector

By Rplus AnalyticsInsight4 Aug 2025
Designing a Cloud-Agnostic Data Lakehouse: A Reference Architecture for Public Sector

The data lakehouse is now the default architecture for serious analytics workloads. It combines the cost profile and flexibility of a data lake with the performance and governance of a data warehouse, on top of cheap object storage rather than expensive proprietary engines.

For most public sector teams the question is no longer whether to adopt one. It is how to design a lakehouse that does not quietly become a single-cloud monoculture in disguise.

What follows is the reference architecture we recommend, the trade-off at each layer, and the decisions that separate a genuinely portable platform from a nominally portable one.

The lock-in is already priced in

This is not a theoretical risk. In April 2024 the Cabinet Office's Central Digital and Data Office acknowledged, in a document reported by The Register, that the UK government's ability to negotiate cloud contracts has been inhibited by vendor lock-in — and warned of risk concentration across departments.

The contracts behind that warning are public.

£450M
Home Office cloud deal signed December 2023
£350M
HMRC contract
£94M
Defra contract signed early 2024
£1.125B
Combined value of those three deals alone

Three departments, one provider, over a billion pounds. Whatever the merits of each individual contract, the aggregate is a negotiating position — and it is not the buyer's.

Four codebases, or one

The practical cost of cloud-native design is rarely the licence. It is that each provider's services demand their own implementation, and an organisation running workloads on more than one cloud ends up maintaining a separate codebase for each.

CLOUD-NATIVE — ONE IMPLEMENTATION PER PROVIDER Apps / BI · build A Apps / BI · build B Apps / BI · build C Apps / BI · build D Provider 1 native services codebase A Provider 2 native services codebase B Provider 3 native services codebase C Provider 4 native services codebase D CLOUD-AGNOSTIC — ONE IMPLEMENTATION, EVERY PROVIDER Apps / BI · one build Provider 1 open table format codebase A Provider 2 open table format codebase A Provider 3 open table format codebase A Provider 4 open table format codebase A
The difference is not the number of clouds. It is the number of things you have to maintain, staff, patch and re-test every time the requirement changes.

Four codebases means four sets of version requirements, four skill profiles to recruit for, teams siloed by implementation rather than by domain, and every change delivered four times. A single portable codebase collapses all of that into one — and the saving compounds with every release, not just at migration.

Seven layers, seven portability questions

A modern lakehouse decomposes into seven layers. Each one has a portability question attached, and they do not all have the same answer.

#
Layer
Where lock-in enters
Portable?
1
Ingestionhow data gets in
Cloud-native services — Glue, Data Factory, Dataflow, GoldenGate — are powerful but provider-specific. Agnostic alternatives like Informatica IDMC, Talend and open-source connectors ingest the same sources and survive a provider switch.
Depends
2
Storageobject storage
S3, ADLS Gen2, GCS and OCI Object Storage expose effectively the same primitives. The portability question is not the storage service — it is the format you write into it.
Yes
3
Open table formatthe decision that matters
Delta Lake, Apache Iceberg and Apache Hudi all provide ACID transactions, schema evolution and time travel over Parquet files. Proprietary warehouse formats are a one-way door. Open table formats are not.
Critical
4
Catalog & governancewhere metadata lives
Provider-native catalogs — Glue Data Catalog, Purview, Dataplex, OCI Data Catalog — are convenient but trap your metadata. Cross-cloud layers like Unity Catalog, Snowflake Horizon and Informatica Data Governance preserve lineage, classifications and access policies when workloads move.
Depends
5
Processingtransformation runtime
Spark is the closest thing to a portable runtime. As Databricks, Snowpark, EMR, Synapse or Dataproc, the user-facing code is largely the same. Athena, BigQuery SQL extensions and Redshift stored procedures are where lock-in creeps back.
Mostly
6
Serving & BIsemantic model
Power BI, Tableau, Looker, Sigma and QuickSight connect to most lakehouse engines. The real question is whether your semantic model and row-level security live in the BI tool or in the lakehouse beneath it. The latter travels; the former does not.
Depends
7
ML & AImodel artefacts
SageMaker, Azure ML, Vertex AI and OCI Data Science are all capable, but models trained on one rarely deploy cleanly to another. Open frameworks — MLflow, ONNX, plain PyTorch and scikit-learn — keep models portable.
Rarely

Row three is the fork in the road. Everything else can be worked around at some cost.

Where the lock-in sits

Assessed across a full lakehouse stack rather than service by service, the four major providers and the two agnostic platforms fall out like this.

PlatformLock-inWhy
AWSHighHeavy use of proprietary services; EMR and Glue tightly tied to AWS
AzureHighDeep integration with ADLS, Synapse and Azure ML
GCPMediumSome open components — Dataproc, BigQuery SQL — but still Google-optimised
Oracle CloudHighStrong focus on Oracle-native databases and pipelines
DatabricksLowBuilt to operate across multiple clouds on open standards
SnowflakeLowBuilt to operate across multiple clouds on open standards
Read this the right way

A high lock-in rating is not a verdict on quality. AWS, Azure, GCP and Oracle Cloud all run excellent lakehouse services, and for a single-cloud organisation with no intention of moving, native is often the faster and cheaper route.

The rating measures one thing only: what it would cost you to leave.

The medallion pattern, briefly

Most well-designed lakehouses organise data into three logical zones. Each is materialised as tables in your chosen open format, governed by your chosen catalog, with Spark or an equivalent runtime doing the work between them.

THE SAME STRUCTURE WORKS ON ANY SPARK-COMPATIBLE RUNTIME Bronze raw ingested data immutable, schema-on-read kept for replay and audit Silver filtered, cleaned, joined conformed to a canonical model the shared version of the truth Gold business-level aggregates reporting, ML features ready to serve Every zone written in the same open table format, governed by the same catalog
Medallion is engine-agnostic. The data stays portable even when the engine changes — which is the whole point of adopting it.

Reading data across clouds

Once data lives in more than one place, you have to decide how a query reaches it. There are two patterns, they are routinely confused, and they behave differently under load.

DATA FEDERATION DATA VIRTUALISATION Cloud 1 Compute Local storage 1. Federated query issued 4. Results returned and joined locally Cloud 2 · other platform Compute Storage 2. Query executes on remote compute 3. Only the result set crosses the boundary Cloud 1 Compute Local storage Virtualisation layer — locality aware Cloud 2 · private cloud · on-premise Platform Storage
Federation pushes the query to the data and returns a result set. Virtualisation puts an abstraction layer in front of several systems so they present as one.

Federation reads via remote compute, so the work happens where the data already sits and only the answer crosses the network. That keeps egress down and avoids duplication.

Virtualisation abstracts away the complexity of the underlying systems so consumers see a single surface, typically over JDBC. It is the better fit when you need to hide a messy estate from its users.

One rule worth stating plainly

Do not use the virtualisation layer to perform transformations. It exists to present data, not to reshape it. Transformations belong in the processing layer, where they can be versioned, tested and rerun.

Multi-cloud or hybrid — the real reasons

Organisations rarely end up on more than one cloud because an architect drew it that way. They end up there for reasons that are commercial, regulatory or simply historical — and the honest ones are worth naming.

Why multi-cloud

  • Business continuity. Regulatory requirements and enterprise policy that mandate more than one provider.
  • Historical evolution. Business units chose different clouds; mergers brought others with them.
  • Perceived cost. A different cost model looks favourable — and multi-cloud increases negotiating power with the hyperscalers.
  • Lock-in. Avoiding dependence on a single provider as a deliberate strategy.
  • Features. Some capabilities simply exist on one cloud and not another.
  • Data sovereignty. Regulatory requirements to hold data in a specific country.

Why hybrid

  • Co-existence. Stepwise migration — gold layer first to generate value in cloud, pipelines afterwards.
  • Data that cannot move. Some data carries too much risk to store in cloud at all.
  • Region availability. No cloud in-region, and services from other regions not permitted.
  • Legacy investment. Substantial existing infrastructure that still has life in it.
  • OPEX versus CAPEX. Maintaining a balance between the two.
  • Volume and scale. Data too large to move — and cost models where cloud ends up more expensive than on-premise.

That last point deserves emphasis, because it cuts against the grain of most cloud advocacy. At sufficient scale, the economics can favour on-premise. A portable architecture is what lets you act on that finding instead of discovering it too late to do anything about it.

Designing for portability from day one

Three principles separate genuinely portable lakehouses from nominally portable ones.

01

Decouple aggressively

Storage, compute, catalog and orchestration should each be replaceable independently. If your orchestrator hard-codes storage paths, or your transformation code embeds catalog identifiers, you have quietly recoupled the layers.

02

Governance as the spine

A unified catalog spanning clouds is what makes federation, sharing and migration tractable. Fragment governance per provider and every cross-cloud action becomes a manual reconciliation.

03

Open by default

Every proposal for a proprietary format or service carries the burden of justifying the lock-in. New tables go into Delta or Iceberg. New transformations go into Spark or Snowpark. Exceptions are documented.

What portability still costs you

It is not free, and pretending otherwise does nobody a favour. Cross-cloud observability does not exist out of the box — monitoring every environment through a single pane of glass means a custom implementation over shared system tables, and even then the data updates through the day rather than in real time.

Egress charges apply whenever data genuinely has to cross a boundary. Multi-cloud storage services exist specifically to avoid them — Cloudflare R2, Faction and Wasabi among them — and no egress fee is their principal selling argument.

For a worked example of this architecture built for a central government department, see One Codebase, Five Clouds.

Rplus Analytics builds cloud-agnostic data platforms for UK central government departments. If you would like a portability assessment of your current architecture, get in touch.