alec.vogelsang
← All work

Five Splunk environments into one

Each product line had grown its own Splunk deployment. Same apps, different copies. Same people, different logins. A separate infrastructure bill for each. I owned the consolidation into a single Ansible-managed environment — and finished it on my own after the other half of the team left. It's kept growing since: Azure and Oracle Cloud accounts now log into the same platform.

Where
Deltek, cloud operations
When
2022 – 2024, still growing
Role
Owned delivery; team of two, then one
Stack
Splunk, Ansible, Terraform, AWS, Azure, OCI

The situation

Splunk had arrived at the company more than once. Each product line stood up its own deployment, and by the time I picked this up we were running separate environments side by side, plus a government-cloud environment with its own rules.

The duplication was the expensive part. The same reporting app existed in two environments under the same name, maintained separately, drifting apart. Users needed to know which environment held their data before they could go looking for it, and access requests routinely landed on the wrong one. Every environment carried its own indexers, its own search heads, its own bill.

The brief was to merge them into one — internally we called the target Global OSS — across all five regions we operated in.

How I scoped it

The first real decision was the one that made the rest possible: migrate configuration, not data.

Moving years of indexed data between environments would have been the slowest, riskiest part of the project, and it would have bought almost nothing. Instead the old environments stayed live and searchable until their retention windows expired on their own, then got decommissioned. New data went to the new environment from cutover onward. Nobody lost access to anything; the old estate just aged out.

The per-environment work broke into two halves:

Deciding what not to bring

A migration is a rare licence to throw things away, and I wanted to use it. Lifting everything verbatim would have moved the mess rather than fixing it.

Cutting over without losing data

The pattern I used everywhere, and the reason nothing got lost: write to both destinations, validate, then remove the old one. Never repoint and hope.

For the AWS log sources that meant an explicit sequence — stand up the new bucket in the target account, configure the log services to deliver to both old and new, confirm both were receiving, repoint Splunk at the new one, and only then start removing the old log groups and the redundant streaming config. The last step was always a sanity check across every source, account, and region rather than a spot check on one.

That work also let me take out a cost problem on the way past. Logs were being routed through a managed streaming service that we didn’t have the in-house expertise to run efficiently, and the quotes for doing it properly were eye-watering. Going direct to object storage and having Splunk collect from there did the same job for a fraction of it.

Making it stay fixed

Consolidating once is worth very little if the estate drifts apart again. The build was split deliberately:

The test of whether that worked came when we rebuilt the engineering environment. It was the same playbooks with a different inventory file. That is the whole point.

The thing I'd carry forward

Scoping it as config-only migration is what made a multi-year, multi-region consolidation survivable. Data migration is where projects like this go to die, and letting retention do that job for free cost nothing but patience.

Where it landed

What’s happened since

The part I didn’t anticipate is how much the consolidation would end up being infrastructure for things that hadn’t been proposed yet. Having one place for logs to go turned out to be worth more than the cost saving that justified the project.

That last one is the real measure of whether this worked. The first migration was a multi-quarter project with a team. The most recent one was a normal piece of work.

What I’d do differently

I’d have pushed harder, earlier, on defining what “done” meant per environment. We had a good task breakdown and a clear lift-and-shift checklist, but acceptance criteria arrived later than they should have, and the fuzziness cost us in the middle of the project. I ask that question first on consulting engagements and I should have asked it as loudly internally.

I’d also have written the runbooks concurrently rather than at the end. Doing the first region teaches you nearly everything about the second, and I re-derived more than I needed to.

This write-up describes the shape of the work rather than the specifics. Environment and host names, index names, account identifiers, vendor and cost figures, and everyone I worked with are left out deliberately — that detail belongs to my employer, not on my portfolio.