← → navigate · N speaker notes · F fullscreen
Context: replacing fragile text-based infrastructure orchestration with a typed deployment platform
A new globally distributed cloud service needed a repeatable way to deploy both application code and Azure infrastructure across regions and release rings.
Text templates hid deployment risk until late in the release path.
Compile-time safety was weak; failures often surfaced at deployment time.
Runtime outputs from one resource were awkward to pass to another.
dependsOn and ordering logic lived separately from the actual resource references.
Adding or reshaping resources meant editing multiple templates and validating late.
The core design: resource references are configuration, runtime value flow, and dependency declarations at the same time
Everything is a DeployableResource. Containers hold scoped resources; references between objects form edges.
Make invalid deployments harder to express.
The platform had to behave predictably under partial failure, retries, and repeated deployment attempts
Follow server-provided retry/backoff hint
Do not retry; surface configuration/request error
Retry transient failures, default max 3 attempts
The platform could be safely re-run after fixing a failed resource rather than requiring a full manual unwind.
The platform does not pretend to solve application compatibility magically.
Desired graph vs actual Azure state
The decision was worthwhile because the pain was real—but the custom platform also introduced ownership cost
Native platform integration, broad samples, and day-one resource support.
Text references, late validation, manual dependsOn, weaker IDE flow.
Could keep native deployment backend while adding a typed wrapper.
Duplicates resource mapping and ARM expression semantics; harder debug path.
Typed models, runtime references, inferred DAG, domain-specific developer experience.
Custom execution runtime, SDK support lag, ongoing platform maintenance.
live-site issues caused by infrastructure orchestration mistakes
global scale units supported by the initial service rollout
release rings for staged global deployment
of services / systems later adopted the platform pattern
I would keep the strongly typed topology, but make the deployment backend pluggable earlier—allowing SDK-backed and ARM-backed resources to coexist when Azure SDK support lagged or when native release integration mattered more.