Course Modules
01
Cloud Concepts
3 lessons
Every "what is the cloud" question on AZ-900 is really a question about who is responsible for what. The definition — compute delivered over the internet, billed as you use it — is one sentence; the part the exam actually scores is the shared responsibility line, which slides depending on whether you bought IaaS, PaaS or SaaS. Read each service-model bullet below as "what did I just stop managing, and what did I not".
Key Concepts
- Cloud Computing Defined: The delivery of computing services — servers, storage, databases, networking, software, analytics, and intelligence — over the Internet ("the cloud") to offer faster innovation, flexible resources, and economies of scale
- Shared Responsibility Model: Security responsibilities are split between the cloud provider and the customer. The provider secures the physical infrastructure; the customer secures their data, identities, and application configurations. The boundary shifts depending on the service model (IaaS, PaaS, SaaS)
- IaaS (Infrastructure as a Service): Provides virtualized computing resources on demand — VMs, networking, and storage. The customer manages the OS, middleware, and applications. Examples: Azure Virtual Machines, Azure Virtual Networks
- PaaS (Platform as a Service): Provides a managed platform for building and deploying applications without managing the underlying infrastructure. The provider handles the OS, patching, and runtime. Examples: Azure App Service, Azure SQL Database
- SaaS (Software as a Service): Fully managed software delivered over the Internet on a subscription basis. The provider manages everything from infrastructure to the application itself. Examples: Microsoft 365, Microsoft Teams, Dynamics 365
💻 Concrete example — the IaaS VM that got cryptomined while Azure itself stayed intact
Situation: A team lifts an old Windows app onto an Azure VM, opens RDP (3389) to the internet "just for the migration weekend", and forgets. Three weeks later the VM sits at 100% CPU and the invoice is up. The developer opens a support case claiming Azure was compromised.
Walk: 1) Nothing on Microsoft's side failed. The hypervisor, the host and the physical datacenter are the provider's responsibility and they held. 2) The VM is IaaS, so the guest OS, its patch level, the local accounts and the NSG rules in front of it are all the customer's — a brute-forced local administrator password is squarely on the customer's side of the line. 3) The fix is customer-side too: remove the 3389 allow rule, reach the VM through Bastion or a VPN instead, enforce a strong password and patch the OS.
Verify: Ask the same question about the same app running on App Service (PaaS): the OS patching moves to Microsoft, but the app code, the credentials it uses and who can sign in stay yours. On Microsoft 365 (SaaS) almost everything moves to Microsoft — except the data you put in and the identities that can reach it, which never move at any tier.
The benefits list is easy to recite and easy to get wrong under exam conditions, because two pairs of words look interchangeable and are not: scalability (you can add capacity) versus elasticity (the platform adds it for you, on demand), and an SLA number versus the architecture that earns it. Azure does not hand you four nines because you deployed in Azure — you earn them with the deployment shape you choose.
Key Concepts
- High Availability (HA): Cloud services are designed to provide continuous operation through redundant infrastructure. Azure offers SLAs (Service Level Agreements) guaranteeing uptime percentages — for example, 99.99% uptime means roughly 52 minutes of downtime per year
- Scalability & Elasticity: Scalability lets you add resources to handle increased load (vertical: bigger VM; horizontal: more VMs). Elasticity automatically adjusts resources based on demand in real time, so you never over-provision or under-provision
- Agility & Speed: Cloud resources can be provisioned in minutes rather than weeks. Teams can quickly spin up development environments, test new ideas, and tear them down when finished, accelerating the innovation cycle
- Disaster Recovery & Geo-Distribution: Cloud providers offer built-in backup, replication, and recovery services across geographically distributed datacenters. Azure Site Recovery and geo-redundant storage ensure business continuity even during regional failures
- CapEx vs OpEx: Traditional IT requires Capital Expenditure (CapEx) — large upfront investment in physical hardware. Cloud computing shifts to Operational Expenditure (OpEx) — pay-as-you-go pricing where you only pay for what you consume, reducing financial risk
💻 Concrete example — the "99.99%" service that measured 99.6%
Situation: A team promises the business 99.99% availability for an internal app. It runs as a single VM talking to a single Azure SQL database. Over a quarter the app is unreachable for roughly three hours — about 99.6% — and nobody can explain the gap.
Walk: 1) Nothing was promised in the first place: a single VM only carries an SLA at all if it uses premium storage, and even then it is 99.9% — roughly 8.7 hours a year, not 52 minutes. 2) Availability is bought with redundancy: spreading the same VMs across an availability set raises it to 99.95%, and across availability zones to 99.99%. 3) Dependencies multiply, they do not average. A front end at 99.95% in front of a database at 99.99% gives a composite of 0.9995 × 0.9999 ≈ 99.94% — every extra component in the request path can only lower the number.
Verify: Redeploy the VMs zonally, re-run the composite arithmetic against the new tier numbers, and quote that figure to the business. The same exercise explains why elasticity is not just a cost story: autoscale that adds instances also removes the single instance whose reboot took the service down.
Public, private and hybrid is not a ranking from worst to best, and the exam never rewards "private is more secure". The deployment model is chosen by a constraint — a data-residency law, a depreciating datacenter, a latency budget, an application that cannot be moved — and hybrid wins so often in enterprises precisely because the constraint applies to some of the workload, not all of it.
Key Concepts
- On-Premises vs Cloud: On-premises requires the organization to purchase, manage, and maintain all hardware and software. Cloud offloads infrastructure management to the provider, letting teams focus on business value rather than datacenter operations
- Public Cloud: Resources owned and operated by a third-party provider (like Microsoft Azure) and shared across multiple tenants. Offers the greatest scalability and lowest upfront cost. No capital expenditure — everything is OpEx
- Private Cloud: Dedicated infrastructure used exclusively by a single organization, either on-premises or hosted by a third party. Provides maximum control and security but requires higher CapEx and operational overhead
- Hybrid Cloud: Combines public and private clouds, allowing data and applications to move between them. Organizations can keep sensitive workloads on-premises while leveraging the public cloud for burst capacity, disaster recovery, or less-sensitive workloads
- Choosing the Right Model: IaaS for maximum control (lift-and-shift migrations), PaaS for developer productivity (web apps, APIs), SaaS for ready-to-use solutions (email, CRM). Many real-world architectures combine all three models
💻 Concrete example — the insurer that was told "cloud-first" and still could not move the policy database
Situation: An insurer runs a mainframe-era policy database plus a customer portal. The board mandates cloud-first to stop buying hardware. The regulator requires policyholder records to stay physically in-country, and the country has no Azure region.
Walk: 1) Public cloud for everything fails the residency test, and it fails on the regulation, not on security — Azure's compliance portfolio is broader than the insurer's own datacenter. 2) Private cloud for everything satisfies the regulator and defeats the mandate: the portal is the part that needs elastic capacity at renewal season, and keeping it on-premises means buying for the peak again. 3) Hybrid splits along the constraint. The policy records stay in the on-premises private cloud; the portal, the reporting and the dev/test estate run in Azure and reach the records over a private link.
Verify: Check that the split holds under the money question too. The portal is now OpEx and scales at renewal season; the datacenter shrinks to the one workload that has to be there; and the next audit asks only about the records that never left. If the regulator later approves an in-country region, the same split becomes a migration plan rather than a redesign.
☁ Scenario — picking the right cloud service model
Situation: A 200-person company wants to move email, calendar, and document collaboration to the cloud. The IT team has 2 people and can only manage user accounts — they cannot patch servers, deploy application updates, or maintain uptime.
Decision: This is SaaS (Microsoft 365). The provider manages everything from the physical datacenter to the running application. IT manages only identities, licenses, and data. If the team needed to host their own app, the answer would be PaaS; if they needed full OS control for a legacy system, IaaS.
Shared responsibility check: Under SaaS the customer is still responsible for which users have access, what data they put in, and MFA enrollment. "The provider handles security" is never the full answer — data and identities stay with the customer regardless of model.
- Service-model responsibility: IaaS = you manage OS+app, PaaS = you manage app+data, SaaS = you manage data+identities only. Provider always handles physical + host; customer always handles data + access.
- Scalability means you can add resources (vertical = bigger VM, horizontal = more VMs); elasticity means the platform does it automatically based on load. The exam tests this wording precisely.
- CapEx (datacenter capital upfront) → OpEx (pay-as-you-go) is the cornerstone economic argument. Know SLA math: 99.9% ≈ 8.7h/year downtime, 99.99% ≈ 52 min/year, 99.999% ≈ 5 min/year.
02
Azure Architecture
3 lessons
Azure gives you three separate answers to "what happens when something fails", and they protect against three different sizes of failure: an availability set covers a rack or an update wave, an availability zone covers a whole datacenter, and a region pair covers a region. Choosing one because it sounds highly available, without naming the failure it survives, is the mistake this lesson is about.
Key Concepts
- Azure Regions: A region is a set of datacenters deployed within a latency-defined perimeter and connected through a dedicated low-latency network. Azure has 60+ regions worldwide, more than any other cloud provider, enabling you to deploy resources close to your users
- Availability Zones: Physically separate locations within an Azure region, each with independent power, cooling, and networking. Deploying across availability zones protects against datacenter-level failures. Not all regions support availability zones
- Region Pairs: Each Azure region is paired with another region within the same geography (e.g., East US paired with West US). During planned maintenance, Azure updates one region at a time. In a widespread outage, one region from each pair is prioritized for recovery
- Sovereign Regions: Isolated Azure instances for government or regulatory compliance needs. Azure Government (US) and Azure China (operated by 21Vianet) are physically and logically separated from the main Azure cloud
- Choosing a Region: Consider proximity to users (latency), service availability (not all services are in all regions), compliance requirements (data residency laws), and pricing (costs vary by region)
💻 Concrete example — three VMs, one availability set, and a datacenter that still took the app down
Situation: An app runs on three VMs in an availability set in West Europe, described in the design document as "highly available". A power and cooling incident in one West Europe datacenter takes all three offline at once. The team insists the design was correct.
Walk: 1) The availability set did what it is for: it spread the VMs across fault domains (separate racks, power and switches) and update domains (so platform patching never reboots them together). It does not promise they are in different buildings. 2) The failure was datacenter-sized, and the control for that is availability zones — physically separate locations inside the region, each with independent power, cooling and networking, linked by private high-speed fibre rather than the public internet. 3) A region-wide failure is a third case again, and that is what the region pair is for: West Europe is paired with North Europe, platform updates roll one half of a pair at a time, and geo-redundant storage replicates between the two.
Verify: Redeploy the three VMs as zonal instances in zones 1, 2 and 3, and confirm the storage account is at least ZRS. Then check availability: not every region offers zones, and not every service is present in every region, so "which region" is a decision about latency, service availability, data residency and price before it is a decision about redundancy.
The hierarchy looks like folders and is not. Each level exists because something real is scoped to it: the subscription is where billing and quota live, the resource group is where lifecycle and delete live, the management group is where governance that must apply to many subscriptions lives. The question to ask of any resource is not "where does this belong tidily" but "what do I want to happen to it when this container is deleted, billed or governed".
Key Concepts
- Azure Resources: Any entity managed by Azure — virtual machines, storage accounts, databases, virtual networks, web apps, and more. Every resource must belong to exactly one resource group
- Resource Groups: Logical containers that hold related Azure resources for an application or project. Resources in a group share the same lifecycle — deploy, update, and delete together. Resource groups cannot be nested, but resources can interact across groups
- Azure Subscriptions: A billing and access control boundary. Each subscription links to an Azure account and provides authenticated and authorized access to Azure resources. Organizations often use multiple subscriptions to separate environments (dev, staging, prod) or departments
- Management Groups: Containers that sit above subscriptions and allow you to apply governance conditions (Azure Policy, RBAC) at scale. Management groups can be nested up to six levels deep, creating a hierarchy that mirrors your organizational structure
- Hierarchy: The full hierarchy is: Azure AD Tenant → Management Groups → Subscriptions → Resource Groups → Resources. Policies and RBAC applied at a higher level are inherited by all levels below
💻 Concrete example — the cleanup that deleted a shared VNet along with its resource group
Situation: A proof-of-concept resource group is deleted at the end of a quarter to tidy the subscription. Within minutes, two unrelated applications in other resource groups lose connectivity. Nobody deleted anything belonging to those apps.
Walk: 1) The virtual network the two apps were peered to had been created inside the proof-of-concept group months earlier, because that is where the person who built it was working. 2) Deleting a resource group deletes everything inside it — it is a lifecycle boundary, not a label. Resources in different groups can talk to each other freely, which is exactly why a dependency can end up crossing the boundary unnoticed. 3) Each resource lives in exactly one group, and groups do not nest, so the only durable fix is to place shared infrastructure in a group whose name states its lifetime, for example a platform or networking group, and to put a CanNotDelete lock on it.
Verify: The same reasoning answers the neighbouring exam questions. Quota exhaustion — "we cannot start more VMs in West Europe" — is a subscription limit per region, not a resource-group one, so another subscription has its own headroom. And a rule that must hold for dev, test and production subscriptions alike belongs on the management group above them, where it is inherited once rather than assigned three times.
ARM is not a deployment tool sitting next to the portal — it is the single door everything goes through. The portal, the CLI, PowerShell, the SDKs and the REST API all submit the same requests to ARM, which authenticates them, evaluates RBAC, locks and Policy, and only then talks to the resource provider. That is why "it worked in the portal but the script was denied" is almost never true, and why a declarative template is idempotent: you describe the end state and ARM works out the difference.
Key Concepts
- What Is ARM: Azure Resource Manager is the deployment and management layer for Azure. All requests — whether from the Azure portal, CLI, PowerShell, SDKs, or REST APIs — go through ARM, which authenticates and authorizes them before passing them to the Azure service
- ARM Templates: JSON files that define the infrastructure and configuration for your Azure deployment. They enable Infrastructure as Code (IaC) — declarative, repeatable, and version-controlled deployments. You define what you want, and ARM handles the how
- Bicep: A domain-specific language (DSL) that provides a simpler syntax for authoring ARM templates. Bicep files compile down to ARM template JSON but are easier to read and write. Microsoft recommends Bicep over raw JSON for new projects
- Declarative vs Imperative: ARM templates and Bicep are declarative — you describe the desired end state. Imperative approaches (CLI scripts, PowerShell) describe step-by-step commands. Declarative templates are idempotent: deploying the same template multiple times produces the same result
- Benefits of ARM: Consistent management layer, declarative templates, dependency management (resources deploy in correct order), RBAC integration, tagging for cost tracking and organization, and the ability to deploy, manage, and monitor resources as a group
💻 Concrete example — the portal hotfix that vanished on the next pipeline run
Situation: An engineer fixes a production incident at 02:00 by raising an App Service plan from S1 to S3 in the portal. The service recovers. Four days later the release pipeline redeploys the Bicep template and the site slows to a crawl again at the next traffic peak.
Walk: 1) The template still says S1, and a declarative deployment reconciles reality to the template — it does not merge the manual change in. This is configuration drift, and idempotence is precisely what caused it: deploying the same template twice produces the same end state both times. 2) The change was never wrong, it was never written down. The fix is to put S3 in the template (or in the parameter file for that environment) and let the pipeline be the source of truth. 3) Note what ARM did not do: it did not create a second plan. Templates are not scripts that run again; they are a desired state that gets compared.
Verify: Re-run the deployment with no changes and confirm it completes with nothing modified — that no-op is the signature of a declarative system. The same property is what lets one template plus three parameter files produce dev, test and production without three copies drifting apart, and it is why Microsoft steers new work to Bicep, which compiles to the same ARM JSON with far less of it.
☁ Scenario — designing an Azure resource hierarchy for 3 teams
Situation: You're onboarding Dev, QA, and Production teams. Each needs isolated billing and separate governance policies, but all employees use the same company directory (Entra ID tenant).
Design: One Entra ID tenant (single directory, shared identities). One Management Group with baseline Policy applied (e.g., "allowed regions = West Europe + North Europe"). Three Subscriptions — one per team — for billing isolation and quota separation. Within each subscription, Resource Groups per project lifecycle (e.g., webapp-prod-rg, database-prod-rg). Tags (env=prod, team=production) on every resource for cost reporting.
Why not one subscription? You can't easily split billing or apply different governance rules without subscription-level boundaries. The management group enforces the "must not deploy outside Europe" policy across all three subscriptions automatically — no need to repeat it per subscription.
- Region pairs are linked across >300 miles; planned platform updates roll out one pair-half at a time, and geo-redundant storage replicates between them by default.
- Resource groups are the unit of lifecycle and access — every resource belongs to exactly one. Tags inherit nothing automatically; you must propagate via Policy or scripts.
- ARM templates / Bicep are idempotent — re-running an unchanged deployment is a no-op. ARM is also where RBAC, locks, and Azure Policy are evaluated, before the resource provider sees the request.
03
Core Azure Services
4 lessons
The compute family is a ladder of abstraction: VMs, then containers, then App Service, then Functions — each rung hands more of the operational work to Azure and takes away some control. The exam question is always "which rung does this workload need", and the giveaway is usually in the shape of the work: continuously serving, event-driven, or a job that runs and stops. A workload that is idle most of the day is the clearest signal of all.
Key Concepts
- Azure Virtual Machines (VMs): IaaS offering that provides full control over the operating system, installed software, and configuration. Choose from Windows or Linux images, select VM sizes (CPU, RAM, disk), and manage patching and updates yourself. Ideal for lift-and-shift migrations and custom workloads
- Azure App Service: A PaaS platform for building, deploying, and scaling web apps, REST APIs, and mobile backends. Supports .NET, Java, Node.js, Python, and PHP. Handles infrastructure management, OS patching, and auto-scaling so developers focus on code
- Azure Container Instances (ACI): The simplest way to run containers in Azure without managing servers or orchestrators. Provides fast startup, per-second billing, and is ideal for short-lived tasks, batch processing, or simple container workloads
- Azure Kubernetes Service (AKS): A managed Kubernetes orchestration service for deploying, scaling, and managing containerized applications at scale. Azure manages the control plane (API server, etcd, scheduler); you manage the worker nodes and application containers
- Azure Functions: A serverless compute service that runs event-driven code without provisioning infrastructure. You write functions triggered by HTTP requests, timers, queue messages, or database changes. Pay only for execution time (consumption plan) — zero cost when idle
💻 Concrete example — the nightly batch job paying for a VM that idles 23 hours a day
Situation: A nightly job resizes the day's uploaded images. It runs for about 20 minutes at 01:00 and does nothing else. It lives on a D2s_v3 VM kept on all month so the scheduler is never late, at roughly $70 a month for about 10 hours of actual work.
Walk: 1) The workload is not "a server", it is a task with a start and an end — a VM charges for allocated time whether it computes or not, so 97% of the bill buys idleness. 2) Azure Container Instances fits directly: package the existing script as a container, start it on a schedule, pay per second while it runs, and there is no orchestrator and no host to patch. 3) Azure Functions fits if the work can be expressed as a trigger — per image uploaded, on a timer — and costs nothing while idle, with the caveat that the consumption plan has an execution time limit, so one 20-minute monolithic run must be split into per-image invocations. 4) AKS would run it happily and bring a cluster to operate for a job that takes 20 minutes. That is the trap answer.
Verify: After the move, the monthly compute line for this job falls to cents and the only thing the team maintains is the image. Apply the same test in reverse: a licensed application that must see a specific OS build and a kernel driver still belongs on a VM — full OS control is the one thing every rung above it takes away.
Two properties of Azure networking generate most of the "but I opened the port" tickets, and both are stated plainly in the documentation: NSG rules are evaluated in priority order and the first match wins, and NSGs are stateful, so the return traffic of an allowed flow is allowed automatically. Getting these right turns troubleshooting from guesswork into reading a sorted list.
Key Concepts
- Azure Virtual Network (VNet): The fundamental building block for private networking in Azure. VNets enable Azure resources to communicate with each other, with the Internet, and with on-premises networks. You define address spaces and subnets. VNets are region-scoped and can be connected via VNet peering
- VPN Gateway: Sends encrypted traffic between an Azure VNet and an on-premises network over the public Internet using IPsec/IKE tunnels (site-to-site VPN) or allows individual clients to connect (point-to-site VPN). Cost-effective for moderate bandwidth needs
- Azure ExpressRoute: A private, dedicated connection from your on-premises infrastructure to Azure that does not traverse the public Internet. Provides higher bandwidth (up to 100 Gbps), lower latency, and more reliability than VPN. Used by enterprises with strict performance or compliance requirements
- Network Security Groups (NSGs): Act as a virtual firewall for controlling inbound and outbound traffic to Azure resources. NSG rules filter by source/destination IP, port, and protocol. Applied at the subnet or network interface level. Evaluated by priority (lowest number = highest priority)
- Azure DNS: A hosting service for DNS domains that provides name resolution using Microsoft's global network of DNS servers. Supports both public DNS zones (Internet-facing) and private DNS zones (VNet-internal name resolution). Does not allow purchasing domain names — use App Service Domains or a third-party registrar
💻 Concrete example — the allow rule that never matched because a deny sat above it
Situation: A web tier cannot reach the database subnet on 1433. The team adds an inbound rule "Allow-SQL-from-Web" at priority 200 on the database subnet's NSG. Nothing changes. They then add an outbound allow rule on the web tier for the return traffic. Still nothing.
Walk: 1) List the effective rules in priority order and the cause is visible: an earlier hardening exercise left "Deny-All-Inbound" at priority 100. Lower number means higher priority and evaluation stops at the first match, so the allow at 200 is never reached. Moving the allow to priority 90 fixes it in one change. 2) The outbound rule was never needed. NSGs are stateful: allowing the inbound session means its replies are permitted without a matching rule, and adding one only makes the rule set harder to read. 3) Confirm which NSG is actually in the path — rules can sit on the subnet and on the NIC, and both are evaluated.
Verify: Use the effective-rules view on the database NIC to confirm the allow is now the first match, and re-test the connection. The lesson generalises to VNet peering, where the surprising default is the opposite kind: peering is not transitive, so two spokes peered to the same hub cannot reach each other without gateway transit or routes that send them through it.
Two independent choices hide inside "put it in a storage account": which service (blob for objects, files for an SMB share, queues for messages, tables for key-value) and which access tier. The tier decision is the one that bites, because the tiers trade storage price against retrieval price and retrieval time — and the cheapest tier is only cheap for data nobody reads.
Key Concepts
- Azure Blob Storage: Object storage optimized for massive amounts of unstructured data — images, videos, documents, backups, and logs. Access via REST API, Azure CLI, or client libraries. Supports three blob types: Block (most common), Append (log files), and Page (VHD disks)
- Azure File Storage: Fully managed file shares accessible via the SMB (Server Message Block) and NFS protocols. Can be mounted by cloud and on-premises machines simultaneously. Ideal for replacing or extending on-premises file servers and for shared configuration files
- Azure Queue Storage: A simple message queuing service for storing large numbers of messages (up to 64 KB each). Enables asynchronous communication between application components. Used to decouple services and handle traffic spikes gracefully
- Azure Table Storage: A NoSQL key-value store for semi-structured data. Provides fast access to large datasets without the complexity of a relational database. Suitable for flexible datasets like user profiles, device information, or metadata. Azure Cosmos DB Table API offers a premium alternative
- Storage Access Tiers: Hot (frequently accessed, highest storage cost, lowest access cost), Cool (infrequently accessed, 30-day minimum, lower storage cost), Cold (rarely accessed, 90-day minimum, lower storage cost than Cool), and Archive (rarely accessed, 180-day minimum, lowest storage cost, highest access cost and retrieval latency of hours)
💻 Concrete example — the month-end reports filed to Archive that took hours to come back
Situation: Finance must keep seven years of statements, so an admin sets a blob container's default tier to Archive and moves everything into it, including the current month's reports that accounting opens most days. The first request for a report returns an error saying the blob is not online; a week later the bill shows unexpected charges.
Walk: 1) Archive is offline storage. A blob must be rehydrated to Hot or Cool before it can be read, which takes hours at standard priority — so a tier chosen for the 7-year data made the 7-day data unusable. 2) The surprise charges are the early-deletion penalty: Archive bills a 180-day minimum, Cool 30 days and Cold 90, so moving or deleting data before that window still charges the remainder. 3) The right shape is age-based, not folder-based: keep current reports in Hot, let a lifecycle management rule move them to Cool after 30 days and to Archive after a year.
Verify: Re-read a current report immediately (Hot, no rehydration) and confirm the lifecycle rule has moved only the older blobs. Redundancy is a separate axis that the tier does not touch: LRS keeps three copies in one datacenter, ZRS spreads them across availability zones, and the GRS and GZRS options add copies in the paired region.
Every managed database here removes the same chores — patching, backups, high availability — so those are not the differentiator. What separates them is the shape of the data and of the queries: relational with joins and transactions, or documents and key lookups at global scale. Cosmos DB being the newest and fastest-sounding option is what makes it the most frequently wrong answer.
Key Concepts
- Azure SQL Database: A fully managed PaaS relational database engine based on Microsoft SQL Server. Handles patching, backups, monitoring, and high availability automatically. Supports elastic pools for cost-efficient management of multiple databases with varying usage patterns
- Azure Cosmos DB: A globally distributed, multi-model NoSQL database designed for low-latency and high-throughput applications. Supports multiple APIs: SQL (Core), MongoDB, Cassandra, Gremlin (graph), and Table. Offers single-digit millisecond reads and writes with guaranteed 99.999% availability
- Azure Database for MySQL: A managed MySQL community edition service in the cloud. Provides built-in high availability, automated backups, and scaling without application downtime. Fully compatible with existing MySQL tools, drivers, and applications
- Azure Database for PostgreSQL: A managed PostgreSQL service available in two deployment modes: Single Server (general-purpose) and Flexible Server (recommended, offers more control over maintenance, HA configurations, and cost optimization). Supports PostgreSQL extensions and is compatible with existing tools
- Choosing the Right Database: Use Azure SQL for relational workloads requiring T-SQL compatibility. Use Cosmos DB for globally distributed, low-latency NoSQL workloads. Use MySQL or PostgreSQL managed services for applications already built on those open-source engines. The managed service approach reduces administrative overhead for all options
💻 Concrete example — the reporting database that was fast, global, and far too expensive
Situation: A team picks Cosmos DB for an internal reporting store because the brief said "modern and scalable". Six weeks in, the finance dashboard is slow, queries that join orders to customers are awkward to write, and the request-unit bill is several times the estimate.
Walk: 1) The workload is relational: a handful of analysts running ad-hoc joins and aggregates over a few million rows, from one country, during office hours. 2) Cosmos DB is priced and tuned for the opposite profile — huge volumes of small, partition-key-shaped reads and writes, served globally at single-digit-millisecond latency. Cross-partition queries and joins are exactly what its request-unit model charges most for. 3) Azure SQL Database matches the shape: full T-SQL joins, transactions and a cost that tracks a predictable workload, with the same managed patching, backups and HA.
Verify: After the move the same dashboard queries run as ordinary SQL and the bill becomes a flat tier rather than a per-query one. Keep the reverse case in view for the exam: a product catalogue read by users on three continents, with multi-region writes and a documented latency target, is genuinely Cosmos DB — and that is where its five consistency levels, from Strong to Eventual, become the interesting decision.
☁ Scenario — choosing the right compute service for a web migration
Situation: A startup runs a Django web app on 3 on-premises Linux VMs. They want to move to Azure, eliminate OS patching overhead, and add auto-scaling for Black Friday traffic spikes — without rewriting any code.
Answer: Azure App Service (PaaS). No OS to patch, built-in auto-scale rules, HTTPS/TLS included, custom domain support, and Django is natively supported. The team just pushes code.
Why not the others? Azure VMs would preserve the existing setup but keep the patching burden. Azure Functions would require rewriting the app as event-driven handlers — too invasive. AKS is powerful but adds Kubernetes operational complexity they don't need. App Service is the sweet spot: less management than VMs, less rework than Functions, less ops than AKS.
Exam pattern: "Reduce infrastructure management" + "no code changes" = App Service. "Respond to events/triggers" = Functions. "Full OS control" = VMs.
- Compute decision tree: VMs = full control / lift-and-shift, App Service = managed web apps, Functions = event-driven serverless, AKS = orchestrated containers.
- Storage tiers (Hot / Cool / Cold / Archive) trade off retrieval cost vs storage cost; Archive is cheapest to store but takes hours to rehydrate.
- Cosmos DB is global, multi-model, single-digit-ms latency — pick it whenever the scenario says "globally distributed" or "low-latency NoSQL". SQL Database is single-region (or read replicas) relational.
04
Azure Identity & Security
3 lessons
The single most useful sentence about Entra ID is what it is not: it is not Active Directory Domain Services in the cloud. Entra ID is an internet-facing identity provider speaking OAuth, OIDC and SAML to applications; AD DS is a domain speaking Kerberos and LDAP to domain-joined machines. Most hybrid-identity confusion — and several exam questions — comes from treating one as a hosted version of the other.
Key Concepts
- Microsoft Entra ID (formerly Azure AD): Microsoft's cloud-based identity and access management service. It authenticates users and provides single sign-on (SSO) to thousands of cloud applications including Microsoft 365, Azure, and third-party SaaS apps. Every Azure subscription is associated with an Entra ID tenant
- Tenants, Users & Groups: A tenant represents an organization and contains users, groups, and registered applications. Users can be members (internal to the org) or guests (B2B collaboration). Groups simplify access management by assigning permissions to a group rather than individual users
- Multi-Factor Authentication (MFA): Requires two or more verification methods: something you know (password), something you have (phone, security key), or something you are (biometrics). MFA blocks 99.9% of identity-based attacks and is strongly recommended for all users
- Single Sign-On (SSO): Users authenticate once and gain access to all connected applications without re-entering credentials. Reduces password fatigue, improves user experience, and centralizes access management. Supported via SAML, OIDC, and OAuth 2.0 protocols
- Conditional Access: Policies that enforce access requirements based on signals such as user location, device compliance, application sensitivity, and risk level. Example: require MFA when signing in from outside the corporate network or block access from untrusted countries entirely
💻 Concrete example — the lift-and-shift VM that could not be domain-joined to "Azure AD"
Situation: A file-and-print application is moved onto an Azure VM. It needs to join the corporate domain so it can authenticate users with Kerberos and read group memberships over LDAP. The team points it at the Entra ID tenant that already contains every one of those users, and the domain join fails.
Walk: 1) The users are genuinely there — synchronised from on-premises AD by Entra Connect — but Entra ID does not serve Kerberos or LDAP, so there is nothing for the VM to join. 2) There are two legitimate fixes: extend the existing on-premises domain to the VM over the site-to-site connection (a domain controller the VM can reach), or use Microsoft Entra Domain Services, a managed domain in Azure that projects the same identities and does speak Kerberos and LDAP. 3) Nothing here is a licensing problem or a firewall problem; it is a protocol mismatch.
Verify: Once joined to a real domain, the app authenticates as before, while the organisation's SaaS applications keep signing in through Entra ID with SSO over the modern protocols. Both directories hold the same people; they answer different questions.
Defense in depth and Zero Trust are answers to two different questions. Defense in depth asks how many independent layers must fail before an attacker reaches the data; Zero Trust asks what do we assume about a request that has already got inside. The second one exists because the first was often implemented as one hard shell around a soft, flat network.
Key Concepts
- Defense in Depth: A layered security strategy where multiple layers of protection slow down an attacker. The layers from outer to inner: physical security, identity & access, perimeter (DDoS, firewalls), network (segmentation, NSGs), compute (secure VMs, patching), application (secure coding, vulnerability scanning), and data (encryption at rest and in transit)
- Zero Trust Model: Assumes breach — never trust, always verify. Every access request is fully authenticated, authorized, and encrypted regardless of where it originates. The three principles: verify explicitly (authenticate based on all available data points), use least privilege access (JIT/JEA), and assume breach (minimize blast radius, segment access)
- Least Privilege Access: Users and applications receive only the minimum permissions needed to perform their tasks. Just-In-Time (JIT) access grants elevated permissions temporarily when needed and revokes them automatically. Reduces the attack surface and limits damage from compromised accounts
- Network Segmentation: Dividing the network into smaller segments using VNets, subnets, and NSGs to limit lateral movement if an attacker compromises one segment. Microsegmentation applies fine-grained policies at the workload level for even tighter control
- Encryption: Data should be encrypted at rest (Azure Storage Service Encryption, Azure Disk Encryption using BitLocker/DM-Crypt) and in transit (TLS/SSL for data moving between services or to users). Azure manages encryption keys by default, or you can bring your own keys (BYOK) via Azure Key Vault
💻 Concrete example — one phished laptop that could reach every server in the VNet
Situation: A finance user is phished. Within an hour the attacker is enumerating file shares, database servers and a domain controller. The environment has a firewall at the perimeter, antivirus on every machine and a strong password policy.
Walk: 1) The perimeter was never breached — the attacker signed in as a legitimate user, from a normal-looking session, and everything after that was authorised. This is the assumption Zero Trust rejects: being inside is not evidence of anything. 2) Lateral movement was free because the VNet was flat, with management ports reachable from any subnet. Network segmentation — separate subnets with NSGs that permit only the flows the applications actually need — is the layer that would have contained this. 3) Standing administrative rights turned a user compromise into an infrastructure compromise. Least privilege with just-in-time elevation means the permissions the attacker inherited expire and have to be requested. 4) Verifying explicitly — MFA plus a device-compliance requirement — would most likely have stopped the sign-in itself.
Verify: Walk the layers outward afterwards and name the control at each one: identity (MFA, Conditional Access), perimeter (DDoS, firewall), network (subnets, NSGs), compute (patching, JIT access), application, data (encryption at rest and in transit). Any layer you cannot name is where the next incident goes unimpeded.
These five services answer five different questions, and the exam tests whether you can match the question to the tool rather than describe the tool: how exposed am I (Defender for Cloud), where do secrets live (Key Vault), what absorbs a flood (DDoS Protection), what filters traffic centrally (Azure Firewall), and where do I investigate (Sentinel). One of them — Key Vault — is the answer to a question that appears in almost every exam sitting.
Key Concepts
- Microsoft Defender for Cloud: A unified security management and threat protection platform that provides a secure score, security recommendations, and advanced threat detection across Azure, hybrid, and multi-cloud environments. Continuously assesses your resources and provides prioritized hardening recommendations
- Azure Key Vault: A cloud service for securely storing and managing secrets (API keys, passwords, connection strings), encryption keys, and SSL/TLS certificates. Applications authenticate to Key Vault using managed identities to retrieve secrets programmatically, avoiding hardcoded credentials in code
- Azure DDoS Protection: Provides defense against Distributed Denial of Service attacks. The Basic tier is free and automatically enabled for all Azure services. The Standard tier adds advanced mitigation capabilities, real-time attack metrics, diagnostic logging, and application-layer protection for public-facing resources
- Azure Firewall: A managed, cloud-native network security service that provides stateful packet inspection, application-level filtering (FQDN), threat intelligence-based filtering, and centralized network policy enforcement. Integrates with Azure Monitor for logging and analytics
- Microsoft Sentinel: A cloud-native SIEM (Security Information and Event Management) and SOAR (Security Orchestration, Automated Response) solution. Collects security data from across your entire organization, detects threats using AI and analytics, investigates incidents, and automates responses through playbooks
💻 Concrete example — the connection string that shipped to a public repository
Situation: A developer commits a configuration file containing a database connection string, complete with username and password, and the repository is public. Secret scanning raises it within the hour. The credential is valid for the production database.
Walk: 1) Rotating the password first is right, but it does not fix the pattern: the next deployment will hardcode the new one. 2) The secret belongs in Azure Key Vault, where it is stored, versioned, access-controlled and auditable — every read is logged, and the value never has to be visible to a developer. 3) The part that closes the loop is the managed identity: the App Service is given an identity of its own, that identity is granted read access to the one secret, and the app fetches it at runtime. There is now no credential in the code, in source control or in the pipeline to leak.
Verify: Check the two things that prove it worked — the configuration file contains a Key Vault reference rather than a value, and the vault's access logs show the app's identity reading the secret. Defender for Cloud would independently have flagged the same weakness as a recommendation against your secure score, which is the difference between the two tools: the vault fixes it, Defender for Cloud tells you it is there.
☁ Scenario — enforcing MFA only for remote logins via Conditional Access
Situation: The CFO accesses Azure-hosted financial reports from a personal laptop at home. Company policy: MFA is required whenever a sign-in originates outside the corporate office network. Office logins should remain seamless (no MFA prompt).
Conditional Access policy: Users = Finance group; Cloud apps = All cloud apps; Conditions → Locations = "Any location" EXCEPT the Named Location "Corporate HQ" (defined as the office's public IP range); Grant = Require multi-factor authentication. Save and enable the policy.
Result: Sign-ins from the office IP match the exception and pass through without MFA. Remote sign-ins (home, coffee shop, hotel) fall into "any location not excluded" and trigger the MFA grant control automatically.
Exam note: Conditional Access evaluates signals — user identity, device compliance, location, risk level — and returns a grant or block decision in real time. It is the Zero Trust policy engine in Entra ID.
- Entra ID ≠ on-prem AD: it's a cloud identity service for SaaS apps; you'd use Entra Domain Services if you need traditional AD features (Kerberos, LDAP) in the cloud.
- Conditional Access is the policy engine — combine signals (user, device, location, risk) with controls (require MFA, block, require compliant device) to gate access dynamically.
- Zero Trust's three pillars: verify explicitly (auth every request), least privilege (just-in-time, just-enough), assume breach (segment + monitor everything).
05
Azure Governance & Compliance
3 lessons
Azure Policy only does what its effect says it does. An assignment with the Audit effect reports; one with Deny blocks; DeployIfNotExists fixes. And either way, a policy evaluates new and updated deployments — resources that already exist are marked non-compliant, not repaired. "We have a policy for that" is therefore never an answer on its own.
Key Concepts
- Azure Policy: A service that creates, assigns, and manages policies to enforce rules and ensure compliance across your Azure resources. Policies can audit existing resources and prevent non-compliant deployments. Example: enforce that all resources must be deployed in specific regions or require specific tags on resources
- Policy Definitions & Initiatives: A policy definition is a single rule (e.g., "allowed VM sizes"). An initiative is a collection of related policy definitions grouped together for a larger compliance goal (e.g., "ISO 27001 compliance" initiative containing multiple policies). Initiatives simplify management and assignment
- Policy Effects: Deny (block non-compliant resource creation), Audit (allow but flag as non-compliant), Append (add fields to a resource, e.g., add a tag), DeployIfNotExists (deploy a remediation resource if missing), and Disabled (policy is not enforced). Understanding effects is key to predicting policy behavior
- Azure Blueprints: A declarative way to orchestrate the deployment of resource templates, role assignments, policy assignments, and resource groups as a single versioned package. Blueprints enable repeatable, governed environment setup — ideal for new subscription provisioning and compliance-ready environments
- Compliance Dashboard: Azure Policy provides a compliance view showing which resources comply with assigned policies and which do not. Non-compliant resources can be remediated manually or automatically using remediation tasks that bring resources into compliance
💻 Concrete example — the "allowed locations" policy that allowed everything
Situation: To satisfy a data-residency requirement, a governance lead assigns the built-in allowed-locations policy at the management group, restricted to two European regions. A month later an audit finds fourteen resources in East US, all created after the assignment.
Walk: 1) The assignment was made with the Audit effect, which records non-compliance and permits the deployment. Nothing was ever blocked, and the compliance dashboard had been showing exactly that for a month. 2) Changing the effect to Deny stops the next one at ARM, before the resource provider is reached — the portal, the CLI and the pipeline all fail identically, because they all go through ARM. 3) The fourteen existing resources are still non-compliant after the change, because Deny is preventive. They have to be moved or recreated; policies whose effect is DeployIfNotExists or Modify can instead be run as a remediation task over what already exists.
Verify: Attempt a deployment into East US and confirm it is refused with the policy named in the error, then re-check the compliance view once the fourteen are moved. Scope matters as much as effect: assigned at the management group, the rule covers every subscription beneath it, which is precisely why it is assigned there rather than three times over.
Two built-in roles differ by exactly one capability, and the exam leans on it repeatedly: Owner and Contributor both have full control over resources, but only Owner can hand out access. Add the rule that role assignments are additive and the most permissive wins at the scope where they overlap, and most access puzzles reduce to arithmetic.
Key Concepts
- Role-Based Access Control (RBAC): Manages who has access to Azure resources, what they can do, and what scope they can access. RBAC uses role assignments that combine a security principal (user, group, service principal, managed identity), a role definition (collection of permissions), and a scope (management group, subscription, resource group, or resource)
- Built-In Roles: Owner (full access including the ability to assign roles), Contributor (full access except assigning roles), Reader (view-only access), and User Access Administrator (manage user access only). Hundreds of service-specific roles exist (e.g., Virtual Machine Contributor, Storage Blob Data Reader)
- Custom Roles: When built-in roles do not match your needs, create custom role definitions with precisely the permissions required. Custom roles are defined in JSON and can be scoped to management groups, subscriptions, or resource groups
- Resource Locks: Prevent accidental deletion or modification of critical resources. Two lock levels: CanNotDelete (resources can be read and modified but not deleted) and ReadOnly (resources can only be read — no modifications or deletions). Locks are inherited from parent scopes
- Scope & Inheritance: RBAC and locks applied at a higher scope (management group or subscription) automatically apply to all child resources. The most permissive role wins when a user has multiple role assignments. Locks apply regardless of RBAC role — even an Owner cannot delete a CanNotDelete-locked resource without first removing the lock
💻 Concrete example — the Contributor who could build anything and grant nothing
Situation: A senior engineer with Contributor on the production subscription is asked to give a new starter read access to one resource group. Creating VMs, storage and databases works fine; the role assignment fails with an authorisation error. The engineer reports a broken portal.
Walk: 1) The portal is behaving correctly. Contributor grants full management of resources and explicitly excludes managing access — that separation exists so that someone who can build infrastructure cannot quietly widen who can reach it. 2) Two clean fixes exist. User Access Administrator at the resource-group scope lets the engineer grant access there and nowhere else, or an Owner performs the one assignment. Promoting the engineer to Owner on the whole subscription solves the ticket and quietly hands them permanent rights over everything. 3) The new starter should be granted Reader at the resource group, not at the subscription: narrowest role at the narrowest scope.
Verify: Confirm the assignment is visible on the resource group and absent from its siblings. Then note the one control that is not arithmetic: a resource lock outranks RBAC entirely, so even an Owner cannot delete a CanNotDelete-locked resource until the lock is removed — an intentional, auditable pause before destruction.
The cost-saving levers are not interchangeable, and they are not applied in an arbitrary order. A reservation buys a discount on a commitment you have already sized correctly; right-sizing is what makes that size correct. Doing them the other way round locks in the wrong number for one to three years, which is the mistake this lesson exists to prevent.
Key Concepts
- Azure Pricing Calculator: A web-based tool for estimating the monthly cost of Azure services before deployment. You select services, configure options (region, tier, instance count), and get a detailed cost estimate. Essential for budgeting and proposals
- Total Cost of Ownership (TCO) Calculator: Compares the cost of running workloads on-premises versus in Azure. Input your current infrastructure (servers, databases, storage, networking) and the TCO calculator shows potential savings from migrating to Azure over 1-5 years, including labor, electricity, and datacenter costs
- Azure Cost Management + Billing: A built-in Azure service for monitoring, allocating, and optimizing cloud spending. Provides cost analysis dashboards, budget alerts (notify when spending approaches thresholds), and recommendations for cost optimization. Supports exporting cost data for external analysis
- Tags for Cost Tracking: Name-value pairs applied to Azure resources for organizing and categorizing. Common tags: Environment (prod, dev), Department (finance, engineering), CostCenter, Owner. Tags enable cost allocation by filtering and grouping spending in cost analysis reports
- Cost-Saving Strategies: Azure Reservations (commit to 1- or 3-year terms for up to 72% savings on VMs, databases, and storage), Azure Spot VMs (use spare capacity at deep discounts for interruptible workloads), right-sizing (choose the smallest VM size that meets performance needs), and auto-shutdown for dev/test VMs
💻 Concrete example — the three-year reservation bought on the wrong VM size
Situation: Under pressure to cut cloud spend, a team buys three-year reserved instances for twenty D4s_v3 VMs and reports a large saving. Two months later a performance review shows those VMs average under 10% CPU and should be D2s_v3 — but the commitment is already made.
Walk: 1) The discount was real and applied to twice the capacity the workload needs; a discount on waste is still waste. 2) The correct order is measure, right-size, then commit: Azure Advisor's cost recommendations are built from actual utilisation, so the smaller size was knowable before the purchase. 3) Reservations are not entirely rigid — they can be exchanged or cancelled within Azure's published limits — but the point stands: the commitment should follow the measurement. 4) Reservations suit steady, predictable workloads; interruptible ones such as batch rendering belong on Spot VMs at a far deeper discount, accepting eviction when Azure needs the capacity back; and dev/test VMs simply need auto-shutdown outside working hours.
Verify: Before any future commitment, price it in the Pricing Calculator at the size Advisor recommends, and set a budget so the next surprise arrives as an alert. Keep the two calculators distinct: Pricing Calculator estimates a planned Azure deployment, the TCO Calculator compares today's on-premises costs against Azure for a migration business case.
☁ Scenario — preventing accidental deletion with a resource lock
Situation: A junior admin accidentally deleted the production SQL server last month during routine cleanup, causing 4 hours of downtime. Your task: prevent this from happening again, but don't block routine deployments or configuration updates.
Solution: CanNotDelete lock on the production resource group. Navigate to the resource group → Settings → Locks → Add lock. Set Name = "prod-no-delete", Lock type = CanNotDelete. Save.
Why CanNotDelete and not ReadOnly? ReadOnly would block all writes including legitimate deployments and configuration changes — too restrictive. CanNotDelete allows updates and new resource creation, but prevents the delete operation. Developers can still deploy; they just can't destroy production resources.
Key exam point: Locks override RBAC. Even a user with the Owner role cannot delete a CanNotDelete-locked resource without first removing the lock — which creates an intentional, auditable pause before destruction.
- Azure Policy is preventive (denies the deployment) — RBAC is permission-based (who can do what). Use Policy for "must" rules, RBAC for "who". Both inherit downward through the hierarchy.
- Resource locks:
ReadOnlyblocks modifications,CanNotDeleteblocks delete but allows changes. They override RBAC — even an Owner can't delete a locked resource without removing the lock first. - Budgets in Cost Management trigger alerts, not hard caps — they don't stop services. To actually stop spending you must script automation against the alert (e.g., shut down VMs).
06
Monitoring & Management Tools
3 lessons
The portal, the CLI, PowerShell and Cloud Shell are four front ends to one API, so they can all do the same things — the real difference is whether the work is repeatable. A portal click produces a resource; a script produces a resource and a record of how it was made. The other thing that separates them is context: a command-line tool acts on whichever subscription it currently has selected.
Key Concepts
- Azure Portal: A web-based graphical interface for managing all Azure resources. Provides dashboards, resource creation wizards, and monitoring views. Ideal for visual exploration, one-off tasks, and learning Azure services. Accessible from any browser without installing software
- Azure CLI: A cross-platform command-line tool for managing Azure resources using concise commands (e.g.,
az vm create). Available on Windows, macOS, and Linux. Commands follow a consistentaz [group] [subgroup] [action]pattern. Ideal for scripting and automation in Bash environments - Azure PowerShell: A set of cmdlets for managing Azure resources using PowerShell syntax (e.g.,
New-AzVM). Runs on Windows, macOS, and Linux via PowerShell Core. Preferred by administrators already familiar with PowerShell scripting and the verb-noun naming convention - Azure Cloud Shell: A browser-based shell environment accessible directly from the Azure portal. Supports both Bash (with Azure CLI) and PowerShell. Pre-configured with Azure tools, Git, and common utilities. Requires an Azure Storage account for persisting files across sessions
- Azure Mobile App: Allows you to monitor Azure resources, check service health, run Cloud Shell commands, and respond to alerts from your mobile device. Useful for on-the-go management and receiving push notifications for critical events
💻 Concrete example — the script that built a test environment in the production subscription
Situation: An engineer with access to four subscriptions runs a tested CLI script to stand up a load-test environment. It succeeds. An hour later the production subscription shows eight unfamiliar VMs and a new resource group, and the production budget alert fires.
Walk: 1) The script was correct. The context was not: the CLI holds a default subscription, and this session's default was production. Nothing in the script named a subscription, so nothing contradicted the default. 2) The fix is to make context explicit rather than inherited — select the subscription at the top of the script, or pass it on each command, and print it before creating anything. 3) The same class of mistake is much rarer in the portal, where the subscription is a visible field on the creation blade, and that is the honest trade: the portal shows you context, scripts reproduce work.
Verify: Delete the mistaken resource group, re-run with the subscription set explicitly, and confirm the resources land in the test subscription. Two details often tested alongside this: Cloud Shell needs an Azure file share to persist anything between sessions, and CLI and PowerShell are functionally equivalent — choose by the scripting language your team already uses, not by capability.
Azure Monitor collects two kinds of data and they answer different questions: metrics are cheap numbers sampled on a schedule, good for "is it healthy right now"; logs are detailed records queried with KQL, good for "why". A whole class of incident — the platform looks fine and the users do not agree — happens when only the first kind is being watched.
Key Concepts
- Azure Monitor: The comprehensive monitoring platform for Azure that collects, analyzes, and acts on telemetry from cloud and on-premises resources. It gathers metrics (numerical time-series data) and logs (structured records of events) into a centralized data platform for visualization, alerting, and automation
- Log Analytics Workspace: A centralized repository for log data collected by Azure Monitor. You query this data using Kusto Query Language (KQL) to search, filter, and analyze logs. KQL queries power dashboards, alerts, and workbooks. Example: find all failed login attempts in the past 24 hours
- Application Insights: An Application Performance Management (APM) feature of Azure Monitor for live web applications. Automatically detects performance anomalies, tracks request rates, response times, failure rates, and dependency calls. Supports .NET, Java, Node.js, Python, and JavaScript applications
- Alerts & Action Groups: Azure Monitor alerts notify you when specific conditions are met in metrics or logs (e.g., CPU > 90% for 5 minutes, or a critical error in application logs). Action groups define what happens when an alert fires: send email/SMS, call a webhook, trigger an Azure Function, or create an ITSM ticket
- Metrics vs Logs: Metrics are lightweight numerical values sampled at regular intervals (e.g., CPU percentage every minute) — ideal for real-time monitoring and alerts. Logs are detailed, time-stamped records (e.g., full request traces, error messages) — ideal for deep investigation and root cause analysis
💻 Concrete example — the slow web app whose VM metrics all looked perfect
Situation: Users report that a web app takes four or five seconds to load. The infrastructure dashboard shows CPU at 12%, memory comfortable, no failed requests and no alerts. The infrastructure team says the platform is healthy; the users keep complaining.
Walk: 1) Both are right. Platform metrics describe the host, not the request, and a request spending its time waiting consumes almost no CPU. 2) Application Insights answers at the request level: the end-to-end transaction shows roughly 3.6 of the 4 seconds inside a single dependency call to the database, repeated for every row of a list. 3) The Log Analytics workspace behind it is where you confirm the pattern with KQL — group the dependency telemetry by name and look at the call count per request — and that turns "the app is slow" into "this query runs N times per page".
Verify: After the query is fixed, the same transaction view shows the dependency time collapsing and the page returning under a second. Then close the monitoring gap that let it run: add an alert on server response time with an action group that emails the team, so the next regression is detected by the platform rather than by users.
Three services sound similar and answer three different questions: Advisor says what you should improve, Azure Monitor says what your resources are doing, and Service Health says whether Azure itself is having a problem. When something breaks, knowing which one to open first is most of the triage — and it decides whether the incident is yours to fix at all.
Key Concepts
- Azure Advisor: A personalized cloud consultant that analyzes your deployed resources and provides actionable recommendations across five categories: Reliability (high availability improvements), Security (vulnerability fixes), Performance (speed optimizations), Cost (spending reduction opportunities), and Operational Excellence (best practices)
- Advisor Recommendations: Each recommendation includes a description, impact level (High, Medium, Low), and step-by-step remediation instructions. Examples: resize underutilized VMs to save costs, enable MFA for admin accounts, configure backups for unprotected databases. Some recommendations can be applied directly from the Advisor dashboard
- Azure Service Health: Provides a personalized view of the health of Azure services and regions that you use. Three components: Azure Status (broad view of all Azure service health), Service Health (targeted view of services and regions you use, with alerts for outages and planned maintenance), and Resource Health (health of your specific individual resources)
- Service Health Alerts: Configure alerts to be notified when Azure service issues, planned maintenance, or health advisories affect your subscriptions and resources. Alerts can trigger email, SMS, webhook, or logic app actions. Proactive notification helps you prepare for maintenance and respond quickly to incidents
- Advisor vs Monitor vs Service Health: Azure Advisor provides proactive best-practice recommendations. Azure Monitor collects and analyzes operational telemetry from your resources. Service Health tracks the health of Azure platform services. Together, they provide a complete picture of optimization, operations, and platform reliability
💻 Concrete example — the VMs that rebooted overnight with nothing in the application logs
Situation: Four VMs restart at 03:10. The application logs end mid-transaction and resume after the boot, with no error, no crash dump and no deployment that night. The on-call engineer starts reading application code.
Walk: 1) The wrong place to start. Resource Health for one of the VMs states plainly that it was rebooted by the platform for a host update — a platform event, not an application fault. 2) Service Health shows the matching planned-maintenance notice for that region and subscription, issued days earlier and read by nobody. 3) The durable fix is notification and design: create a Service Health alert so planned maintenance and incidents reach the team by email or webhook, and spread the VMs across an availability set or zones so platform updates never reboot them all at once.
Verify: Confirm the alert by checking the next advisory arrives, and confirm the redundancy by checking the instances now sit in different update domains or zones. Keep the three views straight: Azure Status is the public page for broad outages, Service Health is filtered to your subscriptions and services, and Resource Health is your individual resource.
☁ Scenario — diagnosing a $3,000 bill spike
Situation: The Azure invoice jumped $3,000 more than last month. Your manager wants an explanation before tomorrow's meeting.
Step 1 — Cost Management: Portal → Cost Management + Billing → Cost Analysis. Set date range to current month vs prior month. Group by Resource type → Virtual Machines cost doubled. Group by Resource → four new D4s_v3 VMs show up that weren't there last month, each running 24/7.
Step 2 — Azure Advisor: Portal → Advisor → Cost tab. Advisor flags those same four VMs: average CPU utilization under 5% over the past 7 days. Recommendation: right-size from D4s_v3 ($0.192/hr) to D2s_v3 ($0.096/hr). Estimated monthly saving: $1,800.
Step 3 — Set a budget: Cost Management → Budgets → Create budget at the previous month's baseline + 10%. Add an alert at 80% threshold → email the team. Note: budgets send alerts; they do not stop provisioning.
For the meeting: "Cost spike traced to 4 oversized VMs provisioned for load testing and never shut down. Right-sizing will save $1,800/month. Budget alert added to catch this next time."
- CLI vs PowerShell:
az ...uses dash-flags (cross-platform, JSON output);Get-AzVM-style cmdlets are PowerShell objects (richer pipelines on Windows). Both can do everything the portal does. - Azure Monitor is the umbrella — Metrics (numeric, real-time), Logs (KQL queryable via Log Analytics workspaces), Alerts (rules on metrics/logs), and Application Insights (app-level APM) all live under it.
- Azure Advisor surfaces five recommendation pillars: cost, security, reliability, operational excellence, performance. Service Health alerts you to platform-side incidents affecting your subscription.