Skip to content

Product1 publisher3 min readPublished

Multi-cloud portability breaks on how each provider answers the same call

One engineer who built services on AWS, GCP and Alibaba Cloud puts about 90% of cloud services in a commodity bucket that is safe to abstract. A platform team has to normalize errors and pagination for that share, and services with a real cost or capability edge stay native.

The Product Desk · Product desk

Illustration accompanying Multi-cloud portability breaks on how each provider answers the same call

What happened

  • An engineer who built services on AWS, GCP and Alibaba Cloud wrote in DevOps.com that multi-cloud trouble comes more from differences in how providers behave than from connectivity.
  • Earlier abstraction projects such as Apache jclouds worked at the REST level and fell behind as providers kept changing their APIs, according to the author.
  • The author's pattern puts a cloud-neutral client API on top of a driver layer, with provider code underneath that translates status codes and unifies pagination.
  • Roughly 90% of cloud services, such as object storage and pub/sub messaging, are standardized enough across providers to abstract, by the author's estimate.

Compiled by The Product DeskSomething wrong?How this is made

Why it matters

  • decision Platform teams have to sort services into commodity and native before building anything, since native integrations stay wherever they bring a cost or business advantage.
  • constraint App teams behind the neutral interface can reach only the features the platform team exposes there, so a capability that one provider ships first has to wait for that team.
  • precedent A team that writes its own REST-level wrapper should expect the same result jclouds had, falling behind each provider update and doing the catch-up work by hand.

Take a cleanup job that deletes a file another process already removed. On one major provider the call returns success. On another it returns a 404 error, according to the author of the DevOps.com piece [3]. Code written against the first provider treats the missing file as done. Move the same code to the second provider and it throws [3].

Listing objects has the same problem. Some platforms return an explicit continuation token, while others expect the caller to build a cursor from the last document returned [4]. "These aren't bugs to fix, they're fundamental design decisions baked into each platform," the author wrote [15].

Teams tell themselves the hard part is getting services connected to each cloud, and they plan from a tidy architecture diagram. "Within weeks, the diagram stops matching reality," the author wrote [14]. In practice, each service team writes its own provider-specific branch for each of these differences, and the same effort gets duplicated across teams [5].

That puts the problem on the platform team. The author cites a 2024 Gartner report finding that over 92% of large enterprises run in multi-cloud environments [9]. The proposed layer sits on official provider SDKs. Those already handle request signing, header management, retry logic, timeouts and endpoint discovery [7]. The shared code then has to own only the translation: what a delete of a missing object returns, and which pagination style the application sees [7].

The piece is one practitioner's account from several companies [2]. It does not include measurements of how much duplicated code a normalization layer removes or what the layer costs to maintain. The 90% commodity share comes with the word "roughly" and is offered as a "useful framework" [11].

I'd turn that split into a 2x2. One axis asks whether a service behaves the same across providers once errors and pagination are normalized. The other asks whether the native version saves money or adds a capability the business uses. If a service behaves the same everywhere and has no native advantage, it goes behind the portable interface, and object storage is the obvious first candidate [11]. If there is a real native advantage, the native integration stays, whichever column the service sits in, per the author's rule [12]. The fourth box holds a provider-specific service with no cost or capability advantage. It ties the team to one provider and gets nothing back, so I'd list it for replacement.

The tradeoff, in the author's words, is "cost leverage versus business-critical functionality" [13]. On the portability side, every service moved behind the interface adds provider code that the platform team has to maintain for each cloud, translating status codes and pagination [8]. The forcing function I'd use: a team asking to stay native writes down the feature and what it saves. A blank line sends the service behind the interface.

What to watch

  • Published measurements from teams running a normalization layer, such as code removed or incidents during provider moves, would test a case that now rests on one practitioner's experience.
  • A provider SDK release that changes delete or pagination behavior would show whether SDK updates really flow through the layer without manual work.
  • Service inventories that put far more than 10% of workloads on native features would weaken the case for building the shared layer at all.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories