Defender for Cloud left Contoso Airlines with a list of recommendations and an obvious crack: it detects after the fact. Somebody creates a huge virtual machine in the wrong region with no tags, the resource exists, it bills and it sits there exposed; days later a recommendation flags it and somebody has to go and fix it. Worse still, the person who did it was perfectly entitled to: they were Contributor on the subscription, which is exactly the permission they need in order to work. RBAC cannot solve this, because RBAC only answers who. What is missing is a system that answers what, and that is Azure Policy: the rules of the game, applied at the moment the resource is created, regardless of who creates it. This lesson closes the security module, and the platform goes from being secured to being governed.
Important warning: governance and compliance policies have immediate, wide-reaching effects — a badly scoped Deny policy can halt legitimate deployments in production, and a badly written
Modifycan alter resources en masse. On top of that, real regulatory compliance (PCI DSS, GDPR, ENS) goes far beyond what any tool evaluates. Before applying any governance initiative in production, it must be reviewed by a security professional or by your organization's compliance team.
Contents
- RBAC versus Policy: who can versus what can be done
- Anatomy of a policy definition
- The effects and when to use each one
- Assignment, scope, exclusions and resources that already exist
- Initiatives and the built-in compliance ones
- Contoso's set of policies
- Compliance evaluation and remediation tasks
- Management groups: the root of governance
- From Blueprints to template specs and landing zones
- The cost of governance versus the cost of not having it
- Policy and infrastructure as code
- Common Mistakes and Tips
- Exercises
- Conclusion
- RBAC versus Policy: who can versus what can be done
Here is the example that explains everything. Diego Salas is Contributor on rg-contoso-reservas-dev, a perfectly legitimate permission Marta granted him in 04-02. With it he creates a Standard_E64s_v5 virtual machine in East US for a performance test, with no tags. Nothing he has done violates RBAC: he had permission to create resources.
The result, though, is a problem on four fronts: cost (some €3,500 a month nobody budgeted for), billing (with no centro-coste, it cannot be charged to anyone), compliance (data that could end up outside the EU) and operations (a resource in a region the team does not monitor).
| RBAC | Azure Policy | |
|---|---|---|
| Question | Who can do this? | What can be done? |
| Evaluated against | The calling identity | The resource's properties |
| Model | Deny by default, then grant | Allow by default, then restrict |
| What the rule covers | Actions | Configurations and values |
| Example | "Diego can create VMs" | "No VM may be larger than Standard_D4s_v5 in development" |
| Applies to existing resources | Not applicable | Yes: it audits them, and fixes them with tasks |
They complement each other and do not replace each other: RBAC decides whether you can press the button; Policy decides what is acceptable to come out of pressing it. Note the asymmetry in the default models: with RBAC you can do nothing until it is granted; with Policy you can do everything until somebody restricts it.
- Anatomy of a policy definition
{
"properties": {
"displayName": "Restrict the allowed regions at Contoso",
"description": "Only West Europe and North Europe are allowed, for data sovereignty and operational reasons.",
"mode": "Indexed",
"parameters": {
"regionesPermitidas": {
"type": "Array",
"metadata": { "displayName": "Allowed regions" },
"defaultValue": [ "westeurope", "northeurope" ]
}
},
"policyRule": {
"if": {
"allOf": [
{ "field": "location", "notIn": "[parameters('regionesPermitidas')]" },
{ "field": "location", "notEquals": "global" },
{ "field": "type", "notEquals": "Microsoft.Resources/resourceGroups" }
]
},
"then": { "effect": "deny" }
}
}
}Element by element:
mode:Indexedevaluates only the resource types that support tags and location — it is the right one for regions and tags;Allalso includes resource groups and subscriptions. UsingAllwhereIndexedbelongs produces false non-compliance on resources that have no real location.parameters: they make the policy reusable. The list of regions is decided when you assign it, not when you define it, so the same policy serves production and a future environment in another geography.policyRule.if: the conditions, combinable withallOf(AND) andanyOf(OR), and nestable. The usual operators areequals,notEquals,in,notIn,like,existsandcontains.- The example's two exclusions are not decoration: many resources have the
globallocation (Front Door, Traffic Manager, DNS) and blocking them would break the platform; and resource groups are excluded because their location only says where their metadata is stored. then.effect: what to do when the condition is met.
- The effects and when to use each one
| Effect | What it does | When to use it |
|---|---|---|
| Audit | Marks the resource as non-compliant; prevents nothing | The discovery phase, always before Deny |
| Deny | Rejects the creation or modification | Non-negotiable rules, after auditing the impact |
| Append | Adds fields to the request | Adding simple default values |
| Modify | Adds, changes or removes tags and properties; requires a managed identity | Inheriting centro-coste from the resource group |
| DeployIfNotExists | Deploys a related resource if it is missing; requires a managed identity | Diagnostics, agents, backups |
| AuditIfNotExists | Marks as non-compliant if a related resource is missing | Detecting without deploying |
| Disabled | Turns the policy off without deleting the assignment | Pausing temporarily to diagnose |
| DenyAction | Blocks one specific action, typically deletion | Protecting critical resources from being deleted |
Two distinctions worth committing to memory. Append versus Modify: Append only acts on creation and does not touch what already exists; Modify can fix already created resources through remediation tasks, which is why it is the one used for tags. Deny versus DeployIfNotExists: the first rejects and forces whoever is deploying to fix it; the second accepts and fixes it itself. Use Deny for what must never exist and DeployIfNotExists for what must always accompany the resource.
The Modify and DeployIfNotExists effects need a managed identity on the assignment, because Azure Policy has to act on your behalf, and that identity needs the corresponding roles. It is the number one cause of remediation tasks that fail.
- Assignment, scope, exclusions and resources that already exist
A definition does nothing until it is assigned to a scope: management group, subscription or resource group. The assignment is inherited downwards, just like RBAC, and it supports exclusions of specific sub-scopes.
The point that causes the most confusion: what happens to resources that already exist.
- A
Denyeffect does not delete or block what is already created. It only acts on future creations and modifications. A pre-existing resource that breaches it shows up as non-compliant, and the block will fire the next time somebody tries to modify it (a side effect that catches people out: a routine update starts failing). - The
AuditandAuditIfNotExistseffects evaluate everything that exists and report on it. ModifyandDeployIfNotExistscan fix what exists, but only if an explicit remediation task is launched (section 7).
Hence the correct rollout sequence, analogous to the WAF's in 04-04: assign in Audit, measure the real non-compliance, fix what exists, announce the date and only then change the effect to Deny.
- Initiatives and the built-in compliance ones
An initiative (or policy set) groups policies that are assigned and measured together. Advantages: a single assignment, shared parameters and one compliance view. Contoso creates the initiative "Base de gobernanza de Contoso" with the six policies from the next section.
Azure ships built-in initiatives for complete standards: Microsoft Cloud Security Benchmark (assigned by default), PCI DSS 4.0, ISO 27001, CIS Azure Foundations, NIST SP 800-53 and Spain's ENS. They are the counterpart of the previous lesson's Defender compliance dashboard: there you saw the result, here is the mechanism that evaluates it. Nearly all their policies are of the Audit type, precisely because a standard exists to measure, not to block deployments.
- Contoso's set of policies
MG="mg-contoso" # root management group
SCOPE="/providers/Microsoft.Management/managementGroups/$MG"
# 1. Allowed regions (built-in policy, with a parameter)
az policy assignment create -n regiones-permitidas --scope $SCOPE \
--policy "e56962a6-4747-49cd-b67b-bf8b01975c4c" \
--params '{"listOfAllowedLocations":{"value":["westeurope","northeurope"]}}'
# 2. The four mandatory tags: one assignment per tag
for T in entorno proyecto centro-coste propietario; do
az policy assignment create -n "requiere-etiqueta-$T" --scope $SCOPE \
--policy "871b6d14-10aa-478d-b590-94f262ecfa99" \
--params "{\"tagName\":{\"value\":\"$T\"}}"
done
# 3. Inherit centro-coste from the resource group with Modify (needs an identity)
az policy assignment create -n hereda-centro-coste --scope $SCOPE \
--policy "cd3aa116-8754-49c9-a813-ad46512ece54" \
--params '{"tagName":{"value":"centro-coste"}}' \
--mi-system-assigned --location westeurope \
--role "Contributor" --identity-scope $SCOPE
# 4. No public access on storage accounts
az policy assignment create -n sin-blobs-publicos --scope $SCOPE \
--policy "4fa4b6c0-31ca-4c0d-b10d-24b96f62a751"
# 5. Mandatory HTTPS and minimum TLS on App Service
az policy assignment create -n solo-https --scope $SCOPE \
--policy "a4af4a39-4135-47fb-b175-47fbdf85311d"Three comments on this block. The mandatory tags policy is assigned four times because the built-in one accepts a single tag per assignment; the order matters: the inheritance one (Modify) has to be evaluated before the requirement one, or deployments without centro-coste would be rejected instead of completed automatically. The inheritance assignment creates a managed identity with --mi-system-assigned and gives it the Contributor role at the scope: without that, the policy is assigned correctly and remediation always fails.
Two more policies are missing. The one for VM sizes in development is assigned only to the development subscription, because production's restrictions are different:
az policy assignment create -n tamanos-vm-dev \
--scope "/subscriptions/$SUB_DEV" \
--policy "cccc23c7-8427-4f53-ad12-b6a63eb452b3" \
--params '{"listOfAllowedSKUs":{"value":["Standard_B2s","Standard_D2s_v5","Standard_D4s_v5"]}}'And the one for automatic diagnostics, the canonical DeployIfNotExists case, which solves Defender's recommendation number 7 (04-05) at the root: instead of configuring fourteen resources by hand, the policy configures them and configures every future one as well.
LOG_ID=$(az monitor log-analytics workspace show -g rg-contoso-seguridad-pro -n log-contoso-pro --query id -o tsv)
az policy assignment create -n diagnostico-app-service --scope $SCOPE \
--policy "b79fa14e-238a-4c2d-b376-442ce508fc84" \
--params "{\"logAnalytics\":{\"value\":\"$LOG_ID\"}}" \
--mi-system-assigned --location westeurope \
--role "Contributor" --identity-scope $SCOPE| Policy | Effect | Scope | Problem it solves |
|---|---|---|---|
| Allowed regions | Deny | mg-contoso |
Data sovereignty and operations |
| Four mandatory tags | Deny | mg-contoso |
Cost allocation (module 8) |
Inherit centro-coste |
Modify | mg-contoso |
Keeping the previous one out of the way |
| No public access on storage | Deny | mg-contoso |
Boarding pass leakage |
| HTTPS and minimum TLS | Deny / Audit | mg-contoso |
PCI DSS and data in transit |
| Allowed VM sizes | Deny | Development subscription | Runaway spend |
| Diagnostics to Log Analytics | DeployIfNotExists | mg-contoso |
Auditing and observability |
- Compliance evaluation and remediation tasks
Azure Policy evaluates at three moments, and it is worth knowing them because they explain almost every "I assigned the policy and nothing happens" question:
- When a resource is created or modified: immediately. That is when
Deny,AppendandModifyact. - When a policy is assigned or changed: an evaluation is triggered within about 30 minutes.
- The periodic cycle: everything is re-evaluated every 24 hours.
# Overall compliance state
az policy state summarize --scope $SCOPE \
--query "value[0].results.{NonCompliant:nonCompliantResources, Policies:nonCompliantPolicies}"
# Which specific resources are non-compliant, and under which policy
az policy state list --scope $SCOPE --filter "complianceState eq 'NonCompliant'" \
--query "[].{Resource:resourceId, Policy:policyDefinitionName}" -o table
# Force an evaluation without waiting (it can take a while on large scopes)
az policy state trigger-scan --resource-group rg-contoso-reservas-proRemediation is what fixes what already exists. It only applies to Modify and DeployIfNotExists, and it is not automatic: you have to create a task that walks the non-compliant resources and applies the change to them using the assignment's managed identity.
az policy remediation create -n corrige-centro-coste \
--policy-assignment hereda-centro-coste \
--resource-discovery-mode ExistingNonCompliant \
--scope "/subscriptions/$SUB_PRO"
az policy remediation show -n corrige-centro-coste --scope "/subscriptions/$SUB_PRO" \
--query "{State:provisioningState, Succeeded:deploymentSummary.successfulDeployments, Failed:deploymentSummary.failedDeployments}"If failedDeployments is greater than zero, the cause is nearly always the same: the assignment's managed identity does not have sufficient permissions in some sub-scope. You check it with az role assignment list --assignee <the assignment's principalId>.
- Management groups: the root of governance
Assigning policies subscription by subscription does not scale: every new subscription is born ungoverned and somebody has to remember. Management groups are containers above subscriptions that let you assign policies and RBAC once, inherited downwards.
flowchart TB
T["Tenant root group<br/>(contosoairlines.example)"] --> MG["mg-contoso<br/>Company-wide mandatory policies"]
MG --> P["mg-contoso-plataforma<br/>Networking, security, identity"]
MG --> C["mg-contoso-cargas<br/>Business applications"]
P --> S1["Platform subscription<br/>(shared networking and security)"]
C --> S2["Contoso Airlines - Produccion"]
C --> S3["Contoso Airlines - Desarrollo"]
Contoso's allocation, and the logic behind it:
- In
mg-contoso: what is non-negotiable for everyone — allowed regions, mandatory tags, no public access on storage, HTTPS and automatic diagnostics. Nobody, in any present or future subscription, can get around it. - In
mg-contoso-plataforma: rules specific to the shared infrastructure, such as requiring every subnet to have an NSG attached. - In
mg-contoso-cargas: the applications' rules, and beneath it the VM size restriction that applies only to the development subscription.
Two practical warnings. The tenant root group always exists and assigning there affects absolutely everything, including subscriptions that do not exist yet; treat it with extreme care, and it requires the Management Group Administrator role. And exclusions should be few and documented: a hierarchy full of exceptions governs nothing.
- From Blueprints to template specs and landing zones
Azure Blueprints was the attempt to package ARM templates, policy assignments and role assignments into a single artifact. It is deprecated and must not be used in new designs. Its replacement is two separate and better pieces:
- Template specs: ARM or Bicep templates, versioned and stored as an Azure resource, shareable with RBAC.
- Azure landing zones: the Cloud Adoption Framework's reference implementation, which deploys the management group hierarchy, the policies, the network topology and identity as one coherent whole. It is where what you have built by hand today evolves to, and it is covered in lesson 09-04.
- The cost of governance versus the cost of not having it
Azure Policy is free: you pay nothing for definitions, assignments, evaluation or remediation. What it costs is the time to design it and the initial friction when a deployment is rejected.
Against that, the cost of not having it, with the figures from the example in section 1: the Standard_E64s_v5 VM in East US costs around €3,500 a month and, with no centro-coste, it cannot be charged to anyone, so it lands in the general allocation and nobody claims it. Add the real cost of an incident: a storage account with public access is a personal data breach, and GDPR fines are measured as a percentage of turnover. The whole governance section costs zero euros a month; the first badly created resource it prevents more than pays for the time invested. It is, by some distance, the best cost-benefit ratio in the module, and it is why Nuria Peña will be demanding it from module 8 onwards: with no centro-coste on every resource, no cost analysis is possible.
- Policy and infrastructure as code
It might look as though, if the whole infrastructure is defined in Bicep with the right tags and regions, Policy is redundant. It is not, and the reason is the one that has come up all module long: the template protects what the pipeline deploys, the policy protects everything else. Somebody will create a resource from the portal to "try something out", a third-party tool will provision something on its own, or a poorly reviewed pipeline will deploy to the wrong region. Policy is the safety net that does not depend on anybody's discipline.
The correct way to combine them is in layers: the template defines the intent and makes the right thing easy; the policy prevents the wrong thing wherever it comes from; and the policy definitions and assignments themselves are managed as code, versioned in the repository and deployed by the pipeline, not clicked into the portal. How that is done with Bicep and Azure Pipelines is the content of lessons 05-03 and 05-06.
Common Mistakes and Tips
- Assigning
Denystraight into production. Start inAudit, measure the non-compliance, fix, announce, and only then block. - Forgetting the managed identity on
ModifyandDeployIfNotExists. The assignment is created with no error and every remediation fails. - Expecting
Denyto clean up what exists. It only acts on creations and modifications; existing resources are fixed with remediation tasks. - Being impatient. Evaluation takes about 30 minutes after assigning, and the full cycle 24 hours.
- Requiring tags without the inheritance policy. Every deployment starts failing and the team ends up asking for the policy to be removed.
- Blocking the
globallocation. Front Door, Traffic Manager and DNS can no longer be created. Always excludeglobaland resource groups. - Using Blueprints in a new design. It is deprecated; use template specs and landing zones.
- Filling the hierarchy with exclusions. Every exception is a crack; document and review the few that are unavoidable.
- Tip: test every new policy in
rg-contoso-reservas-devbefore promoting it to the management group. The blast radius of a badly written policy at the root is the entire company. - Tip: group your own policies into an initiative from the start. Ten loose assignments become unmanageable; an initiative is assigned, parameterized and measured in one go.
Exercises
Exercise 1: designing governance for Contoso Miles
"Contoso Miles" (centro-coste=CC-2077) will have its own subscription. Requirements: West Europe only; the four mandatory tags with centro-coste inherited from the resource group; no database reachable from the internet; diagnostics sent to log-contoso-pro; and VMs limited to Standard_D4s_v5 at most.
- For each requirement, state the appropriate effect and where in the hierarchy you would assign it.
- Which ones need a managed identity, and what role would you give it?
- Describe the rollout order so as not to block the team on day one.
Exercise 2: a policy that breaks the deployments
After assigning the mandatory tags policy with the Deny effect at mg-contoso, Contoso's nightly pipeline starts failing with RequestDisallowedByPolicy and, on top of that, 240 pre-existing resources show up as non-compliant.
- Why do the new deployments fail, and what is missing from the design?
- What has to be done about the 240 existing resources, with the commands?
- Propose the correct assignment order so that this would not have happened.
Exercise 3: choosing the right effect
State the effect (Audit, Deny, Modify, DeployIfNotExists, DenyAction) and justify it:
- Every new storage account must require TLS 1.2 as a minimum.
- Every resource must have the
propietariotag; if it is missing, it has to be set from the resource group's value. - Every SQL database must have auditing enabled, sending it to Log Analytics.
- You want to know how many VMs have no backup, without changing anything yet.
- Nobody must be able to delete
kv-contoso-pro, not even an Owner.
Solutions
Solution 1:
- Regions:
Deny, at the management group containing the Miles subscription (or atmg-contosoif the rest of the company shares the restriction; since here it is West Europe only, it is assigned at subscription level with its own parameter). Mandatory tags:Denyat the subscription.centro-costeinheritance:Modifyat the subscription. Databases with no public access:Denyat the subscription. Diagnostics:DeployIfNotExists, better atmg-contosobecause it applies company-wide. VM sizes:Denyat the subscription. - The
Modifyone (tag inheritance) and theDeployIfNotExistsone (diagnostics). Role: Contributor at the assignment's scope, or better a narrower one — Tag Contributor for the first and Monitoring Contributor plus Log Analytics Contributor for the second — applying 04-02's least privilege. - First the
Auditones and theModify/DeployIfNotExistsones with their remediation tasks, so that the platform brings itself up to date. Then measure compliance for a few days. Then tell the team the date it comes into force. And only then change the regions, tags, public access and sizes effects toDeny.
Solution 2:
- Because the pipeline creates resources without the
centro-costetag, and withDenythe whole request is rejected. What is missing is the inheritance policy with theModifyeffect, which should fill in the tag from the resource group before the requirement policy evaluates; also missing is having gone through anAuditphase, which would have revealed the problem without cutting anything off. - The
Denypolicies do not touch them: they carry on existing, marked non-compliant, but they will fail the next time somebody modifies them. They are fixed by assigning the inheritance policy with a managed identity and launchingaz policy remediation create -n corrige-etiquetas --policy-assignment hereda-centro-coste --resource-discovery-mode ExistingNonCompliant --scope /subscriptions/$SUB, and then checkingdeploymentSummary.failedDeployments. Resources whose resource group does not have the tag either will have to be tagged by hand, or the resource groups tagged first. - (a) Assign the inheritance one (
Modify) and run its remediation. (b) Assign the tags one inAuditand measure for one or two weeks. (c) Manually fix whatever is left and give the team a date. (d) Change the effect toDeny. It is the same detect-analyze-fix-enforce sequence as the WAF's in 04-04, and for the same reason.
Solution 3:
Deny: it is a property known at creation time, there is no reason to accept an insecure account and the requirement is non-negotiable under PCI DSS. It is preceded by anAuditphase if accounts already exist.Modify: it adds the missing tag and, unlikeAppend, it can fix existing resources with a remediation task. It requires a managed identity.DeployIfNotExists: auditing is a related resource (a diagnostic setting) that has to be created, not a property of the database. It requires a managed identity with permissions on the workspace.AuditIfNotExists: you only want to measure the absence of a related resource (the backup item) without deploying anything or blocking. It is the natural preliminary phase before deciding whether to move toDeployIfNotExists.DenyActionon the delete operation, complemented by aCanNotDeleteresource lock (01-05) and by the vault's own purge protection (04-03). Three layers for the same goal, because losing a Key Vault with encryption keys is irreversible.
Conclusion
This lesson closes module 4, and it is worth looking at what has changed. You can tell what RBAC cannot solve: RBAC answers who can do something and Azure Policy answers what can be done, with opposite default models — RBAC denies until you grant; Policy allows until you restrict. You have dissected a policy definition with its mode, its parameters, its conditions and its effects, and you know when to use each one: Audit to discover, Deny for the non-negotiable, Append and Modify to fill in values — with the difference that only Modify fixes what exists — DeployIfNotExists and AuditIfNotExists for related resources, and Disabled to pause. You understand that a Deny does not clean up what is already created, that evaluation takes about 30 minutes after assigning and 24 hours for its full cycle, and that remediation tasks are what bring the platform up to date, as long as the assignment has its managed identity with the right permissions.
You have implemented Contoso's set of policies: regions limited to West Europe and North Europe, the four mandatory tags with centro-coste inherited from the resource group, a ban on public access in storage, HTTPS and minimum TLS, bounded VM sizes in development and automatic deployment of diagnostics to log-contoso-pro — which solves at the root, and for the future too, one of the recommendations Defender produced in 04-05. All of it hanging off a hierarchy of management groups (mg-contoso → mg-contoso-plataforma and mg-contoso-cargas) that means no future subscription is born ungoverned. You know that Blueprints is deprecated and that its place is taken by template specs and the Cloud Adoption Framework's landing zones (09-04), that Policy is free while a single badly created resource costs thousands of euros, and that infrastructure as code and policy are complementary layers: the template makes the right thing easy, the policy prevents the wrong thing wherever it comes from.
Recapping the whole module: Contoso Airlines' platform came in with passwords typed by hand and leaves governed. Identities live in Microsoft Entra ID with groups, MFA, Conditional Access, PIM and an emergency account excluded from everything. Permissions are minimal and assigned to groups, with data roles kept separate from the management plane and a custom role for operations. Not a single secret is left in the code or in the deployment: managed identities eliminated the ones that could disappear and kv-contoso-pro holds the ones that could not, with @Microsoft.KeyVault(...) references the application resolves on its own. The perimeter is protected with the WAF on fd-contoso-global, its OWASP and bot rules, rate limiting and an attack response playbook, with the DDoS cost decisions reasoned rather than improvised. Posture watches itself with Defender for Cloud, its score, its prioritized recommendations, its alerts and its PCI DSS dashboard. And the rules of the game no longer depend on somebody remembering: they are written as policy and applied at the moment each resource is created.
There is, however, something this module has laid bare without saying it. Everything you have built across four modules has been deployed by hand, command by command, from the CLI. It works, but it does not scale, it is not reproducible, there is no way of knowing who changed what or of rolling back if something breaks, and there would be no way of recreating this platform in another region after a disaster. The same discipline you have applied to governance today has to be applied to delivery. In module 5, Azure DevOps, you will build the complete cycle: Azure Repos to version the code and the templates too, Azure Pipelines to build and test on every change, continuous deployment with environments and approvals so you can reach production without fear, Azure Artifacts for shared packages and, closing the circle, infrastructure as code with Bicep, where this whole platform — networks, applications, databases, policies included — stops being a collection of commands run once and becomes reviewable, versioned, repeatable code. See you there.
Azure Course
Module 1: Introduction to Azure
- What Is Azure?
- Service Models, Regions and Availability Zones
- Creating and Setting Up Your Azure Account
- A Tour of the Azure Portal
- Azure Resource Manager: Subscriptions, Resource Groups and Tags
- Azure CLI, PowerShell and Cloud Shell
Module 2: Core Azure Services
- Azure Virtual Machines
- Compute Scaling and High Availability
- Azure App Service
- Azure Storage: Blobs, Files, Queues and Tables
- Azure Networking: Virtual Networks, Subnets and NSGs
- Hybrid Connectivity and Global Delivery
Module 3: Azure Databases
- Choosing the Right Data Service
- Azure SQL Database
- Azure Cosmos DB
- Azure Database for MySQL
- Azure Database for PostgreSQL
- Data Analytics: Data Lake, Data Factory and Synapse
Module 4: Security in Azure
- Microsoft Entra ID and Identity Management
- RBAC and Managed Identities
- Azure Key Vault
- DDoS Protection and Web Application Firewall
- Microsoft Defender for Cloud
- Governance and Compliance with Azure Policy
Module 5: Azure DevOps
- Introduction to Azure DevOps
- Azure Repos
- Azure Pipelines: Continuous Integration
- Continuous Deployment with Environments and Approvals
- Azure Artifacts
- Infrastructure as Code with Bicep
Module 6: Advanced Azure Services
- Containers in Azure: Container Registry and Container Apps
- Azure Kubernetes Service (AKS)
- Azure Functions
- Azure Logic Apps
- Messaging and Events: Service Bus, Event Grid and Event Hubs
- Azure AI Services
Module 7: Monitoring and Management
- Azure Monitor: Metrics, Alerts and Dashboards
- Log Analytics and KQL Queries
- Application Insights
- Azure Automation and Runbooks
- Backup and Disaster Recovery
Module 8: Cost Management and Optimization
- Pricing Calculator and Cost Estimation
- Azure Cost Management: Analysis, Budgets and Alerts
- Reservations, Savings Plans and Azure Hybrid Benefit
- Azure Advisor
- Optimization Strategies and FinOps Culture
