← Back to Projects

Real-Time Data Platform for a Global Enterprise Client

Client
Global enterprise, multiple countries (anonymized)
My Role
Sole technical lead & PM
Timeline
~4 weeks core build
Stack
Azure, Databricks, Key Vault

The Challenge

The client was running a legacy, on-premises operational database that held their core business data, but getting that data into a usable, analyzable form meant manual, periodic exports. Reporting was always looking backward, and there was no way for stakeholders to see current numbers without waiting on a scheduled pull.

The client wanted to modernize: move to a cloud-based data platform that could connect securely to their existing on-prem system, pull data continuously instead of in batches, and give their team a foundation to build real dashboards on top of.

A vendor had already attempted the initial setup using a standard implementation guide. It didn't work: the cloud data environment was built in isolation, with no actual network path back to the client's on-prem database, and the connectivity model it assumed didn't match the client's real network architecture. I inherited this as a clean-slate rebuild.

Architecture & Approach

The client's network followed a hub-and-spoke model with a central firewall appliance handling all internet-bound traffic. That firewall couldn't consume the cloud provider's dynamic service tags the way a native cloud firewall could, which meant the network design had to route the new platform's specific outbound dependencies directly, while still sending everything else through the client's existing security stack.

Security: Pushing Back on a Risky Shortcut

Partway through the project, the vendor pushed for the simplest path for them: open the database port and web-based access directly to the public internet, no IP restrictions, no gating. It would have made their own access easier, but internet-facing database instances are among the most heavily targeted infrastructure on the internet, constantly hit by automated port scanning, credential-stuffing attempts, and ransomware campaigns that specifically look for exposed database ports.

As the sole engineer and project lead on the engagement, I pushed back, brought the risk and my proposed alternative to leadership, and got the go-ahead to implement it a different way.

End result: the client and its vendors kept full functional access, but there was no exposed database port, no exposed web access, and no way in without a valid VPN session tied to a real directory identity. The convenient option and the secure option turned out not to be the same option.

Troubleshooting: Two Root Causes That Weren't Obvious at First

Compute couldn't reach the private network. The first test runs used the platform's default serverless compute, and every connection attempt failed. Tracing the network path showed the compute was landing on an address range that had nothing to do with the client's network, a completely different, non-routable space. Switching to a dedicated compute cluster that actually provisioned inside the client's virtual network resolved the routing mismatch immediately.

Environment setup silently broke its own network config. Once compute was correctly placed, health checks still failed with a generic connectivity error. The actual cause: the initial environment provisioning process had quietly detached the network route associations it needed to function, no error, no warning, it just came up broken. Re-associating the network correctly fixed it, and from there, direct database connectivity tested successfully end to end.

Both of these were the kind of failures that don't show up in vendor documentation, generic errors that could mean five different things, and the only way through was methodically ruling out each layer: compute placement, network routing, then the actual database connection.

Real-Time Ingestion

Once basic connectivity was solid, the next phase was building an actual change-data-capture pipeline, so the platform wasn't just reachable, it was continuously ingesting updates as they happened in the source system. This required enabling change tracking at the database level, a prerequisite the ingestion tool's error messages didn't make obvious when missing, and configuring per-table capture for the specific datasets the client's team needed.

Outcome

What This Demonstrates

Client name, industry, and identifying details have been withheld or generalized to protect confidentiality.