Think of your Azure Landing Zone (ALZ) like a perfectly brewed flat white. You can handcraft each shot—carefully spinning up management groups, policies, and subscriptions—or you can automate the process with precision, ensuring each brew (deployment) tastes just as intended.
Automation is where mature cloud environments lift from repeatable to reliable. In this post, we’re taking that next step: automating your platform layer using Infrastructure as Code (IaC) and modern CI/CD practices with Azure DevOps and GitHub Actions.
What is Landing Zone Automation?
Landing zone automation turns the conceptual Azure architecture from the Cloud Adoption Framework (CAF) into deployable, consistent reality.
It’s about codifying the platform foundation—management groups, policies, networks, role assignments, and more—so your entire environment can be replicated, validated, and governed repeatably.
Whether you’re deploying Microsoft’s standard ALZ composition or the Sovereign Landing Zone (SLZ) for government and regulated industries, automation ensures:
- Consistent structure across tenants and subscriptions
- Version-controlled platform definitions
- Governance and compliance baked into the deployment pipeline
- Smooth integration with organisational CI/CD tooling
How It Works
At the heart of automated landing zones sits a hierarchy of IaC definitions and orchestrations:
1. Core IaC – Bicep Evolution
Bicep has now matured beyond a deployment language—it’s the clear path forward from ARM templates.
With ALZ modules defined in Bicep, engineers can:
- Parameterise management group hierarchies
- Configure resource consistency across environments
- Simplify updates and version pinning through Azure Container Registry (ACR)-hosted modules
The latest ALZ accelerator leverages reusable Bicep modules organised by design area—Identity, Network, Governance, Management, and Security.
2. Deployment Orchestration
Infrastructure deployment happens through:
- Bootstrap scripts (
main.biceporchestrators or PowerShell wrappers) - Azure DevOps pipelines or GitHub Actions for environment rollout
- Separate parameter files (e.g., dev, test, prod, sovereign) for scalable multi‑environment management
3. Control Plane Integration
Each run authenticates via a managed identity or service principal with least‑privilege RBAC, deploying to the control plane (management groups, policy assignments, subscriptions).
The pipeline enforces drift detection through outputs from what-if operations before applying changes.
Sovereign Landing Zone Automation
For regulated workloads, the Sovereign Landing Zone (SLZ) introduces additional validation layers and compliance automation.
SLZ deployments use the same core ALZ Bicep modules but add governance and security overlays specific to sovereign or isolated cloud environments.
Key components to automate include:
- Deployment to sovereign‑specific tenants with restricted Azure AD endpoints
- Policy and Initiative Definitions sourced from the SLZ GitHub repository
- Compliance blueprint outputs registered as artefacts for audit traceability
- Approval gates and manual interventions where government regulations require validation
- Separation of parameter sets per compliance classification (e.g. Standard, Protected, Secret System)
This layered model ensures sovereign deployments remain CAF‑aligned while adhering to national compliance and residency requirements.
Real‑World Impact
Let’s take a common enterprise example:
A national healthcare organisation managing both standard and sovereign tenants across regions.
With automated landing zones, they can:
- Provision new regulated workloads automatically through the Sovereign Landing Zone blueprint
- Apply the same guardrails, RBAC assignments, and network controls to every deployment
- Satisfy compliance audits via Git version history of policy assignments and configurations
- Maintain consistent operations pipelines across both public and sovereign Azure clouds
This removes human error from foundational design and shifts governance to “code as policy”.
Implementation Examples
Deploying via the Azure Portal or CLI
For teams just beginning to automate, you can start with Azure CLI or PowerShell to deploy the ALZ accelerator:
|
|
Using Bicep – Example Snippet
Below is a simplified snippet showing an automated management group structure:
|
|
Supplementary Module Files
Each module encapsulates a discrete design area—aligning with the ALZ approach of modular, reusable components.
📂 modules/mg.bicep
Creates or updates a management group and outputs its ID.
|
|
📂 modules/policyAssignment.bicep
Assigns a built‑in or custom policy or initiative to the management group level.
|
|
📂 modules/roleAssignment.bicep
Grants a role definition to a service principal, group, or managed identity.
|
|
📂 modules/networking/vnet.bicep
Defines a basic virtual network with multiple subnets.
|
|
Bicep File Structure Example
A typical repository layout for an automated landing zone looks like this:
|
|
Each folder represents a deployable component, enabling modular rollouts and granular version control.
This layout scales naturally for multi‑environment and multi‑tenant SLZ scenarios where the sovereign parameters and policy baselines differ.
Gotchas & Edge Cases
A few real‑world kinks to watch out for:
- Management group drift: Ensure pipelines perform
what-ifprior to deployments to catch unexpected manual changes. - Policy replication lag: Azure Policy assignments can take minutes to propagate; build delay logic or retry policies into orchestrations.
- Sovereign Cloud API differences: Sovereign regions (e.g., Azure Government) may have limited support for preview resource providers—always validate pipeline dependencies in each environment.
- Permissions & scope: The service connection must have Management Group Contributor and Policy Contributor roles at the root management group for full control-plane deployments.
- Parameter reuse drift: Reusing
*.parameters.jsonfiles across dissimilar tenants may cause mismatched IDs—keep parameter sets per environment.
Best Practices
- Use Bicep modules with version pinning to avoid breaking changes from upstream ALZ module updates.
- Treat the pipeline as the source of truth, never the portal—manual changes create drift.
- Apply policy assignments and role definitions within IaC, not post-provisioning.
- Structure repositories by design area or environment, depending on operating model.
- Incorporate Azure Policy compliance scans or
what-ifpreviews into every pull request. - Separate parameter files for sovereign, regulatory, and standard environments.
- Integrate approval gates in DevOps or GitHub to replicate SLZ-compliant change control.