Building a Practical Azure Landing Zone for a Small Organization — My Hands-On Journey

Over the past few weeks, I went through the full process of designing and implementing a lean but enterprise-grade Azure Landing Zone for a small organization. The goal wasn’t to build a complex cloud platform — it was to create something secure, governed, and scalable, while remaining simple enough to operate with a small team.

This experience helped me balance cloud architecture discipline with practical constraints, and it clarified what really matters at this scale.

Here’s what I built, why I built it that way, and what I learned along the way.


🧭 Starting with the Foundation: Management Groups & Environment Separation

The first step was establishing a clear environment structure. Instead of allowing resources to sprawl across subscriptions, I organized everything under a Landing Zones management group:

Tenant Root
 └─ Landing Zones
     ├─ Development
     │   └─ Dev Subscription
     └─ Production
         └─ Prod Subscription

This created clear separation of environments, enforced consistent policies, and gave the platform team a single place to manage governance.

For a small org, this structure is lightweight — but future-proof.


🔐 Designing RBAC the Right Way — Without Over-Permissioning

Next came access control — usually the most fragile part of small Azure environments.

I replaced ad-hoc permissions with a clean RBAC model:

  • tanolis-platform-adminsOwner at Landing Zones MG (inherited)
  • Break-glass account → Direct Owner for emergencies only
  • Dev users → Contributor or RG-scoped access only in Dev
  • Prod users → Reader by default, scoped contributor only when justified

No direct Owner permissions on subscriptions.
No developers in Prod by default.
Everything through security groups, not user assignments.

This drastically reduced risk, while keeping administration simple.


🧯 Implementing a Real Break-Glass Model

Many organizations skip this — until they get locked out.

I created a dedicated break-glass account with:

  • Direct Owner at the Landing Zones scope
  • Strong MFA + secure offline credential storage
  • Sign-in alerts for monitoring
  • A documented recovery runbook

We tested recovery scenarios to ensure it could restore access safely and quickly.

It wasn’t about giving more power — it was about preventing operational dead-ends.


🛡️ Applying Policy Guardrails — Just Enough Governance

Instead of trying to deploy every policy possible, I applied a starter baseline:

  • Required resource tags (env, owner, costCenter)
  • Logging and Defender for Cloud enabled
  • Key Vault protection features
  • Guardrails against unsafe exposure where reasonable

The focus was risk-reduction without friction — especially important in small teams where over-governance leads to shadow IT.


🧱 Defining a Simple, Scalable Access Model for Workloads

For Dev workloads, I adopted Contributor at subscription or RG level, depending on the need.
For Prod, I enforced least privilege and scoped access.

To support this, I created a naming convention for access groups:

<org>-<env>-<workload>-rg-<role>

Examples:

  • tanolis-dev-webapi-rg-contributors
  • tanolis-prod-data-rg-readers

This makes group intent self-documenting and audit-friendly — which matters more as environments grow.


📘 Documenting the Platform — Turning Architecture into an Operating Model

Technology wasn’t the final deliverable — operability was.

I created lightweight but meaningful platform artifacts:

  • Platform Operations Runbook
  • Subscription & Environment Register
  • RBAC and access governance model
  • Break-glass SOP and validation checklist

The goal was simple:

The platform should be understandable, supportable, and repeatable — not just functional.


🎯 What This Experience Reinforced

This project highlighted several key lessons:

  • 🟢 Small orgs don’t need complex cloud — they need clear boundaries and discipline
  • 🟢 RBAC and identity design matter more than tools or services
  • 🟢 A working break-glass model is not optional
  • 🟢 Policies should guide, not obstruct
  • 🟢 Documentation doesn’t have to be heavy — just intentional
  • 🟢 Good foundations reduce future migration and security pain

A Landing Zone is not just a technical construct — it’s an operating model for the cloud.


🚀 What’s Next

With governance and identity foundations in place, the next evolution will focus on:

  • Network & connectivity design (simple hub-lite or workload-isolated)
  • Logging & monitoring baselines
  • Cost governance and budgets
  • Gradual shift toward Infrastructure-as-Code
  • Backup, DR, and operational resilience

Each step can now be layered safely — because the core platform is stable.


🧩 Final Thought

This experience reinforced that even in small environments, doing cloud “the right way” is absolutely achievable.

