Some of the most important engineering work a platform does is the work you will never notice if it is done right. No new feature, no UI change, no announcement. Just a foundation that stays current, supported, and secure underneath everything else. Over the past several weeks our team did exactly that kind of work: migrating our email and notification services off a retiring AWS SDK and bringing our build toolchain up to a modern baseline across the platform. Here is what we did and why it matters even though you will never see it.
Why Touch Working Code at All?
A fair question. The services in question were working. The answer is that “working today” and “supportable tomorrow” are different things.
AWS SDK for Java version 1 has reached the end of its life. It still runs, but it stops receiving updates, including security patches and support for new AWS capabilities. Building on an end-of-life dependency is a slow-motion risk: everything is fine until the day it very much is not, and by then you are doing an emergency migration under pressure instead of a planned one on your own schedule.
We chose the planned route.
Migrating SES and SNS to AWS SDK v2
The core change was moving our email and notification services from AWS SDK v1 to v2 for two services every message depends on: Amazon SES (email delivery) and Amazon SNS (notifications).
This was not a find-and-replace. AWS SDK v2 is a genuinely different design, with explicit client lifecycles, a different error-handling model, and stricter typing. The migration meant:
- → Replacing the old SES and SNS client libraries with their v2 equivalents (SesV2Client and SnsClient)
- → Pinning the whole SDK to a single managed version so every AWS library stays in lockstep and cannot drift apart
- → Rewriting the email and notification services around v2’s client lifecycle, so connections are opened and closed cleanly rather than lingering
- → Adopting v2’s typed error handling so failures surface as specific, catchable conditions instead of generic errors
The Bugs We Found Along the Way
This is the quiet payoff of a careful migration: you find latent problems that were waiting to bite.
While rewriting these services, we caught and fixed several issues that predated the migration:
- → A connection leak in the path that resets email settings, where a client could be left open instead of released. Under normal use it was invisible; under sustained load it is the kind of thing that slowly degrades a service.
- → A latent region-parsing bug that would have thrown on certain inputs, defused before it ever had the chance.
- → Unsafe access to settings values that could fail when a field was absent, replaced with null-safe handling.
- → SNS subscriptions pinned to HTTPS to match our security requirements.
None of these were causing visible failures. All of them were real, and all of them are now gone. That is the usual pattern: the modernization is the headline, and the bug fixes you get for free along the way are the real return.
Bringing the Whole Build Toolchain Current
Alongside the SDK work, we moved a broad set of services onto a newer, patched build baseline: an updated Amazon Corretto Java runtime and a current Maven build version. This landed across email sending, email campaigns, SMS tracking, compliance, reporting, background jobs, and more.
A consistent, current build toolchain across services matters for reasons that are invisible day to day but compound over time: security patches land in the runtime everything is compiled and run on, builds behave the same way across every service instead of each one drifting onto its own versions, and the next upgrade is a small step from a current baseline rather than a large, risky leap from an old one.
The Discipline Behind “It Just Works”
It is tempting to defer this kind of work indefinitely, because it never shows up on a roadmap and never generates a demo. That is precisely why it gets dangerous when it is neglected. End-of-life dependencies and stale toolchains do not announce themselves; they simply raise the cost and risk of every future change until something forces the issue.
Doing it deliberately, on our own schedule, with careful migrations that fix latent bugs on the way through, is what keeps a platform dependable for years rather than months. You will never see this work in the product. You experience it as a platform that keeps running, keeps getting patched, and keeps being easy for us to improve.
CloudContactAI is built by AllCode, an AWS Advanced Tier Services Partner. Migrating cleanly between AWS SDK generations and keeping a fleet of services on a modern, consistent runtime is exactly the AWS-native engineering discipline AllCode applies across its platforms.
Have feedback on any of these changes, or a feature you would like to see next? Reach out to your account team. We would love to hear from you.