You don’t need a massive platform team — you just need:

  • good structure
  • intentional governance
  • and a mindset of sustainability over quick wins.

That’s what turns an Azure subscription into a true Landing Zone.

Azure PowerShell and Azure CLI

It’s impossible to memorize all commands in PowerShell and Azure CLI. Good news is that Microsoft follows a standard pattern

Open this page;

https://learn.microsoft.com/en-us/cli/azure/reference-index?view=azure-cli-latest

If we look at Azure CLI command for Virtual Machine, they follow this naming convention;

az vm list
az vm create
az vm delete

Azure CLI start with az vm and a verb. another example is;

az keyvault list
az keyvault create
az keyvault delete

for a more complicated example;

az network vnet list
az network vnet create
az network vnet delete

In above example vnet is a sub-component of netowrk. another example is;

az network vnet subnet list
az network vnet subnet create
az network vnt subnet delete

Where subnet is a sub-component of vnet and vnet is a sub-component of network.

Let’s go over PowerShell now;

https://learn.microsoft.com/en-us/powershell/module/az.keyvault/new-azkeyvault?view=azps-12.0.0

Get-AzVM
New-AzVM
Remove-AzVM

Verb is the first part of the word.

Get-AzVirtualNetwork
New-AzVirtualNetwork
Remove-AzVirtualNetwork
Get-AzVirtualNetworkSubnetConfig
New-AzVirtualNetworkSubnetConfig
Remove-AzVirtualNetworkSubnetConfig

Standard PowerShell that comes with windows doesn’t work. We need to upgrade it to PowerShell7 which is a cross-plateform scripting engine. There are 3 Azure specific modules for PowerShell that we need to install (We can avoid to install anything by using Azure Cloud shell);

For demo purpose, I am using Azure Cloud shell. The advantage is that i don’t need to login to my account because i am already logged in to Azure Portal. The response that i will get here is JSON formatted.

PowerShell

Microsoft has switched from old “Azure RM” to “Az” module. They don’t run side by side. To install a new AZ Module, run this command;

Run as administrator

Install-Module -Name Az-AllowClobber -Repository PSGallery -Force

To update module if you have already installed it;

Run as administrator
Update-Module -Name Az -AllowClobber -Repository PSGallery

To connect to Azure from workstation, use this command in PowerShell terminal;

connect-AzAccount -TenantId {GUID} (We don't need curly brackets)

To check latest version of PowerShell, follow this link;

To view installed Az module, use this command;

Get-InstalledModule -Name Az -AllVersions | Select-Object -Property Name, Version

This will list down Name and Version of Az Module. My list has Az Version 8.1.0 installed.

To list my web app, run this command in PowerShell terminal

Get-AzWebApp

To get a shorter version of output, run this command;

Get-AzWebApp | Select-Object Name, Location | ConvertTo-CSV -NoTypeInformation

Azure Microservices

Here are the major services other than core services;

Service Fabric

Azure Functions

Small piece of code that we can write. There is a small editor build-in to the browser that we can use.

Azure Logic Apps

Logic apps are pretty much similar to SQL Server integration services or windows workflow where we have some logical steps that executes in parallel or sequential to perform a task.

API Management

Can be used to throttle or secure API. We can put this in front take advantage.

Azure Kubernetes Services

Azure Core Service

There are 3 core services. This is the foundation of cloud; Every Azure service is built on one or all of these. for example, if we are learning Machine Learning, its a combination of Virtual Machine and Storage.

Virtual Machines

Windows or Linus OS. Can be created in few minutes. Can be remotely connected. Install whatever software you want.

Virtual Machine is a foundation on top of which other compute services provide service;

a) Azure Batch

b) Virtual Machine Scale Sets

It’s a way to have load-balancer where virtual machine are setup with some auto-scaling rules.

c) Azure Kubernetes Services (AKS)

Working on AKS cluster is basically working with VM. AKS is abstraction to underlying VM.

d) Service Fabric

A different paradigm to Virtual Machine is App Services.

1- App Services;

Web apps or container apps, Windows or Linux OS, fully-managed servers, no ability to remote control and others

Virtual Networking

Refer to this article.

Storage

a) Storage can be upto 5 pb, Storage types are Blobs, queues, tables, files – Various levels of replication including from local to global. Storage account charges are based on size of the storage (currently 1.8 cents per GB).

Storage tiers are hot, cool and archive