<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Brewed in the Cloud by Chris Hailes</title><link>https://blog.brewedinthecloud.com/post/</link><description>Recent content in Posts on Brewed in the Cloud by Chris Hailes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 04 Mar 2027 00:00:00 +1100</lastBuildDate><atom:link href="https://blog.brewedinthecloud.com/post/rss.xml" rel="self" type="application/rss+xml"/><item><title>WAF, Firewall, DDoS or Network Security Perimeter? Choose by Threat Boundary</title><link>https://blog.brewedinthecloud.com/p/exposure-controls-by-threat-boundary/</link><pubDate>Thu, 05 Nov 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/exposure-controls-by-threat-boundary/</guid><description>&lt;p&gt;&amp;ldquo;Should we use WAF, Firewall, DDoS Protection or Network Security Perimeter?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Before choosing, I would ask what we need to stop. An unwanted web request, an outbound connection, public access to a PaaS resource and an availability attack are not the same failure. Treating them as one purchasing decision is how a team ends up with the right product for the wrong problem.&lt;/p&gt;
&lt;p&gt;A WAF rule can reject a web request while an unintended data operation remains available. DDoS protection can improve resilience against network-layer attacks without narrowing a workload&amp;rsquo;s data permissions. A perimeter association can be present while its enforcement mode is not the mode the design assumes.&lt;/p&gt;
&lt;p&gt;Choose the boundary first. The threat-to-control matrix below makes the choice concrete: what the control should change, what it cannot replace, and how to check the difference without generating an attack.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Controls are comparable only when they address the same failure condition.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Different layers can be complementary without being alternatives.&lt;/p&gt;
&lt;p&gt;The continuing illustrative scenario has a public application ingress, an application workload, approved private Storage access, and a controlled unintended destination. Identity, networking and service behavior determine what can be done after a request reaches the application.&lt;/p&gt;
&lt;p&gt;Split the review into four questions. Which HTTP requests should reach application logic? Which connections should the workload establish? Which public relationships should a supported PaaS resource accept? What protects the public endpoint&amp;rsquo;s availability under a network-layer attack?&lt;/p&gt;
&lt;p&gt;Now the controls have a job to do. They are no longer competing on a feature list.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
E[Public client] --&gt; W[Application request boundary]
W --&gt; A[Application workload]
A --&gt; F[Selected network enforcement path]
F --&gt; D[Destination operation]
I[Identity and service authorization] --&gt; D
P[Supported PaaS public-access boundary] --&gt; D
V[Availability resilience] -. supports .-&gt; W
&lt;/div&gt;
&lt;p&gt;This is a boundary map, not a promise that every packet crosses every product. Private traffic may follow a different route from public traffic, and service-side operations may have another boundary entirely.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;h3 id="use-a-threat-to-control-matrix"&gt;Use a threat-to-control matrix
&lt;/h3&gt;&lt;p&gt;The &lt;a class="link" href="https://blog.brewedinthecloud.com/azure-exposure-reduction-toolkit/#2-threat-to-control-matrix" &gt;draft toolkit&amp;rsquo;s threat-to-control module&lt;/a&gt; records threat, source, operation, candidate control, enforcement placement, unsupported cases, evidence and operational burden. A useful starting point is:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure condition&lt;/th&gt;
&lt;th&gt;Candidate boundary&lt;/th&gt;
&lt;th&gt;What it does not establish&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unwanted HTTP request reaches application logic&lt;/td&gt;
&lt;td&gt;WAF policy on the chosen supported application front end&lt;/td&gt;
&lt;td&gt;Correct application authorization or workload egress restriction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unwanted connection leaves a source along an inspected route&lt;/td&gt;
&lt;td&gt;Azure Firewall rules for traversing traffic&lt;/td&gt;
&lt;td&gt;Enforcement on alternate routes or correct destination permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unwanted public access to an onboarded PaaS resource&lt;/td&gt;
&lt;td&gt;Network Security Perimeter association and applicable access rules&lt;/td&gt;
&lt;td&gt;Blocking every Private Endpoint operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network-layer flood threatens an eligible public endpoint&lt;/td&gt;
&lt;td&gt;Appropriate Azure DDoS offering&lt;/td&gt;
&lt;td&gt;Prevention of authorized data misuse or all application-layer overload&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Microsoft&amp;rsquo;s current documentation distinguishes WAF application protection from DDoS layer 3/4 protection. Firewall rule processing separately distinguishes DNAT, network and application rules. NSP documentation describes supported PaaS associations, transition/enforced modes and public-access rules.&lt;/p&gt;
&lt;p&gt;Use those distinctions to decide what belongs in the design. Combining the products does not remove the need to check each one&amp;rsquo;s actual scope.&lt;/p&gt;
&lt;h3 id="verify-placement-mode-and-bypass"&gt;Verify placement, mode and bypass
&lt;/h3&gt;&lt;p&gt;For WAF, identify the hosting product and SKU, attached policy, effective mode and protected route to the origin. Detection-mode evidence is not prevention evidence. Confirm the exact host-specific capability before choosing a managed rule set or custom rule.&lt;/p&gt;
&lt;p&gt;For Firewall, establish that the relevant route traverses the appliance and inspect effective policy, including parents and broader rules. A narrow application rule cannot rescue a matching permissive network rule that already terminates evaluation.&lt;/p&gt;
&lt;p&gt;For NSP, inspect the resource association and supported service. Microsoft&amp;rsquo;s documentation allows Private Endpoint traffic without explicit NSP access rules; do not treat an enforced perimeter as a universal private-data boundary. Resource authentication and authorization still need their own assessment.&lt;/p&gt;
&lt;p&gt;For DDoS, identify the eligible public IP/resource, selected offering and evidence of enabled coverage. Public-cloud feature availability does not imply every PaaS integration has identical support. Check service-specific support and cloud/region constraints.&lt;/p&gt;
&lt;h3 id="exercise-a-composition-safely"&gt;Exercise a composition safely
&lt;/h3&gt;&lt;p&gt;Use a harmless marker header or path to match a deliberately configured WAF test rule on an author-owned application. Compare the front-end request with an authorized direct-origin check. The expected result is a documented policy response, not proof that all malicious requests are blocked.&lt;/p&gt;
&lt;p&gt;Separately test a non-HTTP connection along the declared Firewall path and a synthetic authenticated operation against the controlled destination. Record which boundary rejects each case. A blocked HTTP marker alongside a successful unintended Blob operation is a useful counterexample: WAF works at its boundary while the consequence remains elsewhere.&lt;/p&gt;
&lt;p&gt;DDoS validation here is configuration and coverage review only. Do not generate attack traffic or label a benign load test a mitigation result. Provider-authorized simulation would be a separately scoped exercise.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;The matrix changes procurement and engineering reviews because each control must justify its role in a particular path. More layers are not automatically more assurance.&lt;/p&gt;
&lt;h3 id="prefer-the-composition-that-preserves-necessary-work"&gt;Prefer the composition that preserves necessary work
&lt;/h3&gt;&lt;p&gt;An application might need WAF protection for public HTTP input and tightly scoped data roles for Storage operations. An egress restriction may then constrain additional destinations. DDoS coverage addresses a distinct availability pressure where the endpoint is eligible.&lt;/p&gt;
&lt;p&gt;Before adding another layer, ask which remaining operation it will constrain. TLS inspection can bring certificate management, troubleshooting and cost without correcting the broad data role that authorizes the unwanted write. It may still be justified, but that role is not a reason to deploy it.&lt;/p&gt;
&lt;h3 id="make-ownership-part-of-selection"&gt;Make ownership part of selection
&lt;/h3&gt;&lt;p&gt;WAF exclusions, Firewall policy inheritance, NSP profiles and service roles may have different owners. A control without an owner for changes and failure response becomes another exception backlog.&lt;/p&gt;
&lt;p&gt;I would choose a smaller composition the team can test and operate over a wider one nobody can explain during an outage. An exclusion waiting for approval, a certificate renewal and an ambiguous support handoff all consume attention. That cost belongs beside the Azure bill.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The awkward cases are worth keeping in the review. They show how a control can work correctly while the finding remains unresolved.&lt;/p&gt;
&lt;h3 id="origin-access-can-bypass-the-web-boundary"&gt;Origin access can bypass the web boundary
&lt;/h3&gt;&lt;p&gt;A front-end WAF result says nothing about an independently reachable origin. Inspect origin restrictions and allowed legitimate management paths before asserting that application input is constrained.&lt;/p&gt;
&lt;h3 id="a-network-allowance-is-not-a-business-allowance"&gt;A network allowance is not a business allowance
&lt;/h3&gt;&lt;p&gt;Permitting HTTPS to a destination does not establish that the destination account, tenant or operation is approved. A successfully authenticated write can remain an unintended relationship even when every packet follows the designed route.&lt;/p&gt;
&lt;h3 id="transition-evidence-is-not-enforced-rejection"&gt;Transition evidence is not enforced rejection
&lt;/h3&gt;&lt;p&gt;NSP transition mode helps understand existing access patterns. Its presence is not proof of enforced denial. Record effective association mode and test resource-specific behavior rather than rely on the word &amp;ldquo;perimeter.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="availability-controls-have-their-own-exclusions"&gt;Availability controls have their own exclusions
&lt;/h3&gt;&lt;p&gt;DDoS offering eligibility and value-added features differ. Do not transfer a coverage claim from one public IP resource to every public endpoint in the architecture. A dependency outage or valid application overload can also remain outside the tested protection.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Give each failure condition its own matrix row, with a non-goal and a counterexample. If two products answer different questions, do not force them into a winner-and-loser comparison.&lt;/p&gt;
&lt;p&gt;An application owner should be able to read the result as a decision: &amp;ldquo;We need this boundary because of this operation, and we accept this remaining limitation.&amp;rdquo; That is more useful than a diagram carrying four security logos.&lt;/p&gt;
&lt;h3 id="assumptions-and-evidence-boundary"&gt;Assumptions and evidence boundary
&lt;/h3&gt;&lt;p&gt;These are documented control distinctions and proposed exercises, not observations from a combined tenant deployment. Before testing, record hosting/SKU and mode for WAF; Firewall tier, rule types and route; NSP onboarded resource, association API/schema and mode; DDoS offering and eligible endpoint; actual region/cloud support and diagnostic categories. Deployment APIs remain unpinned until a supported template and authorized lab are selected.&lt;/p&gt;
&lt;p&gt;Separate permissions for reading policy/configuration, changing it and performing service data operations. Testing with an administrator can conceal the authority boundary the workload actually has.&lt;/p&gt;
&lt;p&gt;For this finding, I would require every added control to constrain a named unwanted operation or support a named availability/recovery requirement. If it does neither, leave it out of this remediation decision. Any retained exception needs an owner, expiry and a compensating boundary we can actually test.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Choose controls by the question they answer. A control that works exactly as documented can still be the wrong response when the consequence sits at a different boundary.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/web-application-firewall/overview" target="_blank" rel="noopener"
&gt;Azure Web Application Firewall overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/firewall/rule-processing" target="_blank" rel="noopener"
&gt;Azure Firewall rule processing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview" target="_blank" rel="noopener"
&gt;Azure DDoS Protection overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/network-security-perimeter-concepts" target="_blank" rel="noopener"
&gt;Network Security Perimeter concepts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>From Finding to Path: Model Azure Exposure as Reachability</title><link>https://blog.brewedinthecloud.com/p/exposure-finding-to-path-reachability/</link><pubDate>Tue, 03 Nov 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/exposure-finding-to-path-reachability/</guid><description>&lt;p&gt;A finding can land at the top of the queue and still leave the engineer guessing.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Restrict access to this storage account&amp;rdquo; sounds actionable. But access from where, using which identity, to do what? Without those answers, two teams can implement different fixes and both reasonably believe they have finished.&lt;/p&gt;
&lt;p&gt;The earlier &lt;a class="link" href="https://blog.brewedinthecloud.com/p/prioritizing-external-risk-with-attack-path-context/" &gt;attack-path prioritization article&lt;/a&gt; explains why consequence should outrank finding volume. This series starts after that decision: what exactly should change, and how will we know the change worked?&lt;/p&gt;
&lt;p&gt;I would not hand that finding to engineering until we can name the path and explain how the fix could fail its test. That adds work to triage. It also avoids the more expensive conversation later: the setting changed, so why is the unwanted operation still possible?&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Start with what the compromised workload can do, not where it sits on the diagram. An exposure path connects that capability to usable authority, a network path, a destination operation and its consequence.&lt;/p&gt;
&lt;p&gt;Consider an application spoke whose workload needs to read objects from an approved private Blob destination. A second controlled destination represents somewhere it should not write. DNS, telemetry and responder access must keep working when we constrain that second path. This illustrative scenario runs through the series; the testing assumptions are collected below.&lt;/p&gt;
&lt;p&gt;Can the workload connect to the second account? That is one question. Can its identity actually write there? That is another. And if we block the connection, can the workload or its deployment pipeline change a role assignment, public access setting or route to reopen it?&lt;/p&gt;
&lt;p&gt;Those questions belong in the same record. Otherwise we risk closing the door while leaving the means to unlock it untouched.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
S[Source workload capability] --&gt; I[Effective identity authority]
S --&gt; N[DNS and network path]
I --&gt; O[Destination operation]
N --&gt; O
O --&gt; C[Reachable consequence]
M[Control-plane change authority] -. can reopen .-&gt; N
M -. can widen .-&gt; I
R[Recovery and telemetry dependencies] --&gt; V[Validation boundary]
&lt;/div&gt;
&lt;p&gt;The diagram expresses dependencies, not an Azure packet-processing order. A useful record names which edge a proposed change will constrain and which edges remain.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;h3 id="make-the-finding-an-engineering-hypothesis"&gt;Make the finding an engineering hypothesis
&lt;/h3&gt;&lt;p&gt;Give the path a stable ID, then describe it plainly: this workload, using this principal, can perform this operation against this service instance. Add the DNS answer, route and authorization scope that make the operation possible. Include who can change those conditions, not just who owns the account.&lt;/p&gt;
&lt;p&gt;Then write a claim that can fail:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;After change C, source S using principal P cannot perform operation O against controlled destination D; the approved dependency and responder path still work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is less impressive than &amp;ldquo;the account is secure.&amp;rdquo; It is also something an engineer can challenge, implement and test.&lt;/p&gt;
&lt;p&gt;The &lt;a class="link" href="https://blog.brewedinthecloud.com/azure-exposure-reduction-toolkit/#1-path-record-and-read-only-inventory" &gt;path-record module in the draft Azure Exposure Reduction Toolkit&lt;/a&gt; provides the technical companion. Its minimum fields are:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Decision it supports&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Path ID and scope version&lt;/td&gt;
&lt;td&gt;Comparing the same case across changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source, principal, destination, operation&lt;/td&gt;
&lt;td&gt;Establishing which capability is being constrained&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS, route and enforcement context&lt;/td&gt;
&lt;td&gt;Identifying where the network claim applies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role scope and control-plane owner&lt;/td&gt;
&lt;td&gt;Finding authority that can preserve or reopen access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expected result and evidence references&lt;/td&gt;
&lt;td&gt;Separating a hypothesis from a supported conclusion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Positive controls, residuals and retest triggers&lt;/td&gt;
&lt;td&gt;Preserving service and avoiding permanent assurance claims&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Inventory gives you a starting point, not a verdict. This read-only Azure Resource Graph query identifies declared Private Endpoint targets:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resources
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where type =~ &amp;#34;microsoft.network/privateendpoints&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| mv-expand connection = properties.privateLinkServiceConnections
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project endpointId = id,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; subnetId = tostring(properties.subnet.id),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; targetId = tostring(connection.properties.privateLinkServiceId),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; groupIds = connection.properties.groupIds,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Run it in Resource Graph, not a Log Analytics workspace. It covers the automatic connection property shown; manually requested connections use a different property and need separate inspection. Empty output may mean missing scope, permissions, delayed inventory or no matching resources. It does not mean no usable path exists.&lt;/p&gt;
&lt;h3 id="test-authority-and-reachability-separately"&gt;Test authority and reachability separately
&lt;/h3&gt;&lt;p&gt;Run the checks where the workload runs. A successful CLI call from an administrator&amp;rsquo;s laptop may use a different resolver, route and identity. It answers a useful question, but not necessarily the one in the finding.&lt;/p&gt;
&lt;p&gt;Use synthetic objects and scoped data permissions. The baseline must include an authorized, harmless operation that succeeds against the controlled unintended destination if the claim is that this path currently exists. If baseline access fails, investigate why; do not celebrate the same failure after the change as newly achieved reduction.&lt;/p&gt;
&lt;p&gt;After a single approved lab change, repeat the identical operation, approved dependency probe and responder-access check. Preserve request identifiers, timestamps and configuration versions. A negative result is convincing only when the positive controls still work and the rejection can be attributed to the intended boundary.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;The useful handoff is no longer &amp;ldquo;secure Storage.&amp;rdquo; It is &amp;ldquo;remove this write capability without breaking that read dependency.&amp;rdquo; Platform, identity and application owners can then divide the work without pretending one team owns every part of the path.&lt;/p&gt;
&lt;h3 id="choose-the-smaller-defensible-change"&gt;Choose the smaller defensible change
&lt;/h3&gt;&lt;p&gt;Suppose the application needs reads from account A but has inherited write authority to account B. Tightening the data role may be a smaller change than introducing a new centralized inspection dependency. Conversely, network restriction may be valuable where many identities share a reachable management surface.&lt;/p&gt;
&lt;p&gt;I would compare those changes by the capability they remove and the dependency they preserve, not by how much infrastructure they introduce. The record gives the reviewer a way to make that choice and see what remains.&lt;/p&gt;
&lt;h3 id="leave-responders-something-useful"&gt;Leave responders something useful
&lt;/h3&gt;&lt;p&gt;A path record should survive the remediation ticket. During an incident, it tells responders which dependency they can constrain, which identity scope matters, and which recovery operation must remain possible.&lt;/p&gt;
&lt;p&gt;That durability is worth the documentation burden when consequence is high. For a low-value isolated endpoint, a shorter record may be proportionate. The method should improve a decision, not create an exhaustive graph project before every change.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;A neat record can still describe the wrong path. The most important checks are the ones that catch a convincing explanation before it becomes a closure decision.&lt;/p&gt;
&lt;h3 id="reachable-does-not-mean-authorized"&gt;Reachable does not mean authorized
&lt;/h3&gt;&lt;p&gt;A successful TCP connection establishes transport, not Blob write authority. A service rejection might reflect authentication, authorization or a network policy; retain service error details rather than assigning every 403 to the firewall.&lt;/p&gt;
&lt;h3 id="a-snapshot-can-miss-reopening-authority"&gt;A snapshot can miss reopening authority
&lt;/h3&gt;&lt;p&gt;The principal used by the workload may not itself edit networking, while its deployment pipeline can. Record the separate automation identity and who can change that pipeline. The relevant authority graph includes deployment and recovery operations.&lt;/p&gt;
&lt;h3 id="context-changes-invalidate-comparison"&gt;Context changes invalidate comparison
&lt;/h3&gt;&lt;p&gt;Changing resolver, test principal, destination subresource or token state between runs changes the experiment. Cached tokens and sessions require explicit handling. Use fresh connections and record token-acquisition context without recording tokens.&lt;/p&gt;
&lt;h3 id="unknown-paths-are-not-blocked-paths"&gt;Unknown paths are not blocked paths
&lt;/h3&gt;&lt;p&gt;If role visibility or diagnostic access is incomplete, mark the path unknown. Removing an unknown record from the denominator does not improve security. It only improves the appearance of the report.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Start with the highest-consequence finding that has a controllable test boundary. Define one source, one principal, one destination operation and one proposed intervention. Expand only after the first record can be reviewed and reproduced.&lt;/p&gt;
&lt;h3 id="assumptions-and-evidence-boundary"&gt;Assumptions and evidence boundary
&lt;/h3&gt;&lt;p&gt;The proposed exercise uses synthetic objects and author-owned Blob destinations on supported general-purpose v2 Storage accounts. Service data access is separate from management-plane read access. Resource Graph needs visibility over the queried resources; the operation needs the appropriate scoped data role. Confirm CLI version, effective-route inspection support, resource API versions, region availability and diagnostic schema for the selected topology before deployment.&lt;/p&gt;
&lt;p&gt;Microsoft documents Private Endpoint connectivity and unchanged service authorization mechanisms. This article proposes a validation exercise; it does not report Azure lab results. Keep those evidence categories separate in the final record.&lt;/p&gt;
&lt;p&gt;I would close this as a removed path only when the baseline existed, the unwanted operation fails at the intended boundary, required service still works, and reopening authority is accounted for. If one of those is missing, call it a partial change or an inconclusive test. That is a useful engineering result too; it just is not the result we set out to prove.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; A good remediation claim names the capability that disappears and the dependency that survives. A resource setting without those two statements is still an implementation task, not evidence of reduced consequence.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/governance/resource-graph/overview" target="_blank" rel="noopener"
&gt;Azure Resource Graph overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/storage/common/storage-private-endpoints" target="_blank" rel="noopener"
&gt;Use private endpoints for Azure Storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/role-based-access-control/overview" target="_blank" rel="noopener"
&gt;Azure RBAC overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/prioritizing-external-risk-with-attack-path-context/" &gt;Prioritizing External Risk with Attack Path Context&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Prove the Attack Path Is Broken</title><link>https://blog.brewedinthecloud.com/p/prove-azure-workload-attack-path-broken/</link><pubDate>Thu, 29 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/prove-azure-workload-attack-path-broken/</guid><description>&lt;p&gt;The change ticket says “removed excessive access.” The role assignment is gone, the route was updated, and the review is marked complete.&lt;/p&gt;
&lt;p&gt;What changed for the workload?&lt;/p&gt;
&lt;p&gt;That question is not answered by the ticket status. A control-plane diff proves a configuration changed. It does not establish which identity the process uses now, where its hostname resolves, whether the service accepts the request, or whether an alternate path survived.&lt;/p&gt;
&lt;p&gt;If the claim is that an attack path is broken, the evidence needs to include a test of that claim.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;A useful before-and-after comparison holds the test conditions steady while changing one known edge. For a workload-to-service path, record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the source process and identity;&lt;/li&gt;
&lt;li&gt;the target operation;&lt;/li&gt;
&lt;li&gt;the service name and resolved destination;&lt;/li&gt;
&lt;li&gt;the network protocol and port;&lt;/li&gt;
&lt;li&gt;the identity/network configuration change;&lt;/li&gt;
&lt;li&gt;the request result before and after.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="mermaid"&gt;flowchart LR
W[Same workload context] --&gt; I[Same identity under test]
W --&gt; D[Same DNS question]
D --&gt; P[Observed destination]
P --&gt; S[Same service and operation]
C[Scoped control change] -. changes authority or reachability .-&gt; S
W --&gt;|repeat comparable test| S
&lt;/div&gt;
&lt;p&gt;The graph is not an inventory of every possible route. It is a record of the claim you tested and the boundary around that claim.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A control is a proposed explanation. The before-and-after request is evidence of its effect.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;h3 id="write-the-claim-so-a-failed-test-can-disprove-it"&gt;Write the claim so a failed test can disprove it
&lt;/h3&gt;&lt;p&gt;“We reduced attack paths” is not falsifiable. Try: “After removing the Blob data permission from principal A at scope B, workload C can still read its required test object, but cannot read the prohibited test object through hostname D.”&lt;/p&gt;
&lt;p&gt;That claim names an allowed operation and a denied one. It also avoids equating application outage with security improvement. If the required read fails too, the change may have removed the dependency rather than narrowed it.&lt;/p&gt;
&lt;p&gt;For a network change, specify the source, destination, protocol/port, and expected result. “Private Endpoint works” needs more detail: which service hostname, resolver context, address, and client operation? If the destination is a VM, name the listening port and test type. Record whether the source is the actual workload, a VM diagnostic, or a separate probe.&lt;/p&gt;
&lt;h3 id="capture-the-baseline-before-changing-anything"&gt;Capture the baseline before changing anything
&lt;/h3&gt;&lt;p&gt;Use a read-only, non-sensitive test object and an authorized environment. Capture the principal used by the workload, the requested operation, DNS answer from the workload&amp;rsquo;s resolver path, destination address used by the client, and connection/service outcome. Store tokens nowhere in the evidence pack.&lt;/p&gt;
&lt;p&gt;Inspect the relevant configuration as well: role definition and assignment scope, identity attachment, DNS zone/links/forwarding, routes, NSGs, firewall policy, and target service restrictions where applicable. Include only the surfaces that affect this path. A sprawling export makes it harder to see the edge you intend to test.&lt;/p&gt;
&lt;p&gt;Record time and versions. For Azure RBAC Role Assignments REST API, use a supported API version and include conditions when relevant; &lt;code&gt;2022-04-01&lt;/code&gt; supports conditions. For Network Watcher, record current source support, region enablement, diagnostic mode, and required permissions. Neither tool replaces the application&amp;rsquo;s actual request.&lt;/p&gt;
&lt;h3 id="change-one-edge-when-practical"&gt;Change one edge when practical
&lt;/h3&gt;&lt;p&gt;If you remove an identity assignment and simultaneously alter DNS, routes, and firewall policy, a failed request tells you the path changed, but not which change mattered. Incident containment may require several actions at once; a controlled architecture test should isolate the change where practical.&lt;/p&gt;
&lt;p&gt;Keep the control-plane diff and the data-plane result separate. The diff is evidence of intent and scope. The request result is evidence of observed behaviour under test. If they disagree, investigate rather than choosing the more convenient one.&lt;/p&gt;
&lt;h3 id="retest-the-allowed-and-denied-cases"&gt;Retest the allowed and denied cases
&lt;/h3&gt;&lt;p&gt;Repeat the required operation from the same workload context. Then try one carefully selected operation or object that should remain denied. Keep the same source, identity, hostname, and protocol unless the change intentionally alters them. If the path is supposed to be unreachable, record an actual connection failure plus supporting route/policy evidence.&lt;/p&gt;
&lt;p&gt;Do not claim “all access is gone” from one denied read. It says that request failed in that context and at that time. The service may have other data operations, identities, DNS answers, or network paths that were not part of the test.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;The value of the evidence pack is not a more impressive audit trail. It is preventing the team from shipping a security change that simply moves the failure somewhere less visible.&lt;/p&gt;
&lt;p&gt;For example, a role change might cause the target read to fail while the application falls back to a public endpoint and a different credential. If the only retest is “the app still works,” the path may be less contained than before. Conversely, a TCP failure from a diagnostic source might be caused by the target not listening, while the actual workload remains able to reach it through a proxy.&lt;/p&gt;
&lt;p&gt;Use one compact record per claimed path:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Record item&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workload/process and principal&lt;/td&gt;
&lt;td&gt;Identified runtime context&lt;/td&gt;
&lt;td&gt;Same context or documented change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operation&lt;/td&gt;
&lt;td&gt;Required and prohibited test action&lt;/td&gt;
&lt;td&gt;Same actions, same test data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;td&gt;Resolver and answer chain&lt;/td&gt;
&lt;td&gt;Resolver and answer chain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;Source, destination, protocol/port, result&lt;/td&gt;
&lt;td&gt;Comparable source and test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change&lt;/td&gt;
&lt;td&gt;None or baseline configuration&lt;/td&gt;
&lt;td&gt;Exact role/DNS/route/policy diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service outcome&lt;/td&gt;
&lt;td&gt;Response and timestamp&lt;/td&gt;
&lt;td&gt;Response and timestamp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boundary&lt;/td&gt;
&lt;td&gt;Untested sources/targets/operations&lt;/td&gt;
&lt;td&gt;Remaining paths and uncertainty&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The table does not prove a whole estate is safe. It helps the owner state what improved, what remained available, and what still needs investigation.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;Before-and-after evidence can look objective while quietly comparing different tests. A new token, a different source VM, a changed DNS cache, or a different service operation can alter the outcome without demonstrating that the control worked.&lt;/p&gt;
&lt;h3 id="changes-can-have-propagation-and-cache-effects"&gt;Changes can have propagation and cache effects
&lt;/h3&gt;&lt;p&gt;Identity authorization, DNS, routes, and connections do not all change on the same clock. Verify the relevant service behaviour and record when each test ran. Do not invent a fixed convergence time or treat the first result after a change as permanent.&lt;/p&gt;
&lt;h3 id="a-denial-can-have-the-wrong-cause"&gt;A denial can have the wrong cause
&lt;/h3&gt;&lt;p&gt;A permission error, timeout, DNS failure, and connection refusal are different results. Capture the service error or diagnostic reason. A generic “failed” status cannot tell you whether authority, name resolution, routing, a firewall, or the target itself stopped the operation.&lt;/p&gt;
&lt;h3 id="negative-testing-needs-a-safe-boundary"&gt;Negative testing needs a safe boundary
&lt;/h3&gt;&lt;p&gt;Do not probe arbitrary tenant resources to see what else is reachable. Define the allowed and denied test targets in advance, use non-sensitive data, and obtain authorization. The prohibited case should be representative enough to test the control without turning the validation into uncontrolled discovery.&lt;/p&gt;
&lt;h3 id="evidence-can-go-stale"&gt;Evidence can go stale
&lt;/h3&gt;&lt;p&gt;A result applies to the tested configuration and time. New identity assignments, DNS links, endpoint changes, or routes can reopen a path. Decide which changes invalidate the record and who owns the retest. Otherwise, the evidence pack becomes another static diagram.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Keep a durable statement of the claim, the test tuple, the control change, and the result. Store enough information for another engineer to reproduce the request, but never include access tokens or sensitive payloads. Use the same workload context and safe test data before and after whenever possible.&lt;/p&gt;
&lt;p&gt;Separate three conclusions: whether the configuration changed as intended; whether the required operation still works; and whether the prohibited path now fails for the intended reason. If any answer is unknown, say so. It is more useful than converting uncertainty into a green status.&lt;/p&gt;
&lt;p&gt;Finally, treat the evidence as scoped and time-bound. Re-run it after a relevant edge changes and leave a list of untested identities, destinations, and operations. “We broke this path under these conditions” is a defensible result. “The workload has no attack paths” almost never is.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; The proof isn&amp;rsquo;t that the role assignment disappeared or the firewall rule changed. The proof is the same workload request, tested again, with the intended dependency preserved and the unnecessary consequence removed.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/role-assignments-list-rest" target="_blank" rel="noopener"
&gt;List Azure role assignments using the REST API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/network-watcher/connection-troubleshoot-overview" target="_blank" rel="noopener"
&gt;Connection troubleshoot overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/private-link/private-endpoint-dns" target="_blank" rel="noopener"
&gt;Azure Private Endpoint private DNS zone values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/storage/blobs/authorize-access-azure-active-directory" target="_blank" rel="noopener"
&gt;Authorize blob access with Microsoft Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"
&gt;Managed identities for Azure resources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Cut Both Edges: Identity and Network Containment</title><link>https://blog.brewedinthecloud.com/p/cut-both-edges-identity-network-containment/</link><pubDate>Tue, 27 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/cut-both-edges-identity-network-containment/</guid><description>&lt;p&gt;The incident call starts with a familiar instruction: block the workload.&lt;/p&gt;
&lt;p&gt;Block it where? Remove its role? Disable its identity? Deny its subnet? Isolate the VM? Each action sounds like containment until you ask what the other half of the path can still do—and which production dependency you just cut along with it.&lt;/p&gt;
&lt;p&gt;When an application is compromised, the objective is not to demonstrate that someone can make a control-plane change. It is to reduce the attacker&amp;rsquo;s options without losing the services responders still need. That requires an identity decision and a network decision made against the same path.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;For a workload-to-resource path, identity and networking enforce different conditions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity determines which operation the principal can perform at the service.&lt;/li&gt;
&lt;li&gt;DNS and network policy determine how the workload locates and reaches the service.&lt;/li&gt;
&lt;li&gt;The service and application determine what happens to the request and whether the dependency still functions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Changing one edge may be the right first move. It does not prove the full path is broken.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
W[Compromised workload] --&gt;|network and DNS path| S[Target service]
I[Workload identity] --&gt;|authorized operation| S
R[Responder] --&gt;|containment change| I
R --&gt;|containment change| W
S --&gt;|required business dependency| A[Application function]
&lt;/div&gt;
&lt;p&gt;There is no universal “revoke first, block second” sequence. The right order depends on confidence, service impact, control-plane integrity, and how quickly the attacker can use the remaining path. That uncertainty should be in the runbook before the pager goes off.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Containment is not complete because a rule changed. It is complete when the tested consequence fell and the required service still behaves as intended.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;h3 id="identity-only-containment"&gt;Identity-only containment
&lt;/h3&gt;&lt;p&gt;Removing or reducing an identity assignment can narrow what the principal is authorized to do. Disabling an identity or changing workload configuration may be appropriate when the workload itself is untrusted. These actions do not automatically establish that the process cannot reach the destination, and the operational timing of authorization changes must be verified for the specific service and request.&lt;/p&gt;
&lt;p&gt;Identity-only action can be useful when network paths are shared by many healthy services and the suspicious workload&amp;rsquo;s authority is the clearest edge to remove. It can be less disruptive than blocking an entire subnet. But if the workload has another identity, a cached credential path, or can invoke an intermediary with its own authority, one removed assignment may leave the consequence intact.&lt;/p&gt;
&lt;h3 id="network-only-containment"&gt;Network-only containment
&lt;/h3&gt;&lt;p&gt;Restricting egress, isolating a VM, changing a route, or applying a narrowly scoped deny can stop a known source from contacting a target. This can buy responders time when they do not yet trust the workload or identity. It may also cut DNS, monitoring, package feeds, identity endpoints, or shared services needed for investigation and recovery.&lt;/p&gt;
&lt;p&gt;Blocking the subnet is fast to explain and often expensive to operate. If unrelated workloads share it, the containment boundary is larger than the incident boundary. A network action also does not remove the identity&amp;rsquo;s authority from other attached resources or alternate paths.&lt;/p&gt;
&lt;h3 id="coordinated-containment"&gt;Coordinated containment
&lt;/h3&gt;&lt;p&gt;When evidence supports it, make a paired plan: reduce the identity authority that matters and restrict the network path from the compromised source. Keep the service dependency that healthy workloads require, or move those workloads to a known-good path if that has been rehearsed.&lt;/p&gt;
&lt;p&gt;The plan needs an owner for each action, the exact target scope, a rollback or escalation condition, and a test that will show whether it worked. Don&amp;rsquo;t improvise a broad role deletion or shared firewall policy edit during an incident if a narrower, pre-approved option exists.&lt;/p&gt;
&lt;h3 id="separate-the-control-plane-action-from-the-outcome"&gt;Separate the control-plane action from the outcome
&lt;/h3&gt;&lt;p&gt;Record the change request and the actual outcome. For identity, capture the principal, role/action, scope, and service operation under test. For networking, capture source, resolved destination, protocol/port, route or policy change, and connection result. Then test the expected legitimate operation from a known-good workload.&lt;/p&gt;
&lt;p&gt;Azure Activity Log or resource configuration can help show that a control-plane change was submitted or recorded. That is not the same as evidence that every affected data-plane request now behaves as intended. Use service-specific documentation and a safe test to establish the effect; avoid promising a universal propagation interval.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Suppose a compromised image-processing VM reads uploaded content from Blob Storage using a managed identity. The same subnet hosts a clean service that writes audit records to the same account.&lt;/p&gt;
&lt;p&gt;A subnet-wide deny may interrupt both applications and remove the logs responders wanted to keep. Removing a role assignment may stop the suspicious read but leave the compromised process able to reach other services through a shared identity or an intermediary. Doing both without checking dependencies can convert a security incident into an outage and still fail to close the path.&lt;/p&gt;
&lt;p&gt;Before the incident, make a containment decision record:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;th&gt;Record before approval&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identity action&lt;/td&gt;
&lt;td&gt;Principal, exact assignment/permission, scope, affected workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network action&lt;/td&gt;
&lt;td&gt;Source resource/subnet, destination, protocol/port, DNS dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Required service&lt;/td&gt;
&lt;td&gt;What must remain reachable for healthy workloads and responders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence&lt;/td&gt;
&lt;td&gt;Baseline request, DNS answer, connection result, and known residual paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trigger&lt;/td&gt;
&lt;td&gt;Confidence or condition that justifies the action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recovery&lt;/td&gt;
&lt;td&gt;Owner, rollback criteria, and retest required before reconnecting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;During the incident, this does not remove the need for judgment. It makes the consequences visible before a responder has to choose under pressure.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The safest containment action on a diagram can be the most damaging one in a running service. Shared identities and shared subnets are common because they simplify operations; incidents expose the cost of that coupling.&lt;/p&gt;
&lt;h3 id="existing-tokens-and-sessions-complicate-timing"&gt;Existing tokens and sessions complicate timing
&lt;/h3&gt;&lt;p&gt;Submitting a role or identity change does not let you claim that every in-flight operation stopped at that instant. Token lifetime, service-side checks, caches, existing connections, and application retries can affect what responders observe. Check the service&amp;rsquo;s current documentation and verify behaviour in a controlled test; do not rely on a universal “revoked in N minutes” statement.&lt;/p&gt;
&lt;h3 id="shared-identities-expand-the-containment-boundary"&gt;Shared identities expand the containment boundary
&lt;/h3&gt;&lt;p&gt;Removing an assignment from a user-assigned identity can affect every workload relying on it. Disabling or detaching it from one compute resource may not change what another attached resource can request. Inventory the identity&amp;rsquo;s assignments and attachments before using it as a single-workload kill switch.&lt;/p&gt;
&lt;h3 id="isolation-can-remove-the-evidence-you-need"&gt;Isolation can remove the evidence you need
&lt;/h3&gt;&lt;p&gt;The compromised workload may need to be cut off from external destinations while preserving a telemetry path to a trusted collection point. If the isolation design also removes DNS, management, or logging access, responders need a separate out-of-band method. Test this before relying on it.&lt;/p&gt;
&lt;h3 id="the-control-plane-may-be-part-of-the-incident"&gt;The control plane may be part of the incident
&lt;/h3&gt;&lt;p&gt;If the attacker can change routes, NSGs, firewall policy, or role assignments, responders need confidence in the administrative identity and control path they use to contain the workload. A containment action performed through a compromised authority path can be undone or misrepresented.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Design at least three rehearsed options: identity reduction, source isolation, and coordinated containment. For each, name the scope, required permissions, expected service impact, telemetry retained, and recovery trigger. Favor reversible actions with a clear owner, but do not let reversibility become an excuse to defer a needed boundary change.&lt;/p&gt;
&lt;p&gt;During response, establish the smallest useful path first: compromised source, identity, target operation, resolver, and route. Choose containment against that path, not against the easiest resource group or subnet label. If evidence is incomplete, say so and choose a bounded action that buys time without pretending the residual risk is gone.&lt;/p&gt;
&lt;p&gt;Afterward, repeat the original request from the affected workload or a safe equivalent and test the healthy dependency from a known-good source. Document both results. A stopped attacker path and a working business function are separate acceptance criteria; you need both before declaring recovery complete.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Identity-only containment can leave a reachable service. Network-only containment can leave portable authority. Under pressure, know which edge you are cutting—and what still depends on it.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/assume-breach-network-isolation-during-compromise" target="_blank" rel="noopener"
&gt;Network isolation during active compromise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/assume-breach-networks-fail-safely-under-breach-conditions" target="_blank" rel="noopener"
&gt;Networks that fail safely under breach conditions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"
&gt;Managed identities for Azure resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/network-watcher/rbac-permissions" target="_blank" rel="noopener"
&gt;Azure RBAC permissions for Network Watcher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/platform/activity-log" target="_blank" rel="noopener"
&gt;Azure Activity Log&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Disable Peering Route Propagation in Azure (Preview)</title><link>https://blog.brewedinthecloud.com/p/azure-peering-route-propagation-preview/</link><pubDate>Sun, 25 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-peering-route-propagation-preview/</guid><description>&lt;p&gt;You&amp;rsquo;ve pointed a summary route at the firewall, but traffic to a peered spoke still goes directly to the destination. Check the prefixes: a more-specific system peering route can beat your user-defined route (UDR).&lt;/p&gt;
&lt;p&gt;For engineers operating hub-and-spoke inspection, &lt;strong&gt;disable peering route propagation (preview)&lt;/strong&gt; offers a way to remove those competing peering routes instead of maintaining an override for every spoke. The useful outcome is less repeated route maintenance while keeping selected traffic on the inspection path.&lt;/p&gt;
&lt;p&gt;There is one eligibility check to make before trying it: &lt;strong&gt;during preview, the firewall or network virtual appliance (NVA) next hop must be in the same VNet as the source workload NIC.&lt;/strong&gt; A workload in the hub can meet that rule with a hub appliance. If your main problem is steering spoke-originated traffic through a firewall located only in the peered hub, this preview doesn&amp;rsquo;t currently solve it. That is a restriction of this preview feature, not a prohibition on ordinary UDR service chaining.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Peering provides connectivity; routes determine which next hop a packet uses. This setting removes system-generated peering routes for supported workloads on the subnets associated with a route table. Your UDRs still have to supply the intended path.&lt;/p&gt;
&lt;p&gt;Consider this illustrative hub-side workload, with the appliance in the same VNet and two peered spokes:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Next hop&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;System peering route&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.0/16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Peering to spoke A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System peering route&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.21.0.0/16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Peering to spoke B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User-defined summary&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.0/15&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hub appliance at &lt;code&gt;10.0.2.4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Before suppression, traffic to &lt;code&gt;10.20.1.10&lt;/code&gt; follows the &lt;code&gt;/16&lt;/code&gt; peering route, not the &lt;code&gt;/15&lt;/code&gt; UDR. Longest prefix match comes first; being user-defined doesn&amp;rsquo;t make a broader route win. After suppression, those peering routes are removed from consideration, allowing the summary UDR to select the appliance, assuming no other winning route exists.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the change: remove the competing automatic routes, not change Azure&amp;rsquo;s route-precedence rules.&lt;/p&gt;
&lt;p&gt;You can already override those system routes with matching-prefix UDRs: at an equal prefix length, a UDR takes precedence over a system peering route. This preview doesn&amp;rsquo;t introduce inspection as a new capability. It exchanges repeated per-peer route configuration for responsibility for every required peering path affected by suppression. &lt;strong&gt;Less route maintenance, more responsibility for route completeness&lt;/strong&gt; is the trade-off.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Peering stays configured. Whether traffic still gets through depends on the replacement routes and the appliance path.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;The control lives on the route table as &lt;code&gt;disablePeeringRoute&lt;/code&gt;. By default, &lt;code&gt;None&lt;/code&gt; keeps system-generated peering routes; set it to &lt;code&gt;All&lt;/code&gt; to suppress generated IPv4 and IPv6 peering routes for supported workloads on associated subnets.&lt;/p&gt;
&lt;p&gt;The scope is easy to misread: it&amp;rsquo;s a route-table setting, not a switch on each peering connection. Every associated subnet inherits it for supported workloads. It doesn&amp;rsquo;t let you suppress just one chosen peer. Use separate tables when subnet routing policies differ.&lt;/p&gt;
&lt;p&gt;Before configuration, register the &lt;code&gt;Microsoft.Network/AllowDisablePeeringRoutes&lt;/code&gt; preview feature in the subscription that contains the route table. The setting is available through the Azure portal, CLI, and PowerShell; REST, ARM, and Bicep deployments need route-table API version &lt;code&gt;2025-07-01&lt;/code&gt; or later.&lt;/p&gt;
&lt;p&gt;For PowerShell, use Az.Network 8.1.0 or later. Sign in, select the subscription that owns the route table, and request preview registration once:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Connect-AzAccount&lt;/span&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Set-AzContext&lt;/span&gt; &lt;span class="n"&gt;-SubscriptionId&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;subscription-id&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Register-AzProviderFeature&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-FeatureName&lt;/span&gt; &lt;span class="n"&gt;AllowDisablePeeringRoutes&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ProviderNamespace&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Network&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Registration may take time. Run the following check again later if it isn&amp;rsquo;t ready; there&amp;rsquo;s no need to repeat the registration request. Refresh the network provider only after the feature reports &lt;code&gt;Registered&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$feature&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-AzProviderFeature&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-FeatureName&lt;/span&gt; &lt;span class="n"&gt;AllowDisablePeeringRoutes&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ProviderNamespace&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Network&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$feature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;RegistrationState&lt;/span&gt; &lt;span class="o"&gt;-ne&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Registered&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Preview feature state is &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$feature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegistrationState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;. Wait for Registered, then run this block again.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Register-AzResourceProvider&lt;/span&gt; &lt;span class="n"&gt;-ProviderNamespace&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Network&lt;/span&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The next example assumes the route table already exists and is associated with the source subnet. Choose a destination prefix that matches only traffic intended for inspection, and use an appliance private IP in the same VNet as the source workload NIC. It adds the UDR and enables peering-route suppression together:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;resource-group&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$routeTableName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;route-table-name&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$routeName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;inspect-spoke-ranges&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$destinationPrefix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;summarized-spoke-prefix&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$appliancePrivateIp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;nva-private-ip&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$routeTable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-AzRouteTable&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$routeTableName&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$routeTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;-contains&lt;/span&gt; &lt;span class="nv"&gt;$routeName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Route &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$routeName&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; already exists. Review or update it explicitly before continuing.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$routeTable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Add-AzRouteConfig&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$routeName&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-AddressPrefix&lt;/span&gt; &lt;span class="nv"&gt;$destinationPrefix&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-NextHopType&lt;/span&gt; &lt;span class="n"&gt;VirtualAppliance&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-NextHopIpAddress&lt;/span&gt; &lt;span class="nv"&gt;$appliancePrivateIp&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-RouteTable&lt;/span&gt; &lt;span class="nv"&gt;$routeTable&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$routeTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DisablePeeringRoute&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;All&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Set-AzRouteTable&lt;/span&gt; &lt;span class="n"&gt;-RouteTable&lt;/span&gt; &lt;span class="nv"&gt;$routeTable&lt;/span&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$updatedRouteTable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-AzRouteTable&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$routeTableName&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$updatedRouteTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DisablePeeringRoute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$updatedRouteTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Routes&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="nv"&gt;$routeName&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Select-Object&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AddressPrefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NextHopType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NextHopIpAddress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is a documented configuration example, not a report of an executed Azure test. It leaves existing routes and subnet associations in place; it doesn&amp;rsquo;t configure the appliance or its onward path. The final output confirms saved configuration, not effective forwarding. Review the existing routes and all associated subnets before applying it; pause other writers to the table while making the change.&lt;/p&gt;
&lt;p&gt;To restore peering-route propagation, retrieve the table again, set &lt;code&gt;DisablePeeringRoute&lt;/code&gt; to &lt;code&gt;&amp;quot;None&amp;quot;&lt;/code&gt;, and save it with &lt;code&gt;Set-AzRouteTable&lt;/code&gt;. That alone isn&amp;rsquo;t a full rollback: the added UDR remains, and existing overrides still affect route selection. Preserve the original configuration and restore the routes your change plan requires.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;The best fit is a growing hub-and-spoke network where eligible source subnets need the same inspection path to multiple spokes. Microsoft&amp;rsquo;s overview describes using suppression with a summary UDR to avoid maintaining an override for every peer. The day-to-day benefit is fewer route edits when another spoke joins that same routing policy.&lt;/p&gt;
&lt;h3 id="a-more-manageable-hub-and-spoke-route-table"&gt;A more manageable hub-and-spoke route table
&lt;/h3&gt;&lt;p&gt;Take a shared-service workload in the hub that contacts applications in the two spokes from the earlier example. Both destinations require inspection by the hub appliance. Without suppression, you might maintain &lt;code&gt;/16&lt;/code&gt; UDR overrides to beat the matching system peering routes. With suppression on the source subnet&amp;rsquo;s route table, the &lt;code&gt;/15&lt;/code&gt; summary can express that shared intent.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
subgraph Hub VNet
Source["Hub source subnet"]
Appliance["Firewall or NVA"]
end
Spoke["Destination in peered spoke VNet"]
Source --&gt;|"UDR: spoke prefix"| Appliance
Appliance --&gt;|"Forwarded traffic over peering"| Spoke
&lt;/div&gt;
&lt;p&gt;The appliance must still forward traffic over peering to the destination. Don&amp;rsquo;t apply the source subnet&amp;rsquo;s suppression policy blindly to the appliance subnet: removing the appliance&amp;rsquo;s onward routes or sending it back to itself can break the path you&amp;rsquo;re trying to build.&lt;/p&gt;
&lt;p&gt;For a stateful inspection design, the spoke&amp;rsquo;s response to the hub workload must also traverse the intended appliance path. The spoke may need a matching-prefix UDR for that return destination to override its direct peering route; changing the hub source table doesn&amp;rsquo;t configure this return route. The example shows the outbound route-selection change, not a complete bidirectional deployment.&lt;/p&gt;
&lt;h3 id="when-i-would-keep-explicit-routes"&gt;When I would keep explicit routes
&lt;/h3&gt;&lt;p&gt;Suppose the next spoke needs a different appliance or must bypass this inspection path. Don&amp;rsquo;t widen the summary just to keep the table short. Keep its route explicit and review the remaining effective routes before enabling suppression for that source subnet.&lt;/p&gt;
&lt;p&gt;My recommendation is to use this where the routing intent is genuinely repetitive and the address plan makes summarization safe. If every spoke needs an exception, a smaller table isn&amp;rsquo;t worth making the packet path harder to explain. This feature controls route propagation; it doesn&amp;rsquo;t centralize firewall management or replace destination-specific policy.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The outage pattern is deceptively quiet: peering still shows connected, but an application times out because its old system route is gone and its replacement UDR is missing, wrong, or points to an appliance that cannot forward the flow. A healthy peering status does not validate the new path.&lt;/p&gt;
&lt;h3 id="suppression-covers-more-than-the-summary"&gt;Suppression covers more than the summary
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;All&lt;/code&gt; suppresses generated IPv4 and IPv6 peering routes, not just the destinations covered by your new UDR. Inventory every peer and required destination first. One IPv4 summary won&amp;rsquo;t replace other IPv4 paths or any IPv6 paths you still need.&lt;/p&gt;
&lt;h3 id="route-selection-isnt-end-to-end-inspection"&gt;Route selection isn&amp;rsquo;t end-to-end inspection
&lt;/h3&gt;&lt;p&gt;Other routes can still win. This property doesn&amp;rsquo;t disable BGP route propagation, and it doesn&amp;rsquo;t remove existing UDRs. Check the effective route for each test destination rather than assuming suppression makes the summary authoritative.&lt;/p&gt;
&lt;p&gt;Forwarding, firewall policy, NSGs, peering settings for forwarded traffic, and the return path are separate work. For a custom NVA, verify IP forwarding at the Azure NIC and appliance/OS layers. With a stateful firewall, asymmetric return traffic can break an otherwise plausible outbound design.&lt;/p&gt;
&lt;h3 id="preview-workload-and-tooling-exclusions"&gt;Preview workload and tooling exclusions
&lt;/h3&gt;&lt;p&gt;Azure BareMetal Infrastructure workloads aren&amp;rsquo;t covered: they retain standard longest-prefix-match behavior even when sharing a subnet with supported workloads. Terraform currently requires the AzAPI provider rather than AzureRM. Manage this preview setting on the route table, not through Azure Virtual Network Manager routing rule collections. Behavior and availability may change; check the current documentation before deployment.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Start with a dedicated canary source subnet and route table, not a table shared across production. Capture the original configuration and effective routes, then record a small test matrix: source NIC, destination IP, protocol/port, expected next hop, and expected application result. Include both inspected destinations and destinations outside the summary.&lt;/p&gt;
&lt;p&gt;After applying the change, check three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Route selection:&lt;/strong&gt; generated peering routes are suppressed for the supported source NIC, and the intended UDR selects the appliance for each inspected destination. Required paths outside the summary still have the correct route.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actual traffic:&lt;/strong&gt; bidirectional application tests succeed, and appliance telemetry shows the tested flows being processed. A successful connection alone doesn&amp;rsquo;t prove inspection; effective routes alone don&amp;rsquo;t prove packet delivery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance reduction:&lt;/strong&gt; compare the routes before and after. Retire redundant per-spoke overrides only after validating the replacement path; the PowerShell example deliberately doesn&amp;rsquo;t delete them.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If a required flow fails or takes an unexpected path, stop expansion and restore the captured route configuration, including the suppression setting. Agree on who performs that rollback before the change window. Repeat the checks when adding peers, changing address ranges, or introducing route exceptions.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Use this preview when many routes express the same inspection policy, not simply when the route table looks busy. Keep explicit routes where exceptions carry important intent. A shorter route table is only an improvement if the resulting packet path remains easy to explain.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/configure-disable-peering-route-propagation?tabs=portal" target="_blank" rel="noopener"
&gt;Configure disable peering route propagation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-peering-overview#disable-peering-route-propagation-preview" target="_blank" rel="noopener"
&gt;Azure Virtual Network Peering: disable peering route propagation (preview)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;User-defined routes overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/diagnose-network-routing-problem" target="_blank" rel="noopener"
&gt;Diagnose a virtual machine routing problem&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Can the Packet Reach the Identity’s Target?</title><link>https://blog.brewedinthecloud.com/p/can-packet-reach-identity-target/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/can-packet-reach-identity-target/</guid><description>&lt;p&gt;The access review says the workload identity can read the storage account. The network diagram says the subnet has no route to it.&lt;/p&gt;
&lt;p&gt;Which one is right?&lt;/p&gt;
&lt;p&gt;Possibly both. Azure RBAC describes authority. Routes, DNS, firewalls, and network security groups shape reachability. Until you test the same source, destination, protocol, and operation, those documents are describing different slices of the system.&lt;/p&gt;
&lt;p&gt;There is a familiar temptation here: treat a “reachable” result as an attack path, or an “unreachable” result as containment. Both conclusions get ahead of the evidence.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;A network test answers a narrow question: from this source, can a particular kind of connection be established to this destination at this time?&lt;/p&gt;
&lt;p&gt;It does not answer whether the workload has permission to perform an operation once connected. Nor does a role assignment answer whether the packets can get there.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
W[Workload source] --&gt;|DNS chooses destination| D[Resolved address]
D --&gt;|route and policy for protocol/port| N[Network path]
N --&gt;|connection may succeed| S[Target service]
I[Workload identity] --&gt;|authorization for operation| S
&lt;/div&gt;
&lt;p&gt;The testable claim is not “the identity can reach storage.” It is more like: “This VM&amp;rsquo;s application process resolves this hostname to this address, can establish TCP 443, and can read this test object using this principal.”&lt;/p&gt;
&lt;p&gt;That sentence is longer because the architecture is more complicated than one green check.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Reachability is a property of a tested source, destination, protocol, and time—not an enduring property of an identity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;h3 id="fix-the-test-tuple-before-you-run-a-probe"&gt;Fix the test tuple before you run a probe
&lt;/h3&gt;&lt;p&gt;Record the source resource and actual runtime context, target FQDN or IP, expected resolver, protocol, destination port, and the business operation to test. For a workload identity path, capture the principal ID and the exact data or service action separately.&lt;/p&gt;
&lt;p&gt;Avoid a vague scan of “the subnet.” A VM and a container on that VM may have different local firewall, proxy, DNS, or identity behaviour. A subnet-level effective rule view can explain policy, but it cannot prove what a process used.&lt;/p&gt;
&lt;p&gt;For this article&amp;rsquo;s example, assume an Azure VM application connects to an Azure Storage Blob private endpoint using the service hostname and HTTPS on TCP 443. It is illustrative; no test was run against an Azure subscription. Record actual VM/Storage SKUs, region, endpoint subresource, resolver configuration, and client SDK/API version before applying the method to a tenant.&lt;/p&gt;
&lt;h3 id="use-diagnostics-for-the-question-they-can-answer"&gt;Use diagnostics for the question they can answer
&lt;/h3&gt;&lt;p&gt;Azure Network Watcher&amp;rsquo;s Connection troubleshoot supports TCP or ICMP tests from documented sources including virtual machines and virtual machine scale sets to destinations including VMs, FQDNs, URIs, and IP addresses. Its results can surface connectivity, DNS, route, NSG, and other supported configuration issues. The agentless experience is currently documented as preview; feature availability and behaviour need to be checked for the target environment.&lt;/p&gt;
&lt;p&gt;That is useful. It is not an application transaction. A TCP success says a connection probe reached a listening port under the tested conditions. It does not prove the application resolved the same name, used the same proxy, negotiated TLS as expected, or presented the identity you reviewed. A TCP failure can come from the target not listening, a guest firewall, a missing route, policy, or a diagnostic prerequisite—not necessarily the security boundary you meant to test.&lt;/p&gt;
&lt;p&gt;Pair the diagnostic with a test from the actual workload context. Resolve the application hostname there, record the address, then attempt a safe connection. Where practical, make a non-mutating application request with the intended identity. Keep results separate so one tool&amp;rsquo;s scope is not mistaken for another&amp;rsquo;s.&lt;/p&gt;
&lt;h3 id="inspect-policy-but-dont-confuse-it-with-observation"&gt;Inspect policy, but don&amp;rsquo;t confuse it with observation
&lt;/h3&gt;&lt;p&gt;Review the effective route, relevant NSG rules, Azure Firewall or network virtual appliance policy, peering/gateway path, and target-side restrictions that apply to the source/destination tuple. Which surfaces matter depends on the topology. A route table screenshot without the effective next hop is not enough; an NSG allow rule does not prove the target is listening.&lt;/p&gt;
&lt;p&gt;For Network Watcher, confirm the service is enabled in the source VM&amp;rsquo;s region and check its current RBAC permission requirements. Built-in Network Contributor, Contributor, and Owner roles can include broad actions; custom roles may be more appropriate after verifying the exact diagnostic actions. Do not expand permissions merely to make a one-time test convenient.&lt;/p&gt;
&lt;p&gt;The diagnostic data model, API version, supported sources, and permission set can change. This draft does not call a Network Watcher REST API, query a log schema, or assume a specific VM agent/extension. Name those versions and prerequisites when a real implementation uses them.&lt;/p&gt;
&lt;h3 id="test-the-service-operation-separately"&gt;Test the service operation separately
&lt;/h3&gt;&lt;p&gt;If TCP connects, use the workload&amp;rsquo;s credential path to attempt one safe, read-only operation. For Blob Storage with Microsoft Entra ID, the data service evaluates authorization for the request; network reachability does not make the request permitted.&lt;/p&gt;
&lt;p&gt;If the operation fails, record the service response and identity used. If it succeeds, record the object and operation. Avoid logging bearer tokens. The test should use non-sensitive data and a principal with only the access required for that test.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Suppose a workload has a role that appears to permit access to a sensitive data store, but the test from its current source cannot reach the target. That is worth investigating, but it is not a reason to leave the role untouched forever. The route may change; a proxy or alternate path may exist; another workload may share the identity.&lt;/p&gt;
&lt;p&gt;Now reverse the result. The TCP probe succeeds, but the data operation is denied. Adding more network blocks might not reduce the specific authority exposure at all. The intended identity may not be in use, or the permission may be missing. An error message and principal ID are more useful than another blanket rule.&lt;/p&gt;
&lt;p&gt;Use a reachability matrix that records both positive and negative cases:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Destination&lt;/th&gt;
&lt;th&gt;Protocol/port&lt;/th&gt;
&lt;th&gt;Network result&lt;/th&gt;
&lt;th&gt;Service operation&lt;/th&gt;
&lt;th&gt;Interpretation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workload process&lt;/td&gt;
&lt;td&gt;Intended endpoint&lt;/td&gt;
&lt;td&gt;TCP 443&lt;/td&gt;
&lt;td&gt;Observed result&lt;/td&gt;
&lt;td&gt;Safe read as target identity&lt;/td&gt;
&lt;td&gt;Tests intended path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same source&lt;/td&gt;
&lt;td&gt;Known out-of-scope endpoint&lt;/td&gt;
&lt;td&gt;TCP 443&lt;/td&gt;
&lt;td&gt;Observed result&lt;/td&gt;
&lt;td&gt;No data operation&lt;/td&gt;
&lt;td&gt;Challenges network boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same source&lt;/td&gt;
&lt;td&gt;Intended service name&lt;/td&gt;
&lt;td&gt;TCP 443&lt;/td&gt;
&lt;td&gt;Observed result&lt;/td&gt;
&lt;td&gt;Same read with wrong/unauthorized identity, if safe&lt;/td&gt;
&lt;td&gt;Separates reachability from authority&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Fill this in only from real tests. A blank or untested cell is not “denied.” Re-test after the change and retain the exact source, destination, protocol, timestamp, and identity so another engineer can reproduce the claim.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The gap between control-plane configuration and a running process is where confident conclusions tend to get expensive. A clean route analysis can coexist with an application outage; a successful probe can coexist with a broken trust boundary.&lt;/p&gt;
&lt;h3 id="diagnostic-sources-may-not-match-the-process"&gt;Diagnostic sources may not match the process
&lt;/h3&gt;&lt;p&gt;Connection troubleshoot operates from supported Azure resource types and test modes. A test from a VM does not automatically represent every container, sidecar, proxy, or application library on that VM. Record what emitted the traffic and what did not.&lt;/p&gt;
&lt;h3 id="a-port-test-can-pass-for-the-wrong-service"&gt;A port test can pass for the wrong service
&lt;/h3&gt;&lt;p&gt;An address can accept TCP without being the intended service. Check DNS, destination ownership, TLS/service identity, and the application response. Do not treat “socket opened” as equivalent to “request reached the intended resource.”&lt;/p&gt;
&lt;h3 id="network-policy-is-not-the-only-failure-domain"&gt;Network policy is not the only failure domain
&lt;/h3&gt;&lt;p&gt;Guest firewall, process configuration, server listener state, DNS, service firewall, and platform diagnostic prerequisites may all affect results. Classify the failure before proposing a security change. If the diagnostic itself needs permissions or connectivity the workload lacks, that is not proof the workload&amp;rsquo;s normal path is blocked.&lt;/p&gt;
&lt;h3 id="one-successful-test-ages-quickly"&gt;One successful test ages quickly
&lt;/h3&gt;&lt;p&gt;Routes, DNS, identities, and policy change independently. A reachability result is a snapshot, not a perpetual guarantee. Preserve its time and configuration context, and decide which changes invalidate it.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Before changing policy, write down what a passing test means. Specify the workload context, FQDN and expected destination, TCP/ICMP choice, port, identity, operation, and what result should be denied. Then use a diagnostic that answers the network question and a separate request that answers the authorization question.&lt;/p&gt;
&lt;p&gt;When results disagree, don&amp;rsquo;t average them. If the network probe succeeds and the service denies access, inspect identity and operation. If the role appears valid and the request times out, inspect DNS, routing, enforcement, and target listener. If the answers change depending on source, name that boundary instead of calling the environment “reachable.”&lt;/p&gt;
&lt;p&gt;Finally, preserve the failed and successful cases. They define where the boundary currently is. After a remediation, run the same tuple again and test an adjacent path that should remain available. That is how you tell containment from accidental outage.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; The packet can reach a target the identity cannot use. The identity can be authorized for a target the workload cannot reach. Neither edge is the whole path; the review has to test where they meet.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/network-watcher/connection-troubleshoot-overview" target="_blank" rel="noopener"
&gt;Connection troubleshoot overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/network-watcher/rbac-permissions" target="_blank" rel="noopener"
&gt;Azure RBAC permissions for Network Watcher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/network-watcher/connection-troubleshoot-manage" target="_blank" rel="noopener"
&gt;Troubleshoot outbound connections with Connection troubleshoot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"
&gt;Managed identities for Azure resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/storage/blobs/authorize-access-azure-active-directory" target="_blank" rel="noopener"
&gt;Authorize blob access with Microsoft Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Private DNS Decides Where Trust Travels</title><link>https://blog.brewedinthecloud.com/p/private-dns-decides-where-trust-travels/</link><pubDate>Tue, 20 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/private-dns-decides-where-trust-travels/</guid><description>&lt;p&gt;The deployment looks tidy. There is a Private Endpoint, a private DNS zone, and a link to the workload&amp;rsquo;s VNet. Public network access is disabled.&lt;/p&gt;
&lt;p&gt;Then someone asks how the application knows which IP to use.&lt;/p&gt;
&lt;p&gt;That should not be a difficult question. In practice, the answer often stops at “the private zone is linked.” That is a resource configuration fact, not evidence of what the application resolved or where its request went.&lt;/p&gt;
&lt;p&gt;Private connectivity changes the route. It does not make name resolution unimportant. For a workload that trusts a service hostname, DNS remains part of the decision about where that trust travels.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;A client normally asks for a service by name, not by drawing an arrow to a Private Endpoint NIC. DNS participates in turning that name into a destination. A private endpoint can be correctly provisioned while the client resolves through an unexpected resolver path, receives a stale answer, or reaches an address other than the one the design assumes.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Application] --&gt;|queries service FQDN| R[Configured resolver]
R --&gt;|uses zone, forwarding, or override| Z[DNS authority]
Z --&gt;|returns address| P[Private endpoint IP]
A --&gt;|connects using result| S[Service]
O[DNS change authority] -.-&gt; Z
&lt;/div&gt;
&lt;p&gt;There are three distinct claims here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The intended DNS configuration exists.&lt;/li&gt;
&lt;li&gt;The workload resolves the service name to the intended destination.&lt;/li&gt;
&lt;li&gt;The request reaches and is authorized by the intended service.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Teams often establish the first claim, infer the second, and treat the third as solved because the answer was private. That is a lot of trust to place in one word.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A private DNS answer is evidence about name resolution. It is not a certificate of service identity or authorization.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;h3 id="follow-the-name-the-application-actually-uses"&gt;Follow the name the application actually uses
&lt;/h3&gt;&lt;p&gt;Begin with the service FQDN in the application&amp;rsquo;s configuration or request log. Do not start with an IP copied from a private endpoint resource. The question is how the real client resolves the name it actually requests.&lt;/p&gt;
&lt;p&gt;For Azure Private Link, client applications can continue using the ordinary service hostname. DNS configuration can direct the query through the public CNAME chain and a private-link zone to a private address, depending on resolver context and zone configuration. Azure documents private DNS zones, VNet links, Azure Private Resolver, and forwarding patterns for private endpoint resolution.&lt;/p&gt;
&lt;p&gt;The answer can differ across a VNet, a peered network, on-premises DNS, a container-specific resolver, and a developer workstation. A successful lookup from one vantage point is a result for that vantage point. It does not establish what a different resolver or cached client answer will do.&lt;/p&gt;
&lt;h3 id="configuration-is-not-observed-behaviour"&gt;Configuration is not observed behaviour
&lt;/h3&gt;&lt;p&gt;Inspect the private endpoint&amp;rsquo;s DNS configuration and NIC addresses, the relevant private DNS zone and records, VNet links, and any custom resolver or forwarding rules. Then query from the workload&amp;rsquo;s actual execution context. Capture the question, resolver, full answer chain, TTL where available, timestamp, and address selected by the client.&lt;/p&gt;
&lt;p&gt;That still leaves a second test: observe the destination used by the connection. A command-line DNS lookup is useful evidence, but the application may use a local cache, proxy, custom resolver library, or a long-lived connection. When practical, instrument the application&amp;rsquo;s request or test in the same process/container context. If that is not practical, state the gap rather than pretending a nearby VM is identical.&lt;/p&gt;
&lt;h3 id="dns-does-not-replace-the-service-checks"&gt;DNS does not replace the service checks
&lt;/h3&gt;&lt;p&gt;A DNS record does not grant access. Azure&amp;rsquo;s documentation is explicit that DNS resolution and access control are independent. The public CNAME chain may be resolvable even when a service denies the request, and a private address does not prove that the service accepted the intended identity or operation.&lt;/p&gt;
&lt;p&gt;Test the remaining edges separately: connect to the resolved destination over the required protocol, then make a safe request with the workload&amp;rsquo;s intended identity. If the client reaches an unexpected address, investigate it. If it reaches the expected private IP but the service denies the operation, do not call DNS the failure merely because DNS was the most visible component.&lt;/p&gt;
&lt;h3 id="the-assumptions-need-to-be-visible"&gt;The assumptions need to be visible
&lt;/h3&gt;&lt;p&gt;This article describes Azure Private Endpoint name resolution generally; a real implementation depends on the service&amp;rsquo;s supported private DNS zone name, endpoint subresource, resolver design, region, and service configuration. Record those for the environment under review. Do not mix records for multiple same-service private endpoints in one zone without verifying the supported design; Microsoft documents that some arrangements can remove an earlier A record and cause resolution failures.&lt;/p&gt;
&lt;p&gt;There is no tested tenant result or specific Azure service instance in this example. If using Azure Private Resolver, identify the SKU/region and endpoint configuration. If relying on DNS logs or network telemetry, specify the source and schema. None is assumed here.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;DNS failures are often treated as availability issues, and sometimes that is exactly what they are. A record disappears; the workload cannot resolve the service; the application fails. The security relevance is that the same dependency can influence which service the client attempts to reach, even when no route or application deployment changes.&lt;/p&gt;
&lt;p&gt;Consider an application using the Storage Blob hostname &lt;code&gt;account.blob.core.windows.net&lt;/code&gt;. In the intended private-link design, the resolver chain should lead the client to the private endpoint address for that account. One workload gets that answer. Another, using a different resolver path, gets a public address or an endpoint associated with another environment.&lt;/p&gt;
&lt;p&gt;Those outcomes do not mean the second workload has accessed data. Public network access may be disabled; the service firewall, TLS validation, identity, and authorization still matter. But the intended private path was not proven. That distinction changes the incident response: investigate the resolver and client path before widening a firewall rule just to restore service.&lt;/p&gt;
&lt;p&gt;This is why I would not use “resolves to RFC1918” as a success criterion. It says the answer is private address space. It does not say whose address it is, which service is listening there, or whether the intended service accepted the request.&lt;/p&gt;
&lt;p&gt;Two remediation options can both look reasonable on a status board. Adding a broad network allow rule may make the application healthy again quickly. Correcting the zone link or forwarding path may take longer and require coordination with the DNS owner. If the failure is a wrong answer, the allow rule treats the symptom and expands the set of destinations the workload can reach. The right fix depends on observed DNS and connection evidence, not which team can close its ticket first.&lt;/p&gt;
&lt;p&gt;Use a small resolution-to-destination record to support that decision:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Workload, container/host context, and configured hostname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolver&lt;/td&gt;
&lt;td&gt;Resolver address/service and forwarding path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answer&lt;/td&gt;
&lt;td&gt;Full CNAME/A/AAAA chain, response time, and TTL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expected target&lt;/td&gt;
&lt;td&gt;Private endpoint resource ID and NIC address from configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observed destination&lt;/td&gt;
&lt;td&gt;Address used by the actual connection, if observable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service result&lt;/td&gt;
&lt;td&gt;TLS/HTTP or service response and workload identity/operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boundary&lt;/td&gt;
&lt;td&gt;Unchecked clients, regions, caches, or network paths&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This makes a resolver change reviewable. It also gives incident responders something better than a screenshot of a zone link taken months earlier.&lt;/p&gt;
&lt;p&gt;For a bounded validation, compare the exact hostname&amp;rsquo;s answer from the workload context against the private endpoint NIC address and then observe the address used by a safe client request. The expected result is a match for the intended endpoint and an authorized service response. If the test differs, record whether the divergence is in the resolver answer, client-used destination, or service authorization. That is a test criterion, not a tenant result reported here.&lt;/p&gt;
&lt;p&gt;For platform and security leaders, this record also exposes an ownership decision. If the workload team cannot change or independently validate the resolver path, then DNS is a shared security dependency, not just a central IT service. The platform owner needs a change process, a defined incident escalation route, and a way to establish which clients may be affected. If those controls are not available, the architecture review should record the dependency as accepted risk rather than calling the application network isolated.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;DNS is a small protocol sitting in the middle of a large operational system. The edge cases are usually not exotic; they are the normal consequences of shared ownership, caching, and migration.&lt;/p&gt;
&lt;h3 id="a-private-zone-can-change-public-name-behaviour"&gt;A private zone can change public-name behaviour
&lt;/h3&gt;&lt;p&gt;Linking a private zone that matches a public service namespace can affect queries for names without private records. Microsoft warns that resolution may fail unless public fallback or forwarding is configured appropriately. Avoid overriding a zone actively used for public endpoint resolution without understanding how missing records behave.&lt;/p&gt;
&lt;h3 id="multiple-endpoints-can-collide"&gt;Multiple endpoints can collide
&lt;/h3&gt;&lt;p&gt;Microsoft&amp;rsquo;s Private Endpoint DNS guidance warns that associating a Private DNS zone for a service with multiple similar Private Endpoints can remove an earlier A record and break resolution. The exact supported design depends on service and DNS architecture. Don&amp;rsquo;t copy a “one zone per environment” pattern blindly; verify the current service guidance and test each consumer path.&lt;/p&gt;
&lt;h3 id="caches-hide-the-change-window"&gt;Caches hide the change window
&lt;/h3&gt;&lt;p&gt;Resolvers and clients cache answers. A record update does not guarantee every process switches destinations at the same moment. Do not describe a DNS change as an immediate cutover unless you tested the relevant TTLs and client behaviour. Long-lived connections can continue using the destination selected earlier.&lt;/p&gt;
&lt;h3 id="central-dns-is-an-authority-decision"&gt;Central DNS is an authority decision
&lt;/h3&gt;&lt;p&gt;Centralizing DNS can simplify operations and support hybrid resolution. It also concentrates the ability to influence name answers. That may be the right trade-off, but it belongs in the threat model and change-approval path. “Platform-owned” does not mean “outside the workload&amp;rsquo;s trust boundary.”&lt;/p&gt;
&lt;p&gt;If the central team cannot tell which workload depends on a zone, it cannot confidently scope an emergency change. If the application team cannot see what the resolver returned, it cannot confidently distinguish a DNS issue from a service outage. Shared ownership without shared evidence is not a control model; it is a hand-off gap.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Review DNS and network reachability as one path, but keep their evidence distinct. Record the resolver and actual answer from the workload, then identify the address the application connected to. Validate the service operation independently with the intended identity.&lt;/p&gt;
&lt;p&gt;When you change a zone, link, forwarder, or resolver endpoint, test both the expected private service and a representative name without a private record. That second test can catch a private-zone configuration that quietly breaks public resolution. Use a safe non-production workload where possible.&lt;/p&gt;
&lt;p&gt;Give each shared DNS dependency an owner and an incident path. Decide who can change it, how changes are reviewed, and what telemetry can show what answer clients received. DNS telemetry may not exist or may not capture every client; say what the evidence covers.&lt;/p&gt;
&lt;p&gt;Agree the response lane before an incident: a wrong resolver answer routes first to DNS ownership; an expected private answer with a failed connection routes to network and endpoint diagnostics; a successful connection with a denied service operation routes to identity/service authorization. Reclassify if the evidence contradicts the first hypothesis. This avoids the familiar cycle where teams widen access while arguing about which dashboard is authoritative.&lt;/p&gt;
&lt;p&gt;Most importantly, don&amp;rsquo;t call a private IP a trusted destination. Confirm it belongs to the intended endpoint, confirm the connection uses it, and confirm the service authorizes the intended operation. Each of those checks closes a different gap.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; A Private Endpoint changes where packets can travel. DNS still helps choose where the workload sends them. If the review stops at “the answer was private,” it hasn&amp;rsquo;t yet shown that the right service received the request.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/private-link/private-endpoint-dns" target="_blank" rel="noopener"
&gt;Azure Private Endpoint private DNS zone values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/dns/dns-private-resolver-overview" target="_blank" rel="noopener"
&gt;Azure Private Resolver overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/dns/private-dns-overview" target="_blank" rel="noopener"
&gt;Azure Private DNS overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/private-link/private-endpoint-overview" target="_blank" rel="noopener"
&gt;Private Endpoint overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/storage/blobs/authorize-access-azure-active-directory" target="_blank" rel="noopener"
&gt;Authorize blob access with Microsoft Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>When a Managed Identity Becomes a Pivot</title><link>https://blog.brewedinthecloud.com/p/when-managed-identity-becomes-pivot/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/when-managed-identity-becomes-pivot/</guid><description>&lt;p&gt;“We moved it to managed identity, so there are no credentials for an attacker to steal.”&lt;/p&gt;
&lt;p&gt;That is a good reason to remove a secret. It is not a reason to stop the review.&lt;/p&gt;
&lt;p&gt;If a compromised process can ask for a token as its assigned identity, the useful question becomes what that identity can do next. Maybe the answer is one read against one storage account. Maybe the same identity is attached to three workloads and can reach a shared service with much broader authority. Those are not the same incident, even if both designs say “managed identity” on the diagram.&lt;/p&gt;
&lt;p&gt;The identity does not become a pivot because the feature is weak. It becomes one when the workload&amp;rsquo;s legitimate authority and its reachable dependencies combine into a route to something else.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;A managed identity changes how a workload obtains credentials. It does not decide what the workload is authorized to do, which other resources can answer it, or whether network controls will let it connect.&lt;/p&gt;
&lt;p&gt;Think of the pivot as the join between three edges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Credential edge:&lt;/strong&gt; can this compromised process request a token for the identity?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authority edge:&lt;/strong&gt; which operations can that principal perform, at what scope, and through which service?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reachability edge:&lt;/strong&gt; can the process contact the target or an intermediary that can act on the target?&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="mermaid"&gt;flowchart LR
W[Compromised workload] --&gt;|requests token as| I[Managed identity]
I --&gt;|authorized operation| S[Service or resource]
W --&gt;|DNS and network path| S
S --&gt;|may expose a further operation| T[Downstream target]
&lt;/div&gt;
&lt;p&gt;The path matters only when its edges meet. A role assignment alone is not proof of network access. A reachable endpoint alone is not proof of data authorization. A token is not a map of every action the service will permit.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Secretless is a credential property. Contained is an outcome you still have to prove.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;h3 id="first-establish-which-identity-is-in-play"&gt;First establish which identity is in play
&lt;/h3&gt;&lt;p&gt;Start in the workload&amp;rsquo;s execution context. Do not infer the principal from a deployment template or the identity settings on a resource that may not host the process. Record the actual principal ID and whether it is system-assigned or user-assigned.&lt;/p&gt;
&lt;p&gt;That distinction affects the blast radius. A system-assigned managed identity is tied to the lifecycle of its Azure resource. A user-assigned identity is a separate resource and can be assigned to more than one Azure resource. Sharing one may simplify provisioning and role management. It also means compromise of any attached workload may expose the same identity authority, subject to the service&amp;rsquo;s identity-use behavior.&lt;/p&gt;
&lt;p&gt;That isn&amp;rsquo;t a blanket argument against user-assigned identities. It is a design choice with a boundary attached. If a shared identity is used, reviewers should be able to name every workload that can use it and explain why those workloads belong in one compromise domain.&lt;/p&gt;
&lt;h3 id="follow-the-permission-to-the-operation"&gt;Follow the permission to the operation
&lt;/h3&gt;&lt;p&gt;“Reader” and “Contributor” often get discussed as though role names fully describe data access. They do not. For a Blob read, distinguish management-plane permissions on the Storage account from the data-plane authorization evaluated for the blob operation. A successful control-plane inventory is not proof that the application can read a particular object; a successful token request is not either.&lt;/p&gt;
&lt;p&gt;Write down the operation the application needs. For example: read one known blob, list a container, or write an object. Then inspect the applicable role definition, assignment scope, inheritance, and conditions for the principal that actually makes the request. If the workload uses a broker or an intermediary service, follow that edge too. The workload may not have direct permission to the final data and still be able to invoke something that does.&lt;/p&gt;
&lt;p&gt;Use a harmless test object and the same credential-selection behavior as the application. An engineer&amp;rsquo;s interactive sign-in can confirm that the engineer has access. It cannot establish what the managed identity can do.&lt;/p&gt;
&lt;h3 id="reachability-is-the-other-half"&gt;Reachability is the other half
&lt;/h3&gt;&lt;p&gt;Once you know the target operation and principal, test where the workload can connect. Resolve the target hostname from the workload&amp;rsquo;s resolver context, record the address the client uses, and test the required protocol and port from the same source.&lt;/p&gt;
&lt;p&gt;For a VM-based workload, Azure Network Watcher&amp;rsquo;s Connection troubleshoot can help diagnose supported TCP or ICMP connectivity to supported destinations. It can surface route, DNS, and network-security issues. It does not evaluate the Blob data permission or prove that application code uses the same identity and hostname. Treat it as one instrument in the investigation, not the answer.&lt;/p&gt;
&lt;p&gt;If the data path includes a private endpoint, inspect its DNS resolution and network policy as part of the same path. A private address may reduce public exposure; it does not tell you how much data the identity is allowed to read after connection.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Imagine two applications attached to the same user-assigned identity. One processes uploaded images. The other performs a back-office reconciliation job. Both can obtain a token; both can reach the same Storage account.&lt;/p&gt;
&lt;p&gt;If the identity has read access to every container because that was the easiest role to assign, a compromise in the lower-trust image processor can inherit authority intended for the reconciliation job. The pivot is not “managed identity was compromised” in isolation. It is the shared identity, broad operation scope, and reachable storage path taken together.&lt;/p&gt;
&lt;p&gt;Now compare two fixes. Removing the identity from every workload may stop the immediate path, but also stop valid processing. Blocking all traffic to Storage can produce the same operational result. A narrower change might separate the identities, reduce data permissions to the required scope, and constrain the route. Which is right depends on whether the workloads genuinely share a trust boundary and what the application must do.&lt;/p&gt;
&lt;p&gt;The test should make that choice visible. Record:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Principal ID from the workload&lt;/td&gt;
&lt;td&gt;Which identity actually requested access?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role definition, scope, inheritance, conditions&lt;/td&gt;
&lt;td&gt;What operation is potentially authorized?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target operation and response&lt;/td&gt;
&lt;td&gt;Did this request succeed as that identity?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolver and client-used address&lt;/td&gt;
&lt;td&gt;Where did the process direct the request?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source, destination, protocol, port&lt;/td&gt;
&lt;td&gt;Could this workload establish the tested connection?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other attached workloads&lt;/td&gt;
&lt;td&gt;Who shares the identity boundary?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This is a review artifact, not a claim that every other path has been found. If there are multiple attached resources, network paths, or downstream services, show what was excluded and why.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The term “pivot” can make ordinary service access sound more dramatic than the evidence supports. Keep the claim narrow: a pivot exists when a foothold can use authority or a reachable intermediary to move into a consequence-bearing operation. The word does not prove an attacker did so.&lt;/p&gt;
&lt;h3 id="sharing-can-be-a-feature-and-a-risk-at-once"&gt;Sharing can be a feature and a risk at once
&lt;/h3&gt;&lt;p&gt;User-assigned identities can be useful when several resources need consistent authorization or a workload is recycled while its permissions remain stable. The same arrangement couples those resources&amp;rsquo; compromise consequences. Count the attached workload resources and identify their owners before calling the identity “shared infrastructure.”&lt;/p&gt;
&lt;h3 id="scope-is-not-just-the-assignment-written-on-the-resource"&gt;Scope is not just the assignment written on the resource
&lt;/h3&gt;&lt;p&gt;An assignment at a parent scope may apply lower down. Group membership and conditions can further affect effective access. Conversely, a role that sounds broad may not include the exact data action under review. Inspect role definitions and effective assignment paths; do not turn a role display name into a conclusion.&lt;/p&gt;
&lt;h3 id="token-acquisition-is-not-a-permanent-grant"&gt;Token acquisition is not a permanent grant
&lt;/h3&gt;&lt;p&gt;Token handling and service authorization are distinct from network connectivity. Existing tokens, service-side authorization checks, caches, and established connections can make before/after behavior differ from the moment a control-plane change is submitted. Do not claim an exact revocation interval unless current service documentation and a measured test support it.&lt;/p&gt;
&lt;h3 id="intermediaries-complicate-the-graph"&gt;Intermediaries complicate the graph
&lt;/h3&gt;&lt;p&gt;A workload may reach a queue, function, or deployment service that then accesses the target with its own identity. The initial workload may have no direct Storage role, but that does not make the path irrelevant. Document the intermediary&amp;rsquo;s identity, authorization, and trust boundary instead of drawing an unexplained line from the application to the final data.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Begin with the operation, not the identity type. Ask what this workload must do, then prove the principal, authority, and destination used for that action. If multiple workloads share an identity, make the coupling an explicit architecture decision with named owners.&lt;/p&gt;
&lt;p&gt;When a path is too broad, compare changes by what edge they remove. Separate identities when the workloads do not share a trust boundary. Narrow data permissions when the role exceeds the required operation. Restrict network paths when the source should not contact the target. Avoid using a network block to disguise excessive authority or an identity change to paper over an unintended route.&lt;/p&gt;
&lt;p&gt;Finally, repeat the useful operation after the change and test one nearby operation that should remain denied. Capture exact request context and explain any propagation uncertainty. The goal is not to make every request fail. It is to preserve the needed dependency while removing the unnecessary pivot.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Managed identity answers how the workload proves who it is. The incident question is what that identity can do from that workload, over the paths the workload can actually reach.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"
&gt;Managed identities for Azure resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/storage/blobs/authorize-access-azure-active-directory" target="_blank" rel="noopener"
&gt;Authorize blob access with Microsoft Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/role-assignments-list-rest" target="_blank" rel="noopener"
&gt;List Azure role assignments using the REST API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/network-watcher/connection-troubleshoot-overview" target="_blank" rel="noopener"
&gt;Connection troubleshoot overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/network-watcher/rbac-permissions" target="_blank" rel="noopener"
&gt;Azure RBAC permissions for Network Watcher&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>From Token to Packet: Trace an Azure Workload Attack Path</title><link>https://blog.brewedinthecloud.com/p/from-token-to-packet-trace-azure-workload-attack-path/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/from-token-to-packet-trace-azure-workload-attack-path/</guid><description>&lt;p&gt;An application needs to read from Azure Storage. The team uses managed identity, puts a Private Endpoint in place, and restricts public access.&lt;/p&gt;
&lt;p&gt;Those are sensible choices. They also make the design surprisingly easy to stop questioning.&lt;/p&gt;
&lt;p&gt;The identity review checks the permissions. The network review checks private connectivity. Each team can approve its part without answering what happens if the application itself becomes hostile. After all, reading data is what this workload was built to do.&lt;/p&gt;
&lt;p&gt;The uncomfortable question isn&amp;rsquo;t whether those controls exist. It&amp;rsquo;s whether a compromised process can use them to do more than the business dependency requires.&lt;/p&gt;
&lt;p&gt;That is where the review needs to follow a request, rather than collect another approval.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption is that a narrowly permitted identity and a private network path add up to a contained workload.&lt;/p&gt;
&lt;p&gt;They might. But the identity and network diagrams don&amp;rsquo;t establish that on their own. The application may select a different identity, resolve a different destination, or have access to more data than its owners intended.&lt;/p&gt;
&lt;p&gt;Consider an application on an Azure VM reading a blob through a Blob private endpoint. This is an illustrative design, not a tenant observation. Its authority and its packet path meet at the service:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
W[Workload process on VM] --&gt;|requests token as| I[Managed identity]
W --&gt;|resolves account FQDN through| D[DNS resolver]
D --&gt;|returns destination address| P[Private endpoint IP]
W --&gt;|TCP 443 through route and policy| P
P --&gt; S[Blob service]
I --&gt;|data permission evaluated for request| S
&lt;/div&gt;
&lt;p&gt;What matters in this diagram is the join. The permission must belong to the principal making the request, and the route must lead to the destination the client actually uses. Otherwise, the review is describing two different things and calling them one boundary.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A permission review and a connectivity test only describe an attack path if they describe the same workload request.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Private connectivity can narrow exposure without narrowing the data available to an authorized process. Managed identity can remove stored credentials without making that process trustworthy. Neither control has failed when a compromised application uses its legitimate access. The architecture may simply have allowed too much.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;“Can access storage” is a poor starting point because it hides the operation. Reading a blob, listing a container, and changing account configuration are different decisions. For this example, use a read-only request against known, non-sensitive test data.&lt;/p&gt;
&lt;h3 id="the-identity-in-the-diagram-might-not-be-the-identity-in-the-request"&gt;The identity in the diagram might not be the identity in the request
&lt;/h3&gt;&lt;p&gt;A role assignment is easy to inspect. Establishing that it belongs to the identity the application actually uses takes more care. A user-assigned identity may serve several workloads; a system-assigned identity is tied to its resource. Sharing an identity can make deployment easier while making the incident boundary larger than the application boundary.&lt;/p&gt;
&lt;p&gt;For Blob access using Microsoft Entra ID, token acquisition and data authorization are separate steps. The Blob service still has to accept the operation. Inspect the applicable data permissions, inherited assignments, and conditions, then make the request using the workload&amp;rsquo;s credential selection.&lt;/p&gt;
&lt;p&gt;This is why an engineer&amp;rsquo;s successful &lt;code&gt;az login&lt;/code&gt; test can be so unhelpful in a workload review. It proves something about the engineer&amp;rsquo;s access. The application could still be using another principal entirely.&lt;/p&gt;
&lt;h3 id="follow-the-name-before-following-the-route"&gt;Follow the name before following the route
&lt;/h3&gt;&lt;p&gt;The application normally keeps using the service hostname. Private DNS configuration should lead it to the intended private endpoint address. Whether it does depends on the resolver, zone links, forwarding, and any local overrides.&lt;/p&gt;
&lt;p&gt;A lookup from a management VM elsewhere in the network can look reassuring and still tell you little about the application&amp;rsquo;s resolver path. Use the workload&amp;rsquo;s runtime context and capture the address the client uses, not just the answer from a separate lookup. Caches and proxies are part of the explanation, not troubleshooting details to discard once a private IP appears.&lt;/p&gt;
&lt;p&gt;Now test TCP 443 from that same source. Network Watcher&amp;rsquo;s Connection troubleshoot can help investigate supported sources and destinations, including route, DNS, and network-security issues. It cannot tell you whether the Blob service accepts this identity&amp;rsquo;s read request. You still need that request.&lt;/p&gt;
&lt;h3 id="be-precise-about-which-azure-behaviour-you-rely-on"&gt;Be precise about which Azure behaviour you rely on
&lt;/h3&gt;&lt;p&gt;Microsoft documents the managed identity, Blob authorization, private DNS, and Network Watcher mechanisms linked below. Those documents support the method; they are not evidence that your tenant behaves as intended.&lt;/p&gt;
&lt;p&gt;For this example, the target is an Azure Resource Manager-deployed Storage account&amp;rsquo;s Blob service over HTTPS/TCP 443. A real test record needs the Azure region, VM and Storage SKUs, runtime/SDK versions, and resolver configuration. There is no deployed lab or measured result behind this example.&lt;/p&gt;
&lt;p&gt;When inspecting conditional RBAC assignments through the Role Assignments REST API, use &lt;code&gt;2022-04-01&lt;/code&gt; or a later supported version and examine relevant parent scopes and role definitions. For Network Watcher, check regional enablement, supported sources, diagnostic prerequisites, and required RBAC actions. Its documented agentless experience is preview. Don&amp;rsquo;t build an incident dependency around an assumed feature.&lt;/p&gt;
&lt;p&gt;The workload&amp;rsquo;s Blob read permission is separate from the investigator&amp;rsquo;s assignment-inspection and diagnostic permissions. No Storage or Network Watcher REST request or log query is supplied here; pin those API versions and telemetry schemas when an implementation depends on them.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This changes what a design review is prepared to accept. A working application is evidence that its dependency works; it is not evidence that the dependency is appropriately bounded.&lt;/p&gt;
&lt;p&gt;Suppose the test blob can be read, but the connection goes to a public address when the design calls for private access. The request succeeded. The intended path did not. Calling that a pass would hide a DNS or client-routing assumption that needs investigation.&lt;/p&gt;
&lt;p&gt;The opposite result is just as easy to misread. Private connectivity works, but Blob access is denied. That isn&amp;rsquo;t proof of containment until you know why. The test could be using the wrong identity, asking for the wrong operation, or hitting a permission that hasn&amp;rsquo;t propagated.&lt;/p&gt;
&lt;p&gt;Keep the explanation attached to the path. A small record is more useful here than a control inventory:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What to record&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claim&lt;/td&gt;
&lt;td&gt;This process, using this principal, can read this test blob through this private endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source and identity&lt;/td&gt;
&lt;td&gt;Runtime/compute resource, principal ID, credential selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination&lt;/td&gt;
&lt;td&gt;Service hostname, resolver used, DNS answer, client-used address, TCP port&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authority&lt;/td&gt;
&lt;td&gt;Role definition, assignment scope, conditions, requested data operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Result&lt;/td&gt;
&lt;td&gt;Timestamp, request outcome/error, network diagnostic result, evidence reference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After a change&lt;/td&gt;
&lt;td&gt;Exact change, comparable retest, remaining paths and unanswered questions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This is a template, not a populated evidence pack. Use it in an authorized environment with non-sensitive test data; do not store bearer tokens.&lt;/p&gt;
&lt;p&gt;An unexpected destination disproves the claimed private path. A denied read means the operation didn&amp;rsquo;t succeed in that test; it does not, without an explanation, establish a durable security boundary.&lt;/p&gt;
&lt;p&gt;For the before/after test, choose a second, non-sensitive blob that this workload should not read. The required read should succeed and the prohibited read should fail for an understood authorization reason. Repeat both after a scoped permission change. If both fail, you&amp;rsquo;ve broken the dependency; you haven&amp;rsquo;t demonstrated useful containment. If both succeed, the proposed boundary hasn&amp;rsquo;t held. These are expected outcomes for a test design, not reported measurements.&lt;/p&gt;
&lt;p&gt;“Access stopped” is a poor success criterion when the application stopped with it. The defensible outcome is more specific: the required dependency still works, and the unnecessary access tested no longer does.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;A path test can give a very convincing answer to the wrong question. Source context, timing, and operational dependencies are where that usually becomes visible.&lt;/p&gt;
&lt;h3 id="a-test-from-the-host-can-miss-the-application"&gt;A test from the host can miss the application
&lt;/h3&gt;&lt;p&gt;Containers, proxies, and different resolver settings can make the application behave differently from a shell on its VM. Test inside the process&amp;rsquo;s actual context where practical. Where that isn&amp;rsquo;t possible, document the difference instead of quietly treating the host as equivalent.&lt;/p&gt;
&lt;h3 id="removing-a-permission-is-not-the-same-as-ending-access-immediately"&gt;Removing a permission is not the same as ending access immediately
&lt;/h3&gt;&lt;p&gt;After an authorization change, repeat the operation and account for service-specific propagation and caching. Existing connections and fresh connections may behave differently too. A diagram showing an edge removed is a change record; the retest is what tells you whether the intended outcome has taken effect.&lt;/p&gt;
&lt;h3 id="tighter-boundaries-have-operating-costs"&gt;Tighter boundaries have operating costs
&lt;/h3&gt;&lt;p&gt;A private path introduces DNS and connectivity dependencies. Narrower roles need maintenance when the application changes. Neither is a reason to abandon them, but both need owners.&lt;/p&gt;
&lt;p&gt;There is also a temptation to grant broad investigator permissions so the diagnostics run without friction. That creates another powerful identity to govern. Prefer the permissions the diagnostic actually needs, with a pre-agreed escalation path for incidents, rather than solving investigation inconvenience with unrelated write authority.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Start with a dependency whose compromise would matter. Work through its authority and connectivity together, using non-sensitive test data in an authorized, preferably disposable environment. Name the test owner and cleanup requirements, including any temporary permissions.&lt;/p&gt;
&lt;p&gt;Bring the identity and network evidence into the same review. Where the results disagree, leave the question open until someone can explain it. A failed connection with broad permissions still deserves an authority review; a reachable service with a denied read still deserves scrutiny of the other permitted operations.&lt;/p&gt;
&lt;p&gt;The review should produce something the next change can invalidate. If an identity assignment, resolver path, route, or firewall rule changes, revisit the affected dependency. A “verified” diagram that survives every infrastructure change without a retest isn&amp;rsquo;t assurance. It&amp;rsquo;s an old diagram.&lt;/p&gt;
&lt;p&gt;There is no complete-estate assurance claim in one VM-to-Blob test. What you have is a defensible answer for one path, plus a method to investigate the next.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Before signing off a workload boundary, ask for the request that crosses it. Who made it, where did it go, what did it do, and what stopped it after the change? Separate approvals aren&amp;rsquo;t a substitute for that answer.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"
&gt;Managed identities for Azure resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/storage/blobs/authorize-access-azure-active-directory" target="_blank" rel="noopener"
&gt;Authorize blob access with Microsoft Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/role-assignments-list-rest" target="_blank" rel="noopener"
&gt;List Azure role assignments using the REST API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/private-link/private-endpoint-dns" target="_blank" rel="noopener"
&gt;Azure Private Endpoint private DNS zone values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/network-watcher/connection-troubleshoot-overview" target="_blank" rel="noopener"
&gt;Connection troubleshoot overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/network-watcher/rbac-permissions" target="_blank" rel="noopener"
&gt;Azure RBAC permissions for Network Watcher&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Operating Azure Security Telemetry as a Product</title><link>https://blog.brewedinthecloud.com/p/azure-security-telemetry-operating-model/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-security-telemetry-operating-model/</guid><description>&lt;p&gt;The final challenge in Azure security telemetry is not technical collection. It is operations. Many organizations can send logs to a workspace. Fewer can explain which signals are critical, who owns them, how quality is measured, and how detection content changes when the platform changes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Security telemetry should be operated like a product with customers, quality measures, lifecycle management, and clear ownership.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This final post in the series pulls the previous themes into an operating model for Azure security telemetry.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Treat telemetry as a product whose customers are incident responders, detection engineers, platform teams, auditors, application owners, and risk leaders. Each customer needs different outcomes. Analysts need fast investigation paths. Detection engineers need reliable schemas and test data. Platform teams need coverage standards and automation. Leaders need assurance and trend reporting.&lt;/p&gt;
&lt;p&gt;The product has features: control-plane visibility, diagnostic coverage, normalized Sentinel content, Defender XDR hunting, Defender for Cloud export, dashboards, alert rules, and retention. It also has quality attributes: completeness, freshness, accuracy, accessibility, cost efficiency, and resilience against tampering.&lt;/p&gt;
&lt;p&gt;This model changes the governance conversation. Instead of asking whether logs are enabled, ask whether the telemetry product meets its service expectations. Can the team reconstruct privileged changes? Can they investigate storage access? Can they correlate endpoint and identity behavior with Azure operations? Can they identify missing diagnostic settings? Can they prove which subscriptions are covered?&lt;/p&gt;
&lt;p&gt;The operating model should also recognize that telemetry changes continuously. Azure services add categories, schemas evolve, teams create new subscriptions, detection rules age, and business priorities shift. A one-time logging project will decay. A product model expects lifecycle management.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;An Azure security telemetry operating model usually has four layers: platform collection, security analytics, response workflow, and governance feedback. Platform collection ensures logs are routed and retained. Security analytics turns data into detections and hunts. Response workflow defines how signals are triaged and remediated. Governance feedback measures coverage, cost, exceptions, and outcomes.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Telemetry Product Backlog] --&gt; B[Collection Standards]
B --&gt; C[Workspace and Routing Architecture]
C --&gt; D[Sentinel Content and Defender Hunts]
D --&gt; E[Incidents, Tickets, and Response]
E --&gt; F[Metrics and Lessons Learned]
F --&gt; A
&lt;/div&gt;
&lt;p&gt;Ownership should be explicit. A cloud platform team may own policy-based diagnostic settings and workspace architecture. A security operations team may own Sentinel analytics and incident response. A detection engineering function may own rule lifecycle and testing. A governance or risk function may own reporting and exceptions. Application teams may own resource-specific remediation.&lt;/p&gt;
&lt;p&gt;Quality control needs measurable checks. Examples include percentage of production subscriptions with Activity Log routing, percentage of high-risk resources with required diagnostic settings, number of analytic rules without owners, median age of Defender for Cloud recommendations, failed parser tests, ingestion cost by source, and incident timelines with missing evidence.&lt;/p&gt;
&lt;p&gt;Change management is part of the design. When a new Azure service is introduced, the telemetry product backlog should ask which logs are required, which detections are relevant, which Defender controls apply, and how the service will appear in risk reporting. That makes telemetry part of platform adoption rather than an afterthought.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Operating telemetry as a product improves incident response because the response team knows what evidence should exist. When a major incident happens, they are not discovering the logging estate for the first time. They can use documented investigation paths, known workspaces, known tables, and known escalation owners.&lt;/p&gt;
&lt;p&gt;It also improves platform engineering. Diagnostic settings, policy assignments, Sentinel connectors, and Defender exports become part of the landing zone and workload onboarding process. Teams can create resources faster because the security expectations are already encoded in reusable patterns.&lt;/p&gt;
&lt;p&gt;For security leadership, the product model produces better metrics. Instead of reporting raw log volume, leaders can report coverage against critical scenarios, detection health, remediation age, and known gaps. That supports risk-based investment decisions. If a high-risk service lacks telemetry, the decision is visible and can be prioritized.&lt;/p&gt;
&lt;p&gt;For auditors and assurance teams, the model creates traceability. Standards define what should be collected. Policy and queries show whether it is collected. Workflows show how findings are handled. Exceptions show who accepted risk and until when. That is much stronger than a screenshot of a workspace.&lt;/p&gt;
&lt;p&gt;The product model also helps control cost. Cost is no longer a surprise created by indiscriminate ingestion. It becomes a managed product attribute. Teams can decide where to spend telemetry budget because each source is tied to a detection, investigation, compliance, or operational outcome.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The first gotcha is treating the workspace as the product. A Log Analytics workspace or Sentinel instance is infrastructure. The product is the end-to-end capability to collect, interpret, respond, and improve. If ownership stops at the workspace boundary, the operating model is incomplete.&lt;/p&gt;
&lt;p&gt;The second gotcha is weak rule ownership. Analytic rules without owners become stale. They generate false positives, miss schema changes, or remain enabled long after the underlying risk changed. Every rule should have a purpose, owner, severity rationale, and review cadence.&lt;/p&gt;
&lt;p&gt;The third gotcha is exception sprawl. Logging exceptions, policy exemptions, disabled connectors, and suppressed recommendations may be reasonable individually. Collectively, they can hollow out the telemetry model. Exceptions need expiry dates and periodic review.&lt;/p&gt;
&lt;p&gt;Another edge case is multi-workspace design. Some organizations split workspaces by region, tenant, business unit, or data boundary. That can be valid, but it complicates detection engineering and investigation. The operating model must explain how cross-workspace incidents are handled.&lt;/p&gt;
&lt;p&gt;Finally, beware of metrics that reward volume. Ingestion volume, alert count, or number of connectors can all go up while security value goes down. Measure coverage, fidelity, response usefulness, and reduction of unknowns instead.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Create a telemetry product charter. Define the purpose, customers, scope, critical scenarios, data sources, ownership model, and success measures. Keep it short enough that teams will read it, but precise enough that it can guide decisions.&lt;/p&gt;
&lt;p&gt;Maintain a signal catalog. For each major source, document why it is collected, where it is routed, how long it is retained, which detections or investigations depend on it, and who owns it. Review the catalog after major incidents and platform changes.&lt;/p&gt;
&lt;p&gt;Run coverage tests. Do not wait for incidents to discover missing logs. Periodically simulate or query for expected events such as role assignments, diagnostic setting changes, key vault access, network rule updates, Defender for Cloud exports, and Sentinel incident creation.&lt;/p&gt;
&lt;p&gt;Manage detections through a lifecycle. New rules should have a hypothesis, data dependency, test method, severity rationale, and response owner. Existing rules should be reviewed for false positives, stale assumptions, schema changes, and business relevance.&lt;/p&gt;
&lt;p&gt;Close the loop with lessons learned. Every incident and major investigation should ask whether telemetry helped, slowed the team down, or was missing. Feed those lessons into the backlog. That is how the telemetry product improves over time.&lt;/p&gt;
&lt;h3 id="hailes-telemetry-utility-score"&gt;Hailes Telemetry Utility Score
&lt;/h3&gt;&lt;p&gt;The scorecard I use for this is the Hailes Telemetry Utility Score. It is Chris Hailes&amp;rsquo;s practitioner framework, not a Microsoft standard. The point is to measure whether telemetry reduces uncertainty during an investigation, not whether the environment has produced the largest possible log volume.&lt;/p&gt;
&lt;p&gt;Score each dimension from 0 to 5:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;What it measures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Completeness&lt;/td&gt;
&lt;td&gt;Critical subscriptions, identities, resources, Defender findings, and response paths are represented.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freshness&lt;/td&gt;
&lt;td&gt;Data arrives fast enough for the decision it supports.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy&lt;/td&gt;
&lt;td&gt;Fields are mapped correctly, parsers are tested, and source semantics are understood.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accessibility and coverage&lt;/td&gt;
&lt;td&gt;The right teams can query the right workspaces, tables, and portals without over-privilege.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost efficiency&lt;/td&gt;
&lt;td&gt;Ingestion and retention spend are tied to detection, investigation, assurance, or response value.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tamper resilience&lt;/td&gt;
&lt;td&gt;Diagnostic settings, workspaces, exports, retention, and administrative paths are protected and monitored.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hailes Telemetry Utility Score = ((completeness + freshness + accuracy + accessibility + costEfficiency + tamperResilience) / 30) * 100
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Use 85-100 as operationally dependable, 70-84 as useful but still fragile, 50-69 as partial visibility, and below 50 as not defensible for the assessed scenario. For example, a privileged-access scenario scored 4 for completeness, 4 for freshness, 3 for accuracy, 4 for accessibility, 3 for cost efficiency, and 2 for tamper resilience lands at 66.7. That tells me the next investment should be tamper protection and parser validation, not another dashboard.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; The highest-value Azure security telemetry programs I&amp;rsquo;ve seen are never the ones with the most data. They&amp;rsquo;re the ones where every critical signal has a name attached to it, a reason it exists, and someone who&amp;rsquo;d actually notice if it stopped firing.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/azure-security-telemetry-toolkit/" &gt;Azure Security Telemetry Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/well-architected/security/monitor-threats" target="_blank" rel="noopener"
&gt;Architecture strategies for monitoring and threat detection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/logs/data-platform-logs" target="_blank" rel="noopener"
&gt;Azure Monitor Logs overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/best-practices" target="_blank" rel="noopener"
&gt;Microsoft Sentinel best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/continuous-export" target="_blank" rel="noopener"
&gt;Defender for Cloud continuous export&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Turning Defender for Cloud Findings into Operational Signals</title><link>https://blog.brewedinthecloud.com/p/azure-security-telemetry-defender-cloud-export/</link><pubDate>Tue, 06 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-security-telemetry-defender-cloud-export/</guid><description>&lt;p&gt;Microsoft Defender for Cloud produces security alerts and recommendations that can be extremely valuable, but only if they flow into the operating model. A recommendation that stays on a portal page is posture information. A recommendation that is exported, assigned, trended, and correlated becomes operational telemetry.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Defender for Cloud findings become security telemetry when they are routed into decisions, not when they are merely visible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post focuses on continuous export and the design choices that turn posture and threat findings into signals that security and platform teams can act on.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Defender for Cloud sits at the intersection of posture management and workload protection. It identifies recommendations, regulatory alignment issues, attack paths, and security alerts across supported Azure and hybrid resources. Those findings are not the same as raw resource logs. They are interpreted signals: Microsoft has already applied assessment, analytics, or threat intelligence to produce them.&lt;/p&gt;
&lt;p&gt;The mental model is findings as operational inputs. Some findings should drive engineering backlog. Some should create incident response activity. Some should inform risk dashboards. Some should be suppressed or accepted with an owner and expiry. If all findings are treated the same, teams either drown in work or ignore the portal.&lt;/p&gt;
&lt;p&gt;Continuous export matters because it moves Defender for Cloud data from a product experience into an enterprise workflow. Microsoft documentation states that Defender for Cloud alerts and recommendations can be exported to Log Analytics, Event Hubs, another SIEM, SOAR, or other solutions. Data can stream as it is generated, or snapshots can be sent on a schedule.&lt;/p&gt;
&lt;p&gt;That routing choice is strategic. Log Analytics supports querying, workbooks, Sentinel integration, and operational analysis. Event Hubs supports streaming to central platforms or external SIEM tools. The right destination depends on who owns the response and what they need to do with the finding.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Continuous export is configured in Defender for Cloud environment settings. You choose the subscription, select continuous export, choose target type such as Log Analytics workspace or Event Hubs, select data types, apply filters, and define export frequency. Export can include security alerts, recommendations, and in some cases associated findings.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Defender for Cloud] --&gt; B[Alerts]
A --&gt; C[Recommendations]
B --&gt; D[Continuous Export]
C --&gt; D
D --&gt; E[Log Analytics]
D --&gt; F[Event Hubs]
E --&gt; G[Sentinel and Workbooks]
F --&gt; H[SIEM SOAR or Data Platform]
&lt;/div&gt;
&lt;p&gt;Export frequency needs attention. Streaming sends updates as resource health state changes. Snapshots send the current state on a schedule, such as weekly per subscription for selected data types. Snapshot data can include a field that identifies it as a snapshot. That distinction matters when analysts build trend queries or detections, because state snapshots are not the same as new events.&lt;/p&gt;
&lt;p&gt;Filtering is also important. Defender for Cloud can generate many recommendations. Exporting every low-priority posture recommendation into an incident workflow can create noise. Exporting only high-severity alerts may miss useful risk context. The goal is to route the right level of signal to the right workflow.&lt;/p&gt;
&lt;p&gt;At scale, Azure Policy can help configure continuous export. This matters in multi-subscription environments where manual configuration will drift. Centralized export also requires permissions to the target workspace or event hub and appropriate Defender for Cloud permissions.&lt;/p&gt;
&lt;p&gt;I route every exported finding into one of three lanes, and I reclassify the moment new evidence changes the picture. Lane 1 (path-break) is for an alert or recommendation that reveals a live route to identity, secrets, or control-plane operations - it goes straight to incident response, bypassing the standard posture backlog. Lane 2 (systemic control) is for a recommendation that recurs across many resources, such as the same missing control appearing on dozens of storage accounts - this gets a policy-level fix, not one ticket per resource. Lane 3 (architecture debt) is for low-severity, isolated findings that are real but not urgent - these get tracked with an owner and a review date, not chased immediately. A finding moves lanes the moment its blast radius or exploitability changes; the lane, not the original severity label, decides who acts and how fast.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;The first impact is posture accountability. If Defender for Cloud recommendations are exported to Log Analytics, platform teams can trend unhealthy resources, recurring recommendations, aging findings, and remediation progress. That enables a monthly or weekly operating rhythm instead of ad hoc portal review.&lt;/p&gt;
&lt;p&gt;The second impact is incident enrichment. A Defender for Cloud alert is more useful when correlated with Activity Log, resource logs, identity events, and Sentinel incidents. For example, an alert on suspicious workload behavior can be enriched with recent administrative changes, public exposure changes, or identity activity. That shortens triage and helps teams decide severity.&lt;/p&gt;
&lt;p&gt;The third impact is engineering prioritization. Not every recommendation should become a ticket immediately. Exported findings allow teams to rank by severity, resource criticality, exposure, business owner, and age. That helps security teams avoid the &amp;ldquo;giant spreadsheet of shame&amp;rdquo; pattern and move toward risk-based remediation.&lt;/p&gt;
&lt;p&gt;Continuous export also supports audit and assurance. Leaders can show that cloud security posture is not only reviewed in a portal, but routed into measurable workflows. They can demonstrate which teams own remediation, which recommendations are accepted risks, and which alerts triggered response.&lt;/p&gt;
&lt;p&gt;For hybrid environments, Defender for Cloud exports can also help bring non-Azure workloads into the same conversation, depending on coverage and onboarding. That matters for enterprises where Azure resources, Arc-enabled servers, containers, and other platforms all contribute to risk.&lt;/p&gt;
&lt;p&gt;This is the trade-off I put in front of a remediation-prioritization debate directly: closing 100 low-severity posture recommendations across dev subscriptions is easy to report and looks productive, but it&amp;rsquo;s worth less than fixing the one exported alert showing a production key vault with a live path to a compromised identity. Given a choice between those two bodies of work in the same sprint, I take the one alert every time. If your remediation backlog can&amp;rsquo;t tell those two situations apart, it&amp;rsquo;s counting tickets, not reducing exposure.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The first gotcha is confusing recommendations with alerts. Recommendations often describe posture gaps or configuration improvements. Alerts usually describe suspected threat activity. They deserve different routing, severity, and ownership. Sending both into the same queue without classification creates confusion.&lt;/p&gt;
&lt;p&gt;The second gotcha is snapshot interpretation. A weekly snapshot is useful for posture reporting, but it should not be treated like a new incident every time it appears. Queries and workflows need to account for snapshot markers and state changes.&lt;/p&gt;
&lt;p&gt;Permissions and target configuration can also fail quietly from an operating perspective. Export requires write permissions to the target and appropriate Defender for Cloud roles. If central teams configure exports across subscriptions, they need a clear permission model.&lt;/p&gt;
&lt;p&gt;Record size and data limits matter. Microsoft notes that Log Analytics supports records up to a specific size limit, and oversized records can trigger data limit messages. This is not usually the first design concern, but it matters for large findings or detailed vulnerability data.&lt;/p&gt;
&lt;p&gt;Finally, exporting data does not mean someone owns it. A workspace full of Defender for Cloud findings is not an operating model. Define which team responds to alerts, which team remediates posture recommendations, how exceptions are approved, and how stale findings are escalated.&lt;/p&gt;
&lt;p&gt;The anti-pattern I push back on every time I see it is a remediation KPI built around ticket-closure count for exported findings. That number rewards clearing easy, low-consequence recommendations while the one exported alert tied to a live production path sits in the queue because it&amp;rsquo;s harder to fix. The metric that should drive the report is the age and exposure of unresolved Lane 1 findings, not the total number of tickets closed.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Separate alert workflows from recommendation workflows. Route high-confidence threat alerts toward incident response. Route posture recommendations toward engineering remediation, backlog management, or governance review. Use common reporting, but do not force the same process.&lt;/p&gt;
&lt;p&gt;Use continuous export to centralize visibility across subscriptions. Prefer policy-based configuration where scale requires it. Review export coverage regularly so newly created subscriptions do not fall outside the telemetry model.&lt;/p&gt;
&lt;p&gt;Design filters deliberately. Export enough context to support investigation and risk reporting, but avoid flooding the workspace with low-value noise. Revisit filters as the organization matures.&lt;/p&gt;
&lt;p&gt;Correlate Defender for Cloud findings with other telemetry. A recommendation becomes more useful when combined with exposure, asset criticality, ownership, and recent changes. An alert becomes more useful when combined with identity, endpoint, and resource behavior.&lt;/p&gt;
&lt;p&gt;Measure remediation age and recurrence. The most important posture questions are often not &amp;ldquo;how many findings exist?&amp;rdquo; but &amp;ldquo;which findings are old, recurring, high-impact, externally exposed, or lacking an owner?&amp;rdquo;&lt;/p&gt;
&lt;h3 id="practical-continuous-export-pattern"&gt;Practical continuous export pattern
&lt;/h3&gt;&lt;p&gt;For broad rollout, start with Microsoft&amp;rsquo;s built-in Azure Policy definitions for Defender for Cloud continuous export: &lt;code&gt;ffb6f416-7bd2-4488-8828-56585fef2be9&lt;/code&gt; for Log Analytics and &lt;code&gt;cdfcce10-4578-4ecd-9703-530938e4abcb&lt;/code&gt; for Event Hubs. Where you manage the automation directly, this Bicep pattern uses the &lt;code&gt;Microsoft.Security/automations@2019-01-01-preview&lt;/code&gt; resource to export selected findings to a workspace.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceResourceId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;continuousExport&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Security/automations@2019-01-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;export-defender-for-cloud-to-law&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Subscription scope&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scopePath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Alerts&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Assessments&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AssessmentsSnapshot&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SecureScores&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AttackPaths&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;actionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Workspace&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceResourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceResourceId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Once export is flowing, start with separate queries for recommendations and alerts so posture backlog work does not get confused with incident response.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SecurityRecommendation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where TimeGenerated &amp;gt;= ago(30d)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize LatestTime = max(TimeGenerated), States = make_set(RecommendationState, 5), Severities = make_set(RecommendationSeverity, 5), SnapshotRecords = countif(IsSnapshot == true) by AssessedResourceId, RecommendationDisplayName, RecommendationId
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by LatestTime desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SecurityAlert
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where TimeGenerated &amp;gt;= ago(14d)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where ProductName has &amp;#34;Defender for Cloud&amp;#34; or ProviderName has &amp;#34;Security Center&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project TimeGenerated, AlertName, AlertSeverity, Status, ProductName, ProviderName, ResourceId, CompromisedEntity, Tactics, Techniques, SystemAlertId, AlertLink
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by TimeGenerated desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Prerequisites are not optional: Defender for Cloud must be enabled, the target workspace needs the required solution path, and the configuring identity needs the documented Defender for Cloud and target write permissions. &lt;code&gt;SecurityAlert&lt;/code&gt; and &lt;code&gt;SecurityRecommendation&lt;/code&gt; are the documented Log Analytics tables for exported alerts and recommendations, but field population still depends on the finding type and export path.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Continuous export isn&amp;rsquo;t just an integration feature to enable and forget. It&amp;rsquo;s the mechanism that turns cloud posture into an accountable operational signal - one with an owner and a queue, not a recommendation sitting unread on a portal page.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/azure-security-telemetry-toolkit/" &gt;Azure Security Telemetry Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/continuous-export" target="_blank" rel="noopener"
&gt;Set up continuous export in Defender for Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/benefits-of-continuous-export" target="_blank" rel="noopener"
&gt;Export alerts and recommendations with continuous export&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/continuous-export-azure-policy" target="_blank" rel="noopener"
&gt;Configure continuous export with Azure Policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/alerts-overview" target="_blank" rel="noopener"
&gt;Defender for Cloud alerts overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Using Defender XDR Advanced Hunting as a Cross-Domain Lens</title><link>https://blog.brewedinthecloud.com/p/azure-security-telemetry-defender-xdr/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-security-telemetry-defender-xdr/</guid><description>&lt;p&gt;Azure security telemetry is not complete if it only describes Azure resources. Real attacks move through identities, devices, email, cloud apps, network paths, and management planes. Microsoft Defender XDR advanced hunting gives security teams a cross-domain lens for that movement.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Azure telemetry explains the cloud estate; Defender XDR helps explain the actors and devices moving through it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post looks at advanced hunting as part of the security telemetry architecture, not just as an analyst search box.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Advanced hunting is a query-based threat hunting capability in Microsoft Defender that lets you explore raw telemetry across security domains. Microsoft documentation describes it as a way to inspect events in your network and locate threat indicators and entities. It can query data from Microsoft Defender for Endpoint, Defender for Office 365, Defender for Cloud Apps, Defender for Identity, and Microsoft Sentinel when connected through the unified portal.&lt;/p&gt;
&lt;p&gt;The mental model is entity-centered investigation. Azure logs can tell you that a role assignment changed, a resource was accessed, or a policy was modified. Defender XDR can help answer what the user, device, mailbox, app, or identity was doing around the same time. That context is what turns a suspicious event into a credible incident story.&lt;/p&gt;
&lt;p&gt;For example, a risky Azure administrative operation is more meaningful if the same user had unusual sign-in behavior, endpoint alerts, suspicious cloud app activity, or email compromise indicators. Conversely, an endpoint alert is more concerning if the same identity later changes Azure access controls.&lt;/p&gt;
&lt;p&gt;Advanced hunting is also useful because it speaks KQL. That lowers the mental switching cost for teams already using Azure Monitor Logs and Microsoft Sentinel. The schemas are different, but the investigation habit is similar: establish time, entity, action, result, and correlation.&lt;/p&gt;
&lt;p&gt;The opinionated design choice is this: Defender XDR should not be used as a dumping ground for every Azure question. It should be used when the Azure event needs actor, device, mailbox, SaaS, or identity context to make the decision defensible. If the question can be answered completely in Azure Monitor or Sentinel, keep it there. If the question depends on what the user or device did before and after the Azure action, advanced hunting becomes the stronger lens.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Advanced hunting has guided and advanced modes. Guided mode helps users who are less familiar with KQL. Advanced mode supports writing KQL directly. The same hunting queries can also support custom detection rules, which run automatically to check for suspected breach activity, misconfiguration, or other findings.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Defender for Endpoint] --&gt; E[Advanced Hunting]
B[Defender for Identity] --&gt; E
C[Defender for Office 365] --&gt; E
D[Defender for Cloud Apps] --&gt; E
F[Microsoft Sentinel Tables] --&gt; E
E --&gt; G[Hunts]
E --&gt; H[Custom Detections]
E --&gt; I[Incident Investigation]
&lt;/div&gt;
&lt;p&gt;Data freshness matters. Microsoft separates advanced hunting data into event or activity data and entity data. Event data, such as alerts and security events, is generally available quickly after sensors transmit it. Entity data, such as user and device information, is updated on a different cadence. That distinction matters when a query appears to miss context during a live investigation.&lt;/p&gt;
&lt;p&gt;There are also quotas and time windows. Defender advanced hunting can query up to 30 days of Defender data unless data is streamed through Microsoft Sentinel for longer retention. Query results, execution time, and resource usage have limits. These boundaries should influence how teams design operational hunts and custom detections.&lt;/p&gt;
&lt;p&gt;Permissions are part of the architecture. Access to advanced hunting can depend on Microsoft Defender XDR unified RBAC, Defender portal permissions, Exchange Online roles, Microsoft Entra roles, and endpoint RBAC settings. A hunt program that works only for global administrators is not a sustainable operating model.&lt;/p&gt;
&lt;p&gt;Time zone behavior is another operational detail. Advanced hunting uses UTC for queries, while results can be displayed according to portal time zone settings. Incident processes should be explicit about time normalization to avoid timeline confusion.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Advanced hunting improves Azure investigations by adding user and device context. Suppose an identity creates a privileged role assignment in Azure. Activity Log can show the management operation. Entra sign-in logs can add authentication context. Defender XDR can add endpoint, email, app, and identity behavior around the same period. Together, they help determine whether this was expected administration, compromised identity activity, or part of a broader attack path.&lt;/p&gt;
&lt;p&gt;Another example is suspicious resource access from a managed device. Azure resource logs may show access to storage, key vault, or application endpoints. Defender for Endpoint telemetry may show process execution, network connections, script activity, or device risk. The combination helps analysts answer whether the resource event was business activity or a compromised workstation reaching into cloud assets.&lt;/p&gt;
&lt;p&gt;Custom detections are where hunting becomes operational. A useful hunt can become a detection rule when it describes a repeatable risk pattern. That transition should be governed. Not every clever query should become an alert. The query needs a response owner, severity logic, tuning strategy, and evidence that the signal is worth interrupting someone.&lt;/p&gt;
&lt;p&gt;For leadership, advanced hunting supports a more realistic security narrative. It acknowledges that Azure security is tied to identities and endpoints, not isolated resource controls. That is important for risk reporting because many cloud incidents begin outside the cloud control plane.&lt;/p&gt;
&lt;p&gt;This is where prioritization becomes concrete. Closing one hundred low-risk findings may look productive, but it can be less valuable than one hunt that proves a compromised endpoint reached a privileged cloud control path. The better success measure is not volume of queries run or alerts created. The better measure is whether a hunt reduces uncertainty about a plausible attack path: identity compromise to endpoint activity, endpoint activity to cloud access, and cloud access to control-plane change.&lt;/p&gt;
&lt;p&gt;For a senior security audience, that distinction matters. Advanced hunting should help leaders choose between competing response options. If two issues are both noisy, prefer the one that breaks a trust edge or removes attacker mobility. If two detections both appear severe, prefer the one with clearer entity linkage and a defined response owner. If a hunt cannot change a triage, containment, or remediation decision, it is probably research, not an operational signal.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The first gotcha is retention. If teams assume advanced hunting is a long-term archive, they may be surprised by the default 30-day Defender data query window. Longer-term requirements may need Microsoft Sentinel, streaming APIs, or another retention architecture.&lt;/p&gt;
&lt;p&gt;The second gotcha is query cost and limits. Advanced hunting has limits around result size, timeout, and CPU resources. Broad queries over large data sets can be blocked or return partial results. Detection engineers should optimize early, filter by time and entity, and avoid using production hunts as exploratory data dumps.&lt;/p&gt;
&lt;p&gt;Permissions can create blind spots. An analyst may be able to query some tables but not others. Email, endpoint, identity, and cloud app data can have different access requirements. If the team does not understand those boundaries, investigations can produce incomplete conclusions.&lt;/p&gt;
&lt;p&gt;Schema differences also matter. Defender advanced hunting tables are not the same as Sentinel tables, even when KQL is used in both places. Joining data across systems requires care with timestamps, entity identifiers, device names, account formats, and casing.&lt;/p&gt;
&lt;p&gt;Finally, be careful with custom detections. A query that is useful during a guided hunt may be too noisy as an always-on detection. Operational detections need tuning, suppression logic, ownership, and response playbooks.&lt;/p&gt;
&lt;p&gt;The reporting anti-pattern is rewarding activity instead of consequence. A program that celebrates query count, alert count, or ticket closure can still miss the one linked identity and device chain that matters. The corrected metric is path clarity: how quickly the team can explain who acted, from which device, through which control, against which Azure resource, and what changed because of the investigation.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Create a set of investigation pivots that connect Azure events to Defender entities. Common pivots include account object ID, user principal name, device ID, IP address, cloud app, URL, file hash, and timestamp windows. Document how each pivot should be normalized.&lt;/p&gt;
&lt;p&gt;Keep high-value hunts small and explainable. A hunt should answer a question, not prove that a query author understands every table. Start with a specific scenario such as privileged Azure change after risky sign-in, endpoint alert before cloud access, or suspicious email leading to cloud app activity.&lt;/p&gt;
&lt;p&gt;Use custom detections only for repeatable risks. Before promoting a hunt, define severity, owner, expected volume, response steps, and tuning rules. Review detections after incidents and after false positives.&lt;/p&gt;
&lt;p&gt;Use a simple routing rule for hunt outcomes. Treat a finding as an incident lane when it indicates active compromise or suspicious control-plane change. Treat it as a systemic control lane when it reveals a recurring weakness such as unmanaged devices reaching administrative paths. Treat it as an architecture debt lane when the hunt exposes missing telemetry, weak retention, or unclear ownership. Reclassify the lane when new evidence changes impact, likelihood, or response urgency.&lt;/p&gt;
&lt;p&gt;Plan for retention explicitly. If your organization needs to investigate beyond 30 days, design the export or Sentinel path before the incident. Retention is difficult to retrofit under pressure.&lt;/p&gt;
&lt;p&gt;Train analysts on time handling. Use UTC in queries and be clear when screenshots or portal results display local time. Timeline errors are one of the simplest ways to undermine an otherwise strong investigation.&lt;/p&gt;
&lt;h3 id="practical-advanced-hunting-pivots"&gt;Practical advanced hunting pivots
&lt;/h3&gt;&lt;p&gt;These examples run in Microsoft Defender XDR advanced hunting, not Azure Monitor Logs. They add identity, device, cloud app, and alert-evidence context around Azure investigations. Do not assume you can directly join to &lt;code&gt;AzureActivity&lt;/code&gt; in Defender XDR unless Microsoft Sentinel tables are onboarded into the Defender portal and visible to your role.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 1d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let adminIndicators = dynamic([&amp;#34;Add member to role&amp;#34;, &amp;#34;Add app role assignment&amp;#34;, &amp;#34;Consent to application&amp;#34;, &amp;#34;Update application&amp;#34;]);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CloudAppEvents
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where Timestamp &amp;gt;= ago(lookback)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where IsAdminOperation == true or ActionType has_any (adminIndicators) or ActivityType has_any (adminIndicators)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project Timestamp, AccountObjectId, AccountId, AccountDisplayName, Application, ActionType, ActivityType, IPAddress, CountryCode, OSPlatform, ObjectName, ObjectType
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by Timestamp desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 1d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let accountUpn = &amp;#34;admin@contoso.com&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DeviceEvents
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where Timestamp &amp;gt;= ago(lookback)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where InitiatingProcessAccountUpn =~ accountUpn
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project Timestamp, DeviceName, ActionType, InitiatingProcessFileName, InitiatingProcessCommandLine, InitiatingProcessSHA1, RemoteIP, RemoteUrl, ReportId
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by Timestamp desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 7d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AlertEvidence
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where Timestamp &amp;gt;= ago(lookback)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where CloudPlatform =~ &amp;#34;Azure&amp;#34; or isnotempty(ResourceID) or EntityType in~ (&amp;#34;CloudResource&amp;#34;, &amp;#34;AzureResource&amp;#34;, &amp;#34;User&amp;#34;, &amp;#34;Device&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project Timestamp, AlertId, Title, Severity, ServiceSource, EntityType, EvidenceRole, AccountUpn, DeviceName, CloudResource, ResourceType, ResourceID, SubscriptionId
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by Timestamp desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The table boundary matters. Microsoft documents &lt;code&gt;CloudAppEvents&lt;/code&gt; as Defender for Cloud Apps activity, &lt;code&gt;DeviceEvents&lt;/code&gt; as Defender for Endpoint device events, and &lt;code&gt;AlertEvidence&lt;/code&gt; as alert entities from Defender services and onboarded Sentinel workspaces. Use these as pivots from an Azure investigation, not as proof that all Azure control-plane data exists inside XDR.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Advanced hunting earns its place when it connects an Azure action back to a human and a device - the sign-in, the mailbox rule, the endpoint event - not when it just becomes a second console to run disconnected searches in.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/azure-security-telemetry-toolkit/" &gt;Azure Security Telemetry Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/defender-xdr/advanced-hunting-overview" target="_blank" rel="noopener"
&gt;Advanced hunting overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/defender-xdr/advanced-hunting-best-practices" target="_blank" rel="noopener"
&gt;Advanced hunting best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/defender-xdr/custom-detection-rules" target="_blank" rel="noopener"
&gt;Custom detections in Defender XDR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/unified-secops-platform/microsoft-sentinel-onboard" target="_blank" rel="noopener"
&gt;Microsoft Sentinel in the Defender portal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Designing Microsoft Sentinel Around Normalized Signals</title><link>https://blog.brewedinthecloud.com/p/azure-security-telemetry-sentinel-normalization/</link><pubDate>Tue, 29 Sep 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-security-telemetry-sentinel-normalization/</guid><description>&lt;p&gt;After collection comes interpretation. Microsoft Sentinel can ingest data from many Azure, Microsoft, third-party, and custom sources, but raw ingestion alone does not make a detection program resilient. If every analytic rule is tightly coupled to one vendor table or one proprietary schema, the detection library becomes fragile.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Normalization is not a data-engineering luxury; it is how security content survives source diversity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post focuses on using normalized signals, especially the Advanced Security Information Model, to make Sentinel content more portable, readable, and maintainable.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Microsoft Sentinel is most valuable when it becomes a security reasoning layer, not just a log bucket. Analysts and detection engineers need to ask questions that cut across sources: authentication, network sessions, process activity, audit events, file activity, DNS activity, and alerts. Those concepts are more stable than individual table names.&lt;/p&gt;
&lt;p&gt;ASIM provides a normalization layer between diverse data sources and the people or content that use the data. Microsoft describes ASIM as following the robustness principle: be strict in what you send and flexible in what you accept. In practice, ASIM maps proprietary source telemetry into normalized schemas with consistent field names and meanings.&lt;/p&gt;
&lt;p&gt;That matters because security operations rarely stay inside a single product boundary. An identity investigation may involve Microsoft Entra logs, endpoint data, firewall records, cloud app telemetry, and custom application logs. Without normalization, each investigation becomes a manual translation exercise. With normalization, the team can reason in common concepts.&lt;/p&gt;
&lt;p&gt;The mental model is to separate source onboarding from detection intent. A source-specific parser should understand the source. A detection should express the behavior it cares about. That separation lets new sources improve existing content instead of requiring every rule to be rewritten.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;ASIM uses normalized schemas and parsers. The schemas define common event types such as authentication, DNS, network session, process event, audit event, file activity, and user management. Parsers map source-specific tables into those schemas. Sentinel content can then query normalized views rather than hard-coding every source table.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Source Tables] --&gt; B[ASIM Parsers]
B --&gt; C[Normalized Schemas]
C --&gt; D[Analytics Rules]
C --&gt; E[Hunting Queries]
C --&gt; F[Workbooks]
D --&gt; G[Incidents]
&lt;/div&gt;
&lt;p&gt;There are two important normalization patterns. Query-time parsers present a normalized view over existing data without changing the original table. This is flexible and useful because parser fixes can apply to existing data. Ingest-time normalization writes data into normalized tables, which can improve query performance for large or frequently used data sets.&lt;/p&gt;
&lt;p&gt;The trade-off is familiar: flexibility versus performance and operational complexity. Query-time parsing is often easier to adopt and iterate. Ingest-time normalization may be better for high-volume, high-value schemas where query performance and cost predictability matter.&lt;/p&gt;
&lt;p&gt;Sentinel content should be designed around source-agnostic intent where possible. For example, a brute-force detection should care about authentication failure and success patterns, entities, result codes, and source addresses. It should not need a separate rule for every identity source if normalized authentication events can represent the behavior consistently.&lt;/p&gt;
&lt;p&gt;Normalization does not remove the need to understand source detail. It reduces unnecessary coupling. Detection engineers still need to know where fields came from, which parser versions are in use, how timestamps behave, and where source-specific semantics matter.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;The biggest operational gain is maintainability. Without normalization, each new telemetry source increases detection library complexity. A new firewall, identity provider, or endpoint source may require duplicate rules, duplicate workbooks, and duplicate hunting queries. With normalized schemas, new sources can expand the coverage of existing content.&lt;/p&gt;
&lt;p&gt;During an investigation, normalization reduces cognitive load. Analysts can ask consistent questions: what account, what source, what destination, what action, what result, what device, what process? They do not need to memorize every vendor-specific column before they can make progress.&lt;/p&gt;
&lt;p&gt;Normalization also improves content governance. Detection owners can define which rules are source-specific and which are source-agnostic. They can track parser health as part of telemetry readiness. They can test whether onboarding a new source improves coverage for existing analytics. That is a more mature operating model than counting connectors.&lt;/p&gt;
&lt;p&gt;For hybrid and multi-cloud environments, ASIM is especially useful. Azure environments often coexist with on-premises systems, SaaS platforms, endpoint telemetry, and other clouds. A Sentinel program that assumes all security data looks like Azure-native data will struggle. A normalized program can accept diversity without letting it dominate every rule.&lt;/p&gt;
&lt;p&gt;There is also a resilience benefit. Vendors change schemas, teams replace tools, and log sources evolve. Normalization creates a buffer between source churn and detection intent. The buffer is not perfect, but it gives security engineering a place to manage change deliberately.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The first gotcha is believing normalization is automatic. Deploying Sentinel does not mean every source is normalized. You need to know which parsers exist, which sources they support, which schemas are relevant, and whether your content actually uses them.&lt;/p&gt;
&lt;p&gt;The second gotcha is ignoring parser quality. A normalized field is only useful if it is mapped correctly. If source semantics are misunderstood, normalized content can produce misleading results. Parser validation should be part of onboarding, especially for custom sources.&lt;/p&gt;
&lt;p&gt;Performance can also surprise teams. Query-time parsers are flexible, but complex parsing over large data sets can slow queries. High-volume detections may need optimization, summarized data, or ingest-time normalization. A beautiful normalized query that times out is not operationally useful.&lt;/p&gt;
&lt;p&gt;Another edge case is over-normalization. Some detections depend on source-specific nuance. Forcing everything through a common schema can hide details that matter. The right pattern is not &amp;ldquo;only ASIM.&amp;rdquo; It is &amp;ldquo;use normalized schemas where the behavior is common, and keep source-specific logic where the source detail changes the decision.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Finally, ownership matters. Parsers, workbooks, analytic rules, and connectors are often managed by different people. If nobody owns the normalization layer, it will drift. Treat parser health and schema coverage as part of the Sentinel platform.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Build an ASIM adoption map. List the detection domains you care about, such as authentication, network, process, DNS, audit, and user management. Then map which data sources feed each domain, which parsers exist, and which rules use normalized schemas.&lt;/p&gt;
&lt;p&gt;Prefer normalized content for common behavioral detections. Brute force, impossible travel, suspicious process patterns, DNS anomalies, and network session patterns are good candidates when the underlying schema supports them. Keep source-specific detections for source-specific capabilities.&lt;/p&gt;
&lt;p&gt;Test parser output with known events. Do not validate only by checking that a parser returns rows. Validate entity fields, action fields, result fields, timestamps, source and destination fields, and error handling. Analysts need meaning, not just rows.&lt;/p&gt;
&lt;p&gt;Monitor query performance. If a normalized query becomes a core analytic rule, measure execution time and cost. Consider optimization or ingest-time normalization for high-volume paths.&lt;/p&gt;
&lt;p&gt;Document the contract. Detection content should state whether it depends on ASIM, which schema it expects, which sources are covered, and what assumptions are made. That documentation helps future engineers avoid breaking detection coverage during source changes.&lt;/p&gt;
&lt;h3 id="practical-asim-aligned-authentication-query"&gt;Practical ASIM-aligned authentication query
&lt;/h3&gt;&lt;p&gt;This example uses the Microsoft Sentinel &lt;code&gt;imAuthentication&lt;/code&gt; filtering parser so the detection intent is expressed through ASIM authentication fields rather than one source table. It looks for a common investigation pattern: many failed logons followed by a success for the same target user and logon method.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 1d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let failureThreshold = 10;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;imAuthentication(starttime = ago(lookback), endtime = now())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where EventType == &amp;#34;Logon&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where EventResult in (&amp;#34;Failure&amp;#34;, &amp;#34;Success&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FailedLogons = countif(EventResult == &amp;#34;Failure&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SuccessfulLogons = countif(EventResult == &amp;#34;Success&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FirstSeen = min(EventStartTime),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LastSeen = max(EventEndTime),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SourceIps = make_set(SrcIpAddr, 10),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Products = make_set(EventProduct, 10)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; by TargetUsername, TargetUserId, LogonMethod
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where FailedLogons &amp;gt;= failureThreshold and SuccessfulLogons &amp;gt; 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project TargetUsername, TargetUserId, LogonMethod, FailedLogons, SuccessfulLogons, FirstSeen, LastSeen, SourceIps, Products
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by FailedLogons desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The source assumption is that your workspace has authentication sources covered by supported ASIM parsers. Microsoft documents fields such as &lt;code&gt;EventType&lt;/code&gt;, &lt;code&gt;EventResult&lt;/code&gt;, &lt;code&gt;EventStartTime&lt;/code&gt;, &lt;code&gt;EventEndTime&lt;/code&gt;, &lt;code&gt;TargetUsername&lt;/code&gt;, &lt;code&gt;TargetUserId&lt;/code&gt;, &lt;code&gt;LogonMethod&lt;/code&gt;, and &lt;code&gt;SrcIpAddr&lt;/code&gt; in the ASIM authentication schema. Before promoting this to an analytic rule, test it with known events and confirm the parser maps your identity sources correctly.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Normalization is working when a new source improves detection coverage without forcing the team to relearn the entire investigation model - not when it becomes a new set of hunting queries nobody else can maintain.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/azure-security-telemetry-toolkit/" &gt;Azure Security Telemetry Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/normalization" target="_blank" rel="noopener"
&gt;Normalization and the Advanced Security Information Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/normalization-content" target="_blank" rel="noopener"
&gt;ASIM security content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/normalization-modify-content" target="_blank" rel="noopener"
&gt;Modify content to use ASIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/connect-data-sources" target="_blank" rel="noopener"
&gt;Microsoft Sentinel data connectors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Collecting Azure Resource Logs Without Creating Noise</title><link>https://blog.brewedinthecloud.com/p/azure-security-telemetry-diagnostic-settings/</link><pubDate>Thu, 24 Sep 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-security-telemetry-diagnostic-settings/</guid><description>&lt;p&gt;Once the Azure control plane is visible, the next question is which resource-level signals deserve to be collected. This is where many telemetry programs become expensive and disappointing. Teams enable every diagnostic category they can find, send it all to one workspace, and then discover that most of the data is not tied to a detection, investigation, or assurance use case.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A good Azure telemetry design is selective by intent, not selective by accident.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Diagnostic settings are the bridge between Azure resources and operational destinations such as Log Analytics, Event Hubs, and storage accounts. They are powerful, but they need architecture. Collection should be driven by risk, investigation paths, and response ownership.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Think of resource logs as evidence from the services that carry business risk. The control plane tells you that a resource changed. Resource logs tell you how that resource behaved. For security telemetry, the question is not &amp;ldquo;can this service emit logs?&amp;rdquo; The question is &amp;ldquo;which emitted events would change a detection, investigation, or governance decision?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This shifts the conversation from log categories to decisions. For a key vault, useful questions include who accessed secrets, whether access was denied, whether purge protection matters, and whether administrative changes align with policy. For a firewall or application gateway, useful questions include what was allowed, what was denied, which rules matched, and whether traffic patterns changed. For storage, useful questions include access paths, authentication methods, network source, and data access patterns.&lt;/p&gt;
&lt;p&gt;The mental model is signal portfolio management. Some logs are high-value and low-volume. Some are high-value but expensive. Some are operationally useful but rarely security relevant. Some only matter during a major incident. Treating them all equally creates cost pressure and weakens analyst focus.&lt;/p&gt;
&lt;p&gt;An architecture-first approach classifies resource logs into tiers: mandatory security evidence, conditional investigation support, operational-only telemetry, and excluded noise. That classification should be visible in platform standards, not hidden in individual diagnostic settings.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Diagnostic settings define which log categories and metrics are collected from a resource and where they are sent. A single resource can have diagnostic settings that route data to destinations such as a Log Analytics workspace, an Event Hubs namespace, or a storage account. Each destination supports a different operating model.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Azure Resource] --&gt; B[Diagnostic Setting]
B --&gt; C[Log Analytics Workspace]
B --&gt; D[Event Hubs]
B --&gt; E[Storage Account]
C --&gt; F[Sentinel Detections]
D --&gt; G[SIEM or Data Pipeline]
E --&gt; H[Archive and Retention]
&lt;/div&gt;
&lt;p&gt;Log Analytics is commonly used when teams need query, detection, workbook, and Microsoft Sentinel integration. Event Hubs is useful when telemetry must be streamed to another platform, a downstream security data lake, or a central enterprise pipeline. Storage can support archive and compliance retention patterns, although it is less convenient for active detection.&lt;/p&gt;
&lt;p&gt;The critical design choice is not only destination. It is category selection. Azure services expose different diagnostic categories, and not all categories have equal security value. A storage account, key vault, firewall, application gateway, Kubernetes service, or database service will each require a different collection decision. Copying the same diagnostic template everywhere is rarely correct.&lt;/p&gt;
&lt;p&gt;At scale, deployment matters. Azure Policy can deploy diagnostic settings for supported resources and can audit resources that are missing expected settings. Infrastructure as code can also define diagnostic settings alongside the resource. The most mature pattern is to combine both: templates create the expected configuration at deployment time, and policy detects drift or resources created outside the normal path.&lt;/p&gt;
&lt;p&gt;Cost management must be part of the design. Ingestion volume, retention, table plan choices, and query behavior all affect the operating cost. Security teams need enough telemetry to investigate and detect, while platform teams need predictable cost boundaries. That trade-off should be explicit.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Diagnostic setting design directly affects incident response. During a suspected data exposure, the team may need to know whether storage data access logs were collected, whether key vault access was visible, whether firewall traffic was retained, and whether the data is queryable in the same workspace as related identity and control-plane events.&lt;/p&gt;
&lt;p&gt;If the logs are missing, the investigation becomes a reconstruction exercise. If the logs exist but are split across disconnected destinations, response slows down. If the logs exist but are buried under unclassified noise, analysts spend time filtering rather than deciding. A deliberate collection design improves all three outcomes.&lt;/p&gt;
&lt;p&gt;There is also a governance impact. When diagnostic settings are standardized, security and platform leaders can measure telemetry coverage. They can report which subscriptions and resource classes meet the logging baseline, where exceptions exist, and whether those exceptions have owners. That is much stronger than a general statement that &amp;ldquo;logging is enabled.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;For detection engineering, resource logs unlock higher-fidelity analytics. A network rule change from Activity Log is useful. A rule change followed by unusual allowed traffic from a firewall is more useful. A key vault configuration change is useful. The same change followed by denied secret reads, successful reads from a new identity, or access from an unexpected network is more useful again.&lt;/p&gt;
&lt;p&gt;The impact is not just better alerting. It is better prioritization. Resource logs help teams decide which control-plane changes matter most because they show whether the affected service behaved differently afterwards.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;Diagnostic settings can fail as an operating model when ownership is unclear. Security may define the requirement, platform may own policy, application teams may own the resource, and operations may own the workspace. Without clear responsibility, gaps persist because everyone assumes another team is handling them.&lt;/p&gt;
&lt;p&gt;Another gotcha is over-collection. Sending every metric and log category to a central workspace can create cost and performance issues without improving detection. More data can actually reduce security value if analysts cannot tell which tables matter or if high-value events are buried under routine operational records.&lt;/p&gt;
&lt;p&gt;Service differences are also important. Azure services do not all expose the same diagnostic categories, and category names can evolve. A policy that works for one resource type may not apply to another. Treat resource classes individually and review high-risk services more often.&lt;/p&gt;
&lt;p&gt;Log size and limits matter. Some destinations and services impose practical limits, and large records or high-volume categories can behave differently than expected. Defender for Cloud continuous export, for example, notes that Log Analytics supports records up to a specific size limit. That kind of detail matters when designing downstream pipelines.&lt;/p&gt;
&lt;p&gt;Finally, do not forget the security of the telemetry path itself. A workspace, event hub, or storage account receiving security logs is a high-value target. If an attacker can modify diagnostic settings, delete data, or change routing, they can damage your evidence trail. Protect the collection pipeline with the same seriousness as production infrastructure.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Start by defining a resource telemetry baseline for high-risk Azure services. Key Vault, Storage, networking services, identity-adjacent services, Kubernetes, databases, and internet-facing services usually deserve early attention. For each resource class, document the mandatory categories, optional categories, destination, retention, and reason for collection.&lt;/p&gt;
&lt;p&gt;Use policy to audit and deploy diagnostic settings where supported. Pair that with infrastructure as code so new resources are born with the expected telemetry configuration. Review policy exemptions as security exceptions, not administrative clutter.&lt;/p&gt;
&lt;p&gt;Route telemetry based on use case. Send detection and investigation data to Log Analytics and Sentinel. Stream enterprise integration data to Event Hubs where needed. Use archive destinations for long-term retention requirements. Avoid one-size-fits-all routing.&lt;/p&gt;
&lt;p&gt;Create a cost feedback loop. Track ingestion by resource type, category, subscription, and owner. If a category is expensive, either prove its security value or redesign the route. Cost control should not mean blind deletion; it should mean evidence-based collection.&lt;/p&gt;
&lt;p&gt;Test the baseline with incident scenarios. Pick scenarios such as secret access, public exposure, firewall rule changes, and suspicious administrative updates. Confirm that the necessary logs are present, queryable, retained, and understandable by the teams who will use them.&lt;/p&gt;
&lt;h3 id="practical-tiered-diagnostic-settings-baseline"&gt;Practical tiered diagnostic-settings baseline
&lt;/h3&gt;&lt;p&gt;The implementation pattern I prefer is a resource-class baseline with two tiers: mandatory evidence that is always collected, and investigative telemetry that is enabled only where the service, risk, and cost model justify it. This Key Vault example uses the &lt;code&gt;Microsoft.Insights/diagnosticSettings@2021-05-01-preview&lt;/code&gt; Bicep resource, the Microsoft-documented &lt;code&gt;Audit&lt;/code&gt; category group for mandatory evidence, and &lt;code&gt;allLogs&lt;/code&gt; for the deeper tier.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsWorkspaceId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mandatoryEvidence&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;investigative&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;telemetryTier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mandatoryEvidence&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.KeyVault/vaults@2023-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;diagnosticSetting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/diagnosticSettings@2021-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;set-by-platform-security-baseline&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsWorkspaceId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsDestinationType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Dedicated&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;telemetryTier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mandatoryEvidence&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;categoryGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Audit&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;categoryGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;allLogs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllMetrics&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;At scale, wrap this decision in Azure Policy &lt;code&gt;DeployIfNotExists&lt;/code&gt; assignments and remediation tasks, but do not pretend one diagnostic setting fits every resource provider. Category groups are not universal, category names can differ by service, and &lt;code&gt;allLogs&lt;/code&gt; can change cost materially. The baseline should say which resource classes require audit evidence, which classes justify investigative categories, and which teams own exceptions.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Diagnostic settings aren&amp;rsquo;t a checkbox to tick during deployment. They&amp;rsquo;re the contract between Azure services and the security decisions your organization is going to need to make later - usually at 2am, during an incident, when it&amp;rsquo;s too late to go back and turn on the log you needed.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/azure-security-telemetry-toolkit/" &gt;Azure Security Telemetry Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/essentials/diagnostic-settings" target="_blank" rel="noopener"
&gt;Diagnostic settings in Azure Monitor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/logs/data-platform-logs" target="_blank" rel="noopener"
&gt;Azure Monitor Logs overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/connect-data-sources" target="_blank" rel="noopener"
&gt;Microsoft Sentinel data connectors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/service-limits" target="_blank" rel="noopener"
&gt;Azure Monitor service limits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Security Telemetry: Start with the Control Plane</title><link>https://blog.brewedinthecloud.com/p/azure-security-telemetry-control-plane/</link><pubDate>Tue, 22 Sep 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-security-telemetry-control-plane/</guid><description>&lt;p&gt;Security telemetry programs often begin with tools, dashboards, and alert rules. That is understandable, but it can push teams into collecting data before they know what the data is supposed to prove. In Azure, the better starting point is the control plane: who changed what, where, when, and through which path.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you cannot explain control-plane activity, you do not yet have a defensible Azure security telemetry model.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This first post in the Azure Security Telemetry series sets the foundation. We are not trying to collect every possible log. We are defining the minimum trustworthy signal set that helps platform, security, and operations teams reason about Azure change.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Think of Azure security telemetry as three connected layers. The first layer is intent: management operations, policy changes, role assignments, deployments, and configuration updates. The second layer is resource behavior: logs and metrics emitted by the workloads and services affected by those changes. The third layer is detection context: the alerts, incidents, investigations, and response actions that turn raw events into security decisions.&lt;/p&gt;
&lt;p&gt;The control plane sits in the intent layer. Azure Activity Log records subscription-level events such as administrative operations, service health events, and resource health changes. That makes it the audit backbone for questions like: who changed a network security group, who modified a key vault access model, who assigned a privileged role, or who deleted a diagnostic setting?&lt;/p&gt;
&lt;p&gt;The mistake is treating Activity Log as just another table. It is not simply &amp;ldquo;more logs.&amp;rdquo; It is the record of management authority being exercised. A denied data exfiltration attempt matters, but so does the control-plane change that opened the path for it. A risky deployment matters, but so does the identity and pipeline that submitted it.&lt;/p&gt;
&lt;p&gt;For senior cloud and security leaders, the mental model should be accountability before analytics. Start by mapping the decisions you must defend: privileged access, policy exceptions, logging coverage, network exposure, data protection posture, and incident response authority. Then collect the control-plane signals that let you prove those decisions are operating as intended.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure gives you some control-plane visibility by default, but durable security telemetry still requires deliberate routing. Platform metrics and activity logs exist automatically, while diagnostic settings are used to send activity logs, resource logs, and metrics to destinations such as Log Analytics workspaces, Event Hubs, or storage accounts. For security operations, the common pattern is to send security-relevant control-plane logs into a central Log Analytics workspace that is connected to Microsoft Sentinel.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Azure Subscription] --&gt; B[Activity Log]
A --&gt; C[Resource Diagnostic Settings]
B --&gt; D[Central Log Analytics Workspace]
C --&gt; D
D --&gt; E[Microsoft Sentinel]
D --&gt; F[Security Dashboards]
E --&gt; G[Analytics Rules and Incidents]
&lt;/div&gt;
&lt;p&gt;The important implementation detail is scope. Activity Log helps at the subscription level, but many useful resource logs require diagnostic settings on the individual resource, resource group, or supported platform service. That means your logging design must account for scale. If diagnostic settings are configured by hand, they will drift. If they are configured through policy, infrastructure as code, and landing zone standards, they can become part of the platform contract.&lt;/p&gt;
&lt;p&gt;You also need to separate collection from interpretation. The collection design answers: what should be sent, where should it go, how long should it be retained, and which teams can read it? The interpretation design answers: which events matter, how should they be enriched, when should they alert, and which response path owns them?&lt;/p&gt;
&lt;p&gt;The control-plane baseline should include administrative operations, policy and initiative changes, role assignment changes, diagnostic setting changes, network control updates, key vault configuration changes, security control changes, and major resource lifecycle events. The exact list varies by environment, but the principle does not: if a change can materially alter security posture, it should leave a searchable trail.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;The practical value of control-plane telemetry is speed and confidence during incidents. When something looks wrong, teams should not spend the first hour arguing whether the platform changed. They should be able to reconstruct the management timeline quickly.&lt;/p&gt;
&lt;p&gt;A common example is storage exposure. A storage account suddenly allows broader network access, public access is changed, or diagnostic coverage disappears. Without control-plane telemetry, the investigation starts with speculation. With it, the team can see the resource update, caller identity, caller IP, operation name, status, correlation ID, and timestamp. That does not solve the incident by itself, but it gives the response team a defensible timeline.&lt;/p&gt;
&lt;p&gt;Another example is privileged access. If a high-impact role assignment appears, the important question is not only whether the role exists. It is who assigned it, through which mechanism, whether it matched an approved change, whether Privileged Identity Management was involved, and whether related resources changed afterwards. Activity Log and identity telemetry together make that analysis possible.&lt;/p&gt;
&lt;p&gt;This also changes executive reporting. Instead of saying &amp;ldquo;we collect Azure logs,&amp;rdquo; the platform team can say &amp;ldquo;we can reconstruct privileged and security-relevant management changes across production subscriptions.&amp;rdquo; That is a stronger assurance statement because it is tied to decision quality, not data volume.&lt;/p&gt;
&lt;p&gt;Control-plane telemetry is also valuable for engineering discipline. When deployment pipelines, policy assignments, and manual portal actions are visible in the same workspace, teams can identify where change is automated, where exceptions happen, and where operational habits are creating risk. The telemetry becomes a feedback loop for platform maturity.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The control plane looks simple until you operate it across many subscriptions, tenants, regions, and teams. The hard parts are not usually about whether Azure can emit logs. They are about consistency, ownership, cost, and retention.&lt;/p&gt;
&lt;p&gt;The first gotcha is assuming that default visibility is the same as a security telemetry design. Azure provides useful default signals, but default availability does not guarantee central retention, Sentinel integration, least-privilege access, or detection coverage. A log that exists somewhere but cannot be queried by the incident team is not operationally useful.&lt;/p&gt;
&lt;p&gt;The second gotcha is inconsistent diagnostic settings. Many Azure services require explicit diagnostic settings to export resource logs. If these are created manually, some resources will be covered and others will not. If your detection rules depend on a log category that only exists on half the resources, the rule creates false confidence.&lt;/p&gt;
&lt;p&gt;The third gotcha is treating every operation as equal. A noisy stream of benign write operations can bury the few events that matter. Control-plane telemetry needs classification. Privileged access changes, policy changes, network exposure changes, logging changes, and security tooling changes deserve a different review path from routine tag updates.&lt;/p&gt;
&lt;p&gt;Retention is another edge case. Security investigations often need to look beyond a short operational window, especially when a compromise is discovered late. Retention choices should be deliberate and risk-based. Sending everything to a premium workspace forever is rarely the answer, but neither is keeping only a few days of high-value administrative history.&lt;/p&gt;
&lt;p&gt;Finally, watch for cross-tenant and centralized operations. Enterprises often centralize logging, security operations, or event streaming. That is powerful, but it introduces permission, routing, and accountability questions. The target workspace or event hub must be protected as a security asset.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Begin with a written signal contract. Define the control-plane events that are security relevant for your organization, the subscriptions in scope, the destination workspace, the retention class, and the owning team. Make the contract understandable enough that cloud platform engineers and security analysts can both challenge it.&lt;/p&gt;
&lt;p&gt;Use Azure Policy or infrastructure as code to deploy diagnostic settings at scale wherever possible. Manual setup is acceptable for early discovery, but it should not become the operating model for production. Policy also helps detect drift when teams create new resources without the expected telemetry path.&lt;/p&gt;
&lt;p&gt;Design the workspace access model intentionally. Security analysts need enough access to investigate, but broad workspace access can expose sensitive operational data. Use role-based access control, table-level patterns where appropriate, and a clear distinction between readers, detection engineers, platform operators, and workspace administrators.&lt;/p&gt;
&lt;p&gt;Classify events before alerting. Not every write operation is an incident. Build analytic logic around high-impact operations, unexpected actors, unusual locations, after-hours changes, failed administrative attempts, and changes to logging, identity, network, and security controls. Use allow lists carefully and review them regularly.&lt;/p&gt;
&lt;p&gt;Correlate control-plane activity with identity and resource telemetry. An administrative operation becomes more meaningful when you can connect it to sign-in behavior, workload behavior, Defender findings, or Sentinel incidents. The goal is not a bigger query. It is a more reliable story.&lt;/p&gt;
&lt;h3 id="practical-control-plane-reconstruction-query"&gt;Practical control-plane reconstruction query
&lt;/h3&gt;&lt;p&gt;Use this as a starting point in Azure Monitor Logs or Sentinel when Azure Activity Log has been routed into the &lt;code&gt;AzureActivity&lt;/code&gt; table. It focuses on security-relevant management operations and returns the actor, correlation, operation, target, result, and time fields needed for a defensible change timeline.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 14d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let securityRelevantOperations = dynamic([
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Authorization/roleAssignments/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Authorization/roleAssignments/delete&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Authorization/policyAssignments/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Authorization/policyExemptions/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Insights/diagnosticSettings/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Insights/diagnosticSettings/delete&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Network/networkSecurityGroups/securityRules/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.KeyVault/vaults/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Storage/storageAccounts/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Security/pricings/write&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AzureActivity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where TimeGenerated &amp;gt;= ago(lookback)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where CategoryValue in (&amp;#34;Administrative&amp;#34;, &amp;#34;Policy&amp;#34;, &amp;#34;Security&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where OperationNameValue in~ (securityRelevantOperations)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; or OperationNameValue has_any (&amp;#34;diagnosticSettings&amp;#34;, &amp;#34;roleAssignments&amp;#34;, &amp;#34;policyAssignments&amp;#34;, &amp;#34;networkSecurityGroups&amp;#34;, &amp;#34;keyVault&amp;#34;, &amp;#34;storageAccounts&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| extend AuthorizationAction = tostring(Authorization_d.action),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; AuthorizationScope = tostring(Authorization_d.scope),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RequestMethod = tostring(HTTPRequest.method),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ClientRequestId = tostring(HTTPRequest.clientRequestId),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ClaimsAppId = tostring(Claims_d.appid),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ClaimsUpn = tostring(Claims_d.upn)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project TimeGenerated, Caller, ClaimsUpn, ClaimsAppId, CallerIpAddress, CorrelationId, OperationId, OperationNameValue, ActivityStatusValue, ActivitySubstatusValue, SubscriptionId, ResourceGroup, ResourceProviderValue, ResourceId, AuthorizationAction, AuthorizationScope, RequestMethod, ClientRequestId
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by TimeGenerated desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The assumption is that &lt;code&gt;AzureActivity&lt;/code&gt; contains subscription-level or management group level events routed to the workspace. Microsoft documents &lt;code&gt;CorrelationId&lt;/code&gt; as the field that groups events belonging to the same broader action, while &lt;code&gt;OperationNameValue&lt;/code&gt;, &lt;code&gt;ResourceId&lt;/code&gt;, &lt;code&gt;Caller&lt;/code&gt;, &lt;code&gt;CallerIpAddress&lt;/code&gt;, &lt;code&gt;ActivityStatusValue&lt;/code&gt;, and &lt;code&gt;TimeGenerated&lt;/code&gt; provide the core reconstruction frame. Validate provider-specific operations in your tenant before turning this into an alert.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; The first real win I look for in an Azure security telemetry program isn&amp;rsquo;t the number of logs collected. It&amp;rsquo;s whether the team can explain a security-relevant change without relying on memory, screenshots, or tribal knowledge.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/azure-security-telemetry-toolkit/" &gt;Azure Security Telemetry Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/management-monitoring-overview" target="_blank" rel="noopener"
&gt;Azure security management and monitoring overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/essentials/diagnostic-settings" target="_blank" rel="noopener"
&gt;Diagnostic settings in Azure Monitor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log" target="_blank" rel="noopener"
&gt;Azure Activity Log&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/overview" target="_blank" rel="noopener"
&gt;Microsoft Sentinel overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Operating an Azure Exposure Management Program</title><link>https://blog.brewedinthecloud.com/p/operating-an-azure-exposure-management-program/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/operating-an-azure-exposure-management-program/</guid><description>&lt;p&gt;Most Azure security programs can produce long finding lists, but many struggle to prove that remediation work actually reduced exploitable paths. This post is about program governance, KPIs, and cross-team execution, and it takes an explicit stance: exposure management should be judged by attacker-path reduction, not by alert closure volume.&lt;/p&gt;
&lt;p&gt;My default assessment rule is simple: if a fix does not measurably reduce attacker reachability or blast radius, it should not outrank work that does. I still value hygiene and control coverage, but I treat those as supporting factors unless they materially change external attack opportunity.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Exposure management is a control loop, not a scanner report. The loop is discovery, context enrichment, prioritization, execution, and verification. Most teams perform discovery and sometimes prioritization. Fewer teams enforce a verification step that proves risk was actually reduced after deployment.&lt;/p&gt;
&lt;p&gt;I assess maturity with three questions. First, can we explain who owns each internet-facing asset? Second, can we prove why one finding should be fixed before another? Third, can we show before-and-after evidence that the top remediation items removed realistic attacker options? If the answer to any question is no, the program is still dashboard-centric.&lt;/p&gt;
&lt;p&gt;For this domain, I recommend a decision model rather than ad-hoc triage:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Program Effectiveness Index (PEI)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Formula:&lt;/strong&gt; PEI = Weighted(High-Risk MTTR, Recurrence Percent, Known Owner Coverage, Exception Expiry Compliance)&lt;/p&gt;
&lt;p&gt;This model is intentionally opinionated. It avoids the trap where a high CVSS issue on a low-consequence endpoint steals time from a medium-severity issue that sits on a short path to critical identity or data assets.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[External Asset Discovery] --&gt; B[Context Enrichment]
B --&gt; C[Program Effectiveness Index (PEI) Scoring]
C --&gt; D[Remediation Lane Routing]
D --&gt; E[Verification and Evidence]
E --&gt; F[Weekly Governance Review]
F --&gt; B
&lt;/div&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In implementation, teams first establish asset identity quality: hostname, service owner, business criticality, internet reachability, and data sensitivity. If any one of these is missing, triage confidence drops and ownership handoffs stall. This is why I prefer failing ownership quality early instead of pretending the queue is decision-ready.&lt;/p&gt;
&lt;p&gt;Next, findings are scored with the model above and placed into deterministic remediation lanes. A practical lane design is 24-hour, 72-hour, and 14-day SLA classes. Lane assignment should be automatic based on score bands and exception triggers, not manually debated in every stand-up.&lt;/p&gt;
&lt;p&gt;I make one explicit tie-breaker statement here: when two items have similar score, prioritize the item with higher transitive reachability into identity, secrets, or control-plane operations. That tie-break rule helps avoid local optimization where teams close many low-impact issues and defer the path that matters most.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assertion:&lt;/strong&gt; In mature exposure programs, prioritization quality matters more than queue throughput, because incorrect prioritization increases attacker opportunity even when closure counts look healthy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I route every program-level finding into one of three lanes, and I reclassify the moment measured outcomes change. Lane 1 (path-break) is for any single finding, anywhere in the program, that reopens a route to tier-0 identity or data - it escalates past normal SLA review straight to executive visibility. Lane 2 (systemic control) is for a KPI that&amp;rsquo;s trending the wrong way across multiple teams, such as exception-expiry compliance slipping in more than one business unit - these trigger a program-level root-cause review, not a team-by-team scolding. Lane 3 (architecture debt) is for known structural gaps, like inconsistent asset ownership data across subsidiaries, that need multi-quarter investment rather than urgent action.&lt;/p&gt;
&lt;p&gt;I put a hard checkpoint on Lane 3 items specifically, because architecture debt is where programs quietly go to die: every Lane 3 item gets a 90-day milestone review, and if the milestone is missed twice, it is reclassified into Lane 2 and given an executive owner. I will not let &amp;ldquo;we&amp;rsquo;re working on it long-term&amp;rdquo; survive past two missed checkpoints - that&amp;rsquo;s not governance, that&amp;rsquo;s a program pretending a known gap doesn&amp;rsquo;t need a deadline.&lt;/p&gt;
&lt;p&gt;The final step is verification. I require evidence of reduced exposure, such as closed reachable path, revoked external trust, removed vulnerable endpoint, or measurable drift reduction in telemetry. If evidence is missing, I treat the item as unresolved.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Teams that adopt this decision model generally reduce disagreement cycles between security and engineering. Instead of arguing over labels, they argue over measurable path consequence, which is a better use of time.&lt;/p&gt;
&lt;p&gt;A representative operational pattern looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Map top 50 internet-facing findings into the model.&lt;/li&gt;
&lt;li&gt;Auto-route into SLA lanes with owner assignment.&lt;/li&gt;
&lt;li&gt;Require verification artifact for closure.&lt;/li&gt;
&lt;li&gt;Review exceptions weekly with expiry discipline.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The impact is usually seen in three metrics: shorter high-risk MTTR, lower recurrence of previously fixed classes, and improved known-owner coverage for external assets. That combination provides stronger assurance than raw ticket closure counts.&lt;/p&gt;
&lt;p&gt;This is the comparison I put in front of the steering committee: a program that closes 500 findings across the quarter looks impressive in a slide, but it means little if the one repeat offender - a business unit with chronically expired exceptions on tier-0 services - never gets addressed. I will spend a governance conversation on that one business unit over celebrating the aggregate closure number. If your program reporting can&amp;rsquo;t separate volume from concentrated risk, it&amp;rsquo;s activity reporting, not program management.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll say plainly what most steering committees won&amp;rsquo;t: a program with a declining PEI score and a rising closure count is not improving, it&amp;rsquo;s getting better at closing easy things while the hard, concentrated risk sits untouched. I&amp;rsquo;d rather report a flat closure count with a rising PEI than the reverse, and I will defend that trade-off in front of any executive who pushes back on throughput.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The biggest failure mode is pretending the scoring model is objective when inputs are stale. If criticality or ownership metadata lags behind architecture change, the model can produce confidently wrong priorities.&lt;/p&gt;
&lt;p&gt;Another edge case is exception inflation. If teams can continuously renew exceptions without demonstrating compensating controls, the exposure program becomes a reporting layer rather than a risk-reduction engine.&lt;/p&gt;
&lt;p&gt;A third edge case is over-automation. Automation is powerful for routing and evidence capture, but premature hard enforcement can break delivery workflows and create silent bypass behavior. I recommend phase-gated enforcement with transparent policy criteria and rollback paths.&lt;/p&gt;
&lt;p&gt;The anti-pattern that undermines the most programs I&amp;rsquo;ve reviewed is a steering-committee report built around total findings closed program-wide. That number rewards volume and can rise even while one business unit&amp;rsquo;s exception backlog quietly rots on a tier-0 service. The metric that should anchor the report is exception-expiry compliance and MTTR broken out by business unit, not a single blended program-wide average.&lt;/p&gt;
&lt;p&gt;Hard exception rule for this post:
&lt;strong&gt;If exception-expiry compliance drops below 90 percent, suspend new exception approvals until the expired backlog is normalized.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Declare your assessment doctrine in writing and keep it visible in every remediation review.&lt;/li&gt;
&lt;li&gt;Keep scoring inputs small and auditable so teams trust the model.&lt;/li&gt;
&lt;li&gt;Separate score computation from policy overrides; both should be explicit.&lt;/li&gt;
&lt;li&gt;Require one owner and one due date for every high-consequence finding.&lt;/li&gt;
&lt;li&gt;Enforce evidence-based closure to avoid optimistic status updates.&lt;/li&gt;
&lt;li&gt;Time-box exceptions and require compensating controls before approval.&lt;/li&gt;
&lt;li&gt;Recalculate scores on architecture change events, not only on scan cycles.&lt;/li&gt;
&lt;li&gt;Publish weekly trend deltas for MTTR, recurrence, and owner coverage.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; My default rule is to prioritize attacker-path consequence over alert volume. Program maturity is proven by declining attacker opportunity, not by how many tickets closed this quarter.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/overview" target="_blank" rel="noopener"
&gt;Azure security fundamentals overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction" target="_blank" rel="noopener"
&gt;Introduction to Microsoft Defender for Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/overview" target="_blank" rel="noopener"
&gt;Azure Monitor overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/overview" target="_blank" rel="noopener"
&gt;Microsoft Sentinel overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Continuous Exposure Monitoring with Sentinel and Workbooks</title><link>https://blog.brewedinthecloud.com/p/continuous-exposure-monitoring-with-sentinel-and-workbooks/</link><pubDate>Tue, 15 Sep 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/continuous-exposure-monitoring-with-sentinel-and-workbooks/</guid><description>&lt;p&gt;Most Azure security programs can produce long finding lists, but many struggle to prove that remediation work actually reduced exploitable paths. This post is about operational monitoring, alerts, and executive reporting, and it takes an explicit stance: exposure management should be judged by attacker-path reduction, not by alert closure volume.&lt;/p&gt;
&lt;p&gt;My default assessment rule is simple: if a fix does not measurably reduce attacker reachability or blast radius, it should not outrank work that does. I still value hygiene and control coverage, but I treat those as supporting factors unless they materially change external attack opportunity.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Exposure management is a control loop, not a scanner report. The loop is discovery, context enrichment, prioritization, execution, and verification. Most teams perform discovery and sometimes prioritization. Fewer teams enforce a verification step that proves risk was actually reduced after deployment.&lt;/p&gt;
&lt;p&gt;I assess maturity with three questions. First, can we explain who owns each internet-facing asset? Second, can we prove why one finding should be fixed before another? Third, can we show before-and-after evidence that the top remediation items removed realistic attacker options? If the answer to any question is no, the program is still dashboard-centric.&lt;/p&gt;
&lt;p&gt;For this domain, I recommend a decision model rather than ad-hoc triage:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operational Risk Drift (ORD)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Formula:&lt;/strong&gt; ORD = New High-Risk Findings/week + Reopened Findings + SLA Breach Rate&lt;/p&gt;
&lt;p&gt;This model is intentionally opinionated. It avoids the trap where a high CVSS issue on a low-consequence endpoint steals time from a medium-severity issue that sits on a short path to critical identity or data assets.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[External Asset Discovery] --&gt; B[Context Enrichment]
B --&gt; C["Operational Risk Drift (ORD) Scoring"]
C --&gt; D[Remediation Lane Routing]
D --&gt; E[Verification and Evidence]
E --&gt; F[Weekly Governance Review]
F --&gt; B
&lt;/div&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In implementation, teams first establish asset identity quality: hostname, service owner, business criticality, internet reachability, and data sensitivity. If any one of these is missing, triage confidence drops and ownership handoffs stall. This is why I prefer failing ownership quality early instead of pretending the queue is decision-ready.&lt;/p&gt;
&lt;p&gt;Next, findings are scored with the model above and placed into deterministic remediation lanes. A practical lane design is 24-hour, 72-hour, and 14-day SLA classes. Lane assignment should be automatic based on score bands and exception triggers, not manually debated in every stand-up.&lt;/p&gt;
&lt;p&gt;I make one explicit tie-breaker statement here: when two items have similar score, prioritize the item with higher transitive reachability into identity, secrets, or control-plane operations. That tie-break rule helps avoid local optimization where teams close many low-impact issues and defer the path that matters most.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assertion:&lt;/strong&gt; In mature exposure programs, prioritization quality matters more than queue throughput, because incorrect prioritization increases attacker opportunity even when closure counts look healthy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I route every drift signal into one of three lanes, and I reclassify the moment new telemetry changes the picture. Lane 1 (path-break) is for a drift event that reopens reachability into identity, secrets, or control-plane operations - it triggers same-day escalation regardless of how the dashboard looks otherwise. Lane 2 (systemic control) is for a recurring drift pattern across multiple services, such as the same misconfiguration reappearing after remediation - these get a root-cause workbook and a staged fix, not repeated one-off tickets. Lane 3 (architecture debt) is for slow-moving drift that isn&amp;rsquo;t urgent yet, like a gradually rising SLA breach rate in a low-criticality workload - these get tracked with a review date, not buried in noise.&lt;/p&gt;
&lt;p&gt;The final step is verification. I require evidence of reduced exposure, such as closed reachable path, revoked external trust, removed vulnerable endpoint, or measurable drift reduction in telemetry. If evidence is missing, I treat the item as unresolved.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Teams that adopt this decision model generally reduce disagreement cycles between security and engineering. Instead of arguing over labels, they argue over measurable path consequence, which is a better use of time.&lt;/p&gt;
&lt;p&gt;A representative operational pattern looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Map top 50 internet-facing findings into the model.&lt;/li&gt;
&lt;li&gt;Auto-route into SLA lanes with owner assignment.&lt;/li&gt;
&lt;li&gt;Require verification artifact for closure.&lt;/li&gt;
&lt;li&gt;Review exceptions weekly with expiry discipline.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The impact is usually seen in three metrics: shorter high-risk MTTR, lower recurrence of previously fixed classes, and improved known-owner coverage for external assets. That combination provides stronger assurance than raw ticket closure counts.&lt;/p&gt;
&lt;p&gt;This is the trade-off I put in front of executives directly: a workbook showing 200 resolved alerts this month looks reassuring, but it tells you nothing if the one metric that matters - reopened findings on tier-0 services - is climbing. I&amp;rsquo;d rather present a dashboard with fewer green tiles and one honest red one than a wall of green that&amp;rsquo;s quietly hiding a worsening drift pattern. If the reporting can&amp;rsquo;t surface that distinction, it isn&amp;rsquo;t monitoring exposure - it&amp;rsquo;s monitoring activity.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The biggest failure mode is pretending the scoring model is objective when inputs are stale. If criticality or ownership metadata lags behind architecture change, the model can produce confidently wrong priorities.&lt;/p&gt;
&lt;p&gt;Another edge case is exception inflation. If teams can continuously renew exceptions without demonstrating compensating controls, the exposure program becomes a reporting layer rather than a risk-reduction engine.&lt;/p&gt;
&lt;p&gt;A third edge case is over-automation. Automation is powerful for routing and evidence capture, but premature hard enforcement can break delivery workflows and create silent bypass behavior. I recommend phase-gated enforcement with transparent policy criteria and rollback paths.&lt;/p&gt;
&lt;p&gt;The anti-pattern I actively watch for is a workbook tuned to show alert-closure velocity as the headline metric. That framing rewards teams for clearing high volumes of low-consequence alerts while a slow-building, high-consequence drift trend goes unreported because it doesn&amp;rsquo;t move the weekly closure number. The metric that should lead the dashboard is reopened findings and drift on tier-0 services, not total alerts actioned.&lt;/p&gt;
&lt;p&gt;Hard exception rule for this post:
&lt;strong&gt;If ORD worsens for two consecutive weeks on tier-1 services, trigger incident review and pause non-critical internet-facing changes.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Declare your assessment doctrine in writing and keep it visible in every remediation review.&lt;/li&gt;
&lt;li&gt;Keep scoring inputs small and auditable so teams trust the model.&lt;/li&gt;
&lt;li&gt;Separate score computation from policy overrides; both should be explicit.&lt;/li&gt;
&lt;li&gt;Require one owner and one due date for every high-consequence finding.&lt;/li&gt;
&lt;li&gt;Enforce evidence-based closure to avoid optimistic status updates.&lt;/li&gt;
&lt;li&gt;Time-box exceptions and require compensating controls before approval.&lt;/li&gt;
&lt;li&gt;Recalculate scores on architecture change events, not only on scan cycles.&lt;/li&gt;
&lt;li&gt;Publish weekly trend deltas for MTTR, recurrence, and owner coverage.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; My default rule is to prioritize attacker-path consequence over alert volume. Once a team adopts a deterministic model plus a hard exception rule, remediation decisions get faster, more defensible, and more likely to actually reduce real external attack opportunity - not just clear the queue.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/overview" target="_blank" rel="noopener"
&gt;Azure security fundamentals overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction" target="_blank" rel="noopener"
&gt;Introduction to Microsoft Defender for Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/overview" target="_blank" rel="noopener"
&gt;Azure Monitor overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/overview" target="_blank" rel="noopener"
&gt;Microsoft Sentinel overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Hardening Internet-Facing Assets with Policy and Automation</title><link>https://blog.brewedinthecloud.com/p/hardening-internet-facing-assets-with-policy-and-automation/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/hardening-internet-facing-assets-with-policy-and-automation/</guid><description>&lt;p&gt;Most Azure security programs can produce long finding lists, but many struggle to prove that remediation work actually reduced exploitable paths. This post is about policy-driven remediation and automation patterns, and it takes an explicit stance: exposure management should be judged by attacker-path reduction, not by alert closure volume.&lt;/p&gt;
&lt;p&gt;My default assessment rule is simple: if a fix does not measurably reduce attacker reachability or blast radius, it should not outrank work that does. I still value hygiene and control coverage, but I treat those as supporting factors unless they materially change external attack opportunity.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Exposure management is a control loop, not a scanner report. The loop is discovery, context enrichment, prioritization, execution, and verification. Most teams perform discovery and sometimes prioritization. Fewer teams enforce a verification step that proves risk was actually reduced after deployment.&lt;/p&gt;
&lt;p&gt;I assess maturity with three questions. First, can we explain who owns each internet-facing asset? Second, can we prove why one finding should be fixed before another? Third, can we show before-and-after evidence that the top remediation items removed realistic attacker options? If the answer to any question is no, the program is still dashboard-centric.&lt;/p&gt;
&lt;p&gt;For this domain, I recommend a decision model rather than ad-hoc triage:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remediation Routing Score (RRS)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Formula:&lt;/strong&gt; RRS = Control Gap Severity + Automation Feasibility + Recurrence Likelihood&lt;/p&gt;
&lt;p&gt;This model is intentionally opinionated. It avoids the trap where a high CVSS issue on a low-consequence endpoint steals time from a medium-severity issue that sits on a short path to critical identity or data assets.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[External Asset Discovery] --&gt; B[Context Enrichment]
B --&gt; C["Remediation Routing Score (RRS) Scoring"]
C --&gt; D[Remediation Lane Routing]
D --&gt; E[Verification and Evidence]
E --&gt; F[Weekly Governance Review]
F --&gt; B
&lt;/div&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In implementation, teams first establish asset identity quality: hostname, service owner, business criticality, internet reachability, and data sensitivity. If any one of these is missing, triage confidence drops and ownership handoffs stall. This is why I prefer failing ownership quality early instead of pretending the queue is decision-ready.&lt;/p&gt;
&lt;p&gt;Next, findings are scored with the model above and placed into deterministic remediation lanes. A practical lane design is 24-hour, 72-hour, and 14-day SLA classes. Lane assignment should be automatic based on score bands and exception triggers, not manually debated in every stand-up.&lt;/p&gt;
&lt;p&gt;I make one explicit tie-breaker statement here: when two items have similar score, prioritize the item with higher transitive reachability into identity, secrets, or control-plane operations. That tie-break rule helps avoid local optimization where teams close many low-impact issues and defer the path that matters most.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assertion:&lt;/strong&gt; In mature exposure programs, prioritization quality matters more than queue throughput, because incorrect prioritization increases attacker opportunity even when closure counts look healthy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I route every control gap into one of three lanes, and I reclassify the moment automation coverage or exception status changes. Lane 1 (path-break) is for any internet-facing gap that&amp;rsquo;s both policy-enforceable and sits on a path to identity or control-plane access - it gets deny-by-default treatment immediately, no exception debate. Lane 2 (systemic control) is for a control gap that recurs across many resources because a policy definition is missing or too narrow - these get a policy fix at the platform level, not repeated manual remediation. Lane 3 (architecture debt) is for gaps that are real but low-consequence, like a redundant rule that could be simplified - these get a backlog item and a review date.&lt;/p&gt;
&lt;p&gt;The final step is verification. I require evidence of reduced exposure, such as closed reachable path, revoked external trust, removed vulnerable endpoint, or measurable drift reduction in telemetry. If evidence is missing, I treat the item as unresolved.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Teams that adopt this decision model generally reduce disagreement cycles between security and engineering. Instead of arguing over labels, they argue over measurable path consequence, which is a better use of time.&lt;/p&gt;
&lt;p&gt;A representative operational pattern looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Map top 50 internet-facing findings into the model.&lt;/li&gt;
&lt;li&gt;Auto-route into SLA lanes with owner assignment.&lt;/li&gt;
&lt;li&gt;Require verification artifact for closure.&lt;/li&gt;
&lt;li&gt;Review exceptions weekly with expiry discipline.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The impact is usually seen in three metrics: shorter high-risk MTTR, lower recurrence of previously fixed classes, and improved known-owner coverage for external assets. That combination provides stronger assurance than raw ticket closure counts.&lt;/p&gt;
&lt;p&gt;I make this comparison explicit when a team wants to celebrate hardening progress: automating fixes for 100 low-impact, redundant firewall rules is useful housekeeping, but it doesn&amp;rsquo;t outrank one policy change that closes the only permissive rule allowing direct internet access to a management interface. Given a choice between the two bodies of work in the same sprint, I take the one rule every time. If your hardening backlog can&amp;rsquo;t rank those two differently, it isn&amp;rsquo;t measuring consequence - it&amp;rsquo;s measuring rule count.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The biggest failure mode is pretending the scoring model is objective when inputs are stale. If criticality or ownership metadata lags behind architecture change, the model can produce confidently wrong priorities.&lt;/p&gt;
&lt;p&gt;Another edge case is exception inflation. If teams can continuously renew exceptions without demonstrating compensating controls, the exposure program becomes a reporting layer rather than a risk-reduction engine.&lt;/p&gt;
&lt;p&gt;A third edge case is over-automation. Automation is powerful for routing and evidence capture, but premature hard enforcement can break delivery workflows and create silent bypass behavior. I recommend phase-gated enforcement with transparent policy criteria and rollback paths.&lt;/p&gt;
&lt;p&gt;The anti-pattern I push back on is a hardening dashboard that measures automation coverage percentage as the success metric - &amp;ldquo;92 percent of policies enforced.&amp;rdquo; That number can look excellent while the 8 percent gap contains the one permissive rule that actually matters. The metric that should be reported instead is whether every internet-facing, policy-enforceable gap tied to a known attack path has been closed, not the aggregate enforcement percentage.&lt;/p&gt;
&lt;p&gt;Hard exception rule for this post:
&lt;strong&gt;If the control gap is internet-facing and policy-enforceable, deny by default; exceptions must be time-bound with compensating controls.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Declare your assessment doctrine in writing and keep it visible in every remediation review.&lt;/li&gt;
&lt;li&gt;Keep scoring inputs small and auditable so teams trust the model.&lt;/li&gt;
&lt;li&gt;Separate score computation from policy overrides; both should be explicit.&lt;/li&gt;
&lt;li&gt;Require one owner and one due date for every high-consequence finding.&lt;/li&gt;
&lt;li&gt;Enforce evidence-based closure to avoid optimistic status updates.&lt;/li&gt;
&lt;li&gt;Time-box exceptions and require compensating controls before approval.&lt;/li&gt;
&lt;li&gt;Recalculate scores on architecture change events, not only on scan cycles.&lt;/li&gt;
&lt;li&gt;Publish weekly trend deltas for MTTR, recurrence, and owner coverage.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; My default rule is to prioritize attacker-path consequence over alert volume. A deterministic model plus a hard exception rule turns hardening from an argument about severity labels into a decision anyone on the team can defend.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/overview" target="_blank" rel="noopener"
&gt;Azure security fundamentals overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction" target="_blank" rel="noopener"
&gt;Introduction to Microsoft Defender for Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/overview" target="_blank" rel="noopener"
&gt;Azure Monitor overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/overview" target="_blank" rel="noopener"
&gt;Microsoft Sentinel overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Prioritizing External Risk with Attack Path Context</title><link>https://blog.brewedinthecloud.com/p/prioritizing-external-risk-with-attack-path-context/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/prioritizing-external-risk-with-attack-path-context/</guid><description>&lt;p&gt;Most Azure security programs can produce long finding lists, but many struggle to prove that remediation work actually reduced exploitable paths. This post is about risk prioritization with business impact and attack path evidence, and it takes an explicit stance: exposure management should be judged by attacker-path reduction, not by alert closure volume.&lt;/p&gt;
&lt;p&gt;My default assessment rule is simple: if a fix does not measurably reduce attacker reachability or blast radius, it should not outrank work that does. I still value hygiene and control coverage, but I treat those as supporting factors unless they materially change external attack opportunity.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Exposure management is a control loop, not a scanner report. The loop is discovery, context enrichment, prioritization, execution, and verification. Most teams perform discovery and sometimes prioritization. Fewer teams enforce a verification step that proves risk was actually reduced after deployment.&lt;/p&gt;
&lt;p&gt;I assess maturity with three questions. First, can we explain who owns each internet-facing asset? Second, can we prove why one finding should be fixed before another? Third, can we show before-and-after evidence that the top remediation items removed realistic attacker options? If the answer to any question is no, the program is still dashboard-centric.&lt;/p&gt;
&lt;p&gt;For this domain, I recommend a decision model rather than ad-hoc triage:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attack Path Priority (APP)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Formula:&lt;/strong&gt; APP = Exploitability x Path Reduction Potential x Business Impact&lt;/p&gt;
&lt;p&gt;This model is intentionally opinionated. It avoids the trap where a high CVSS issue on a low-consequence endpoint steals time from a medium-severity issue that sits on a short path to critical identity or data assets.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[External Asset Discovery] --&gt; B[Context Enrichment]
B --&gt; C[Attack Path Priority (APP) Scoring]
C --&gt; D[Remediation Lane Routing]
D --&gt; E[Verification and Evidence]
E --&gt; F[Weekly Governance Review]
F --&gt; B
&lt;/div&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In implementation, teams first establish asset identity quality: hostname, service owner, business criticality, internet reachability, and data sensitivity. If any one of these is missing, triage confidence drops and ownership handoffs stall. This is why I prefer failing ownership quality early instead of pretending the queue is decision-ready.&lt;/p&gt;
&lt;p&gt;Next, findings are scored with the model above and placed into deterministic remediation lanes. A practical lane design is 24-hour, 72-hour, and 14-day SLA classes. Lane assignment should be automatic based on score bands and exception triggers, not manually debated in every stand-up.&lt;/p&gt;
&lt;p&gt;I make one explicit tie-breaker statement here: when two items have similar score, prioritize the item with higher transitive reachability into identity, secrets, or control-plane operations. That tie-break rule helps avoid local optimization where teams close many low-impact issues and defer the path that matters most.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assertion:&lt;/strong&gt; In mature exposure programs, prioritization quality matters more than queue throughput, because incorrect prioritization increases attacker opportunity even when closure counts look healthy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I route every prioritized finding into one of three lanes, and I reclassify the moment new attack-path evidence appears. Lane 1 (path-break) is for a finding that is the sole remaining route to a tier-0 identity or data asset - it outranks everything else in the queue by default, no scoring debate required. Lane 2 (systemic control) is for a class of findings that recur across many assets and all contribute partial exploitability, such as a shared misconfiguration pattern - these get a coordinated fix, not individual triage. Lane 3 (architecture debt) is for findings with real exploitability but no meaningful path to anything critical - these get tracked, not rushed.&lt;/p&gt;
&lt;p&gt;The final step is verification. I require evidence of reduced exposure, such as closed reachable path, revoked external trust, removed vulnerable endpoint, or measurable drift reduction in telemetry. If evidence is missing, I treat the item as unresolved.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Teams that adopt this decision model generally reduce disagreement cycles between security and engineering. Instead of arguing over labels, they argue over measurable path consequence, which is a better use of time.&lt;/p&gt;
&lt;p&gt;A representative operational pattern looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Map top 50 internet-facing findings into the model.&lt;/li&gt;
&lt;li&gt;Auto-route into SLA lanes with owner assignment.&lt;/li&gt;
&lt;li&gt;Require verification artifact for closure.&lt;/li&gt;
&lt;li&gt;Review exceptions weekly with expiry discipline.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The impact is usually seen in three metrics: shorter high-risk MTTR, lower recurrence of previously fixed classes, and improved known-owner coverage for external assets. That combination provides stronger assurance than raw ticket closure counts.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the trade-off I make explicit whenever prioritization gets contested: closing 100 findings that all lead to dead-end, low-consequence endpoints looks like strong throughput, but it&amp;rsquo;s worth less than closing the 20 findings that collapse the only path to a tier-0 identity store. I will always choose the smaller batch that removes viable reachability over the larger batch that doesn&amp;rsquo;t. If two competing pieces of work are both labeled &amp;ldquo;high priority,&amp;rdquo; that tie-break - which one removes a real path - is the rule that should decide, not who asked first.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The biggest failure mode is pretending the scoring model is objective when inputs are stale. If criticality or ownership metadata lags behind architecture change, the model can produce confidently wrong priorities.&lt;/p&gt;
&lt;p&gt;Another edge case is exception inflation. If teams can continuously renew exceptions without demonstrating compensating controls, the exposure program becomes a reporting layer rather than a risk-reduction engine.&lt;/p&gt;
&lt;p&gt;A third edge case is over-automation. Automation is powerful for routing and evidence capture, but premature hard enforcement can break delivery workflows and create silent bypass behavior. I recommend phase-gated enforcement with transparent policy criteria and rollback paths.&lt;/p&gt;
&lt;p&gt;The anti-pattern I actively correct is a risk report that ranks findings purely by CVSS score aggregated across the queue. That approach rewards raising the average severity number, not reducing real attacker opportunity, and it can bury the one moderate-severity finding that happens to sit on the only path to something critical. The metric that should drive the report is count of viable tier-0 paths remaining, not average or aggregate severity score.&lt;/p&gt;
&lt;p&gt;Hard exception rule for this post:
&lt;strong&gt;If a remediation removes the only transitive path to tier-0 identity or data, it outranks higher-volume findings by default.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Declare your assessment doctrine in writing and keep it visible in every remediation review.&lt;/li&gt;
&lt;li&gt;Keep scoring inputs small and auditable so teams trust the model.&lt;/li&gt;
&lt;li&gt;Separate score computation from policy overrides; both should be explicit.&lt;/li&gt;
&lt;li&gt;Require one owner and one due date for every high-consequence finding.&lt;/li&gt;
&lt;li&gt;Enforce evidence-based closure to avoid optimistic status updates.&lt;/li&gt;
&lt;li&gt;Time-box exceptions and require compensating controls before approval.&lt;/li&gt;
&lt;li&gt;Recalculate scores on architecture change events, not only on scan cycles.&lt;/li&gt;
&lt;li&gt;Publish weekly trend deltas for MTTR, recurrence, and owner coverage.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; My default rule is to prioritize attacker-path consequence over alert volume. A remediation that removes the only route to a tier-0 identity should outrank a dozen louder findings that lead nowhere - that&amp;rsquo;s the judgment call this model is built to defend.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/overview" target="_blank" rel="noopener"
&gt;Azure security fundamentals overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction" target="_blank" rel="noopener"
&gt;Introduction to Microsoft Defender for Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/overview" target="_blank" rel="noopener"
&gt;Azure Monitor overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/overview" target="_blank" rel="noopener"
&gt;Microsoft Sentinel overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Discovering Shadow IT with Azure Exposure Management</title><link>https://blog.brewedinthecloud.com/p/discovering-shadow-it-with-azure-exposure-management/</link><pubDate>Thu, 03 Sep 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/discovering-shadow-it-with-azure-exposure-management/</guid><description>&lt;p&gt;Most Azure security programs can produce long finding lists, but many struggle to prove that remediation work actually reduced exploitable paths. This post is about shadow IT discovery and ownership mapping, and it takes an explicit stance: exposure management should be judged by attacker-path reduction, not by alert closure volume.&lt;/p&gt;
&lt;p&gt;My default assessment rule is simple: if a fix does not measurably reduce attacker reachability or blast radius, it should not outrank work that does. I still value hygiene and control coverage, but I treat those as supporting factors unless they materially change external attack opportunity.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Exposure management is a control loop, not a scanner report. The loop is discovery, context enrichment, prioritization, execution, and verification. Most teams perform discovery and sometimes prioritization. Fewer teams enforce a verification step that proves risk was actually reduced after deployment.&lt;/p&gt;
&lt;p&gt;I assess maturity with three questions. First, can we explain who owns each internet-facing asset? Second, can we prove why one finding should be fixed before another? Third, can we show before-and-after evidence that the top remediation items removed realistic attacker options? If the answer to any question is no, the program is still dashboard-centric.&lt;/p&gt;
&lt;p&gt;For this domain, I recommend a decision model rather than ad-hoc triage:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shadow Asset Risk Score (SARS)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Formula:&lt;/strong&gt; SARS = Discoverability (0-5) + Data Sensitivity (0-5) + Trust Boundary Crossing (0-5)&lt;/p&gt;
&lt;p&gt;This model is intentionally opinionated. It avoids the trap where a high CVSS issue on a low-consequence endpoint steals time from a medium-severity issue that sits on a short path to critical identity or data assets.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[External Asset Discovery] --&gt; B[Context Enrichment]
B --&gt; C["Shadow Asset Risk Score (SARS) Scoring"]
C --&gt; D[Remediation Lane Routing]
D --&gt; E[Verification and Evidence]
E --&gt; F[Weekly Governance Review]
F --&gt; B
&lt;/div&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In implementation, teams first establish asset identity quality: hostname, service owner, business criticality, internet reachability, and data sensitivity. If any one of these is missing, triage confidence drops and ownership handoffs stall. This is why I prefer failing ownership quality early instead of pretending the queue is decision-ready.&lt;/p&gt;
&lt;p&gt;Next, findings are scored with the model above and placed into deterministic remediation lanes. A practical lane design is 24-hour, 72-hour, and 14-day SLA classes. Lane assignment should be automatic based on score bands and exception triggers, not manually debated in every stand-up.&lt;/p&gt;
&lt;p&gt;I make one explicit tie-breaker statement here: when two items have similar score, prioritize the item with higher transitive reachability into identity, secrets, or control-plane operations. That tie-break rule helps avoid local optimization where teams close many low-impact issues and defer the path that matters most.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assertion:&lt;/strong&gt; In mature exposure programs, prioritization quality matters more than queue throughput, because incorrect prioritization increases attacker opportunity even when closure counts look healthy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I route every shadow asset into one of three lanes, and I reclassify the moment ownership or trust evidence changes. Lane 1 (path-break) is for any shadow asset with a confirmed trust relationship into production identity, secrets, or data - it enters containment the same day, regardless of how many other shadow assets are queued. Lane 2 (systemic control) is for a recurring discovery pattern, such as the same team repeatedly standing up unsanctioned SaaS integrations - these get an owner conversation and a staged fix, not a one-off takedown. Lane 3 (architecture debt) is for isolated, low-risk shadow assets with no trust boundary crossing - these get tracked and reviewed, not chased urgently.&lt;/p&gt;
&lt;p&gt;The final step is verification. I require evidence of reduced exposure, such as closed reachable path, revoked external trust, removed vulnerable endpoint, or measurable drift reduction in telemetry. If evidence is missing, I treat the item as unresolved.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Teams that adopt this decision model generally reduce disagreement cycles between security and engineering. Instead of arguing over labels, they argue over measurable path consequence, which is a better use of time.&lt;/p&gt;
&lt;p&gt;A representative operational pattern looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Map top 50 internet-facing findings into the model.&lt;/li&gt;
&lt;li&gt;Auto-route into SLA lanes with owner assignment.&lt;/li&gt;
&lt;li&gt;Require verification artifact for closure.&lt;/li&gt;
&lt;li&gt;Review exceptions weekly with expiry discipline.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The impact is usually seen in three metrics: shorter high-risk MTTR, lower recurrence of previously fixed classes, and improved known-owner coverage for external assets. That combination provides stronger assurance than raw ticket closure counts.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the comparison I use to explain priority to skeptical stakeholders: discovering and cataloguing 100 harmless shadow assets in a quarter is a fine housekeeping exercise, but it matters far less than finding the one shadow asset with a live SSO trust into your production identity provider. I will pull an engineer off a backlog of 100 low-risk findings to deal with that one asset immediately. If your shadow IT program can&amp;rsquo;t tell the difference between those two situations, it&amp;rsquo;s an inventory exercise, not a risk-reduction program.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The biggest failure mode is pretending the scoring model is objective when inputs are stale. If criticality or ownership metadata lags behind architecture change, the model can produce confidently wrong priorities.&lt;/p&gt;
&lt;p&gt;Another edge case is exception inflation. If teams can continuously renew exceptions without demonstrating compensating controls, the exposure program becomes a reporting layer rather than a risk-reduction engine.&lt;/p&gt;
&lt;p&gt;A third edge case is over-automation. Automation is powerful for routing and evidence capture, but premature hard enforcement can break delivery workflows and create silent bypass behavior. I recommend phase-gated enforcement with transparent policy criteria and rollback paths.&lt;/p&gt;
&lt;p&gt;The anti-pattern to watch for is a shadow IT program that reports success purely as discovery-count growth - &amp;ldquo;we found 400 new assets this quarter.&amp;rdquo; That number can go up while the program&amp;rsquo;s actual value goes down, because volume says nothing about consequence. The metric that should be reported instead is the count and age of shadow assets with a confirmed trust boundary crossing into production - that&amp;rsquo;s the number that tells you whether the program is reducing real risk.&lt;/p&gt;
&lt;p&gt;Hard exception rule for this post:
&lt;strong&gt;Any shadow asset with production SSO trust enters containment workflow immediately, even when SARS is only moderate.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Declare your assessment doctrine in writing and keep it visible in every remediation review.&lt;/li&gt;
&lt;li&gt;Keep scoring inputs small and auditable so teams trust the model.&lt;/li&gt;
&lt;li&gt;Separate score computation from policy overrides; both should be explicit.&lt;/li&gt;
&lt;li&gt;Require one owner and one due date for every high-consequence finding.&lt;/li&gt;
&lt;li&gt;Enforce evidence-based closure to avoid optimistic status updates.&lt;/li&gt;
&lt;li&gt;Time-box exceptions and require compensating controls before approval.&lt;/li&gt;
&lt;li&gt;Recalculate scores on architecture change events, not only on scan cycles.&lt;/li&gt;
&lt;li&gt;Publish weekly trend deltas for MTTR, recurrence, and owner coverage.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; My default rule here is the same one I use across exposure management: prioritize attacker-path consequence over alert volume. A shadow IT asset only becomes urgent the moment it&amp;rsquo;s linked to production trust - that&amp;rsquo;s the signal worth acting on, not the raw discovery count.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/overview" target="_blank" rel="noopener"
&gt;Azure security fundamentals overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction" target="_blank" rel="noopener"
&gt;Introduction to Microsoft Defender for Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/overview" target="_blank" rel="noopener"
&gt;Azure Monitor overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/overview" target="_blank" rel="noopener"
&gt;Microsoft Sentinel overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Attack Surface Management in Defender EASM</title><link>https://blog.brewedinthecloud.com/p/azure-attack-surface-management-in-defender-easm/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-attack-surface-management-in-defender-easm/</guid><description>&lt;p&gt;Most Azure security programs can produce long finding lists, but many struggle to prove that remediation work actually reduced exploitable paths. This post is about Defender EASM discovery and external asset inventory, and it takes an explicit stance: exposure management should be judged by attacker-path reduction, not by alert closure volume.&lt;/p&gt;
&lt;p&gt;My default assessment rule is simple: if a fix does not measurably reduce attacker reachability or blast radius, it should not outrank work that does. I still value hygiene and control coverage, but I treat those as supporting factors unless they materially change external attack opportunity.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Exposure management is a control loop, not a scanner report. The loop is discovery, context enrichment, prioritization, execution, and verification. Most teams perform discovery and sometimes prioritization. Fewer teams enforce a verification step that proves risk was actually reduced after deployment.&lt;/p&gt;
&lt;p&gt;I assess maturity with three questions. First, can we explain who owns each internet-facing asset? Second, can we prove why one finding should be fixed before another? Third, can we show before-and-after evidence that the top remediation items removed realistic attacker options? If the answer to any question is no, the program is still dashboard-centric.&lt;/p&gt;
&lt;p&gt;For this domain, I recommend a decision model rather than ad-hoc triage:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exposure Priority Score (EPS)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Formula:&lt;/strong&gt; EPS = Internet Reachability (0-5) x Identity Proximity (0-5) x Asset Criticality (0-5)&lt;/p&gt;
&lt;p&gt;This model is intentionally opinionated. It avoids the trap where a high CVSS issue on a low-consequence endpoint steals time from a medium-severity issue that sits on a short path to critical identity or data assets.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[External Asset Discovery] --&gt; B[Context Enrichment]
B --&gt; C["Exposure Priority Score (EPS) Scoring"]
C --&gt; D[Remediation Lane Routing]
D --&gt; E[Verification and Evidence]
E --&gt; F[Weekly Governance Review]
F --&gt; B
&lt;/div&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In implementation, teams first establish asset identity quality: hostname, service owner, business criticality, internet reachability, and data sensitivity. If any one of these is missing, triage confidence drops and ownership handoffs stall. This is why I prefer failing ownership quality early instead of pretending the queue is decision-ready.&lt;/p&gt;
&lt;p&gt;Next, findings are scored with the model above and placed into deterministic remediation lanes. A practical lane design is 24-hour, 72-hour, and 14-day SLA classes. Lane assignment should be automatic based on score bands and exception triggers, not manually debated in every stand-up.&lt;/p&gt;
&lt;p&gt;I make one explicit tie-breaker statement here: when two items have similar score, prioritize the item with higher transitive reachability into identity, secrets, or control-plane operations. That tie-break rule helps avoid local optimization where teams close many low-impact issues and defer the path that matters most.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assertion:&lt;/strong&gt; In mature exposure programs, prioritization quality matters more than queue throughput, because incorrect prioritization increases attacker opportunity even when closure counts look healthy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I route every EASM finding into one of three lanes, and I reclassify the moment new evidence changes the picture. Lane 1 (path-break) is for anything that collapses attacker reachability into identity, secrets, or control-plane operations in a single fix - it jumps the queue regardless of volume. Lane 2 (systemic control) is for weaknesses that recur across multiple discovered assets, such as a class of misconfigured endpoints EASM keeps surfacing - these get a staged remediation plan with milestones, not one ticket. Lane 3 (architecture debt) is for real but non-urgent issues, like inconsistent asset tagging that slows future triage - these get a review date, not silence.&lt;/p&gt;
&lt;p&gt;The final step is verification. I require evidence of reduced exposure, such as closed reachable path, revoked external trust, removed vulnerable endpoint, or measurable drift reduction in telemetry. If evidence is missing, I treat the item as unresolved.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Teams that adopt this decision model generally reduce disagreement cycles between security and engineering. Instead of arguing over labels, they argue over measurable path consequence, which is a better use of time.&lt;/p&gt;
&lt;p&gt;A representative operational pattern looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Map top 50 internet-facing findings into the model.&lt;/li&gt;
&lt;li&gt;Auto-route into SLA lanes with owner assignment.&lt;/li&gt;
&lt;li&gt;Require verification artifact for closure.&lt;/li&gt;
&lt;li&gt;Review exceptions weekly with expiry discipline.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The impact is usually seen in three metrics: shorter high-risk MTTR, lower recurrence of previously fixed classes, and improved known-owner coverage for external assets. That combination provides stronger assurance than raw ticket closure counts.&lt;/p&gt;
&lt;p&gt;I make this trade-off explicit with stakeholders because it&amp;rsquo;s the one they instinctively get wrong: closing 100 medium-severity findings on isolated marketing endpoints looks productive on a closure chart, but it does nothing if one unpatched authentication gateway still hands an attacker a direct route to domain admin. I will take the 20-finding batch that collapses that one path over the 100-finding batch that never touches it, every time. If a team can&amp;rsquo;t tell me which of the two batches removes more attacker reachability, they don&amp;rsquo;t have a prioritization model yet - they have a to-do list with a due date.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;The biggest failure mode is pretending the scoring model is objective when inputs are stale. If criticality or ownership metadata lags behind architecture change, the model can produce confidently wrong priorities.&lt;/p&gt;
&lt;p&gt;Another edge case is exception inflation. If teams can continuously renew exceptions without demonstrating compensating controls, the exposure program becomes a reporting layer rather than a risk-reduction engine.&lt;/p&gt;
&lt;p&gt;A third edge case is over-automation. Automation is powerful for routing and evidence capture, but premature hard enforcement can break delivery workflows and create silent bypass behavior. I recommend phase-gated enforcement with transparent policy criteria and rollback paths.&lt;/p&gt;
&lt;p&gt;The clearest anti-pattern I&amp;rsquo;ve watched teams fall into is a leadership dashboard that rewards closed-this-sprint counts without ever asking whether the closed findings reduced reachable attack paths. That KPI quietly trains teams to cherry-pick easy, low-consequence findings while the dangerous ones sit untouched because they&amp;rsquo;re harder to close quickly. The metric that actually matters is the trend in transitive reachability to tier-0 assets over time - even if it means fewer tickets close in a given week.&lt;/p&gt;
&lt;p&gt;Hard exception rule for this post:
&lt;strong&gt;If an internet-facing authentication surface has no confirmed owner, classify as P1 ownership triage within 24 hours regardless of EPS.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Declare your assessment doctrine in writing and keep it visible in every remediation review.&lt;/li&gt;
&lt;li&gt;Keep scoring inputs small and auditable so teams trust the model.&lt;/li&gt;
&lt;li&gt;Separate score computation from policy overrides; both should be explicit.&lt;/li&gt;
&lt;li&gt;Require one owner and one due date for every high-consequence finding.&lt;/li&gt;
&lt;li&gt;Enforce evidence-based closure to avoid optimistic status updates.&lt;/li&gt;
&lt;li&gt;Time-box exceptions and require compensating controls before approval.&lt;/li&gt;
&lt;li&gt;Recalculate scores on architecture change events, not only on scan cycles.&lt;/li&gt;
&lt;li&gt;Publish weekly trend deltas for MTTR, recurrence, and owner coverage.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; My default rule, after reviewing enough EASM queues, is to prioritize attacker-path consequence over alert volume. Once a team adopts a deterministic model plus a hard exception rule, remediation decisions get faster, more defensible, and more likely to actually shrink the attack surface an adversary can use - not just the number on the closure report.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/overview" target="_blank" rel="noopener"
&gt;Azure security fundamentals overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction" target="_blank" rel="noopener"
&gt;Introduction to Microsoft Defender for Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/overview" target="_blank" rel="noopener"
&gt;Azure Monitor overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/overview" target="_blank" rel="noopener"
&gt;Microsoft Sentinel overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Governing Workload Identity: Review Cadence, Drift Detection, and Architecture Accountability</title><link>https://blog.brewedinthecloud.com/p/workload-identity-governance/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/workload-identity-governance/</guid><description>&lt;p&gt;Identity architecture rarely fails in one dramatic design decision.&lt;/p&gt;
&lt;p&gt;It fails quietly through small, reasonable exceptions that are never reconciled back to boundary intent.&lt;/p&gt;
&lt;p&gt;That is why governance for workload identity cannot be a yearly policy check.&lt;/p&gt;
&lt;p&gt;It has to be an operational architecture discipline.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Governance is not inventory management. Governance is trust-state management.&lt;/p&gt;
&lt;p&gt;Inventory answers what identities exist. Trust-state management answers what those identities can now reach and whether that reach still matches architectural intent.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Identity governance quality is measured by drift control, not by control documentation volume.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If your review cadence cannot detect boundary drift before incidents do, governance is procedural, not protective.&lt;/p&gt;
&lt;h2 id="how-it-actually-works"&gt;How It Actually Works
&lt;/h2&gt;&lt;p&gt;Drift appears through recurring operational patterns.&lt;/p&gt;
&lt;h3 id="exception-accumulation"&gt;Exception accumulation
&lt;/h3&gt;&lt;p&gt;Temporary broad grants for release pressure, troubleshooting, or emergency access remain in place. Each exception is understandable alone, but cumulative effect widens trust boundaries.&lt;/p&gt;
&lt;h3 id="ownership-fragmentation"&gt;Ownership fragmentation
&lt;/h3&gt;&lt;p&gt;Identity platform teams manage issuance controls while workload teams manage authorization scope. Without shared accountability, consequence-level risks move between teams unresolved.&lt;/p&gt;
&lt;h3 id="change-driven-reachability-growth"&gt;Change-driven reachability growth
&lt;/h3&gt;&lt;p&gt;New services and dependencies are added under existing scopes, increasing effective reach without explicit identity redesign.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Initial identity design] --&gt; B[Operational exceptions added]
B --&gt; C[Scope and dependency drift]
C --&gt; D{Governance trigger tied to architecture change?}
D --&gt;|No| E[Drift persists]
D --&gt;|Yes| F[Boundary review performed]
E --&gt; G[Compromise consequence grows]
F --&gt; H{Remediation executed?}
H --&gt;|No| G
H --&gt;|Yes| I[Trust boundary restored]
&lt;/div&gt;
&lt;p&gt;Effective governance interrupts this loop early and repeatedly.&lt;/p&gt;
&lt;h2 id="when-this-pattern-reduces-risk-and-when-it-increases-it"&gt;When This Pattern Reduces Risk and When It Increases It
&lt;/h2&gt;&lt;h3 id="reduces-risk-when"&gt;Reduces risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Review cadence is triggered by architecture change, not only calendar interval.&lt;/li&gt;
&lt;li&gt;Drift signals are defined and measured (scope growth, exception age, transitive reach increase).&lt;/li&gt;
&lt;li&gt;One accountable owner is named for trust consequence across mechanism and authorization layers.&lt;/li&gt;
&lt;li&gt;Governance outputs include explicit boundary restoration decisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="increases-risk-when"&gt;Increases risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Governance focuses on identity count and control checklist completion.&lt;/li&gt;
&lt;li&gt;Exceptions are approved without expiry or rollback criteria.&lt;/li&gt;
&lt;li&gt;Findings are written as observations instead of decision-required risk states.&lt;/li&gt;
&lt;li&gt;Review outputs are disconnected from delivery backlog and ownership.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The governance anti-pattern is process maturity without consequence control.&lt;/p&gt;
&lt;h2 id="a-decision-filter-for-governance-reviews"&gt;A Decision Filter for Governance Reviews
&lt;/h2&gt;&lt;p&gt;Before closing any identity governance review, require answers to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which identity boundaries widened since the last review, and why?&lt;/li&gt;
&lt;li&gt;Which exceptions are now older than their original risk acceptance window?&lt;/li&gt;
&lt;li&gt;Which identities gained new transitive reach through platform change?&lt;/li&gt;
&lt;li&gt;Which boundary restoration decisions were made, by whom, and by when?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If these answers are missing, the review was descriptive, not governing.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Strong governance changes outcomes because it continuously re-aligns trust reality with design intent.&lt;/p&gt;
&lt;h3 id="risk-visibility-quality"&gt;Risk visibility quality
&lt;/h3&gt;&lt;p&gt;Leadership gets actionable risk visibility when drift is presented as boundary consequence and ownership decision, not as generic compliance status.&lt;/p&gt;
&lt;h3 id="engineering-prioritization"&gt;Engineering prioritization
&lt;/h3&gt;&lt;p&gt;Teams prioritize the right remediation work when governance findings map directly to containment impact and explicit owners.&lt;/p&gt;
&lt;h3 id="incident-readiness"&gt;Incident readiness
&lt;/h3&gt;&lt;p&gt;Organizations with drift-aware governance face fewer surprise pathways during incidents because problematic edges are identified earlier in normal operations.&lt;/p&gt;
&lt;h3 id="long-term-architecture-integrity"&gt;Long-term architecture integrity
&lt;/h3&gt;&lt;p&gt;Regular boundary restoration prevents identity architecture from degrading into historical exception patterns that no one can confidently explain.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;These issues frequently weaken governance even when review meetings are consistent.&lt;/p&gt;
&lt;h3 id="calendar-driven-reviews-miss-change-driven-risk"&gt;Calendar-driven reviews miss change-driven risk
&lt;/h3&gt;&lt;p&gt;Large identity risk shifts often happen between scheduled reviews. Triggering review on architecture change captures material drift sooner.&lt;/p&gt;
&lt;h3 id="metrics-can-be-precise-and-still-unhelpful"&gt;Metrics can be precise and still unhelpful
&lt;/h3&gt;&lt;p&gt;Tracking identity counts and policy coverage can look mature while failing to show expanding effective reach. Governance metrics must describe consequence.&lt;/p&gt;
&lt;h3 id="ownership-can-be-explicit-but-mis-scoped"&gt;Ownership can be explicit but mis-scoped
&lt;/h3&gt;&lt;p&gt;Assigning ownership to one platform team may still fail if workload-level authorization changes are outside that team&amp;rsquo;s control. Accountability must span the full trust path.&lt;/p&gt;
&lt;h3 id="accepted-risk-can-become-default-posture"&gt;&amp;ldquo;Accepted risk&amp;rdquo; can become default posture
&lt;/h3&gt;&lt;p&gt;Risk acceptance without expiry criteria turns temporary trade-offs into standing architecture behavior. Governance must revisit and retire accepted risk states.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="tie-governance-triggers-to-architecture-events"&gt;Tie governance triggers to architecture events
&lt;/h3&gt;&lt;p&gt;Run identity boundary reviews when new services, federated paths, or major scope assignments are introduced.&lt;/p&gt;
&lt;h3 id="track-drift-with-consequence-oriented-metrics"&gt;Track drift with consequence-oriented metrics
&lt;/h3&gt;&lt;p&gt;Measure effective reach expansion, exception age, and transitive dependency growth, then link each metric to remediation thresholds.&lt;/p&gt;
&lt;h3 id="publish-review-outcomes-as-decisions-not-observations"&gt;Publish review outcomes as decisions, not observations
&lt;/h3&gt;&lt;p&gt;Every governance review should end with explicit boundary actions, owners, and dates.&lt;/p&gt;
&lt;h3 id="maintain-a-standing-boundary-debt-register"&gt;Maintain a standing boundary debt register
&lt;/h3&gt;&lt;p&gt;Treat broad scope and aging exceptions as debt with lifecycle rules. Debt without lifecycle becomes permanent exposure.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Identity governance only works when it continuously restores trust boundaries as systems change. Otherwise it&amp;rsquo;s just documenting drift on a schedule while the actual risk keeps growing underneath it.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access" target="_blank" rel="noopener"
&gt;Cloud Adoption Framework: Identity and access design area&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"
&gt;Managed identities for Azure resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identities-overview" target="_blank" rel="noopener"
&gt;Workload identities in Microsoft Entra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/best-practices" target="_blank" rel="noopener"
&gt;Best practices for Azure RBAC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles" target="_blank" rel="noopener"
&gt;Azure RBAC built-in roles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Designing for Blast Radius: Identity Segmentation as Containment Strategy</title><link>https://blog.brewedinthecloud.com/p/workload-identity-blast-radius/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/workload-identity-blast-radius/</guid><description>&lt;p&gt;A mature identity architecture assumes compromise.&lt;/p&gt;
&lt;p&gt;It does not hope compromise will not happen.&lt;/p&gt;
&lt;p&gt;That assumption changes design priorities immediately: the objective becomes limiting consequence, not declaring prevention completeness.&lt;/p&gt;
&lt;p&gt;For workload identity, that means blast radius is a design artifact.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Blast radius is the maximum domain of legitimate action available to a compromised identity.&lt;/p&gt;
&lt;p&gt;It is shaped by trust boundaries, scope inheritance, shared identity usage, and service dependencies.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Containment is not the absence of compromise. It is the presence of enforced stopping points.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you cannot point to clear stopping points, your architecture has likely optimized for convenience over survivability.&lt;/p&gt;
&lt;h2 id="how-it-actually-works"&gt;How It Actually Works
&lt;/h2&gt;&lt;p&gt;Identity blast radius grows through boundary collapse.&lt;/p&gt;
&lt;h3 id="shared-trust-zones"&gt;Shared trust zones
&lt;/h3&gt;&lt;p&gt;When identities are reused across multiple workloads, one compromise crosses multiple business contexts. Shared usage reduces management overhead while increasing correlated impact.&lt;/p&gt;
&lt;h3 id="broad-inherited-authorization"&gt;Broad inherited authorization
&lt;/h3&gt;&lt;p&gt;Assignments at broad scopes make future assets reachable without additional design decisions. Blast radius silently grows with platform growth.&lt;/p&gt;
&lt;h3 id="dependency-coupled-privilege"&gt;Dependency-coupled privilege
&lt;/h3&gt;&lt;p&gt;A narrowly scoped identity can still trigger broader action through dependent services. Containment must account for downstream authority, not only direct grants.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Identity compromise] --&gt; B{Boundary model}
B --&gt;|Isolated by workload and zone| C[Localized impact]
B --&gt;|Shared identity across zones| D[Cross-zone movement]
D --&gt; E{Transitive dependencies constrained?}
E --&gt;|Yes| F[Moderate containment]
E --&gt;|No| G[High systemic blast radius]
C --&gt; H[Recoverable with local controls]
F --&gt; I[Containment with elevated effort]
G --&gt; J[Architecture-level failure]
&lt;/div&gt;
&lt;p&gt;This is why segmentation decisions are identity decisions, not only network decisions.&lt;/p&gt;
&lt;h2 id="when-this-pattern-reduces-risk-and-when-it-increases-it"&gt;When This Pattern Reduces Risk and When It Increases It
&lt;/h2&gt;&lt;h3 id="reduces-risk-when"&gt;Reduces risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Identity boundaries align to workload trust zones.&lt;/li&gt;
&lt;li&gt;Shared identities are rare and tightly justified.&lt;/li&gt;
&lt;li&gt;Cross-zone access paths are explicit exceptions with owner and expiry.&lt;/li&gt;
&lt;li&gt;Dependency privileges are modeled in containment reviews.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="increases-risk-when"&gt;Increases risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;One identity is used to simplify multi-workload operations.&lt;/li&gt;
&lt;li&gt;Scope is granted broadly to avoid repeated access changes.&lt;/li&gt;
&lt;li&gt;Cross-zone exceptions become standing design defaults.&lt;/li&gt;
&lt;li&gt;Containment reviews ignore transitive dependencies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The practical failure mode is predictable: efficient operations create oversized compromise domains.&lt;/p&gt;
&lt;h2 id="a-decision-framework-for-containment-design"&gt;A Decision Framework for Containment Design
&lt;/h2&gt;&lt;p&gt;Use this filter before accepting workload identity design:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the smallest trust zone this identity must operate in?&lt;/li&gt;
&lt;li&gt;Which assets become reachable if this identity is compromised today?&lt;/li&gt;
&lt;li&gt;Which dependencies can amplify this identity beyond its direct scope?&lt;/li&gt;
&lt;li&gt;Which boundary is guaranteed to stop movement, and what evidence confirms it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If answers depend on assumptions instead of evidence, containment is not real yet.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Containment quality directly shapes business resilience under identity incidents.&lt;/p&gt;
&lt;h3 id="incident-consequence"&gt;Incident consequence
&lt;/h3&gt;&lt;p&gt;When identity boundaries are explicit and narrow, incidents stay local and recovery is faster. When boundaries are porous, one compromise can trigger multi-service disruption.&lt;/p&gt;
&lt;h3 id="recovery-planning-quality"&gt;Recovery planning quality
&lt;/h3&gt;&lt;p&gt;Recovery plans become realistic when they map to actual containment boundaries. Without that mapping, recovery assumptions are often optimistic and fail under pressure.&lt;/p&gt;
&lt;h3 id="platform-design-trade-offs"&gt;Platform design trade-offs
&lt;/h3&gt;&lt;p&gt;Teams make better trade-offs when they quantify the operational savings of shared identities against the extra consequence they introduce under compromise.&lt;/p&gt;
&lt;h3 id="executive-risk-decisions"&gt;Executive risk decisions
&lt;/h3&gt;&lt;p&gt;Leaders can prioritize architecture investments more effectively when blast radius is expressed as concrete affected domains instead of abstract severity labels.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;These conditions commonly weaken containment even when segmentation appears present.&lt;/p&gt;
&lt;h3 id="segmentation-on-paper-can-differ-from-segmentation-in-effect"&gt;Segmentation on paper can differ from segmentation in effect
&lt;/h3&gt;&lt;p&gt;Policy documents may describe isolated zones while inherited role assignments and service dependencies still permit cross-zone action. Effective reach must be tested, not assumed.&lt;/p&gt;
&lt;h3 id="emergency-access-paths-often-become-permanent"&gt;Emergency access paths often become permanent
&lt;/h3&gt;&lt;p&gt;Break-glass identity exceptions added for resilience can become permanent high-risk routes if owner and expiry controls are weak.&lt;/p&gt;
&lt;h3 id="shared-observability-and-automation-tooling-can-become-hidden-bridge-layers"&gt;Shared observability and automation tooling can become hidden bridge layers
&lt;/h3&gt;&lt;p&gt;Tooling identities that span many zones can unintentionally reconnect segmented domains through operational pathways.&lt;/p&gt;
&lt;h3 id="business-critical-services-can-pressure-teams-into-broad-identity-reuse"&gt;Business-critical services can pressure teams into broad identity reuse
&lt;/h3&gt;&lt;p&gt;When delivery urgency is high, teams may standardize on shared high-scope identities. This improves speed and quietly eliminates containment.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="segment-identities-by-trust-boundary-first-ownership-second"&gt;Segment identities by trust boundary first, ownership second
&lt;/h3&gt;&lt;p&gt;Team ownership matters, but compromise consequence should determine boundary design.&lt;/p&gt;
&lt;h3 id="make-cross-zone-identity-use-an-exception-contract"&gt;Make cross-zone identity use an exception contract
&lt;/h3&gt;&lt;p&gt;Every cross-zone path should include purpose, owner, review cadence, and removal criteria.&lt;/p&gt;
&lt;h3 id="test-containment-through-scenario-based-reviews"&gt;Test containment through scenario-based reviews
&lt;/h3&gt;&lt;p&gt;Use realistic compromise scenarios to validate where movement stops in practice.&lt;/p&gt;
&lt;h3 id="track-blast-radius-drift-as-a-standing-metric"&gt;Track blast-radius drift as a standing metric
&lt;/h3&gt;&lt;p&gt;Measure how many high-value domains each identity can reach over time. Rising reachability should trigger immediate design review.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Containment succeeds when identity compromise runs into an engineered stopping point - not when an architecture document simply describes segmentation intent that was never actually tested.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access" target="_blank" rel="noopener"
&gt;Cloud Adoption Framework: Identity and access design area&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"
&gt;Managed identities for Azure resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identities-overview" target="_blank" rel="noopener"
&gt;Workload identities in Microsoft Entra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles" target="_blank" rel="noopener"
&gt;Azure RBAC built-in roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/best-practices" target="_blank" rel="noopener"
&gt;Best practices for Azure RBAC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Token Architecture as a Control Surface: Issuer, Audience, Scope and Lifetime</title><link>https://blog.brewedinthecloud.com/p/workload-identity-token-architecture/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/workload-identity-token-architecture/</guid><description>&lt;p&gt;Most teams treat token settings as identity plumbing.&lt;/p&gt;
&lt;p&gt;That view is expensive.&lt;/p&gt;
&lt;p&gt;Issuer checks, audience constraints, token scope, and token lifetime decide how far a stolen or misused token can travel and how long it remains useful.&lt;/p&gt;
&lt;p&gt;That is architecture, not plumbing.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Tokens are permission containers with movement potential.&lt;/p&gt;
&lt;p&gt;The real design question is not whether token issuance works. It is whether token use remains bounded under compromise.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Token architecture is the portability policy for authority under pressure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If your token model allows broad audience acceptance, oversized scopes, and long-lived validity, you are designing for convenience over containment.&lt;/p&gt;
&lt;h2 id="how-it-actually-works"&gt;How It Actually Works
&lt;/h2&gt;&lt;p&gt;Four token controls shape consequence.&lt;/p&gt;
&lt;h3 id="issuer-trust"&gt;Issuer trust
&lt;/h3&gt;&lt;p&gt;Accepted issuers define who is allowed to mint authority your services will trust. Broad issuer acceptance expands the trust perimeter and raises dependency risk.&lt;/p&gt;
&lt;h3 id="audience-constraints"&gt;Audience constraints
&lt;/h3&gt;&lt;p&gt;Audience is the first portability boundary. Tight audience validation prevents reuse of valid tokens across unrelated services.&lt;/p&gt;
&lt;h3 id="scope-and-claims-breadth"&gt;Scope and claims breadth
&lt;/h3&gt;&lt;p&gt;Wide scopes and over-rich claims increase usable privilege after compromise. Claims should be sufficient for function, not future-proofed for convenience.&lt;/p&gt;
&lt;h3 id="lifetime-and-refresh-behavior"&gt;Lifetime and refresh behavior
&lt;/h3&gt;&lt;p&gt;Long token lifetime increases misuse window. Extremely short lifetime can create availability fragility if issuance paths fail. The right value is a risk-and-resilience trade-off, not a default setting.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Token issued] --&gt; B{Issuer accepted?}
B --&gt;|No| C[Reject]
B --&gt;|Yes| D{Audience exact match?}
D --&gt;|No| C
D --&gt;|Yes| E{Scope minimal?}
E --&gt;|No| F[Excess portability risk]
E --&gt;|Yes| G{Lifetime bounded?}
G --&gt;|No| H[Extended misuse window]
G --&gt;|Yes| I[Constrained token utility]
F --&gt; J[Containment weak]
H --&gt; J
I --&gt; K[Containment stronger]
&lt;/div&gt;
&lt;p&gt;This is why token policy belongs in architecture review, not only in implementation checklists.&lt;/p&gt;
&lt;h2 id="when-this-pattern-reduces-risk-and-when-it-increases-it"&gt;When This Pattern Reduces Risk and When It Increases It
&lt;/h2&gt;&lt;h3 id="reduces-risk-when"&gt;Reduces risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Issuer trust is explicit and minimal.&lt;/li&gt;
&lt;li&gt;Audience checks are strict and service-specific.&lt;/li&gt;
&lt;li&gt;Scopes map to current workload duties, not possible future duties.&lt;/li&gt;
&lt;li&gt;Lifetime reflects both compromise exposure and issuance reliability.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="increases-risk-when"&gt;Increases risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Services accept broad audience values &amp;ldquo;for interoperability&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Scopes are expanded pre-emptively to avoid future integration work.&lt;/li&gt;
&lt;li&gt;Token lifetime decisions are made without threat-window reasoning.&lt;/li&gt;
&lt;li&gt;Refresh paths are trusted without resilience testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The recurring mistake is optimizing token convenience while assuming identity controls elsewhere will compensate.&lt;/p&gt;
&lt;h2 id="a-decision-framework-for-token-design"&gt;A Decision Framework for Token Design
&lt;/h2&gt;&lt;p&gt;Use this review filter before approving token policy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which issuers are trusted, and why is each one necessary?&lt;/li&gt;
&lt;li&gt;Can a token for service A be replayed against service B?&lt;/li&gt;
&lt;li&gt;Which claims and scopes are mandatory for this workload now?&lt;/li&gt;
&lt;li&gt;If a token is exfiltrated, what is the maximum damage window?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the team answers these as implementation defaults instead of architectural decisions, containment is probably weaker than expected.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Token architecture decisions affect day-two operations as much as day-zero security posture.&lt;/p&gt;
&lt;h3 id="security-posture-quality"&gt;Security posture quality
&lt;/h3&gt;&lt;p&gt;Organizations with disciplined audience and scope boundaries see smaller compromise domains because valid tokens do not travel as far.&lt;/p&gt;
&lt;h3 id="reliability-trade-offs"&gt;Reliability trade-offs
&lt;/h3&gt;&lt;p&gt;Aggressive lifetime policies can reduce replay exposure but increase operational fragility when issuance dependencies are unstable. The right answer requires explicit trade-off decisions, not blanket hardening rules.&lt;/p&gt;
&lt;h3 id="engineering-discipline"&gt;Engineering discipline
&lt;/h3&gt;&lt;p&gt;Teams that treat claims as contract design produce cleaner service boundaries. Teams that treat claims as convenience payloads accumulate hidden coupling and privilege debt.&lt;/p&gt;
&lt;h3 id="audit-and-review-clarity"&gt;Audit and review clarity
&lt;/h3&gt;&lt;p&gt;Token architecture with clear rationale creates faster, higher-confidence reviews. Ambiguous issuer and audience policy creates repeated debate and delayed decisions.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;These are frequent failure modes even in technically competent teams.&lt;/p&gt;
&lt;h3 id="strict-audience-checks-can-be-bypassed-by-broad-gateway-trust"&gt;Strict audience checks can be bypassed by broad gateway trust
&lt;/h3&gt;&lt;p&gt;A service can validate audience correctly while an upstream gateway accepts overly broad tokens and forwards them. End-to-end token handling must be reviewed as one chain.&lt;/p&gt;
&lt;h3 id="overly-short-lifetimes-can-create-fail-open-pressure"&gt;Overly short lifetimes can create fail-open pressure
&lt;/h3&gt;&lt;p&gt;When issuance dependencies degrade, teams may introduce emergency bypass paths that permanently weaken controls. Resilience planning is part of secure token design.&lt;/p&gt;
&lt;h3 id="scope-creep-often-enters-through-temporary-troubleshooting-grants"&gt;Scope creep often enters through &amp;ldquo;temporary&amp;rdquo; troubleshooting grants
&lt;/h3&gt;&lt;p&gt;Troubleshooting claims or broad scopes are often left in place after incidents. The token model then drifts from intentional design to accumulated exception state.&lt;/p&gt;
&lt;h3 id="multi-tenant-federation-can-blur-issuer-accountability"&gt;Multi-tenant federation can blur issuer accountability
&lt;/h3&gt;&lt;p&gt;When several issuers are accepted over time, teams may lose precision on which issuer protections are relied upon for which workloads. This raises assurance uncertainty.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="treat-audience-policy-as-a-hard-boundary"&gt;Treat audience policy as a hard boundary
&lt;/h3&gt;&lt;p&gt;Design audience checks to enforce service-level trust segmentation, and test replay attempts across adjacent services.&lt;/p&gt;
&lt;h3 id="keep-claims-minimal-and-role-derived"&gt;Keep claims minimal and role-derived
&lt;/h3&gt;&lt;p&gt;Include only what services need to authorize current behavior. Avoid convenience claims that widen privilege interpretation.&lt;/p&gt;
&lt;h3 id="define-token-lifetime-with-explicit-threat-window-rationale"&gt;Define token lifetime with explicit threat-window rationale
&lt;/h3&gt;&lt;p&gt;State the compromise window you are accepting and the resilience controls that justify it.&lt;/p&gt;
&lt;h3 id="review-token-paths-after-every-identity-architecture-change"&gt;Review token paths after every identity architecture change
&lt;/h3&gt;&lt;p&gt;Any change in federation, gatewaying, or service coupling can alter portability risk. Token architecture needs recurring review, not one-time setup.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Token security was never about issuing valid tokens. It&amp;rsquo;s about making a valid token useless the moment it steps outside the exact boundary it was meant to operate in.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity-platform/access-tokens" target="_blank" rel="noopener"
&gt;Microsoft identity platform access tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity-platform/id-token-claims-reference" target="_blank" rel="noopener"
&gt;Configure and validate token claims&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identities-overview" target="_blank" rel="noopener"
&gt;Workload identities in Microsoft Entra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation" target="_blank" rel="noopener"
&gt;Workload identity federation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/best-practices" target="_blank" rel="noopener"
&gt;Best practices for Azure RBAC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Managed Identity and Federation: What They Solve and What the Architecture Still Owes You</title><link>https://blog.brewedinthecloud.com/p/managed-identity-federation-trust-limits/</link><pubDate>Tue, 18 Aug 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/managed-identity-federation-trust-limits/</guid><description>&lt;p&gt;Managed identity and federation are often presented as endpoint decisions.&lt;/p&gt;
&lt;p&gt;Move off secrets. Adopt federation. Job done.&lt;/p&gt;
&lt;p&gt;That is an operations milestone, not an architectural conclusion.&lt;/p&gt;
&lt;p&gt;The hard work starts after those controls are in place.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Managed identity and federation should be treated as trust transport mechanisms, not trust design mechanisms.&lt;/p&gt;
&lt;p&gt;They change how claims are issued and consumed. They do not automatically define where authority should stop.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Credential modernization lowers one class of risk. Trust boundary design still determines systemic exposure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This distinction matters because teams often report success at the mechanism layer while carrying unresolved architectural consequence at the scope layer.&lt;/p&gt;
&lt;h2 id="how-it-actually-works"&gt;How It Actually Works
&lt;/h2&gt;&lt;p&gt;Managed identity and federation improve different parts of the problem space.&lt;/p&gt;
&lt;h3 id="managed-identity-improvement-domain"&gt;Managed identity improvement domain
&lt;/h3&gt;&lt;p&gt;Managed identity removes secret handling burden: no application-held credentials, less rotation fragility, lower human credential exposure. That is significant and measurable.&lt;/p&gt;
&lt;h3 id="federation-improvement-domain"&gt;Federation improvement domain
&lt;/h3&gt;&lt;p&gt;Federation enables external workload trust without long-lived secrets. It can reduce credential sprawl in CI/CD and multi-platform workloads, and it can improve auditability of issued claims.&lt;/p&gt;
&lt;h3 id="architecture-debt-that-remains"&gt;Architecture debt that remains
&lt;/h3&gt;&lt;p&gt;Neither mechanism automatically constrains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effective role scope in Azure&lt;/li&gt;
&lt;li&gt;Transitive service reachability&lt;/li&gt;
&lt;li&gt;Cross-boundary trust expansion through inherited rights&lt;/li&gt;
&lt;li&gt;Blast radius under valid token misuse&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Identity mechanism upgraded] --&gt; B{Secrets removed?}
B --&gt;|Yes| C[Credential theft surface reduced]
B --&gt;|No| D[Credential risk persists]
C --&gt; E{Scope and trust boundaries constrained?}
E --&gt;|Yes| F[Material exposure reduction]
E --&gt;|No| G[Architectural exposure remains]
G --&gt; H[Compromise consequence still high]
F --&gt; I[Defensible identity posture]
&lt;/div&gt;
&lt;p&gt;The chart is intentionally blunt: mechanism improvement without boundary control produces partial security.&lt;/p&gt;
&lt;h2 id="when-this-pattern-reduces-risk-and-when-it-increases-it"&gt;When This Pattern Reduces Risk and When It Increases It
&lt;/h2&gt;&lt;h3 id="reduces-risk-when"&gt;Reduces risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Mechanism changes are paired with scope redesign and dependency review.&lt;/li&gt;
&lt;li&gt;Federated identities have explicit issuer, audience, and subject constraints.&lt;/li&gt;
&lt;li&gt;Authorization boundaries are revalidated after identity modernization.&lt;/li&gt;
&lt;li&gt;Teams track residual trust-graph risk as a first-class metric.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="increases-risk-when"&gt;Increases risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Success criteria stop at &amp;ldquo;no secrets in code&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Federation is introduced with broad authorization to avoid integration friction.&lt;/li&gt;
&lt;li&gt;External assurance and internal authorization are blended into one vague trust statement.&lt;/li&gt;
&lt;li&gt;Modern controls are used to justify delayed boundary hardening.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The anti-pattern is familiar: improved mechanism, unchanged consequence.&lt;/p&gt;
&lt;h2 id="a-decision-filter-for-design-reviews"&gt;A Decision Filter for Design Reviews
&lt;/h2&gt;&lt;p&gt;Use this filter when reviewing managed identity or federation adoption:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What credential-handling risk was removed, specifically?&lt;/li&gt;
&lt;li&gt;What authorization consequence remains unchanged?&lt;/li&gt;
&lt;li&gt;Which trust assumptions are now external dependencies, and how are they bounded internally?&lt;/li&gt;
&lt;li&gt;Under compromise of a valid token, what exact boundary still holds?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the team can answer the first question but not the last two, modernization is incomplete.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This distinction directly affects the quality of both design and governance decisions.&lt;/p&gt;
&lt;h3 id="strategy-alignment"&gt;Strategy alignment
&lt;/h3&gt;&lt;p&gt;Leaders avoid false confidence when mechanism and boundary outcomes are reported separately. That clarity prevents premature closure of identity risk programs.&lt;/p&gt;
&lt;h3 id="engineering-execution"&gt;Engineering execution
&lt;/h3&gt;&lt;p&gt;Teams make better backlog decisions when they treat boundary hardening as part of identity modernization rather than a later phase. Security debt reduces faster when both tracks run together.&lt;/p&gt;
&lt;h3 id="incident-resilience"&gt;Incident resilience
&lt;/h3&gt;&lt;p&gt;Response plans become more credible when federated and managed identity controls are tied to explicit containment boundaries. Otherwise incident teams still discover real limits during live pressure.&lt;/p&gt;
&lt;h3 id="governance-maturity"&gt;Governance maturity
&lt;/h3&gt;&lt;p&gt;Governance improves when architecture owners are accountable for trust consequence, not only identity mechanism rollout. This shifts accountability from deployment completion to risk outcome.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;These are common reasons technically correct modernization still underperforms.&lt;/p&gt;
&lt;h3 id="federation-can-be-reliable-and-still-over-permissive"&gt;Federation can be reliable and still over-permissive
&lt;/h3&gt;&lt;p&gt;A stable external issuer does not guarantee safe internal authorization. Strong claim integrity with weak scope controls still produces broad blast radius.&lt;/p&gt;
&lt;h3 id="managed-identity-can-hide-privilege-accumulation"&gt;Managed identity can hide privilege accumulation
&lt;/h3&gt;&lt;p&gt;Because managed identities feel &amp;ldquo;safe,&amp;rdquo; teams may grant broad access faster and review it less often. Operational trust in the mechanism can reduce rigor in scope governance.&lt;/p&gt;
&lt;h3 id="mixed-models-increase-ambiguity"&gt;Mixed models increase ambiguity
&lt;/h3&gt;&lt;p&gt;Environments with partial federation, partial managed identity, and legacy secret-based services often create unclear accountability boundaries. Review complexity rises while confidence drops.&lt;/p&gt;
&lt;h3 id="control-ownership-can-fragment"&gt;Control ownership can fragment
&lt;/h3&gt;&lt;p&gt;Identity platform teams may own issuance controls while workload teams own authorization scope. Without a shared review model, risks move between teams without being resolved.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="report-mechanism-gains-and-boundary-gains-separately"&gt;Report mechanism gains and boundary gains separately
&lt;/h3&gt;&lt;p&gt;State exactly what was improved in credential handling and exactly what was improved in containment. Keep these as two explicit score lines.&lt;/p&gt;
&lt;h3 id="for-federated-identities-document-delegated-versus-retained-controls"&gt;For federated identities, document delegated versus retained controls
&lt;/h3&gt;&lt;p&gt;Write down what external systems must guarantee and what Azure authorization boundaries must still enforce internally.&lt;/p&gt;
&lt;h3 id="tie-modernization-milestones-to-boundary-revalidation"&gt;Tie modernization milestones to boundary revalidation
&lt;/h3&gt;&lt;p&gt;Do not complete identity modernization until effective scope and transitive reachability have been reassessed and reduced where needed.&lt;/p&gt;
&lt;h3 id="assign-one-owner-for-residual-trust-graph-risk"&gt;Assign one owner for residual trust-graph risk
&lt;/h3&gt;&lt;p&gt;If mechanism and boundary ownership are split, designate a single accountable owner for consequence under compromise.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Managed identity and federation modernize trust transport, not trust consequence. Moving off secrets is real progress - but if boundary design doesn&amp;rsquo;t change alongside it, the shape of the risk hasn&amp;rsquo;t changed nearly enough.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation" target="_blank" rel="noopener"
&gt;Workload identity federation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identities-overview" target="_blank" rel="noopener"
&gt;Workload identities in Microsoft Entra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"
&gt;Managed identities for Azure resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity-platform/access-tokens" target="_blank" rel="noopener"
&gt;Microsoft identity platform access tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/best-practices" target="_blank" rel="noopener"
&gt;Best practices for Azure RBAC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How Workload Identity Fails: The Compromise Paths You Build by Design</title><link>https://blog.brewedinthecloud.com/p/workload-identity-failure-paths/</link><pubDate>Thu, 13 Aug 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/workload-identity-failure-paths/</guid><description>&lt;p&gt;Most post-incident identity reviews still ask the wrong question first.&lt;/p&gt;
&lt;p&gt;They ask how the attacker got valid access.&lt;/p&gt;
&lt;p&gt;In mature Azure estates, that is often the easiest part of the story to explain. The harder part is what that access could already reach once it was valid.&lt;/p&gt;
&lt;p&gt;That reach is usually designed, not discovered.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Workload identity failure is not one broken control. It is a path problem across trust edges that were individually rational but collectively dangerous.&lt;/p&gt;
&lt;p&gt;An identity compromise becomes material when it can traverse multiple control planes with legitimate permissions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity plane: token issuance and accepted trust relationships&lt;/li&gt;
&lt;li&gt;Management plane: role assignments and inherited administrative reach&lt;/li&gt;
&lt;li&gt;Data plane: service-to-service access where business workloads actually live&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Attack paths in workload identity are architectural sequences, not authentication events.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is why teams miss them. They validate controls in isolation and never validate consequence in combination.&lt;/p&gt;
&lt;h2 id="how-it-actually-works"&gt;How It Actually Works
&lt;/h2&gt;&lt;p&gt;Three path patterns create most of the real exposure.&lt;/p&gt;
&lt;h3 id="privilege-layering-without-boundary-intent"&gt;Privilege layering without boundary intent
&lt;/h3&gt;&lt;p&gt;Identities are granted access over time by different teams solving different delivery needs. The resulting permission set looks reasonable in each sprint but excessive across the whole path. When compromise occurs, the attacker benefits from years of cumulative convenience.&lt;/p&gt;
&lt;h3 id="service-mediated-pivoting"&gt;Service-mediated pivoting
&lt;/h3&gt;&lt;p&gt;A workload identity might only have moderate direct permissions. But if it can invoke an automation service, deployment pipeline, or orchestration account with broader rights, compromise escalates through service relationships rather than direct role elevation.&lt;/p&gt;
&lt;h3 id="inheritance-driven-expansion"&gt;Inheritance-driven expansion
&lt;/h3&gt;&lt;p&gt;Assignments at broad scopes make future resources reachable by default. Identity risk then grows automatically with platform growth, even when no one touches the identity again.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Compromised workload identity] --&gt; B{Direct permissions limited?}
B --&gt;|Yes| C[Invoke trusted service dependency]
B --&gt;|No| D[Immediate broad reach]
C --&gt; E{Dependency has elevated scope?}
E --&gt;|Yes| F[Transitive privilege expansion]
E --&gt;|No| G[Localized impact]
D --&gt; H[Cross-resource compromise path]
F --&gt; H
G --&gt; I[Containment possible]
H --&gt; J[Systemic exposure event]
&lt;/div&gt;
&lt;p&gt;The important point is not that these paths exist. It is that they remain predictable once you model identity relationships as a graph instead of isolated controls.&lt;/p&gt;
&lt;h2 id="when-this-pattern-reduces-risk-and-when-it-increases-it"&gt;When This Pattern Reduces Risk and When It Increases It
&lt;/h2&gt;&lt;h3 id="reduces-risk-when"&gt;Reduces risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Identity scope and dependency edges are reviewed together, not in separate governance streams.&lt;/li&gt;
&lt;li&gt;High-privilege automation services are isolated from routine workload identities.&lt;/li&gt;
&lt;li&gt;Broad-scope assignments have owner, purpose, and expiry.&lt;/li&gt;
&lt;li&gt;Architecture reviews test path consequence, not control presence.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="increases-risk-when"&gt;Increases risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Teams assume managed identity use implies path safety.&lt;/li&gt;
&lt;li&gt;Service dependencies are trusted by default because they are &amp;ldquo;internal&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Role inheritance is treated as administrative convenience instead of attack surface.&lt;/li&gt;
&lt;li&gt;Review artifacts list permissions but do not model traversal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The recurring failure mode is simple: local optimization creates global reachability.&lt;/p&gt;
&lt;h2 id="a-decision-filter-for-design-reviews"&gt;A Decision Filter for Design Reviews
&lt;/h2&gt;&lt;p&gt;If you want to test a workload identity design quickly, pressure-test these questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which services can this identity call that can act with broader authority?&lt;/li&gt;
&lt;li&gt;Which assignments are inherited and therefore expanding as the estate grows?&lt;/li&gt;
&lt;li&gt;What is the shortest path from this identity to a business-critical control function?&lt;/li&gt;
&lt;li&gt;Which path edge would break containment first under compromise?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the team cannot answer without reverse-engineering the environment, the design is under-modeled.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;These path failures matter because they convert routine delivery patterns into high-consequence incident pathways.&lt;/p&gt;
&lt;h3 id="incident-handling-quality"&gt;Incident handling quality
&lt;/h3&gt;&lt;p&gt;Response quality drops when teams only understand direct permissions and discover transitive dependencies during the incident. The first hour becomes architecture archaeology rather than containment action.&lt;/p&gt;
&lt;h3 id="architecture-decision-quality"&gt;Architecture decision quality
&lt;/h3&gt;&lt;p&gt;Design decisions become better when identity boundaries are evaluated as path constraints. Teams stop over-valuing local delivery speed and start valuing path determinism under compromise.&lt;/p&gt;
&lt;h3 id="risk-reporting-quality"&gt;Risk reporting quality
&lt;/h3&gt;&lt;p&gt;Risk reporting gets sharper when findings are written as traversal consequence instead of control inventory. Leaders can prioritize containment work when they can see path length, pivot points, and likely impact domains.&lt;/p&gt;
&lt;h3 id="platform-evolution-safety"&gt;Platform evolution safety
&lt;/h3&gt;&lt;p&gt;As estates evolve, path-aware identity design prevents silent exposure growth. Without that discipline, each new service can inherit old trust assumptions and widen compromise potential by default.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;These are the patterns that repeatedly create false confidence in otherwise well-built environments.&lt;/p&gt;
&lt;h3 id="low-direct-privilege-can-still-be-high-consequence"&gt;Low direct privilege can still be high consequence
&lt;/h3&gt;&lt;p&gt;A workload identity with limited direct rights may still invoke a trusted service with elevated authority. Direct scope looks safe while transitive scope remains dangerous.&lt;/p&gt;
&lt;h3 id="internal-service-trust-is-often-over-generalized"&gt;Internal service trust is often over-generalized
&lt;/h3&gt;&lt;p&gt;Teams frequently assume internal services are safe pivots because they are platform-managed. Internal origin does not remove the need for boundary design and constrained invocation rights.&lt;/p&gt;
&lt;h3 id="inheritance-is-easy-to-forget-and-hard-to-debug"&gt;Inheritance is easy to forget and hard to debug
&lt;/h3&gt;&lt;p&gt;Inherited assignments are not always visible in local design artifacts. During incidents, this creates disagreement about intended versus effective reach and delays decisive containment.&lt;/p&gt;
&lt;h3 id="path-controls-decay-through-operational-shortcuts"&gt;Path controls decay through operational shortcuts
&lt;/h3&gt;&lt;p&gt;Temporary exceptions added during release pressure often become permanent path edges. The accumulated effect is broader traversal than the architecture originally allowed.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="model-identity-as-traversable-paths"&gt;Model identity as traversable paths
&lt;/h3&gt;&lt;p&gt;Document not just &amp;ldquo;what this identity can access&amp;rdquo; but &amp;ldquo;what this identity can trigger that can access more.&amp;rdquo; That second statement usually reveals real exposure.&lt;/p&gt;
&lt;h3 id="separate-routine-workload-identities-from-control-plane-orchestrators"&gt;Separate routine workload identities from control-plane orchestrators
&lt;/h3&gt;&lt;p&gt;If an identity can both run business workload actions and influence control-plane automation, blast radius is already too broad.&lt;/p&gt;
&lt;h3 id="review-inherited-scope-on-every-architecture-change"&gt;Review inherited scope on every architecture change
&lt;/h3&gt;&lt;p&gt;Treat inheritance as a changing risk surface, not a static baseline. New resources can create new consequences without new assignments.&lt;/p&gt;
&lt;h3 id="write-findings-as-consequence-chains"&gt;Write findings as consequence chains
&lt;/h3&gt;&lt;p&gt;Use language like &amp;ldquo;identity A can invoke service B which can modify C&amp;rdquo;. This produces better remediation decisions than abstract permission lists.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Workload identity compromise turns severe when the architecture lets authority travel farther than anyone intended. Control quality matters, but it&amp;rsquo;s the geometry of the path - what connects to what - that decides the actual consequence.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identities-overview" target="_blank" rel="noopener"
&gt;Workload identities in Microsoft Entra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"
&gt;Managed identities for Azure resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation" target="_blank" rel="noopener"
&gt;Workload identity federation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles" target="_blank" rel="noopener"
&gt;Azure RBAC built-in roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/best-practices" target="_blank" rel="noopener"
&gt;Best practices for Azure RBAC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Workload Identity Is a Trust Graph, Not a Credential Problem</title><link>https://blog.brewedinthecloud.com/p/workload-identity-trust-graph/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/workload-identity-trust-graph/</guid><description>&lt;p&gt;Most teams celebrate when they remove secrets from workloads.&lt;/p&gt;
&lt;p&gt;They should. It is a real security improvement.&lt;/p&gt;
&lt;p&gt;It is also where many identity architectures become dangerously self-congratulatory.&lt;/p&gt;
&lt;p&gt;If your design review ends at &amp;ldquo;we use managed identity now,&amp;rdquo; you did credential hygiene, not identity architecture.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Workload identity security is usually discussed as an authentication problem. That framing is too narrow for serious environments.&lt;/p&gt;
&lt;p&gt;Authentication answers whether a principal is valid. Architecture answers what that principal can reach once valid.&lt;/p&gt;
&lt;p&gt;That distinction is the whole argument.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Secret removal reduces credential theft risk. Trust graph design determines compromise consequence.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A workload identity model should be read as a graph:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nodes&lt;/strong&gt;: managed identities, service principals, federated subjects, automation identities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edges&lt;/strong&gt;: role assignments, delegated permissions, cross-service access grants, trust to external token issuers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consequence&lt;/strong&gt;: blast radius produced by transitive reachability, not by credential format.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a compromised identity can still traverse high-value services through legitimate permissions, the architecture is weak even when secret hygiene is excellent.&lt;/p&gt;
&lt;h2 id="how-it-actually-works"&gt;How It Actually Works
&lt;/h2&gt;&lt;p&gt;In practice, identity exposure grows through three repeatable patterns.&lt;/p&gt;
&lt;h3 id="inherited-scope-drift"&gt;Inherited scope drift
&lt;/h3&gt;&lt;p&gt;Assignments at management group, subscription, or broad resource group scope create reachability that local teams do not always notice. The identity keeps becoming more useful operationally and more dangerous architecturally.&lt;/p&gt;
&lt;h3 id="shared-identity-surfaces"&gt;Shared identity surfaces
&lt;/h3&gt;&lt;p&gt;When multiple workloads share one identity for convenience, one compromise becomes multi-workload access. That is not an incident surprise. It is a design outcome.&lt;/p&gt;
&lt;h3 id="transitive-access-chains"&gt;Transitive access chains
&lt;/h3&gt;&lt;p&gt;A workload identity often cannot reach crown-jewel data directly, but it can reach a service that can. These second-order edges are where many threat models stay shallow.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Compromised workload identity] --&gt; B{Effective scope boundary}
B --&gt;|Narrow, workload-local| C[Local containment]
B --&gt;|Broad RG/Subscription| D[Cross-resource reachability]
D --&gt; E{Transitive service edges present?}
E --&gt;|No| F[Elevated but bounded impact]
E --&gt;|Yes| G[Pivot path across trust zones]
G --&gt; H[Systemic exposure event]
C --&gt; I[Periodic boundary review]
F --&gt; I
H --&gt; J[Architecture redesign required]
&lt;/div&gt;
&lt;p&gt;The practical point is blunt: compromise impact is mostly pre-decided by scope topology before any attacker arrives.&lt;/p&gt;
&lt;h2 id="where-teams-misjudge-managed-identity-and-federation"&gt;Where Teams Misjudge Managed Identity and Federation
&lt;/h2&gt;&lt;p&gt;Managed identity and federation are both useful. Neither is a substitute for trust boundary design.&lt;/p&gt;
&lt;h3 id="managed-identity-what-it-solves-and-what-it-does-not"&gt;Managed identity: what it solves and what it does not
&lt;/h3&gt;&lt;p&gt;Managed identity materially improves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Secret handling and storage risk&lt;/li&gt;
&lt;li&gt;Rotation burden and stale credential drift&lt;/li&gt;
&lt;li&gt;Human exposure to credential material&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Managed identity does &lt;strong&gt;not&lt;/strong&gt; materially improve by itself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permission scope quality&lt;/li&gt;
&lt;li&gt;Transitive privilege chains&lt;/li&gt;
&lt;li&gt;Blast radius of inherited role assignments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Treating managed identity rollout as completion criteria is architectural shallowness.&lt;/p&gt;
&lt;h3 id="federation-delegated-trust-boundaries-must-be-explicit"&gt;Federation: delegated trust boundaries must be explicit
&lt;/h3&gt;&lt;p&gt;Federation needs tighter language than &amp;ldquo;it depends on the external issuer.&amp;rdquo; That is directionally true but incomplete.&lt;/p&gt;
&lt;p&gt;When a workload identity trusts an external issuer, security responsibility splits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Delegated to external issuer&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Subject integrity (who the token claims to represent)&lt;/li&gt;
&lt;li&gt;Claim issuance controls&lt;/li&gt;
&lt;li&gt;Upstream identity assurance process&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retained in Azure/control plane design&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Which issuer/audience combinations are accepted&lt;/li&gt;
&lt;li&gt;Which resources and roles the federated identity can reach&lt;/li&gt;
&lt;li&gt;How far privilege propagates after successful token exchange&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the architecture question is not &amp;ldquo;is federation secure?&amp;rdquo; It is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Have we constrained federated trust so a valid external claim cannot become broad internal reachability?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Without that boundary precision, federation discussions become hand-waving and reviewers rightly push back.&lt;/p&gt;
&lt;h2 id="when-this-pattern-reduces-risk-and-when-it-increases-it"&gt;When This Pattern Reduces Risk and When It Increases It
&lt;/h2&gt;&lt;h3 id="reduces-risk-when"&gt;Reduces risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Identity scope is intentionally narrow and regularly revalidated.&lt;/li&gt;
&lt;li&gt;Shared identities are exceptional rather than default.&lt;/li&gt;
&lt;li&gt;Cross-service grants are explicit, justified, and reviewed as architectural exceptions.&lt;/li&gt;
&lt;li&gt;Federated trust accepts only tightly bounded issuer/audience/subject combinations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="increases-risk-when"&gt;Increases risk when
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Broad scope is justified with &amp;ldquo;delivery speed&amp;rdquo; and never revisited.&lt;/li&gt;
&lt;li&gt;Automation identities accumulate permissions release by release.&lt;/li&gt;
&lt;li&gt;External federation is introduced without a clear internal blast-radius boundary.&lt;/li&gt;
&lt;li&gt;Design reviews discuss identity mechanism but not effective reachability.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The anti-pattern is common and predictable: teams modernize credentials while preserving legacy trust sprawl.&lt;/p&gt;
&lt;h2 id="a-decision-filter-for-design-reviews"&gt;A Decision Filter for Design Reviews
&lt;/h2&gt;&lt;p&gt;If this article is useful, it should change review behavior immediately.&lt;/p&gt;
&lt;p&gt;Use this filter in architecture reviews:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the &lt;strong&gt;maximum effective reach&lt;/strong&gt; of this identity today, including inherited assignments?&lt;/li&gt;
&lt;li&gt;Which &lt;strong&gt;transitive edges&lt;/strong&gt; can this identity exploit indirectly through other services?&lt;/li&gt;
&lt;li&gt;For federated identities, which controls are &lt;strong&gt;external dependencies&lt;/strong&gt; versus &lt;strong&gt;internal design controls&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;If this identity is compromised now, where does containment actually stop?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If these questions cannot be answered quickly from current evidence, the design is operating on assumed trust, not controlled trust.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This only matters if it changes decisions in live environments, not just language in architecture decks.&lt;/p&gt;
&lt;h3 id="design-quality"&gt;Design quality
&lt;/h3&gt;&lt;p&gt;Strong teams stop treating workload identity as a provisioning task and start treating it as a boundary design discipline. The review standard shifts from &amp;ldquo;did we remove secrets&amp;rdquo; to &amp;ldquo;can we prove where compromise stops.&amp;rdquo; That change makes architecture reviews harder, but materially better.&lt;/p&gt;
&lt;h3 id="reliability-under-pressure"&gt;Reliability under pressure
&lt;/h3&gt;&lt;p&gt;Containment speed in incidents is mostly determined before the incident starts. When identity boundaries and transitive edges are explicit, responders can isolate quickly without reconstructing trust logic from scratch. When they are implicit, outage and containment timelines both expand.&lt;/p&gt;
&lt;h3 id="security-governance"&gt;Security governance
&lt;/h3&gt;&lt;p&gt;Governance quality improves when drift review is tied to reachability change rather than policy inventory. Counting identities tells you very little; understanding effective scope and inheritance tells you where risk is accumulating. That is the difference between administrative control and architectural control.&lt;/p&gt;
&lt;h3 id="scalability"&gt;Scalability
&lt;/h3&gt;&lt;p&gt;Scale is not &amp;ldquo;how many identities we can create.&amp;rdquo; Scale is whether teams can reason about compromise consequence without escalation to a few platform specialists. If only a small group can explain trust boundaries, the architecture has not scaled, even if automation has.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;These are the conditions that repeatedly make otherwise good identity designs fail in production.&lt;/p&gt;
&lt;h3 id="least-privilege-intent-can-still-produce-broad-effective-reach"&gt;Least-privilege intent can still produce broad effective reach
&lt;/h3&gt;&lt;p&gt;Teams often document narrowly scoped intent while inherited role assignments quietly widen the operational boundary. The design looks controlled in documentation but behaves broadly in practice. Always validate effective scope, not intended scope.&lt;/p&gt;
&lt;h3 id="shared-platform-identities-hide-concentrated-failure-domains"&gt;Shared platform identities hide concentrated failure domains
&lt;/h3&gt;&lt;p&gt;One identity serving multiple workloads reduces operational overhead and increases correlated risk at the same time. During compromise, those workloads collapse into a single incident boundary whether teams planned for that or not. Shared identity should be an explicit exception with ownership.&lt;/p&gt;
&lt;h3 id="federation-reliability-can-mask-federation-over-trust"&gt;Federation reliability can mask federation over-trust
&lt;/h3&gt;&lt;p&gt;A stable external issuer does not guarantee a safe internal trust boundary. External claim integrity and internal authorization scope are separate control planes and must be reviewed separately. Good issuer hygiene cannot compensate for over-broad internal role design.&lt;/p&gt;
&lt;h3 id="drift-accumulates-through-reasonable-exceptions"&gt;Drift accumulates through reasonable exceptions
&lt;/h3&gt;&lt;p&gt;Most exposure growth is gradual and justified one change at a time. No single change looks dangerous, but the aggregate trust graph becomes harder to contain. This is why periodic architecture-level identity review must be mandatory rather than optional.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="review-identity-as-a-graph-not-a-setting"&gt;Review identity as a graph, not a setting
&lt;/h3&gt;&lt;p&gt;Evaluate nodes, edges, and transitive reachability together. Single-control reviews miss system behavior.&lt;/p&gt;
&lt;h3 id="separate-external-assurance-from-internal-authorization"&gt;Separate external assurance from internal authorization
&lt;/h3&gt;&lt;p&gt;For federated identities, document what is trusted externally and what is constrained internally. Do not blend the two in one vague control statement.&lt;/p&gt;
&lt;h3 id="treat-broad-scope-as-debt-with-an-owner-and-expiry"&gt;Treat broad scope as debt with an owner and expiry
&lt;/h3&gt;&lt;p&gt;If broad grants are temporarily necessary, assign ownership and expiry criteria. Scope without expiry is silent risk growth.&lt;/p&gt;
&lt;h3 id="make-one-question-mandatory-in-every-identity-review"&gt;Make one question mandatory in every identity review
&lt;/h3&gt;&lt;p&gt;Before approval, require this answer in writing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is the smallest boundary where compromise of this identity is guaranteed to stop, and what evidence proves it?&lt;/strong&gt;&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If your workload identity review can prove who can authenticate but can&amp;rsquo;t prove where a compromise stops, the design is still immature - no matter how modern the credential mechanism looks on paper.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identities-overview" target="_blank" rel="noopener"
&gt;Workload identities in Microsoft Entra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"
&gt;Managed identities for Azure resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation" target="_blank" rel="noopener"
&gt;Workload identity federation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles" target="_blank" rel="noopener"
&gt;Azure RBAC built-in roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/best-practices" target="_blank" rel="noopener"
&gt;Best practices for Azure RBAC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Exposure-Driven Architecture Reviews</title><link>https://blog.brewedinthecloud.com/p/exposure-driven-architecture-reviews/</link><pubDate>Thu, 06 Aug 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/exposure-driven-architecture-reviews/</guid><description>&lt;p&gt;Most security architecture reviews produce long findings lists and limited strategic change.&lt;/p&gt;
&lt;p&gt;They prove controls exist, but they often fail to prove exposure is constrained.&lt;/p&gt;
&lt;p&gt;An exposure-driven review changes that by starting from adversarial consequence logic: what can be reached, how far authority can propagate, where containment fails, and which assets make that failure material. This approach is not a replacement for governance controls; it is the architectural layer that makes those controls decision-relevant.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Exposure-driven review is a synthesis exercise across trust, path, containment, and criticality.&lt;/p&gt;
&lt;p&gt;Instead of beginning with standards conformance, it begins with four architecture questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reachability&lt;/strong&gt;: Which compromise paths are actually traversable?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Propagation&lt;/strong&gt;: How can authority expand across identity, management, and service dependencies?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containment&lt;/strong&gt;: Where is compromise guaranteed to stop?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Materiality&lt;/strong&gt;: Which reachable assets make consequence business-significant?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This model reframes review outputs from &amp;ldquo;control status&amp;rdquo; to &amp;ldquo;consequence logic.&amp;rdquo; For senior stakeholders, that shift is essential because strategic choices require understanding trade-offs in exposure, not just compliance posture.&lt;/p&gt;
&lt;p&gt;In Azure-hosted estates, where shared responsibility spans platform, workload, and governance teams, exposure-driven reviews also create a common language for cross-layer decisions.&lt;/p&gt;
&lt;h3 id="review-output-quality-bar"&gt;Review output quality bar
&lt;/h3&gt;&lt;p&gt;A review should be considered decision-ready only when every major finding includes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A reachable path statement (starting point, pivot edge, impacted asset).&lt;/li&gt;
&lt;li&gt;A propagation mechanism across identity, management, or service dependency planes.&lt;/li&gt;
&lt;li&gt;A containment boundary statement describing where the sequence must stop.&lt;/li&gt;
&lt;li&gt;A trade-off statement describing cost, delivery friction, and residual risk if accepted.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Without these four elements, review outputs drift back into issue lists that look complete but do not support executive decisions under pressure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a finding cannot be expressed as a consequence chain with boundary logic, it should not drive architecture priority.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;A strong exposure review assembles evidence into coherent risk chains rather than independent issue statements.&lt;/p&gt;
&lt;h3 id="integrate-prior-architecture-lenses"&gt;Integrate prior architecture lenses
&lt;/h3&gt;&lt;p&gt;The review should combine combinational control behavior, attack path mapping, choke-point quality, blast-radius boundaries, and critical asset significance into one model. Treating these as separate workstreams fragments decision quality.&lt;/p&gt;
&lt;h3 id="distinguish-theoretical-weakness-from-reachable-consequence"&gt;Distinguish theoretical weakness from reachable consequence
&lt;/h3&gt;&lt;p&gt;Not every weakness is materially exposed. Review quality improves when findings explicitly show reachable path conditions and required assumptions. This prevents over-prioritization of low-consequence issues and under-prioritization of path-enabling design flaws.&lt;/p&gt;
&lt;h3 id="express-decisions-as-trade-offs"&gt;Express decisions as trade-offs
&lt;/h3&gt;&lt;p&gt;Exposure rarely reduces without operational cost. Reviews should surface trade-offs clearly: where control concentration may increase dependency risk, where isolation may reduce delivery flexibility, and where governance strictness may affect platform velocity.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Architecture evidence inputs] --&gt; B[Trust and dependency mapping]
B --&gt; C[Reachability/path analysis]
C --&gt; D[Containment boundary validation]
D --&gt; E[Critical asset consequence overlay]
E --&gt; F{Material exposure proven?}
F --&gt;|No| G[Monitor and defer]
F --&gt;|Yes| H[Decision trade-off framing]
H --&gt; I[Prioritized architectural actions]
&lt;/div&gt;
&lt;p&gt;The output should be an architecture decision set that leadership and engineering can execute, not an issue register that accumulates without structural change.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Exposure-driven reviews matter because they improve both strategic alignment and operational resilience.&lt;/p&gt;
&lt;h3 id="higher-quality-remediation-decisions"&gt;Higher-quality remediation decisions
&lt;/h3&gt;&lt;p&gt;By linking weaknesses to reachable consequence and critical asset impact, teams prioritize architecture actions that reduce systemic risk instead of chasing high-volume low-impact findings.&lt;/p&gt;
&lt;h3 id="faster-cross-functional-alignment"&gt;Faster cross-functional alignment
&lt;/h3&gt;&lt;p&gt;Platform, identity, security, and product teams can align more quickly when review outputs are framed as shared consequence paths. This reduces prolonged debate over control ownership and accelerates boundary-focused improvements.&lt;/p&gt;
&lt;h3 id="more-defensible-governance-outcomes"&gt;More defensible governance outcomes
&lt;/h3&gt;&lt;p&gt;Governance improves when control exceptions are evaluated for exposure consequence, not just policy variance. Leaders can approve, reject, or time-bound exceptions with clearer understanding of system-level impact.&lt;/p&gt;
&lt;h3 id="increased-incident-preparedness"&gt;Increased incident preparedness
&lt;/h3&gt;&lt;p&gt;Because exposure-driven reviews model propagation and containment explicitly, incident teams inherit a better operational map during crises. Decision time shortens and response confidence increases.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;Exposure-oriented methods are powerful, but they can fail if execution drifts back into familiar checklist habits.&lt;/p&gt;
&lt;h3 id="over-collection-of-evidence-without-synthesis"&gt;Over-collection of evidence without synthesis
&lt;/h3&gt;&lt;p&gt;Teams can gather extensive logs, diagrams, and control metadata yet still miss key exposure logic if evidence is not assembled into traversable consequence chains.&lt;/p&gt;
&lt;h3 id="path-analysis-without-criticality-context"&gt;Path analysis without criticality context
&lt;/h3&gt;&lt;p&gt;A technically valid path may not be materially significant, while a shorter path to a control anchor may be existential. Review outputs must combine path feasibility with asset consequence, not treat them separately.&lt;/p&gt;
&lt;h3 id="binary-scoring-hides-trade-offs"&gt;Binary scoring hides trade-offs
&lt;/h3&gt;&lt;p&gt;Pass/fail summaries are easy to report but weak for architecture decisions. Exposure review requires graded reasoning about uncertainty, consequence, and design cost.&lt;/p&gt;
&lt;h3 id="recommendations-can-become-implementation-checklists"&gt;Recommendations can become implementation checklists
&lt;/h3&gt;&lt;p&gt;Review quality degrades when outputs prescribe product-level configuration steps rather than architectural intent and boundary outcomes. Keep findings at the system decision level unless technical depth is explicitly needed.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="anchor-every-finding-to-consequence-logic"&gt;Anchor every finding to consequence logic
&lt;/h3&gt;&lt;p&gt;Each finding should explain path, propagation mechanism, boundary failure point, and impacted critical assets. If any element is missing, the recommendation is probably not decision-ready.&lt;/p&gt;
&lt;h3 id="use-explicit-confidence-and-assumption-statements"&gt;Use explicit confidence and assumption statements
&lt;/h3&gt;&lt;p&gt;Where data is incomplete, document assumptions and confidence levels. This prevents false certainty and helps teams target evidence collection efficiently.&lt;/p&gt;
&lt;h3 id="separate-immediate-controls-from-structural-redesign"&gt;Separate immediate controls from structural redesign
&lt;/h3&gt;&lt;p&gt;Short-term controls can reduce current exposure, but long-term risk often requires architecture change. Make both layers explicit so tactical fixes do not displace strategic remediation.&lt;/p&gt;
&lt;h3 id="maintain-a-recurring-exposure-review-cadence"&gt;Maintain a recurring exposure review cadence
&lt;/h3&gt;&lt;p&gt;Cloud architecture changes continuously. Exposure review should be periodic and event-driven, triggered by major platform, identity, or governance shifts that alter trust and dependency geometry.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; A review is only defensible when it can explain why a weakness matters, how compromise propagates, where containment fails, and which assets make the outcome material - a long findings list without that context tells you controls existed, not whether exposure ever actually stopped.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/well-architected/" target="_blank" rel="noopener"
&gt;Azure Well-Architected Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/framework/security/overview" target="_blank" rel="noopener"
&gt;Azure architecture center security guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/benchmark/azure/" target="_blank" rel="noopener"
&gt;Microsoft cloud security benchmark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/" target="_blank" rel="noopener"
&gt;Zero Trust deployment guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/governance/" target="_blank" rel="noopener"
&gt;Azure governance documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Critical Asset Mapping</title><link>https://blog.brewedinthecloud.com/p/critical-asset-mapping/</link><pubDate>Tue, 04 Aug 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/critical-asset-mapping/</guid><description>&lt;p&gt;Many organizations say everything is critical, then struggle to defend anything effectively.&lt;/p&gt;
&lt;p&gt;That is not a policy problem. It is an architecture prioritization problem.&lt;/p&gt;
&lt;p&gt;Defensive architecture requires choosing where to concentrate protection effort based on systemic consequence, not broad importance labels. Critical asset mapping provides that discipline by identifying which assets control trust decisions, enable recovery, and materially determine business survivability when compromised.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;A critical asset is not simply a valuable data store or visible production service.&lt;/p&gt;
&lt;p&gt;An asset is critical when compromise of that asset can disproportionately alter authority, availability, or trust for many other systems. In other words, criticality is a function of transitive influence, not local significance.&lt;/p&gt;
&lt;p&gt;A useful way to classify assets for defensive architecture is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control assets&lt;/strong&gt;: identity authorities, policy engines, key management, deployment control functions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consequence multipliers&lt;/strong&gt;: services whose compromise exposes many downstream systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational continuity anchors&lt;/strong&gt;: systems required to recover safely from disruption.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business value concentration points&lt;/strong&gt;: high-impact data and services tied directly to survivability outcomes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This framing avoids a common trap: ranking assets only by confidentiality sensitivity while ignoring assets that can reshape trust boundaries and control posture.&lt;/p&gt;
&lt;h3 id="criticality-proof-test"&gt;Criticality proof test
&lt;/h3&gt;&lt;p&gt;An asset should be treated as tier-one critical only when at least one of the following is true:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Compromise can alter identity, policy, key, or deployment authority for multiple domains.&lt;/li&gt;
&lt;li&gt;Compromise can disable or degrade recovery for multiple business services.&lt;/li&gt;
&lt;li&gt;Compromise can expose or influence data with cross-domain business consequence.&lt;/li&gt;
&lt;li&gt;Compromise can materially expand attacker reach through transitive dependencies.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This test should be re-run whenever inheritance scope, automation pathways, or platform dependencies change.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a criticality model cannot explain transitive consequence, it is an inventory label, not an architecture decision tool.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Critical asset maps become meaningful when built from dependency logic rather than ownership charts.&lt;/p&gt;
&lt;h3 id="start-with-control-significance-not-visibility"&gt;Start with control significance, not visibility
&lt;/h3&gt;&lt;p&gt;Highly visible customer workloads are often treated as most critical by default, while quieter control assets receive less scrutiny. In many incidents, compromise of a control asset creates broader consequence than compromise of a single customer-facing workload.&lt;/p&gt;
&lt;h3 id="trace-transitive-dependence-across-platform-layers"&gt;Trace transitive dependence across platform layers
&lt;/h3&gt;&lt;p&gt;If service A depends on identity authority B, key management C, and deployment control D, then B, C, and D may be more critical from a systemic risk perspective than A itself. Mapping transitive dependencies reveals this hidden hierarchy.&lt;/p&gt;
&lt;h3 id="tie-criticality-to-path-and-containment-context"&gt;Tie criticality to path and containment context
&lt;/h3&gt;&lt;p&gt;Criticality should not be assessed in isolation. An asset that is inherently important but strongly isolated may represent lower immediate architecture risk than a moderately important asset that is broadly reachable through weakly constrained trust edges.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Business service] --&gt; B[Identity authority]
A --&gt; C[Key management]
A --&gt; D[Deployment control]
D --&gt; E[Policy/config influence]
B --&gt; F[Privilege propagation potential]
C --&gt; G[Data access unlock potential]
E --&gt; H[Environment-wide consequence]
F --&gt; H
G --&gt; H
&lt;/div&gt;
&lt;p&gt;The point is not to produce a perfect map. It is to reveal which assets shape system-wide consequence so defensive investment aligns with real architectural risk.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Critical asset mapping improves security outcomes by making prioritization explicit, defensible, and architecture-driven.&lt;/p&gt;
&lt;h3 id="better-allocation-of-defensive-effort"&gt;Better allocation of defensive effort
&lt;/h3&gt;&lt;p&gt;Teams can direct engineering and governance attention toward assets that determine broad trust outcomes, rather than spreading effort evenly across long asset inventories. This increases risk reduction per unit of effort.&lt;/p&gt;
&lt;h3 id="sharper-incident-planning-and-containment"&gt;Sharper incident planning and containment
&lt;/h3&gt;&lt;p&gt;When critical control assets are known and protected as consequence multipliers, incident response can prioritize preserving or restoring those anchors first, reducing cascading impact across dependent services.&lt;/p&gt;
&lt;h3 id="higher-quality-executive-risk-communication"&gt;Higher quality executive risk communication
&lt;/h3&gt;&lt;p&gt;Leaders can evaluate trade-offs more effectively when criticality is explained as systemic influence and business consequence. This is more actionable than abstract severity labels or tool-generated score aggregates.&lt;/p&gt;
&lt;h3 id="stronger-change-management-discipline"&gt;Stronger change management discipline
&lt;/h3&gt;&lt;p&gt;Architecture changes affecting critical assets can be reviewed with heightened rigor because teams understand downstream consequence. This reduces accidental trust-boundary erosion during normal delivery cycles.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;Criticality work is often undermined by assumptions that seem reasonable but produce weak defensive priorities.&lt;/p&gt;
&lt;h3 id="high-usage-is-not-the-same-as-high-consequence"&gt;High usage is not the same as high consequence
&lt;/h3&gt;&lt;p&gt;Frequently accessed assets are not always the most critical. Low-traffic control functions can carry much higher systemic consequence because they govern authority for many services.&lt;/p&gt;
&lt;h3 id="data-sensitivity-labels-can-distort-priorities"&gt;Data sensitivity labels can distort priorities
&lt;/h3&gt;&lt;p&gt;Classification frameworks are useful, but they can over-emphasize storage assets and under-emphasize control-plane assets that can indirectly expose or alter those stores.&lt;/p&gt;
&lt;h3 id="criticality-can-drift-as-dependencies-evolve"&gt;Criticality can drift as dependencies evolve
&lt;/h3&gt;&lt;p&gt;Asset importance is dynamic. New automation pathways, role inheritance changes, and platform integrations can elevate previously moderate assets into high-consequence positions.&lt;/p&gt;
&lt;h3 id="ownership-boundaries-can-hide-shared-consequence"&gt;Ownership boundaries can hide shared consequence
&lt;/h3&gt;&lt;p&gt;Asset owners may optimize local risk while missing transitive impact on other domains. Critical mapping must cross organizational boundaries to reflect true architectural influence.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="define-criticality-using-consequence-logic"&gt;Define criticality using consequence logic
&lt;/h3&gt;&lt;p&gt;Ask which assets can change trust, privilege, or recovery outcomes for multiple domains. Use this as the primary criterion before adding business or compliance overlays.&lt;/p&gt;
&lt;h3 id="maintain-a-dependency-aware-critical-map"&gt;Maintain a dependency-aware critical map
&lt;/h3&gt;&lt;p&gt;Update critical asset views whenever major identity, platform, or governance changes occur. Static annual assessments are too slow for cloud-scale dependency drift.&lt;/p&gt;
&lt;h3 id="link-critical-assets-to-containment-strategy"&gt;Link critical assets to containment strategy
&lt;/h3&gt;&lt;p&gt;For each critical asset, define the minimum boundary where compromise must be contained and the controls that guarantee that boundary under pressure.&lt;/p&gt;
&lt;h3 id="prioritize-protection-of-control-and-recovery-anchors"&gt;Prioritize protection of control and recovery anchors
&lt;/h3&gt;&lt;p&gt;Assets that govern identity, policy, key material, and recovery should be treated as strategic defensive priorities even when they are not highly visible to business stakeholders.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Critical assets are the systems that decide what else can fail. If your priority model can&amp;rsquo;t explain transitive consequence - why compromising this backup vault or that admin group matters more than the flashier workload next to it - it&amp;rsquo;s an inventory label, not a defensive architecture model.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/benchmark/azure/security-controls-v3-governance" target="_blank" rel="noopener"
&gt;Microsoft Cloud Security Benchmark governance guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/framework/" target="_blank" rel="noopener"
&gt;Azure architecture framework: Reliability and Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/key-vault/general/overview" target="_blank" rel="noopener"
&gt;Azure key management and Key Vault overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-areas" target="_blank" rel="noopener"
&gt;Azure landing zone design areas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/governance/management-groups/overview" target="_blank" rel="noopener"
&gt;Azure resource organization and management groups&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Designing Blast Radius</title><link>https://blog.brewedinthecloud.com/p/designing-blast-radius/</link><pubDate>Thu, 30 Jul 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/designing-blast-radius/</guid><description>&lt;p&gt;Containment is often discussed as if it starts during incident response.&lt;/p&gt;
&lt;p&gt;In reality, containment starts during architecture decisions long before any incident occurs.&lt;/p&gt;
&lt;p&gt;Blast radius reflects how far authority, trust, and dependency can propagate after a compromise event. If those propagation paths are broad, incident teams do not &amp;ldquo;choose&amp;rdquo; a small blast radius in the moment. They inherit the one the architecture already created.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;Blast radius is a design property of reachable consequence, not a post-incident metric.&lt;/p&gt;
&lt;p&gt;To reason about blast radius in Azure-hosted environments, treat compromise as a propagation problem across five dimensions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identity scope&lt;/strong&gt;: what principals can reach through direct and inherited access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Administrative scope&lt;/strong&gt;: how management-plane rights can alter controls and resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service coupling&lt;/strong&gt;: where shared dependencies can spread operational and security impact.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data concentration&lt;/strong&gt;: where high-value assets create consequence multipliers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recovery authority&lt;/strong&gt;: which emergency pathways can override normal boundaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This model prevents the common mistake of equating segmentation presence with containment quality. Segments can exist on paper while privilege inheritance and service dependencies still allow practical cross-boundary movement.&lt;/p&gt;
&lt;h3 id="containment-confidence-test"&gt;Containment confidence test
&lt;/h3&gt;&lt;p&gt;Containment design is credible only when teams can answer these questions before deployment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Which identities can cross subscription or environment boundaries through inherited administrative scope.&lt;/li&gt;
&lt;li&gt;Which shared control services (identity, key management, deployment automation, networking) can create cross-domain consequence if compromised.&lt;/li&gt;
&lt;li&gt;Which recovery channels can bypass normal segmentation and how quickly those channels can be revoked.&lt;/li&gt;
&lt;li&gt;Which boundary is the first guaranteed stop point for compromise propagation across identity, management, and data planes.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;If containment depends on responders discovering boundaries during an incident, blast radius was never designed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Blast radius expansion is usually a byproduct of efficiency optimizations.&lt;/p&gt;
&lt;h3 id="shared-platforms-and-inherited-trust"&gt;Shared platforms and inherited trust
&lt;/h3&gt;&lt;p&gt;Shared platform services reduce cost and operational friction, but they also increase trust transitivity. When multiple domains depend on common control services, one compromise can influence many workloads indirectly.&lt;/p&gt;
&lt;h3 id="broad-administrative-inheritance"&gt;Broad administrative inheritance
&lt;/h3&gt;&lt;p&gt;Management group and subscription-level delegation can speed delivery but enlarge consequence domains. A principal compromise in one team context can alter security posture in unrelated environments if administrative inheritance is not tightly bounded.&lt;/p&gt;
&lt;h3 id="recovery-channels-as-latent-expansion-paths"&gt;Recovery channels as latent expansion paths
&lt;/h3&gt;&lt;p&gt;Break-glass accounts, emergency network routes, and broad restoration privileges are necessary for resilience. They are also high-consequence authority channels. If poorly constrained, they can expand blast radius during exactly the periods when decision pressure is highest.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Compromise event] --&gt; B{Identity boundary narrow?}
B --&gt;|Yes| C[Local scope pressure]
B --&gt;|No| D[Cross-domain identity reach]
C --&gt; E{Shared services tightly isolated?}
D --&gt; F[Administrative inheritance expansion]
E --&gt;|Yes| G[Contained consequence]
E --&gt;|No| H[Service-coupled spread]
F --&gt; H
H --&gt; I{Recovery channels constrained?}
I --&gt;|Yes| J[Managed containment recovery]
I --&gt;|No| K[Systemic blast radius]
&lt;/div&gt;
&lt;p&gt;The objective is not zero spread under all conditions. The objective is deterministic boundaries that keep compromise consequence proportionate and recoverable.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Blast radius design quality directly shapes business impact, recovery speed, and leadership confidence during incidents.&lt;/p&gt;
&lt;h3 id="incident-consequence-control"&gt;Incident consequence control
&lt;/h3&gt;&lt;p&gt;Architectures with explicit containment boundaries produce smaller, more predictable incident scopes. Teams can isolate affected domains without shutting down unrelated services or introducing broad emergency privileges.&lt;/p&gt;
&lt;h3 id="recovery-confidence"&gt;Recovery confidence
&lt;/h3&gt;&lt;p&gt;When containment boundaries are designed and tested as architectural properties, recovery plans rely less on improvisation. Operational teams know which controls can be trusted during disruption and where authority remains bounded.&lt;/p&gt;
&lt;h3 id="investment-prioritization"&gt;Investment prioritization
&lt;/h3&gt;&lt;p&gt;Blast-radius analysis improves prioritization by identifying where shared dependencies and inherited privileges create disproportionate consequence. This enables targeted investment in isolation and mediation rather than broad, low-yield hardening.&lt;/p&gt;
&lt;h3 id="governance-quality"&gt;Governance quality
&lt;/h3&gt;&lt;p&gt;Governance becomes more useful when it tracks consequence boundaries and boundary drift. Counting controls is not enough; organizations need evidence that compromise spread remains constrained as the platform evolves.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;Containment design fails most often when organizations confuse isolation visuals with true authority boundaries.&lt;/p&gt;
&lt;h3 id="segmentation-can-look-strong-and-behave-weakly"&gt;Segmentation can look strong and behave weakly
&lt;/h3&gt;&lt;p&gt;Network segmentation does not guarantee containment if identities can still invoke control-plane operations or trusted automation across segments. Effective blast radius depends on combined identity and management boundaries.&lt;/p&gt;
&lt;h3 id="shared-control-services-can-silently-expand-risk"&gt;Shared control services can silently expand risk
&lt;/h3&gt;&lt;p&gt;Centralized logging, key management, automation, and CI/CD platforms are operationally valuable. If privilege boundaries around these services are broad, they become compromise multipliers rather than stabilizers.&lt;/p&gt;
&lt;h3 id="emergency-access-can-become-permanent-posture"&gt;Emergency access can become permanent posture
&lt;/h3&gt;&lt;p&gt;Access patterns introduced during outages or migrations often persist long after the triggering event. Unexpired emergency pathways are a common source of unexpected consequence expansion.&lt;/p&gt;
&lt;h3 id="boundary-intent-decays-during-platform-growth"&gt;Boundary intent decays during platform growth
&lt;/h3&gt;&lt;p&gt;As subscriptions, workloads, and teams scale, initially clear boundary intent can drift through inheritance and convenience-based exceptions. Without periodic architecture review, blast radius grows without explicit approval.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="define-containment-boundaries-in-architectural-terms"&gt;Define containment boundaries in architectural terms
&lt;/h3&gt;&lt;p&gt;State where compromise must stop across identity, administration, and service dependency layers. Make this a design requirement, not an incident objective.&lt;/p&gt;
&lt;h3 id="treat-broad-inheritance-as-explicit-risk-debt"&gt;Treat broad inheritance as explicit risk debt
&lt;/h3&gt;&lt;p&gt;If broad scopes are operationally unavoidable, assign ownership, review cadence, and measurable exit criteria. Containment debt without accountability becomes structural exposure.&lt;/p&gt;
&lt;h3 id="isolate-high-consequence-shared-services"&gt;Isolate high-consequence shared services
&lt;/h3&gt;&lt;p&gt;Platform services that can influence many domains should have stricter mediation, stronger identity controls, and narrower administrative pathways than ordinary workloads.&lt;/p&gt;
&lt;h3 id="review-recovery-pathways-with-adversarial-assumptions"&gt;Review recovery pathways with adversarial assumptions
&lt;/h3&gt;&lt;p&gt;Resilience mechanisms should be tested for misuse potential as rigorously as for availability outcomes. A recovery path that defeats containment is a security-critical design flaw.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Blast radius is never what your architecture diagrams imply. It&amp;rsquo;s what a compromised identity or control-plane principal can actually still reach once the assumptions behind that diagram stop holding.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/well-architected/security/" target="_blank" rel="noopener"
&gt;Azure Well-Architected Framework: Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/well-architected/reliability/" target="_blank" rel="noopener"
&gt;Azure Well-Architected Framework: Reliability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/governance/management-groups/overview" target="_blank" rel="noopener"
&gt;Management groups and governance at scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/best-practices" target="_blank" rel="noopener"
&gt;Azure RBAC best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/hybrid-networking/hub-spoke" target="_blank" rel="noopener"
&gt;Designing secure hub-spoke networks in Azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Designing Choke Points</title><link>https://blog.brewedinthecloud.com/p/designing-choke-points/</link><pubDate>Tue, 28 Jul 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/designing-choke-points/</guid><description>&lt;p&gt;Good architecture does not try to inspect every possible interaction equally.&lt;/p&gt;
&lt;p&gt;It deliberately creates places where high-consequence interactions must pass through constrained decision points.&lt;/p&gt;
&lt;p&gt;Those points are choke points: boundaries where trust extension is mediated, logging is meaningful, and bypasses are intentionally difficult. In enterprise cloud environments, choke points are one of the few scalable ways to move from reactive security operations toward deterministic defensive architecture.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;A choke point is not a product. It is a design property of path concentration with controllable friction.&lt;/p&gt;
&lt;p&gt;In defensive terms, a choke point is valuable when it does three things simultaneously:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Concentrates&lt;/strong&gt; multiple risky paths into fewer decision locations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Constrains&lt;/strong&gt; authority with policy, identity, and network checks before trust propagates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clarifies&lt;/strong&gt; accountability because control ownership and consequence boundaries become explicit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This model is especially relevant in Azure-hosted estates where identity relationships, management-plane actions, and service dependencies can multiply quickly. Without intentional choke design, environments drift toward distributed trust where no single team can confidently explain where compromise should stop.&lt;/p&gt;
&lt;p&gt;The trade-off is real: concentration can improve control quality but also create critical dependencies. Designing choke points is therefore a balancing act between resistance, resilience, and operational flow.&lt;/p&gt;
&lt;h3 id="choke-point-readiness-criteria"&gt;Choke-point readiness criteria
&lt;/h3&gt;&lt;p&gt;A boundary should not be labeled a choke point unless it meets all of the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Mandatory traversal&lt;/strong&gt;: high-consequence identity and management actions cannot bypass the boundary through alternate service links, delegated admin paths, or emergency channels.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layered mediation&lt;/strong&gt;: identity context, policy evaluation, and network decision controls are all enforced at the same boundary transition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Failure-safe behavior&lt;/strong&gt;: degraded operation defaults to constrained access with auditable escalation, not broad operational override.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass governance&lt;/strong&gt;: every exception has expiry, owner, and explicit blast-radius consequence documented at review time.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;A boundary that is easy to bypass during outages is an observation point, not a choke point.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Effective choke point design is about architecture geometry, not just policy enforcement.&lt;/p&gt;
&lt;h3 id="path-convergence-before-privilege-expansion"&gt;Path convergence before privilege expansion
&lt;/h3&gt;&lt;p&gt;The most useful choke points sit where low-trust interactions transition into higher authority domains. Examples include privileged administration pathways, outbound dependency mediation, and cross-segment service invocation boundaries. The key is to mediate before privilege multiplies, not after.&lt;/p&gt;
&lt;h3 id="decision-quality-and-bypass-resistance"&gt;Decision quality and bypass resistance
&lt;/h3&gt;&lt;p&gt;A nominal choke point that can be bypassed by alternate identity paths, direct service links, or emergency access shortcuts is not a choke point in practice. Real choke design requires periodic validation that alternate routes remain constrained or explicitly governed.&lt;/p&gt;
&lt;h3 id="coupling-awareness-and-failure-behavior"&gt;Coupling awareness and failure behavior
&lt;/h3&gt;&lt;p&gt;Because choke points often centralize control decisions, they can also centralize failure modes. If availability design is weak, teams may introduce broad override paths during outages, silently removing the very mediation the choke point was intended to provide.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Low-trust request path] --&gt; B{Must cross mediated boundary?}
B --&gt;|No| C[Bypass route exists]
C --&gt; D[Nominal choke point only]
B --&gt;|Yes| E[Policy + identity + context checks]
E --&gt; F{Decision outcome}
F --&gt;|Allow| G[Constrained authority extension]
F --&gt;|Deny| H[Containment preserved]
G --&gt; I{Operational override available?}
I --&gt;|Uncontrolled| D
I --&gt;|Governed| J[Resilient choke design]
&lt;/div&gt;
&lt;p&gt;This is why choke points must be designed as a control system with explicit resilience behavior, not a static rule location.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Choke points matter because they shape whether compromise scales or stalls.&lt;/p&gt;
&lt;h3 id="reduced-attacker-optionality"&gt;Reduced attacker optionality
&lt;/h3&gt;&lt;p&gt;When critical paths converge through mediated boundaries, attackers face fewer low-friction routes to privilege expansion. Compromise efforts become noisier and more detectable, increasing defender decision time.&lt;/p&gt;
&lt;h3 id="higher-fidelity-security-telemetry"&gt;Higher-fidelity security telemetry
&lt;/h3&gt;&lt;p&gt;Concentrated decision points produce more meaningful telemetry than broad, distributed controls. Signals are closer to high-consequence trust transitions, improving detection relevance and investigative speed.&lt;/p&gt;
&lt;h3 id="stronger-governance-accountability"&gt;Stronger governance accountability
&lt;/h3&gt;&lt;p&gt;Choke points force ownership clarity. Teams can no longer rely on vague &amp;ldquo;shared responsibility&amp;rdquo; language when explicit boundaries define who controls access mediation and who accepts associated risk.&lt;/p&gt;
&lt;h3 id="better-architecture-change-control"&gt;Better architecture change control
&lt;/h3&gt;&lt;p&gt;As environments evolve, choke point placement provides a stable framework for evaluating proposed changes. Teams can ask whether a change preserves mediation, introduces bypasses, or weakens control independence.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;Most choke point failures come from design shortcuts made in the name of convenience or resiliency.&lt;/p&gt;
&lt;h3 id="centralization-without-resilience-planning"&gt;Centralization without resilience planning
&lt;/h3&gt;&lt;p&gt;A choke point that becomes a brittle single dependency will eventually trigger pressure for bypass channels. Without resilient operating design, reliability incidents can directly degrade security posture.&lt;/p&gt;
&lt;h3 id="policy-concentration-without-identity-concentration-control"&gt;Policy concentration without identity concentration control
&lt;/h3&gt;&lt;p&gt;Teams may centralize policy evaluation while allowing identity sprawl and broad delegated administration around the boundary. This creates the appearance of control while maintaining real traversal flexibility.&lt;/p&gt;
&lt;h3 id="hidden-alternate-routes-through-trusted-services"&gt;Hidden alternate routes through trusted services
&lt;/h3&gt;&lt;p&gt;Service integrations and automation pathways often bypass intended chokepoints when they are classified as internal operational flows. These routes must be modeled and constrained as rigorously as external paths.&lt;/p&gt;
&lt;h3 id="exception-handling-that-outlives-emergency-conditions"&gt;Exception handling that outlives emergency conditions
&lt;/h3&gt;&lt;p&gt;Temporary elevated access channels are often created under legitimate urgency. If expiry and rollback are weak, emergency paths become steady-state bypasses.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="design-choke-points-where-consequence-is-decided"&gt;Design choke points where consequence is decided
&lt;/h3&gt;&lt;p&gt;Prioritize boundaries where privilege expansion, data concentration access, or control-plane modification becomes possible. Do not waste choke complexity on low-consequence interactions.&lt;/p&gt;
&lt;h3 id="validate-bypass-resistance-continuously"&gt;Validate bypass resistance continuously
&lt;/h3&gt;&lt;p&gt;Treat alternate route discovery as a recurring architecture activity. A choke point is only as strong as the weakest reachable path around it.&lt;/p&gt;
&lt;h3 id="pair-security-mediation-with-resilient-operations"&gt;Pair security mediation with resilient operations
&lt;/h3&gt;&lt;p&gt;Engineer availability, failover, and observability into choke point designs so operational incidents do not force broad manual overrides.&lt;/p&gt;
&lt;h3 id="govern-exceptions-as-boundary-alterations"&gt;Govern exceptions as boundary alterations
&lt;/h3&gt;&lt;p&gt;Require owner, expiry, and consequence analysis for every choke-point exception. Record each exception as an architectural trust edit, not as routine ticket metadata.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; A choke point only earns its keep when it stays the easiest path for legitimate operations and the hardest path to bypass under pressure - the moment engineers start routing around it to hit a deadline, it&amp;rsquo;s stopped doing its job.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/deploy/networks" target="_blank" rel="noopener"
&gt;Zero Trust principles for Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/framework/security/design-principles" target="_blank" rel="noopener"
&gt;Azure architecture center: Security design principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/security-planning" target="_blank" rel="noopener"
&gt;Privileged access strategy in Microsoft Entra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/hybrid-networking/secure-vnet-hub-spoke" target="_blank" rel="noopener"
&gt;Azure network segmentation guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/recommendations-reference" target="_blank" rel="noopener"
&gt;Defender for Cloud recommendations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Understanding Azure Attack Paths</title><link>https://blog.brewedinthecloud.com/p/understanding-azure-attack-paths/</link><pubDate>Thu, 23 Jul 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/understanding-azure-attack-paths/</guid><description>&lt;p&gt;Most architecture reviews describe controls by domain: identity, network, compute, data, operations.&lt;/p&gt;
&lt;p&gt;Attackers do not operate by domain. They operate by reachability.&lt;/p&gt;
&lt;p&gt;That difference is why many well-governed environments remain surprisingly exposed. A control can be correct in its local domain while still enabling traversal when combined with upstream trust edges and downstream service relationships. Path-based reasoning closes that gap by asking a harder question: not &amp;ldquo;is this configured properly,&amp;rdquo; but &amp;ldquo;what can be reached from here if compromise occurs now.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;An attack path is an architectural sequence of reachable decisions, not a list of vulnerabilities.&lt;/p&gt;
&lt;p&gt;In Azure environments, this sequence often traverses three interconnected planes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identity plane&lt;/strong&gt;: token issuance, authentication trust, directory and principal relationships.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Management plane&lt;/strong&gt;: role assignments, resource governance, configuration authority.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data plane&lt;/strong&gt;: workload-level service access, runtime actions, and business data operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A weakness in one plane only becomes material if it links to meaningful authority in another. Defensive architecture therefore treats attack paths as graph logic: nodes, edges, constraints, and consequence.&lt;/p&gt;
&lt;p&gt;This model changes design priorities. Instead of optimizing each control for local correctness, teams optimize for path disruption: where to break traversal, where to force mediation, and where to guarantee containment.&lt;/p&gt;
&lt;h3 id="path-confidence-decision-test"&gt;Path-confidence decision test
&lt;/h3&gt;&lt;p&gt;Architecture teams should treat a path model as incomplete until it answers these four questions with concrete evidence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Which role assignments are inherited from management group, subscription, or resource group scope, and how that inheritance changes reachability.&lt;/li&gt;
&lt;li&gt;Which identities can influence policy, deployment templates, key material, or network routing through management-plane actions.&lt;/li&gt;
&lt;li&gt;Which service dependencies can be invoked to gain transitive authority beyond direct permissions.&lt;/li&gt;
&lt;li&gt;Which single edge removal would most reduce compromise consequence, and whether that edge is currently governed.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;If a path analysis cannot identify its highest-consequence pivot edge, it is documentation, not defensive architecture.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In practice, path formation is usually the result of normal delivery decisions, not obvious misconfiguration.&lt;/p&gt;
&lt;h3 id="identity-edges-that-over-trust-reachability"&gt;Identity edges that over-trust reachability
&lt;/h3&gt;&lt;p&gt;Broad role assignment inheritance, shared automation identities, and permissive service principals create identity edges that are operationally convenient but architecturally expansive. A foothold that should stay local can gain cross-scope influence through valid but over-broad identity relationships.&lt;/p&gt;
&lt;h3 id="management-plane-authority-as-a-pivot-layer"&gt;Management-plane authority as a pivot layer
&lt;/h3&gt;&lt;p&gt;Management plane privileges often have more systemic consequence than data plane privileges. If a compromised identity can modify policy assignments, network controls, deployment templates, or key management settings, it can reshape the environment to unlock new paths.&lt;/p&gt;
&lt;h3 id="data-plane-adjacency-and-service-dependency-chains"&gt;Data-plane adjacency and service dependency chains
&lt;/h3&gt;&lt;p&gt;Many paths do not require direct access to crown-jewel assets. They require access to services that can influence those assets. Queue processors, orchestration workflows, and platform-managed integrations can become path amplifiers when trust boundaries are implicit.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Initial foothold in workload] --&gt; B{Identity edge available?}
B --&gt;|No| C[Local impact]
B --&gt;|Yes| D[Role/Principal expansion]
D --&gt; E{Management-plane action possible?}
E --&gt;|No| F[Data-plane constrained path]
E --&gt;|Yes| G[Policy/Config influence]
G --&gt; H{Can controls be weakened or bypassed?}
H --&gt;|No| I[Limited pivot]
H --&gt;|Yes| J[New traversal routes opened]
J --&gt; K[Critical asset reachable]
&lt;/div&gt;
&lt;p&gt;Path analysis is useful precisely because it reveals how local trust decisions become global consequence chains.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Path-first review improves architecture decisions by exposing reachable consequence instead of relying on control inventories.&lt;/p&gt;
&lt;h3 id="better-prioritization-of-security-work"&gt;Better prioritization of security work
&lt;/h3&gt;&lt;p&gt;Without path context, teams prioritize visible issues rather than consequential ones. With path context, engineering effort shifts toward breaking high-impact traversal edges, reducing inherited authority, and hardening pivot services that determine systemic risk.&lt;/p&gt;
&lt;h3 id="faster-incident-containment"&gt;Faster incident containment
&lt;/h3&gt;&lt;p&gt;When path maps are part of architecture practice, responders know likely pivot routes before an incident. Containment actions become directed and time-bounded rather than exploratory and reactive.&lt;/p&gt;
&lt;h3 id="stronger-cross-team-coordination"&gt;Stronger cross-team coordination
&lt;/h3&gt;&lt;p&gt;Path-based models create a shared language across platform, identity, network, and application teams. Instead of arguing over control ownership, teams can collaborate on sequence interruption and containment assurance.&lt;/p&gt;
&lt;h3 id="more-defensible-leadership-decisions"&gt;More defensible leadership decisions
&lt;/h3&gt;&lt;p&gt;Executives and technical decision makers gain clearer risk narratives when findings are expressed as &amp;ldquo;reachable consequence&amp;rdquo; rather than as disconnected policy deviations. That clarity supports better trade-off decisions under budget and time constraints.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;Attack path work is high value, but teams repeatedly undercut it with predictable mistakes.&lt;/p&gt;
&lt;h3 id="static-diagrams-age-quickly-in-dynamic-estates"&gt;Static diagrams age quickly in dynamic estates
&lt;/h3&gt;&lt;p&gt;Cloud environments evolve faster than static path diagrams. If path reasoning is performed once per project rather than continuously at architecture checkpoints, critical traversal edges emerge between review cycles.&lt;/p&gt;
&lt;h3 id="data-plane-focus-can-miss-management-plane-dominance"&gt;Data-plane focus can miss management-plane dominance
&lt;/h3&gt;&lt;p&gt;Teams often model workload-to-workload movement but under-model management-plane authority. In many incidents, management-plane control determines whether compromise remains bounded or becomes systemic.&lt;/p&gt;
&lt;h3 id="service-trust-assumptions-can-hide-path-amplifiers"&gt;Service trust assumptions can hide path amplifiers
&lt;/h3&gt;&lt;p&gt;Platform services are frequently treated as safe intermediaries by default. When those services operate with broad authority, they can unintentionally compress attacker effort and increase compromise speed.&lt;/p&gt;
&lt;h3 id="path-length-is-not-the-same-as-path-difficulty"&gt;Path length is not the same as path difficulty
&lt;/h3&gt;&lt;p&gt;A long path with permissive trust edges can be easier than a short path with strong mediation. Sequence depth alone is not a meaningful risk metric without resistance quality at each edge.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="model-paths-across-all-three-planes-together"&gt;Model paths across all three planes together
&lt;/h3&gt;&lt;p&gt;Require architecture review artifacts to show identity, management, and data-plane traversal logic in one model. Split-plane analysis hides systemic reachability.&lt;/p&gt;
&lt;h3 id="identify-and-harden-pivot-services"&gt;Identify and harden pivot services
&lt;/h3&gt;&lt;p&gt;Catalog services that can transform limited compromise into broad authority. These are architectural choke candidates and should receive disproportionate design scrutiny.&lt;/p&gt;
&lt;h3 id="track-inherited-authority-as-changing-exposure"&gt;Track inherited authority as changing exposure
&lt;/h3&gt;&lt;p&gt;Inherited roles and delegated scopes are dynamic risk surfaces. Revalidate them at each major platform change, not just during identity projects.&lt;/p&gt;
&lt;h3 id="write-findings-as-consequence-chains"&gt;Write findings as consequence chains
&lt;/h3&gt;&lt;p&gt;Describe exposures as reachable sequences, for example: &amp;ldquo;workload identity A can invoke service B, which can alter policy C, enabling access to asset D.&amp;rdquo; This format drives action better than isolated control findings.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Attack paths turn architecture from a control checklist into a consequence model. If you can&amp;rsquo;t explain what a compromise could actually reach from here, you don&amp;rsquo;t yet understand your real risk - no matter how tidy the control inventory looks.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/benchmark/azure/" target="_blank" rel="noopener"
&gt;Microsoft cloud security benchmark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/overview" target="_blank" rel="noopener"
&gt;Azure role-based access control (RBAC)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/governance/" target="_blank" rel="noopener"
&gt;Azure governance and management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/engineering/threat-modeling-tool" target="_blank" rel="noopener"
&gt;Threat modeling for cloud workloads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/azure-infrastructure-overview" target="_blank" rel="noopener"
&gt;Zero Trust deployment for Azure IaaS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Why Security Controls Fail in Combination</title><link>https://blog.brewedinthecloud.com/p/why-security-controls-fail-in-combination/</link><pubDate>Tue, 21 Jul 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/why-security-controls-fail-in-combination/</guid><description>&lt;p&gt;Security architecture discussions often begin with a checklist of controls and end with a false sense of assurance.&lt;/p&gt;
&lt;p&gt;That pattern is understandable. Control inventories are easy to report, easy to compare, and easy to govern. They are also a poor proxy for how an adversary experiences your environment.&lt;/p&gt;
&lt;p&gt;In real incidents, compromise rarely succeeds because one control is missing. It succeeds because multiple controls share hidden assumptions, depend on the same authority paths, or fail open when operational pressure increases. Defensive architecture is therefore less about counting controls and more about reasoning about control behavior as a coupled system.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;A useful model is to treat security as a network of trust decisions, not a stack of independent products.&lt;/p&gt;
&lt;p&gt;Every control exists inside a dependency context: an identity source, an administrative authority, a routing and name resolution path, a logging pipeline, and a recovery mechanism. If two controls share too many of these dependencies, they are not truly independent layers. They are multiple interfaces to the same underlying trust decision.&lt;/p&gt;
&lt;p&gt;This matters because incident resilience depends on independence. When an attacker compromises one trust domain, the architecture should force costly pivots. If the architecture instead allows inherited authority to flow through management plane, identity plane, and data plane simultaneously, failure propagation becomes fast and predictable.&lt;/p&gt;
&lt;p&gt;A practical framing for senior design reviews is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control presence&lt;/strong&gt;: Is the safeguard deployed?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control independence&lt;/strong&gt;: Does it rely on a different trust path than adjacent controls?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control consequence&lt;/strong&gt;: If bypassed, how much authority can propagate before containment is guaranteed?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without this progression, review outcomes become inventory-centric and blind to combinational failure.&lt;/p&gt;
&lt;h3 id="architecture-decision-standard"&gt;Architecture decision standard
&lt;/h3&gt;&lt;p&gt;A design should not be approved unless it can satisfy four explicit tests:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Independence test&lt;/strong&gt;: at least two high-consequence controls rely on different authority chains, not the same management group or subscription-level identity inheritance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Propagation test&lt;/strong&gt;: compromise of a workload identity cannot directly or transitively alter policy, key management, or routing controls outside its intended resource-group boundary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Override test&lt;/strong&gt;: emergency access and policy exemptions are time-bounded, owner-assigned, and observable through a dedicated review path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containment test&lt;/strong&gt;: the team can state, in one sentence, where authority propagation must stop and which controls enforce that stop condition.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;If a review can prove control presence but cannot prove compromise stop points, the architecture is not defensible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Combinational failure usually emerges from three recurring conditions.&lt;/p&gt;
&lt;h3 id="shared-assumptions-across-layers"&gt;Shared assumptions across layers
&lt;/h3&gt;&lt;p&gt;Network restrictions, identity policies, and platform hardening are often designed by different teams, but they inherit the same upstream trust assumptions. If that upstream assumption fails, all three layers degrade together. This is why &amp;ldquo;defense in depth&amp;rdquo; claims can collapse in minutes under adversarial pressure.&lt;/p&gt;
&lt;h3 id="hidden-transitive-dependencies"&gt;Hidden transitive dependencies
&lt;/h3&gt;&lt;p&gt;Many environments correctly lock direct access to critical assets while leaving indirect operational paths broad. Automation identities, delegated administration, and service integrations can create transitive reachability that bypasses intended control boundaries without violating any single policy statement.&lt;/p&gt;
&lt;h3 id="operational-override-paths"&gt;Operational override paths
&lt;/h3&gt;&lt;p&gt;Production urgency creates temporary exceptions that become permanent architecture. Break-glass access, broad troubleshooting roles, and emergency routing shortcuts are often rational in isolation but collectively create low-friction compromise pathways.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Initial foothold] --&gt; B{Can attacker influence trusted identity?}
B --&gt;|Yes| C[Identity-plane authority expansion]
B --&gt;|No| D[Local compromise only]
C --&gt; E{Shared dependency with network/platform controls?}
E --&gt;|Yes| F[Multiple controls degrade together]
E --&gt;|No| G[Partial resistance remains]
F --&gt; H{Operational override path exists?}
H --&gt;|Yes| I[Rapid systemic failure propagation]
H --&gt;|No| J[Constrained lateral options]
J --&gt; K[Containment window]
I --&gt; L[High-consequence exposure event]
&lt;/div&gt;
&lt;p&gt;The diagram reflects a core point: control interaction quality, not control quantity, determines whether compromise remains local or becomes systemic.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This architectural lens changes outcomes because it shifts decision quality before incidents, not after them.&lt;/p&gt;
&lt;h3 id="design-review-quality"&gt;Design review quality
&lt;/h3&gt;&lt;p&gt;When reviewers evaluate control independence, architecture conversations become sharper. Teams stop accepting statements like &amp;ldquo;we have MFA, segmentation, and monitoring&amp;rdquo; as proof of resilience. They begin asking whether those controls depend on the same identity authority, the same management plane role chain, or the same exception model.&lt;/p&gt;
&lt;h3 id="failure-predictability"&gt;Failure predictability
&lt;/h3&gt;&lt;p&gt;Combinational analysis increases predictability under stress. If trust concentration and propagation paths are explicit, responders can anticipate where compromise may spread and stage containment actions faster. If the architecture is evaluated only by standalone controls, the first hours of an incident become discovery work.&lt;/p&gt;
&lt;h3 id="governance-effectiveness"&gt;Governance effectiveness
&lt;/h3&gt;&lt;p&gt;Governance programs improve when risk narratives are written as dependency and consequence paths instead of policy counts. Executives can prioritize investments when they can see how one trust boundary flaw undermines multiple controls and multiplies business impact.&lt;/p&gt;
&lt;h3 id="platform-scale-safety"&gt;Platform scale safety
&lt;/h3&gt;&lt;p&gt;As cloud estates grow, combinational failure risk grows nonlinearly. New services inherit old trust assumptions and expand transitive reach unless boundaries are intentionally revalidated. The defensive architecture discipline keeps growth from silently amplifying consequence.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;p&gt;Even strong programs fail here because local correctness can still produce global weakness.&lt;/p&gt;
&lt;h3 id="passing-control-tests-can-hide-systemic-weakness"&gt;Passing control tests can hide systemic weakness
&lt;/h3&gt;&lt;p&gt;Isolated control validation often passes while cross-plane behavior remains unsafe. A well-configured network boundary does not guarantee containment if trusted workload identities can still invoke privileged management operations indirectly.&lt;/p&gt;
&lt;h3 id="internal-service-trust-is-frequently-over-broad"&gt;&amp;ldquo;Internal&amp;rdquo; service trust is frequently over-broad
&lt;/h3&gt;&lt;p&gt;Teams often allow broad communication and invocation rights between platform services because they are all enterprise-managed. Under compromise, those assumptions convert internal reliability channels into attacker mobility channels.&lt;/p&gt;
&lt;h3 id="recovery-design-can-reintroduce-broad-authority"&gt;Recovery design can reintroduce broad authority
&lt;/h3&gt;&lt;p&gt;Backup and recovery workflows are essential, but they sometimes rely on highly privileged identities and broad administrative scopes that bypass normal controls. If those pathways are not constrained and monitored, resilience tooling becomes part of the exposure surface.&lt;/p&gt;
&lt;h3 id="exception-debt-grows-quietly"&gt;Exception debt grows quietly
&lt;/h3&gt;&lt;p&gt;Most security degradation does not come from dramatic policy changes. It comes from accumulated exceptions that were each &amp;ldquo;temporary.&amp;rdquo; Over time, those edges form a stable bypass graph that no single team owns.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="review-control-sets-as-interacting-systems"&gt;Review control sets as interacting systems
&lt;/h3&gt;&lt;p&gt;Require architecture reviews to map trust relationships and dependency paths between identity, network, platform, and operations. If controls cannot be shown as independent under compromise, redesign before scale.&lt;/p&gt;
&lt;h3 id="measure-independence-not-only-existence"&gt;Measure independence, not only existence
&lt;/h3&gt;&lt;p&gt;For each major safeguard, record which upstream trust assumptions it depends on. Prioritize designs that reduce shared dependencies across critical controls.&lt;/p&gt;
&lt;h3 id="make-consequence-boundaries-explicit"&gt;Make consequence boundaries explicit
&lt;/h3&gt;&lt;p&gt;For high-value assets and control-plane functions, require teams to define the smallest guaranteed containment boundary and the evidence that boundary holds under adversarial conditions.&lt;/p&gt;
&lt;h3 id="treat-exceptions-as-architecture-changes"&gt;Treat exceptions as architecture changes
&lt;/h3&gt;&lt;p&gt;Temporary overrides should carry owner, expiry, and consequence analysis. Exceptions are not operational trivia; they are trust-graph edits that must be governed as first-class architecture events.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Security controls don&amp;rsquo;t fail independently in mature cloud estates. They fail in correlated patterns, usually because two &amp;ldquo;separate&amp;rdquo; controls were quietly leaning on the same shared trust assumption the whole time.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/security/" target="_blank" rel="noopener"
&gt;Azure security documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/secure/" target="_blank" rel="noopener"
&gt;Cloud Adoption Framework: Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/framework/security/overview" target="_blank" rel="noopener"
&gt;Azure architecture center: Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-cloud-introduction" target="_blank" rel="noopener"
&gt;Microsoft Defender for Cloud architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/azure-infrastructure-overview" target="_blank" rel="noopener"
&gt;Zero Trust guidance for Azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>VNRA Design Trade-offs: When Abstraction Helps, and When It Hides the Route Problem</title><link>https://blog.brewedinthecloud.com/p/vnra-design-trade-offs/</link><pubDate>Thu, 16 Jul 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/vnra-design-trade-offs/</guid><description>&lt;p&gt;A routing design can look cleaner at exactly the moment it becomes harder to trust.&lt;/p&gt;
&lt;p&gt;That is the trap with abstraction in Azure networking. Remove enough visible route objects and the environment starts to feel simpler. Fewer route tables. Fewer subnet-level associations. Less repeated administrative work.&lt;/p&gt;
&lt;p&gt;But packets do not care whether the control surface looks tidy.&lt;/p&gt;
&lt;p&gt;They care which route wins.&lt;/p&gt;
&lt;p&gt;That is the right lens for Virtual Network Routing Appliance (VNRA). Not whether it reduces configuration sprawl, but whether it makes forwarding behaviour easier or harder to predict when the environment changes, exceptions appear, or incidents land at 2 am.&lt;/p&gt;
&lt;p&gt;The hard truth is this: if introducing VNRA still leaves you needing UDR exceptions to preserve determinism, the design has already told you native routing was the better default.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption is that fewer explicit routing objects means lower complexity.&lt;/p&gt;
&lt;p&gt;That assumption fails surprisingly often in Azure.&lt;/p&gt;
&lt;p&gt;Operational simplicity is not the same as configuration brevity. A design with fewer visible route artefacts can still be more complex if engineers can no longer explain packet path decisions from effective route evidence at the subnet or workload boundary.&lt;/p&gt;
&lt;p&gt;That is the mental model shift this topic needs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VNRA does not automatically simplify routing. It moves complexity away from explicit route authorship and into interpretation of effective forwarding behaviour.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sometimes that is exactly what you want. If you have broad, repeated intent across many segments, centralising that intent can reduce drift and make change safer.&lt;/p&gt;
&lt;p&gt;Sometimes it is the wrong trade. If the design depends on carve-outs, bypasses, and subnet-specific behaviour to stay safe, abstraction does not remove complexity. It just hides it behind a cleaner control surface.&lt;/p&gt;
&lt;p&gt;That distinction matters more than the feature itself.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;From a data plane-first perspective, VNRA matters only if it changes what route wins for a packet and how confidently an operator can predict that outcome.&lt;/p&gt;
&lt;p&gt;That means the useful questions are not:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Did VNRA reduce the number of route tables?&lt;/li&gt;
&lt;li&gt;Did we centralise routing intent?&lt;/li&gt;
&lt;li&gt;Does the architecture diagram look cleaner?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The useful questions are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What effective routes now appear on the workload NIC?&lt;/li&gt;
&lt;li&gt;Which next hop actually wins for the destination that matters?&lt;/li&gt;
&lt;li&gt;Can an engineer explain why that route won over competing system, Border Gateway Protocol (BGP), or user-defined route (UDR) inputs?&lt;/li&gt;
&lt;li&gt;If topology or propagated reachability changes, is the winning path still obvious?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last question is where abstraction either earns its keep or quietly becomes debt.&lt;/p&gt;
&lt;p&gt;VNRA does not replace Azure route selection mechanics. It lives within them. Effective forwarding still depends on the routes that exist, their prefixes, their source, and which one wins on the interface that sends the packet.&lt;/p&gt;
&lt;p&gt;So the design issue is not whether your routing intent is elegant. The design issue is whether the resulting route outcome remains explainable without reconstructing platform-wide logic during an incident.&lt;/p&gt;
&lt;p&gt;If it does, abstraction may be helping.&lt;/p&gt;
&lt;p&gt;If it does not, the environment has become easier to declare and harder to operate.&lt;/p&gt;
&lt;h3 id="the-practical-test"&gt;The practical test
&lt;/h3&gt;&lt;p&gt;A simple test cuts through most of the marketing-grade ambiguity:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If an engineer cannot predict the winning route for a representative subnet from effective route evidence alone, VNRA is the wrong abstraction for that design.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is not a philosophical position. It is an operational one.&lt;/p&gt;
&lt;p&gt;If packet forwarding must be inferred from a combination of central intent, remembered exceptions, propagated routes, and tribal knowledge, then the design has traded route sprawl for uncertainty. That is not simplification in any production sense that matters.&lt;/p&gt;
&lt;h2 id="when-vnra-actually-reduces-complexity"&gt;When VNRA Actually Reduces Complexity
&lt;/h2&gt;&lt;p&gt;VNRA is useful when it removes repeated human decision-making without degrading path clarity.&lt;/p&gt;
&lt;p&gt;That usually means the environment has a small number of broad forwarding patterns repeated at scale.&lt;/p&gt;
&lt;h3 id="repeated-intent-across-many-segments"&gt;Repeated intent across many segments
&lt;/h3&gt;&lt;p&gt;If many subnets are meant to treat the same destinations the same way, VNRA can reduce one of the most common Azure networking failure modes: inconsistent route expression across supposedly equivalent segments.&lt;/p&gt;
&lt;p&gt;The win here is not aesthetic. It is behavioural.&lt;/p&gt;
&lt;p&gt;You are reducing the number of places where a missed route update, stale association, or inconsistent exception can create divergent packet paths. In other words, you are reducing accidental difference.&lt;/p&gt;
&lt;p&gt;That changes how you design and operate the network:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;less repeated route authoring&lt;/li&gt;
&lt;li&gt;less drift between equivalent subnets&lt;/li&gt;
&lt;li&gt;less manual verification after each broad routing change&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In that shape of environment, abstraction can be a real operational improvement.&lt;/p&gt;
&lt;h3 id="route-sprawl-is-already-the-dominant-risk"&gt;Route sprawl is already the dominant risk
&lt;/h3&gt;&lt;p&gt;There are environments where explicit routing is theoretically deterministic but practically fragile because nobody can maintain consistency across all the places where route control has been distributed.&lt;/p&gt;
&lt;p&gt;If every change requires validating route logic across a growing set of subnet route tables, the problem is no longer “explicit routing is more precise”. The problem is “the precision is not surviving contact with reality”.&lt;/p&gt;
&lt;p&gt;VNRA can help in those cases because it reduces the number of repeated decisions humans need to make and re-make over time.&lt;/p&gt;
&lt;p&gt;That is a valid simplification, but only if effective outcomes remain easy to inspect.&lt;/p&gt;
&lt;h3 id="your-routing-policy-is-intentionally-broad"&gt;Your routing policy is intentionally broad
&lt;/h3&gt;&lt;p&gt;If your design intent is something like “all these application segments should follow the same inspected egress path” and that rule genuinely holds without a long list of exceptions, VNRA aligns well with the architecture.&lt;/p&gt;
&lt;p&gt;Broad routing intent is where abstraction tends to pay off. The platform is doing less interpretive work because the design itself is not asking for much nuance.&lt;/p&gt;
&lt;h2 id="when-vnra-increases-complexity"&gt;When VNRA Increases Complexity
&lt;/h2&gt;&lt;p&gt;This is where the abstraction tends to get overused.&lt;/p&gt;
&lt;h3 id="when-determinism-is-the-real-requirement"&gt;When determinism is the real requirement
&lt;/h3&gt;&lt;p&gt;If you need to explain packet path correctness from the subnet boundary, native explicit routing is often the better tool.&lt;/p&gt;
&lt;p&gt;That is particularly true in segmented, compliance-sensitive, or troubleshooting-heavy environments where the operational question is not “what was the intended design?” but “why did this interface send traffic to that next hop?”.&lt;/p&gt;
&lt;p&gt;In those environments, visible route control is often a strength rather than a burden.&lt;/p&gt;
&lt;p&gt;A route table may be verbose, but verbosity is not the same as ambiguity. In many production environments, explicit routing is easier to trust precisely because it is easier to inspect locally.&lt;/p&gt;
&lt;h3 id="when-exceptions-are-structural-not-occasional"&gt;When exceptions are structural, not occasional
&lt;/h3&gt;&lt;p&gt;This is the clearest anti-fit signal.&lt;/p&gt;
&lt;p&gt;If your routing model depends on bypasses, carve-outs, one-off service insertion paths, or subnet-specific forwarding rules to preserve correctness, VNRA is not simplifying the network. It is hiding complexity behind a cleaner control surface.&lt;/p&gt;
&lt;p&gt;That is the point where the abstraction starts working against the architecture.&lt;/p&gt;
&lt;p&gt;And once UDR exceptions appear to recover lost determinism, the design has usually answered the question for you:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If introducing VNRA means you still need UDR exceptions to preserve determinism, native routing was the better default.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is not because UDRs are inherently superior. It is because the network is telling you it needs explicit local control more than centralised intent.&lt;/p&gt;
&lt;h3 id="when-the-design-becomes-mixed-by-necessity"&gt;When the design becomes mixed by necessity
&lt;/h3&gt;&lt;p&gt;Mixed routing models deserve suspicion.&lt;/p&gt;
&lt;p&gt;If the environment increasingly relies on both VNRA-shaped behaviour and carefully placed UDR overrides, you now have two jobs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;understand the abstract forwarding intent&lt;/li&gt;
&lt;li&gt;understand where explicit route control is compensating for it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is usually worse than choosing one primary model and committing to it.&lt;/p&gt;
&lt;p&gt;Mixed models often emerge gradually. Nobody plans them. They appear as small “just for this subnet” corrections that accumulate until the architecture diagram still looks elegant but the data plane no longer is.&lt;/p&gt;
&lt;h3 id="when-troubleshooting-depends-on-local-evidence"&gt;When troubleshooting depends on local evidence
&lt;/h3&gt;&lt;p&gt;The best operational routing designs let the engineer closest to the issue answer basic forwarding questions without escalating into architecture archaeology.&lt;/p&gt;
&lt;p&gt;If local teams cannot explain packet path from effective route evidence on the affected NIC or subnet, incident response slows down. Ownership becomes fuzzy. Mean time to innocence expands. The actual route problem takes longer to isolate because too much of the forwarding logic exists outside the operator’s immediate field of view.&lt;/p&gt;
&lt;p&gt;That is not just a tooling problem. It is a design problem.&lt;/p&gt;
&lt;h2 id="native-simplicity-vs-vnra-influenced-simplicity"&gt;Native Simplicity vs VNRA-Influenced Simplicity
&lt;/h2&gt;&lt;p&gt;The wrong comparison is “manual versus automated”.&lt;/p&gt;
&lt;p&gt;The right comparison is “locally explainable versus centrally abstracted”.&lt;/p&gt;
&lt;h3 id="simpler-native-routing"&gt;Simpler native routing
&lt;/h3&gt;&lt;p&gt;A simpler native routing design usually has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a small number of route sources&lt;/li&gt;
&lt;li&gt;constrained use of UDRs&lt;/li&gt;
&lt;li&gt;clear propagation boundaries&lt;/li&gt;
&lt;li&gt;few exceptions&lt;/li&gt;
&lt;li&gt;forwarding behaviour that can be explained from the affected subnet or NIC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This often looks less sophisticated than an intent-driven design, but for environments that value explainability, it is operationally stronger.&lt;/p&gt;
&lt;h3 id="simpler-vnra-influenced-routing"&gt;Simpler VNRA-influenced routing
&lt;/h3&gt;&lt;p&gt;A VNRA-influenced design is genuinely simpler when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;forwarding intent is repetitive&lt;/li&gt;
&lt;li&gt;exceptions are rare&lt;/li&gt;
&lt;li&gt;route source interactions are stable&lt;/li&gt;
&lt;li&gt;effective route outcomes remain easy to inspect&lt;/li&gt;
&lt;li&gt;another engineer can predict the winning path without reconstructing hidden logic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If those conditions are not true, the abstraction is not reducing complexity. It is displacing it.&lt;/p&gt;
&lt;h2 id="a-quick-decision-filter"&gt;A Quick Decision Filter
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart TD
A[Need to shape routing behaviour] --&gt; B{Is forwarding intent mostly repetitive?}
B --&gt;|No| C[Prefer native explicit routing]
B --&gt;|Yes| D{Are exceptions rare and non-structural?}
D --&gt;|No| C
D --&gt;|Yes| E{Can engineers predict the winning route from effective route evidence?}
E --&gt;|No| C
E --&gt;|Yes| F[VNRA may reduce operational complexity]
F --&gt; G{Do you still need UDR exceptions to preserve determinism?}
G --&gt;|Yes| C
G --&gt;|No| H[VNRA is a reasonable fit]
&lt;/div&gt;
&lt;p&gt;This is not a deployment pattern. It is a design sanity check.&lt;/p&gt;
&lt;p&gt;The key branch is the last one. Once UDR exceptions are required to recover predictable behaviour, the abstraction is usually no longer earning its place.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;So how would this change something you design, deploy, or operate?&lt;/p&gt;
&lt;p&gt;It should change what you optimise for during design review.&lt;/p&gt;
&lt;p&gt;If your environment is dominated by repeated routing intent and low exception density, VNRA may reduce operational drag and make broad change safer.&lt;/p&gt;
&lt;p&gt;If your environment depends on local path explainability, strict exception handling, or per-subnet determinism, then simpler native routing is often the stronger architecture even if it looks less elegant in a diagram.&lt;/p&gt;
&lt;p&gt;That affects several production concerns.&lt;/p&gt;
&lt;h3 id="design"&gt;Design
&lt;/h3&gt;&lt;p&gt;Do not ask whether VNRA can express the intended routing model. Ask whether the resulting packet paths will remain obvious once exceptions, failures, and topology change arrive.&lt;/p&gt;
&lt;p&gt;A design that only looks simple while it remains idealised is not simple.&lt;/p&gt;
&lt;h3 id="reliability"&gt;Reliability
&lt;/h3&gt;&lt;p&gt;Reliability is not just about whether traffic flows. It is about whether engineers can predict and restore correct forwarding under change.&lt;/p&gt;
&lt;p&gt;A routing abstraction that makes incident behaviour harder to reason about is increasing operational risk even if it reduces control-plane sprawl.&lt;/p&gt;
&lt;h3 id="security"&gt;Security
&lt;/h3&gt;&lt;p&gt;Security controls often depend on proving that traffic follows expected paths. If that proof requires too much interpretation, governance gets weaker even when the stated policy is sound.&lt;/p&gt;
&lt;p&gt;Visible determinism is often more useful than elegant intent.&lt;/p&gt;
&lt;h3 id="scalability"&gt;Scalability
&lt;/h3&gt;&lt;p&gt;VNRA can scale route intent. That part is real.&lt;/p&gt;
&lt;p&gt;But if only senior engineers can interpret the resulting forwarding behaviour, then reasoning does not scale with configuration. You have moved the bottleneck rather than removed it.&lt;/p&gt;
&lt;h2 id="implementation-example"&gt;Implementation Example
&lt;/h2&gt;&lt;p&gt;This post intentionally avoids deployment walkthroughs, but the design trade-off still needs a concrete validation artefact.&lt;/p&gt;
&lt;p&gt;The most useful artefact is not a template. It is effective route evidence taken from representative workload interfaces.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network nic show-effective-route-table &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-app-prod &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name nic-app-01 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --output table
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That command by itself is not the point. The point is what you can conclude from the output.&lt;/p&gt;
&lt;p&gt;Use it as a design review heuristic against representative interfaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a standard application subnet&lt;/li&gt;
&lt;li&gt;an exception subnet&lt;/li&gt;
&lt;li&gt;a subnet expected to receive propagated routes&lt;/li&gt;
&lt;li&gt;a subnet expected to bypass a broader forwarding pattern&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then ask four hard questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Can I identify the winning route for the destination that matters?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Can I explain why it won over system, BGP, or UDR alternatives?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Would another engineer reach the same conclusion quickly?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If I need a UDR exception to make this output predictable, why am I using VNRA here at all?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Those questions are more useful than counting route tables or celebrating centralised intent.&lt;/p&gt;
&lt;h3 id="what-healthy-looks-like"&gt;What healthy looks like
&lt;/h3&gt;&lt;p&gt;A VNRA-influenced design is probably doing its job if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;route outcomes are consistent across equivalent subnets&lt;/li&gt;
&lt;li&gt;exception cases are genuinely rare&lt;/li&gt;
&lt;li&gt;effective route outputs are still easy to interpret&lt;/li&gt;
&lt;li&gt;path expectations survive topology change without surprise&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="what-trouble-looks-like"&gt;What trouble looks like
&lt;/h3&gt;&lt;p&gt;The abstraction is probably becoming a liability if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;exception subnets keep appearing&lt;/li&gt;
&lt;li&gt;engineers disagree on expected next hop before checking the NIC&lt;/li&gt;
&lt;li&gt;incident reviews repeatedly require reconstructing central intent to explain local traffic&lt;/li&gt;
&lt;li&gt;UDRs are being added to recover predictability rather than express genuinely separate policy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those are not implementation details. They are architecture signals.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="a-clean-control-surface-can-mask-a-brittle-route-model"&gt;A clean control surface can mask a brittle route model
&lt;/h3&gt;&lt;p&gt;The danger is not that VNRA hides routes. The danger is that it can hide the growth of exceptions until the environment becomes mixed and harder to reason about than the explicit design it replaced.&lt;/p&gt;
&lt;h3 id="exception-growth-is-gradual-not-dramatic"&gt;Exception growth is gradual, not dramatic
&lt;/h3&gt;&lt;p&gt;Most designs do not start complicated. They become complicated one “special case” at a time. That matters because VNRA may still look successful in design documentation long after the forwarding model has become messy in practice.&lt;/p&gt;
&lt;h3 id="effective-routes-show-outcomes-not-intent-quality"&gt;Effective routes show outcomes, not intent quality
&lt;/h3&gt;&lt;p&gt;A route table output can tell you which path wins. It cannot tell you whether the abstraction producing that path is still the right architectural choice. You still need judgement about whether the model is converging on clarity or drift.&lt;/p&gt;
&lt;h3 id="stable-today-does-not-mean-understandable-tomorrow"&gt;Stable today does not mean understandable tomorrow
&lt;/h3&gt;&lt;p&gt;A VNRA design that behaves predictably under today’s topology may become opaque once propagated routes, segmentation changes, or inspection exceptions increase. Re-checking effective outcomes after change is not optional.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="default-to-explicit-routing-when-explainability-is-a-hard-requirement"&gt;Default to explicit routing when explainability is a hard requirement
&lt;/h3&gt;&lt;p&gt;If packet path correctness must be provable from the workload boundary, start with native routing and make abstraction justify itself.&lt;/p&gt;
&lt;h3 id="use-vnra-for-repetition-not-nuance"&gt;Use VNRA for repetition, not nuance
&lt;/h3&gt;&lt;p&gt;If the value of the design comes from broad repeated intent, abstraction can help. If the value comes from careful exceptions, keep the routing model explicit.&lt;/p&gt;
&lt;h3 id="treat-new-udr-exceptions-as-an-architecture-warning"&gt;Treat new UDR exceptions as an architecture warning
&lt;/h3&gt;&lt;p&gt;Do not see them only as implementation details. If UDRs are being added to restore deterministic behaviour inside a VNRA-shaped design, revisit the abstraction choice.&lt;/p&gt;
&lt;h3 id="review-route-evidence-not-just-design-intent"&gt;Review route evidence, not just design intent
&lt;/h3&gt;&lt;p&gt;The design is only as good as the effective routes it produces on real interfaces. Validation should happen at the NIC, not just in the architecture meeting.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; VNRA is useful when it removes repeated routing decisions without making packet paths harder to prove. Once you need UDR exceptions to recover determinism, the network is telling you it wanted explicit control all along.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-routing-appliance-overview" target="_blank" rel="noopener"
&gt;Overview of Azure Virtual Network routing appliances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure virtual network traffic routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/diagnose-vm-network-routing-problem" target="_blank" rel="noopener"
&gt;Diagnose a virtual machine routing problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/cli/azure/network/nic#az-network-nic-show-effective-route-table" target="_blank" rel="noopener"
&gt;Azure CLI: show effective route table for a NIC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview#how-azure-selects-routes" target="_blank" rel="noopener"
&gt;How Azure selects routes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>When Deterministic Routes Fail Loudly in Silence: VNRA Failure Modes and Non-Obvious Behaviour</title><link>https://blog.brewedinthecloud.com/p/vnra-when-deterministic-routes-fail/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/vnra-when-deterministic-routes-fail/</guid><description>&lt;p&gt;There is a particular kind of cloud failure that wastes hours: the route looks right, the next hop looks right, and the workload still cannot talk.&lt;/p&gt;
&lt;p&gt;That is where Azure Virtual Network Routing Appliance (VNRA) gets interesting. Not because it invents strange new routing failures, but because it changes the shape of familiar ones. VNRA can make routing intent more deterministic. The trade is that more traffic can end up depending on the same forwarding model, which means failures become less local, less obvious, and harder to isolate quickly.&lt;/p&gt;
&lt;p&gt;That is the real point of this post.&lt;/p&gt;
&lt;p&gt;In earlier posts we covered route selection, effective routes, and VNRA interactions with system routes, User Defined Routes (UDRs), and Border Gateway Protocol (BGP). This post stays in the unpleasant part of the story: what happens when the selected route still does not translate cleanly into successful packet delivery.&lt;/p&gt;
&lt;p&gt;The practical question is the one that matters:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How would this change something I design, deploy, or operate?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It means that if you adopt VNRA, you should stop thinking in terms of isolated route-table correctness and start thinking in terms of &lt;strong&gt;shared forwarding dependencies&lt;/strong&gt;. VNRA can improve determinism in intended pathing, but that same determinism can widen failure impact and muddy root cause analysis.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;A common assumption in Azure networking goes like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the effective route table shows the expected prefix and next hop, the traffic should work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That assumption is good enough right up until it costs you an incident.&lt;/p&gt;
&lt;p&gt;Effective routes are useful, but they do not prove end-to-end packet success. They show the route outcome Azure is exposing for that network interface. They do not prove that the selected next hop is functionally viable for the flow, that the reverse path is aligned, or that the broader forwarding dependency behind that route is healthy.&lt;/p&gt;
&lt;p&gt;That limitation is not new. Azure has always had a gap between visible route state and actual application outcome. VNRA does not invent that gap. What it changes is how much traffic can now share the same pathing assumptions.&lt;/p&gt;
&lt;p&gt;So the mental model shift is this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VNRA is valuable because it improves determinism in routing intent. VNRA is risky because that determinism often depends on more centralised forwarding behaviour, which reduces failure isolation.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is the trade.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;The important thing to say plainly is this: asymmetry, blackholing, and healthy-looking route tables alongside unhealthy workloads are not new Azure problems.&lt;/p&gt;
&lt;p&gt;You could already get there with combinations of system routes, propagated BGP paths, peering behaviour, and virtual appliance next hops. VNRA does not create entirely new classes of routing pain. What it changes is the &lt;strong&gt;scope&lt;/strong&gt; of the pain.&lt;/p&gt;
&lt;p&gt;Without VNRA, a routing mistake is often easier to keep local. A bad route table association, a wrong UDR, or an unexpected propagated path may still be painful, but the blast radius is frequently narrower and the dependency graph is simpler to reason about.&lt;/p&gt;
&lt;p&gt;With VNRA, more flows can become dependent on the same packet-path model. That improves consistency of routing intent. It also means a single faulty assumption, unavailable appliance path, or return-path mismatch can affect many otherwise unrelated flows at once.&lt;/p&gt;
&lt;p&gt;In practical terms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;route selection may be more predictable&lt;/li&gt;
&lt;li&gt;traffic steering may be more consistent&lt;/li&gt;
&lt;li&gt;forwarding dependence may be more centralised&lt;/li&gt;
&lt;li&gt;failures may stop looking local even when the first symptom is&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is why VNRA is not just a control-plane feature discussion. It is a data-plane consequence discussion.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Workload] --&gt; B{Selected route}
B --&gt;|System / UDR / BGP / VNRA-influenced| C[Chosen forwarding path]
C --&gt; D{Path viable for flow?}
D --&gt;|Yes| E[Forward delivery succeeds]
D --&gt;|No| F[Timeout, blackhole, or reset]
E --&gt; G{Return path aligned?}
G --&gt;|Yes| H[Healthy session]
G --&gt;|No| I[Asymmetry breaks flow]
subgraph VNRA Effect
J[More deterministic path intent]
K[Less isolated failure domains]
end
J --&gt; C
K --&gt; F
K --&gt; I
&lt;/div&gt;
&lt;p&gt;The diagram is intentionally simple. The point is not to describe every routing branch. The point is to show that &lt;strong&gt;deterministic route intent and successful flow completion are related, but not equivalent&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="failure-mode-1-the-route-is-present-but-the-path-dependency-is-not-healthy"&gt;Failure Mode 1: The Route Is Present, but the Path Dependency Is Not Healthy
&lt;/h2&gt;&lt;p&gt;This is the most common trap in the article’s topic space, and the easiest one to misread.&lt;/p&gt;
&lt;p&gt;The effective route table may show:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the expected prefix&lt;/li&gt;
&lt;li&gt;the expected next hop type&lt;/li&gt;
&lt;li&gt;the expected appliance IP&lt;/li&gt;
&lt;li&gt;a perfectly reasonable route source&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That tells you the network interface has a selected route outcome for that prefix. It does &lt;strong&gt;not&lt;/strong&gt; tell you that the forwarding path behind that choice is healthy for the traffic in question.&lt;/p&gt;
&lt;p&gt;In a VNRA design, that distinction matters more because the selected path may represent a shared forwarding dependency for multiple flows, not just a one-off subnet rule.&lt;/p&gt;
&lt;p&gt;At workload level, you may see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP connection timeouts&lt;/li&gt;
&lt;li&gt;repeated retransmits&lt;/li&gt;
&lt;li&gt;failed health probes&lt;/li&gt;
&lt;li&gt;application-level unreachability despite apparently correct route state&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where the practical operational change begins:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In a VNRA design, a healthy-looking effective route table is evidence of intended path selection, not proof of successful packet delivery.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That should change how you interpret incidents. The first question is no longer just “is the route there?” It is “is the selected path still viable in both directions for this flow?”&lt;/p&gt;
&lt;h2 id="failure-mode-2-more-deterministic-intent-less-local-failure"&gt;Failure Mode 2: More Deterministic Intent, Less Local Failure
&lt;/h2&gt;&lt;p&gt;VNRA’s appeal is that it can make pathing behaviour more deliberate. That is good architecture when you need predictable inspection, controlled transit, or consistent route outcomes across multiple segments.&lt;/p&gt;
&lt;p&gt;The catch is that this predictability often comes from &lt;strong&gt;shared forwarding dependence&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A subnet-level UDR problem is usually local enough that teams learn its boundary quickly. A VNRA-shaped path issue can surface first on one workload while already affecting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;multiple spokes&lt;/li&gt;
&lt;li&gt;multiple application tiers&lt;/li&gt;
&lt;li&gt;east-west traffic classes&lt;/li&gt;
&lt;li&gt;north-south inspection paths&lt;/li&gt;
&lt;li&gt;flows that used to fail independently&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the part many designs underweight. VNRA does not just help decide where traffic should go. It can also make many different traffic classes rely on the same decision machinery.&lt;/p&gt;
&lt;p&gt;That means the failure mode changes from:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;this subnet is wrong&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;this forwarding model is wrong&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is a very different investigation.&lt;/p&gt;
&lt;h2 id="failure-mode-3-asymmetry-still-exists--it-just-becomes-easier-to-misread"&gt;Failure Mode 3: Asymmetry Still Exists — It Just Becomes Easier to Misread
&lt;/h2&gt;&lt;p&gt;Asymmetric routing is not a VNRA invention. But VNRA can make asymmetry harder to spot because the forward path may look more intentional than before.&lt;/p&gt;
&lt;p&gt;For example, traffic from a spoke workload might be steered cleanly through a central routing or inspection path. The return traffic might still have a valid route that bypasses the same path entirely. From a narrow route-selection perspective, both directions may appear explainable. From a workload perspective, the session breaks.&lt;/p&gt;
&lt;p&gt;That matters most for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;stateful inspection paths&lt;/li&gt;
&lt;li&gt;session-sensitive applications&lt;/li&gt;
&lt;li&gt;traffic where one direction is centralised and the other is still following a simpler platform path&lt;/li&gt;
&lt;li&gt;environments where different teams control different parts of route intent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The observable symptoms are familiar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;intermittent resets&lt;/li&gt;
&lt;li&gt;one-way success&lt;/li&gt;
&lt;li&gt;handshake success followed by application failure&lt;/li&gt;
&lt;li&gt;some prefixes working while others fail&lt;/li&gt;
&lt;li&gt;inconsistent behaviour between test tools and real applications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is the simplified flow:&lt;/p&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant VM as Spoke VM
participant VNRA as VNRA-directed path
participant APP as Target service
VM-&gt;&gt;VNRA: Forward path follows deterministic routed intent
VNRA-&gt;&gt;APP: Request delivered
APP--&gt;&gt;VM: Return path follows different valid route
Note over VM,APP: Session fails due to asymmetry or state mismatch
&lt;/div&gt;
&lt;p&gt;The non-obvious part is not that asymmetry exists. It is that &lt;strong&gt;a more deliberate forward path can make engineers assume the whole flow is now under the same control model when it is not&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="failure-mode-4-bgp-can-be-healthy-while-the-flow-is-still-broken"&gt;Failure Mode 4: BGP Can Be Healthy While the Flow Is Still Broken
&lt;/h2&gt;&lt;p&gt;BGP often gives teams confidence because it provides visible route exchange and concrete prefixes to inspect. If advertisements are present and effective routes reflect the expected propagated entries, people are tempted to clear routing from the list of suspects.&lt;/p&gt;
&lt;p&gt;That is too generous in a VNRA design.&lt;/p&gt;
&lt;p&gt;BGP health can confirm that route information is present and propagating as expected. It cannot by itself confirm that the forwarding path shaped by those routes is viable, symmetric, or still operationally useful for the workload.&lt;/p&gt;
&lt;p&gt;This is not a criticism of BGP. It is a reminder of scope.&lt;/p&gt;
&lt;p&gt;A route can be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;learned correctly&lt;/li&gt;
&lt;li&gt;selected correctly&lt;/li&gt;
&lt;li&gt;visible correctly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and still participate in a broken end-to-end flow because the actual forwarding dependency behind the selected path is impaired or mismatched in one direction.&lt;/p&gt;
&lt;p&gt;In other words:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BGP tells you that route information is healthy. It does not tell you that the VNRA-dependent path using that information is healthy.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That distinction becomes more important as routing intent gets centralised.&lt;/p&gt;
&lt;h2 id="failure-mode-5-blackholing-without-an-obvious-control-plane-event"&gt;Failure Mode 5: Blackholing Without an Obvious Control-Plane Event
&lt;/h2&gt;&lt;p&gt;Some routing failures are loud. A route disappears. A peer drops. A path withdraws. The incident starts with a visible control-plane change.&lt;/p&gt;
&lt;p&gt;The more frustrating failures are the quiet ones.&lt;/p&gt;
&lt;p&gt;In a VNRA-centred design, traffic can fail because the selected forwarding path is no longer functionally useful, while the route outcome presented to the workload still looks entirely plausible. That does not mean Azure is lying about the route. It means the route view has reached the limit of what it can prove.&lt;/p&gt;
&lt;p&gt;That usually shows up as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;timeouts instead of explicit rejects&lt;/li&gt;
&lt;li&gt;selective failure by prefix or traffic class&lt;/li&gt;
&lt;li&gt;health checks passing from one location and failing from another&lt;/li&gt;
&lt;li&gt;retries that obscure the pattern rather than clarify it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why blackholing in cloud environments is so often misdiagnosed. People look for missing configuration, when the real problem is &lt;strong&gt;a still-selected but no-longer-usable path dependency&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;h3 id="design"&gt;Design
&lt;/h3&gt;&lt;p&gt;If VNRA is in the architecture, you are not merely defining routes. You are defining a shared forwarding model.&lt;/p&gt;
&lt;p&gt;That should change design review questions. Instead of asking only whether the route logic is correct, ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which traffic classes now rely on the same path decision&lt;/li&gt;
&lt;li&gt;which of those require symmetric return&lt;/li&gt;
&lt;li&gt;what fails together if the path remains selected but is not viable in practice&lt;/li&gt;
&lt;li&gt;which paths should not be centralised, even if they could be&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the architectural trade in plain language:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VNRA improves determinism in routing intent, but it weakens failure isolation when too much traffic depends on the same forwarding behaviour.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="reliability"&gt;Reliability
&lt;/h3&gt;&lt;p&gt;Route correctness and service correctness are not the same thing.&lt;/p&gt;
&lt;p&gt;In a VNRA design, reliability depends on whether the selected path is usable for the full flow, not just whether the correct prefix appears in effective routes.&lt;/p&gt;
&lt;h3 id="operations"&gt;Operations
&lt;/h3&gt;&lt;p&gt;The operational change is simple, but important:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do not treat effective routes as proof of successful delivery. Treat them as proof of selected intent.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That changes incident reasoning. A healthy-looking route table should narrow your questions, not end them.&lt;/p&gt;
&lt;h3 id="security"&gt;Security
&lt;/h3&gt;&lt;p&gt;Central inspection or routed enforcement paths benefit from deterministic steering. They also become more sensitive to asymmetry and hidden path dependency failure. If the design assumes inspection is guaranteed because the route intent says so, the design is trusting control-plane evidence too much.&lt;/p&gt;
&lt;h2 id="implementation-example"&gt;Implementation Example
&lt;/h2&gt;&lt;p&gt;This series explicitly excludes step-by-step deployment guidance, so this example is intentionally narrow. The goal is not to show how to build VNRA. The goal is to show why visible route state should be interpreted carefully.&lt;/p&gt;
&lt;p&gt;An Azure CLI example for effective route inspection:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network nic show-effective-route-table &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-spoke-prod &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name nic-app-01 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --output table
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Illustrative output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Source State Address Prefix Next Hop Type Next Hop IP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-------- ------- ---------------- -------------------- -----------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User Active 10.20.15.0/24 VirtualAppliance 10.10.2.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User Active 0.0.0.0/0 VirtualAppliance 10.10.2.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BGP Active 172.16.20.0/24 VirtualNetworkGateway
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Default Active 10.0.0.0/8 VNetPeering
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That output can support a valid conclusion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the workload has selected route outcomes for those prefixes&lt;/li&gt;
&lt;li&gt;the appliance path is part of intended forwarding&lt;/li&gt;
&lt;li&gt;BGP propagation is visible&lt;/li&gt;
&lt;li&gt;peering routes are present&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What it cannot support on its own is the stronger conclusion many engineers want to make:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the selected appliance path is healthy for this flow&lt;/li&gt;
&lt;li&gt;the reverse path is aligned&lt;/li&gt;
&lt;li&gt;the session will complete successfully&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the limit worth respecting.&lt;/p&gt;
&lt;p&gt;To make the dependency concentration concrete, here is a minimal Bicep-style route table fragment showing multiple traffic intents using the same next hop:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeRouteTable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/routeTables@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;rt-spoke-app&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;disableBgpRoutePropagation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;private-segment-via-appliance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.20.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualAppliance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopIpAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.2.4&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default-via-appliance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0.0.0.0/0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualAppliance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopIpAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.2.4&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The deployment syntax is not the point here. The point is architectural:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;deterministic path intent often comes from concentrating multiple route decisions onto the same forwarding dependency.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is exactly why the resulting failure domain deserves more scrutiny.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="effective-routes-are-necessary-but-not-sufficient"&gt;Effective routes are necessary, but not sufficient
&lt;/h3&gt;&lt;p&gt;They help explain selected route intent. They do not validate session success.&lt;/p&gt;
&lt;h3 id="a-cleaner-forward-path-can-hide-a-dirty-return-path"&gt;A cleaner forward path can hide a dirty return path
&lt;/h3&gt;&lt;p&gt;VNRA can make the outbound decision look more deliberate without guaranteeing bidirectional symmetry.&lt;/p&gt;
&lt;h3 id="familiar-failures-can-look-more-novel-than-they-are"&gt;Familiar failures can look more novel than they are
&lt;/h3&gt;&lt;p&gt;Blackholing and asymmetry are old problems. The novelty is often the wider blast radius and less obvious dependency chain.&lt;/p&gt;
&lt;h3 id="routing-looks-healthy-is-often-an-incomplete-statement"&gt;“Routing looks healthy” is often an incomplete statement
&lt;/h3&gt;&lt;p&gt;Healthy route visibility can coexist with unhealthy forwarding outcomes.&lt;/p&gt;
&lt;h3 id="central-path-control-increases-consequence-before-it-increases-complexity"&gt;Central path control increases consequence before it increases complexity
&lt;/h3&gt;&lt;p&gt;The hardest part is not always more routes. It is more traffic relying on the same route behaviour.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="design-for-shared-dependency-awareness"&gt;Design for shared dependency awareness
&lt;/h3&gt;&lt;p&gt;If VNRA is central to pathing, treat that as a deliberate dependency decision, not an implementation detail.&lt;/p&gt;
&lt;h3 id="separate-route-selection-confidence-from-packet-delivery-confidence"&gt;Separate route selection confidence from packet delivery confidence
&lt;/h3&gt;&lt;p&gt;These are related signals, not interchangeable ones.&lt;/p&gt;
&lt;h3 id="be-explicit-about-symmetry-requirements"&gt;Be explicit about symmetry requirements
&lt;/h3&gt;&lt;p&gt;If a flow depends on stateful devices or inspection paths, assume return-path design needs as much scrutiny as forward-path design.&lt;/p&gt;
&lt;h3 id="keep-some-paths-simple-on-purpose"&gt;Keep some paths simple on purpose
&lt;/h3&gt;&lt;p&gt;If a traffic class does not benefit materially from centralised path control, do not centralise it just because you can.&lt;/p&gt;
&lt;h3 id="investigate-incidents-at-the-forwarding-model-level"&gt;Investigate incidents at the forwarding-model level
&lt;/h3&gt;&lt;p&gt;When VNRA is involved, local symptoms may still be expressions of a central path dependency problem.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; VNRA’s strength is that it makes routing intent more deterministic. Its cost is that deterministic intent often rides on less isolated failure domains. If you only verify the route table, you are checking the recipe card and assuming the coffee tasted good.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-routing-appliance-overview" target="_blank" rel="noopener"
&gt;Overview of Azure Virtual Network routing appliances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure virtual network traffic routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/diagnose-network-routing-problem" target="_blank" rel="noopener"
&gt;Diagnose a virtual machine routing problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/expressroute/expressroute-routing" target="_blank" rel="noopener"
&gt;Azure ExpressRoute routing requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview" target="_blank" rel="noopener"
&gt;Virtual network peering in Azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>When BGP Stops Being Boss: VNRA and Propagated Routes in Azure</title><link>https://blog.brewedinthecloud.com/p/vnra-and-propagated-routes-in-azure/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/vnra-and-propagated-routes-in-azure/</guid><description>&lt;p&gt;BGP has a habit of making engineers feel safe.&lt;/p&gt;
&lt;p&gt;If the gateway is up and the prefix is propagated, the instinct is to relax. Azure learned the route, the subnet can see it, and the packet should follow accordingly. In a standard hybrid mental model, that feels reasonable.&lt;/p&gt;
&lt;p&gt;VNRA is where that comfort starts to fall apart.&lt;/p&gt;
&lt;p&gt;This is the key point for this post:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A propagated BGP route can remain visible in Azure without remaining authoritative for forwarding once VNRA governs the packet path.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is not just a troubleshooting nuance. It changes how you judge hybrid determinism, what evidence you trust during incidents, and whether a route table is telling you the thing you think it is.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption is straightforward:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a subnet has a propagated route from a VPN Gateway or ExpressRoute gateway, that route is the authority for forwarding unless something more specific overrides it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That model works well enough until VNRA enters the picture. Then the mistake is not that Azure stops learning the route. The mistake is assuming that &lt;strong&gt;learning&lt;/strong&gt;, &lt;strong&gt;visibility&lt;/strong&gt;, and &lt;strong&gt;forwarding authority&lt;/strong&gt; are still the same thing.&lt;/p&gt;
&lt;p&gt;They are not.&lt;/p&gt;
&lt;p&gt;Once VNRA participates in the routing outcome, a propagated route may still be present while no longer being the deciding authority for how traffic is actually delivered.&lt;/p&gt;
&lt;p&gt;That is the mental shift:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BGP propagation tells Azure a prefix is reachable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VNRA can change whether that propagated route remains authoritative for forwarding&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effective routing evidence is no longer the same thing as forwarding truth&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you miss that distinction, hybrid routing starts to look deterministic on paper and conditional in production.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;This series is deliberately data plane first, so the question here is not “did Azure learn the route?” but “what governs forwarding once both gateway propagation and VNRA are involved?”&lt;/p&gt;
&lt;h3 id="propagation-and-authority-are-not-the-same-thing"&gt;Propagation and authority are not the same thing
&lt;/h3&gt;&lt;p&gt;A route propagated from a gateway into a subnet tells you Azure has imported reachability information for that prefix. That is a control-plane fact.&lt;/p&gt;
&lt;p&gt;The mistake is treating that fact as conclusive proof that the propagated route still governs forwarding for that subnet.&lt;/p&gt;
&lt;p&gt;With VNRA in play, that is no longer a safe assumption.&lt;/p&gt;
&lt;p&gt;A visible route with &lt;code&gt;VirtualNetworkGateway&lt;/code&gt; as its source can still exist while VNRA is the stronger determinant of the realised path. Put bluntly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Visibility of a propagated route does not guarantee authority over forwarding.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is the actual fault line in hybrid designs using VNRA.&lt;/p&gt;
&lt;h3 id="vnra-changes-route-authority-not-just-packet-inspection"&gt;VNRA changes route authority, not just packet inspection
&lt;/h3&gt;&lt;p&gt;It is tempting to talk about VNRA as though it merely influences where packets are observed or inspected. That framing is too weak.&lt;/p&gt;
&lt;p&gt;The important change is that VNRA can alter which route source remains authoritative in practice for a given path. Once that happens, the gateway-learned route is still part of the routing picture, but it is no longer the decisive actor engineers often assume it to be.&lt;/p&gt;
&lt;p&gt;That is why hybrid issues in VNRA-connected designs can look contradictory:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the prefix is present&lt;/li&gt;
&lt;li&gt;the gateway is healthy&lt;/li&gt;
&lt;li&gt;the effective route table looks fine&lt;/li&gt;
&lt;li&gt;traffic behaviour still does not align with a gateway-authoritative path&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is not necessarily a gateway problem. It is often a &lt;strong&gt;route authority problem&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="the-practical-boundary-is-where-forwarding-stops-obeying-propagation"&gt;The practical boundary is where forwarding stops obeying propagation
&lt;/h3&gt;&lt;p&gt;A useful way to reason about this is to stop asking whether BGP propagation exists and start asking where it remains authoritative.&lt;/p&gt;
&lt;p&gt;Once VNRA governs the packet path for a subnet or transit flow, propagated routes may still be true in the sense that Azure has learned them, but they stop being authoritative in the way architects and operators usually care about: they no longer guarantee the forwarding outcome.&lt;/p&gt;
&lt;p&gt;That is the decision boundary that matters.&lt;/p&gt;
&lt;p&gt;If VNRA governs the path, the propagated route becomes evidence of learned reachability, not proof that the gateway still governs forwarding behaviour.&lt;/p&gt;
&lt;h2 id="a-concrete-hybrid-scenario"&gt;A Concrete Hybrid Scenario
&lt;/h2&gt;&lt;p&gt;Consider a spoke workload subnet in a hybrid environment.&lt;/p&gt;
&lt;p&gt;The subnet receives propagated on-premises prefixes from a hub-connected ExpressRoute or VPN gateway. A VM in that subnet shows the expected private prefixes in its effective routes, sourced from &lt;code&gt;VirtualNetworkGateway&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;An engineer checks the route table and concludes the hybrid path is behaving as designed.&lt;/p&gt;
&lt;p&gt;That conclusion may be wrong.&lt;/p&gt;
&lt;p&gt;If VNRA governs forwarding for that subnet’s traffic, then the visible gateway-propagated route is no longer enough to prove that the gateway remains the authority over delivery. The route is present, but the packet path is now being decided elsewhere.&lt;/p&gt;
&lt;p&gt;That is the trap.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Spoke workload subnet]
B[Effective route shows on-prem prefix&lt;br/&gt;Source: VirtualNetworkGateway]
C[VNRA governs forwarding path]
D[Observed traffic does not behave as though gateway propagation is authoritative]
E[Operator assumes gateway path is still decisive]
A --&gt; B
B --&gt; E
A --&gt; C
C --&gt; D
&lt;/div&gt;
&lt;p&gt;The point of this flow is simple: &lt;strong&gt;route visibility and forwarding authority can diverge once VNRA is in the path&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This is where the article either matters or it does not.&lt;/p&gt;
&lt;h3 id="hybrid-determinism-is-weaker-than-the-route-table-suggests"&gt;Hybrid determinism is weaker than the route table suggests
&lt;/h3&gt;&lt;p&gt;A lot of Azure hybrid designs quietly assume that propagated gateway routes provide stable authority across workload subnets. VNRA weakens that assumption.&lt;/p&gt;
&lt;p&gt;If the design depends on “the subnet can see the propagated route, therefore that route governs forwarding”, the design is less deterministic than it looks.&lt;/p&gt;
&lt;p&gt;How would this change something you design, deploy, or operate?&lt;/p&gt;
&lt;p&gt;It means you should stop treating propagated BGP visibility as proof of packet path in VNRA-connected hybrid environments. For design reviews, that changes what evidence is acceptable. For operations, it changes what counts as validation.&lt;/p&gt;
&lt;h3 id="effective-routes-become-evidence-not-authority"&gt;Effective routes become evidence, not authority
&lt;/h3&gt;&lt;p&gt;This is the stronger operational opinion the article needs to make explicit:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In VNRA-affected hybrid paths, effective routes are useful evidence of learned reachability, but they are no longer authoritative proof of forwarding behaviour.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is not because effective routes are wrong. It is because they answer a narrower question than many engineers use them for.&lt;/p&gt;
&lt;p&gt;They can tell you Azure learned the prefix.&lt;/p&gt;
&lt;p&gt;They cannot, on their own, prove that the gateway-learned route still governs the realised path once VNRA has altered route authority for forwarding.&lt;/p&gt;
&lt;h3 id="incident-triage-needs-a-different-first-question"&gt;Incident triage needs a different first question
&lt;/h3&gt;&lt;p&gt;Without VNRA, it is reasonable to begin with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;did the gateway lose the route?&lt;/li&gt;
&lt;li&gt;did BGP stop propagating the prefix?&lt;/li&gt;
&lt;li&gt;is the effective route missing?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With VNRA in the picture, the earlier question is often:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Does the propagated route still have forwarding authority for this subnet, or is VNRA now the governing path decision?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is a materially better triage question because it separates control-plane health from forwarding truth.&lt;/p&gt;
&lt;h3 id="subnet-level-behaviour-matters-more-than-vnet-level-assumptions"&gt;Subnet-level behaviour matters more than VNet-level assumptions
&lt;/h3&gt;&lt;p&gt;One of the quieter risks here is over-generalising from a broad topology statement like “the VNet has the propagated route”.&lt;/p&gt;
&lt;p&gt;That is too coarse.&lt;/p&gt;
&lt;p&gt;In VNRA-influenced environments, the question is whether a particular subnet and path still behave as though the gateway-propagated route is authoritative. If not, route visibility at a wider scope is operationally misleading.&lt;/p&gt;
&lt;h2 id="implementation-example"&gt;Implementation Example
&lt;/h2&gt;&lt;p&gt;This series excludes deployment guidance, but an operational article still needs a concrete artefact.&lt;/p&gt;
&lt;p&gt;A common starting point is to inspect effective routes on a workload NIC.&lt;/p&gt;
&lt;h3 id="azure-cli-inspect-effective-routes"&gt;Azure CLI: inspect effective routes
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network nic show-effective-route-table &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-spoke-prod &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name nic-app-01 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --output table
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Example output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Source State Address Prefix Next Hop Type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--------------------- ------- ------------------ ---------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Default Active 10.20.0.0/16 VnetLocal
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VirtualNetworkGateway Active 172.16.0.0/12 VirtualNetworkGateway
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VirtualNetworkGateway Active 192.168.100.0/24 VirtualNetworkGateway
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Default Active 0.0.0.0/0 Internet
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The operational mistake is to stop here and conclude:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“The on-prem route is present, so the gateway still governs forwarding.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That conclusion is not justified in a VNRA scenario.&lt;/p&gt;
&lt;p&gt;A better interpretation is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure has learned the route&lt;/li&gt;
&lt;li&gt;the subnet can see the propagated prefix&lt;/li&gt;
&lt;li&gt;you still have not proved that the propagated route remains authoritative for forwarding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That distinction changes your next action. You move from route inspection to path validation.&lt;/p&gt;
&lt;p&gt;In practice, that means validating observed behaviour with whichever telemetry is available in your environment, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;flow observations on the forwarding path&lt;/li&gt;
&lt;li&gt;packet capture on test workloads&lt;/li&gt;
&lt;li&gt;appliance-side session or forwarding logs&lt;/li&gt;
&lt;li&gt;bidirectional connectivity tests between Azure and on-premises endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The exact tool is less important than the principle: &lt;strong&gt;if forwarding behaviour and effective routes disagree, trust the forwarding outcome&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="a-healthy-gateway-does-not-prove-authoritative-forwarding"&gt;A healthy gateway does not prove authoritative forwarding
&lt;/h3&gt;&lt;p&gt;Engineers often stop investigating once they confirm the gateway is up and prefixes are propagated. In a VNRA design, that only proves the control plane still knows the route. It does not prove the gateway remains the decisive authority for delivery.&lt;/p&gt;
&lt;h3 id="route-visibility-can-create-false-certainty"&gt;Route visibility can create false certainty
&lt;/h3&gt;&lt;p&gt;The more “correct” the effective route table looks, the easier it is to over-trust it. That is exactly why this class of issue survives design reviews and slows incident response.&lt;/p&gt;
&lt;h3 id="hybrid-asymmetry-becomes-easier-to-misunderstand"&gt;Hybrid asymmetry becomes easier to misunderstand
&lt;/h3&gt;&lt;p&gt;If teams assume a visible propagated route still governs both directions of traffic, they can misread asymmetric behaviour as a gateway fault or application issue when the underlying problem is that forwarding authority has shifted.&lt;/p&gt;
&lt;h3 id="prefix-learning-and-forwarding-authority-can-diverge-cleanly"&gt;Prefix learning and forwarding authority can diverge cleanly
&lt;/h3&gt;&lt;p&gt;This is worth stating plainly: a propagated route does not need to disappear for its practical authority to be reduced. Azure can still learn the prefix while VNRA governs the realised packet path.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="treat-propagated-routes-as-learned-reachability-not-guaranteed-authority"&gt;Treat propagated routes as learned reachability, not guaranteed authority
&lt;/h3&gt;&lt;p&gt;In VNRA-connected hybrid designs, a propagated route should be treated as evidence that Azure knows the prefix exists, not proof that the gateway still governs packet forwarding for that path.&lt;/p&gt;
&lt;h3 id="validate-routing-at-the-subnet-path-level"&gt;Validate routing at the subnet-path level
&lt;/h3&gt;&lt;p&gt;Do not validate “hybrid routing” as a broad topology property. Validate whether a given subnet’s traffic to a given prefix still behaves according to the route authority you expect.&lt;/p&gt;
&lt;h3 id="update-your-runbooks-to-separate-control-plane-and-forwarding-checks"&gt;Update your runbooks to separate control-plane and forwarding checks
&lt;/h3&gt;&lt;p&gt;Runbooks should explicitly distinguish between:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;route learned&lt;/li&gt;
&lt;li&gt;route visible&lt;/li&gt;
&lt;li&gt;route authoritative for forwarding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those are no longer interchangeable conditions.&lt;/p&gt;
&lt;h3 id="use-effective-routes-as-a-clue-not-a-verdict"&gt;Use effective routes as a clue, not a verdict
&lt;/h3&gt;&lt;p&gt;Effective routes are still useful. They are just not the final word in VNRA scenarios.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; A visible VirtualNetworkGateway route can tell you Azure learned the prefix. It cannot, by itself, tell you the gateway still governs delivery once VNRA is shaping the path. In hybrid Azure, that is the difference between a route table that looks right and a system that actually behaves right.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-routing-appliance-overview" target="_blank" rel="noopener"
&gt;Overview of Azure Virtual Network routing appliances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure virtual network traffic routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/diagnose-vm-network-routing-problem" target="_blank" rel="noopener"
&gt;Diagnose a virtual machine routing problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/expressroute/expressroute-routing" target="_blank" rel="noopener"
&gt;ExpressRoute routing requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-bgp-overview" target="_blank" rel="noopener"
&gt;About BGP with Azure VPN Gateway&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>When Your UDR Stops Driving: VNRA, Override, and Routing Ambiguity</title><link>https://blog.brewedinthecloud.com/p/vnra-and-udr-cooperation-override-and-conflict/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/vnra-and-udr-cooperation-override-and-conflict/</guid><description>&lt;p&gt;You attach a User Defined Route (UDR) to a subnet, point it at a next hop, and assume the path is now controlled.&lt;/p&gt;
&lt;p&gt;That assumption is comfortable because it makes routing reviewable. It gives architects something concrete to approve, and operators something visible to inspect. But once Azure Virtual Network Routing Appliance (VNRA) is part of the design, that comfort starts to drift away.&lt;/p&gt;
&lt;p&gt;The route may still be there. It may still be effective. It may still be selected. None of that, by itself, proves the packet followed the path you thought you enforced.&lt;/p&gt;
&lt;p&gt;That is the real design shift here. VNRA does not simply add another routing feature. It changes what a UDR is good for. In VNRA-influenced environments, a subnet UDR should not be treated as proof of enforced path compliance. It proves declared routing intent only.&lt;/p&gt;
&lt;p&gt;If the previous post was about route precedence as a decision model, this one is about what happens when route selection still looks fine but path certainty is gone.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common enterprise assumption is simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I define the right UDR and attach it to the right subnet, I control where the packet goes next.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That sounds reasonable because it is often good enough in simpler Azure routing scenarios. A route is selected, a next hop is visible, and the design appears deterministic.&lt;/p&gt;
&lt;p&gt;The problem is that engineers often treat a selected route as the same thing as an enforced packet path.&lt;/p&gt;
&lt;p&gt;With VNRA, that is no longer a safe shortcut.&lt;/p&gt;
&lt;p&gt;A UDR still expresses routing intent. Azure still evaluates effective routes. But the presence of VNRA means route declaration and forwarding proof are no longer the same class of evidence. The route table tells you what the control plane intends to do. It does not automatically prove the data plane behaved the same way.&lt;/p&gt;
&lt;p&gt;How would this change something you design, deploy, or operate? It means a route table attached to a subnet is no longer enough to prove that a traffic policy is being enforced. For any path that matters operationally, you need both control-plane evidence and data-plane evidence.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;This post deliberately avoids re-teaching UDRs or repeating precedence rules from the previous entry. The important point here is narrower: VNRA weakens the assumption that explicit next-hop configuration is sufficient proof of actual packet steering.&lt;/p&gt;
&lt;p&gt;There are three useful patterns to think about.&lt;/p&gt;
&lt;h3 id="cooperation"&gt;Cooperation
&lt;/h3&gt;&lt;p&gt;This is the easy case.&lt;/p&gt;
&lt;p&gt;The UDR is selected, the configured next hop aligns with the expected forwarding path, and observed traffic behaviour matches the design. VNRA is present, but it does not introduce visible ambiguity for that flow.&lt;/p&gt;
&lt;p&gt;Architects tend to assume this is the normal state because it is the least surprising. Sometimes it is.&lt;/p&gt;
&lt;h3 id="override"&gt;Override
&lt;/h3&gt;&lt;p&gt;This is the case that matters most.&lt;/p&gt;
&lt;p&gt;The UDR can still appear in the effective route set and still represent the declared next hop, yet that alone does not prove the reviewed path is the one the workload actually used. In VNRA-influenced designs, route selection can remain visible while forwarding certainty does not.&lt;/p&gt;
&lt;p&gt;That is the key distinction advanced teams need to internalise: a route can still be valid, selected, and operationally insufficient as proof.&lt;/p&gt;
&lt;h3 id="conflict"&gt;Conflict
&lt;/h3&gt;&lt;p&gt;This is where the design becomes brittle.&lt;/p&gt;
&lt;p&gt;You now have more than one control model claiming authority:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the subnet UDR expresses explicit next-hop intent&lt;/li&gt;
&lt;li&gt;the VNRA-influenced forwarding path shapes actual packet movement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, your architecture stops being deterministic by inspection. Different engineers can read the same route design and reach different conclusions about what the packet will do. That is not a documentation issue. It is a design issue.&lt;/p&gt;
&lt;h2 id="the-position-to-be-clear-about"&gt;The Position to Be Clear About
&lt;/h2&gt;&lt;p&gt;In a VNRA-influenced environment, a subnet UDR should not be treated as proof of enforced path compliance.&lt;/p&gt;
&lt;p&gt;It proves declared routing intent only.&lt;/p&gt;
&lt;p&gt;That does not make the UDR useless. It still matters. It still participates in route selection. It still expresses a design decision that Azure takes into account. But if your architecture, audit process, or operational runbook assumes the route table alone proves where critical traffic went, your assurance model is weaker than you think.&lt;/p&gt;
&lt;p&gt;That is the opinion this post is arguing for, and it is worth stating plainly because many enterprise networking standards still assume the opposite.&lt;/p&gt;
&lt;h2 id="what-counts-as-proof-now"&gt;What Counts as Proof Now
&lt;/h2&gt;&lt;p&gt;Once VNRA is in play, the minimum proof standard needs to change.&lt;/p&gt;
&lt;p&gt;For any path that matters for segmentation, compliance, resilience, or operational control, minimum acceptable proof should include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;control-plane evidence&lt;/strong&gt;, such as effective route inspection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;data-plane evidence&lt;/strong&gt;, such as synthetic path testing, flow observation, or packet capture from representative workloads&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the practical line.&lt;/p&gt;
&lt;p&gt;If you have only reviewed the route table, you have reviewed intent.
If you have observed the path from the originating subnet, you have started to prove behaviour.&lt;/p&gt;
&lt;p&gt;That distinction should change both design review and incident response.&lt;/p&gt;
&lt;h2 id="where-udr-intent-starts-to-break-down"&gt;Where UDR Intent Starts to Break Down
&lt;/h2&gt;&lt;h3 id="explicit-next-hop-is-no-longer-exclusive-authority"&gt;Explicit next hop is no longer exclusive authority
&lt;/h3&gt;&lt;p&gt;A route pointing at a virtual appliance still declares a preferred next hop. That has not changed.&lt;/p&gt;
&lt;p&gt;What has changed is the confidence you can place in that declaration as the final word. In VNRA scenarios, an explicit next hop is part of the forwarding story, not necessarily the whole story.&lt;/p&gt;
&lt;p&gt;For platform teams, that means “we set the next hop” is not the same claim as “we proved the path”.&lt;/p&gt;
&lt;h3 id="effective-routes-remain-useful-but-no-longer-decisive"&gt;Effective routes remain useful, but no longer decisive
&lt;/h3&gt;&lt;p&gt;Effective route views still matter. You should absolutely keep using them.&lt;/p&gt;
&lt;p&gt;But they now belong in the category of necessary evidence, not sufficient evidence. An effective route can confirm that Azure selected the UDR as part of the routing decision. It cannot, on its own, prove that the observed packet path still matches the reviewed design intent.&lt;/p&gt;
&lt;p&gt;That is a subtle but important downgrade in what effective route inspection can tell you operationally.&lt;/p&gt;
&lt;h3 id="subnet-level-standardisation-creates-confidence-that-may-not-be-deserved"&gt;Subnet-level standardisation creates confidence that may not be deserved
&lt;/h3&gt;&lt;p&gt;Enterprise landing zones often rely on shared route tables attached at subnet boundaries. This is attractive because it centralises control and keeps intent visible.&lt;/p&gt;
&lt;p&gt;VNRA complicates that model. A shared route table can still standardise declared routing intent across workloads, but it no longer guarantees that the route table fully explains practical forwarding outcomes. In other words, standardised route declaration does not automatically mean standardised packet behaviour.&lt;/p&gt;
&lt;p&gt;That matters most in estates where central networking teams treat route ownership as equivalent to path ownership.&lt;/p&gt;
&lt;h2 id="visualising-the-difference"&gt;Visualising the Difference
&lt;/h2&gt;&lt;p&gt;The classic mental model looks like this:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Workload Subnet] --&gt; B[UDR Selected]
B --&gt; C[Configured Next Hop]
C --&gt; D[Assumed Packet Path]
&lt;/div&gt;
&lt;p&gt;That model is simple, inspectable, and increasingly incomplete.&lt;/p&gt;
&lt;p&gt;A VNRA-aware model looks more like this:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Workload Subnet] --&gt; B[Effective Route Selection]
B --&gt; C[Declared UDR Next Hop]
C --&gt; D[Azure Forwarding Behaviour]
D --&gt; E[Observed Packet Path]
B -. Control-plane evidence .-&gt; C
D -. Data-plane reality .-&gt; E
&lt;/div&gt;
&lt;p&gt;The important change is not that the UDR disappears. It is that the UDR stops being enough.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;h3 id="design-impact"&gt;Design impact
&lt;/h3&gt;&lt;p&gt;Design standards that say “traffic from subnet X must traverse path Y” need a stronger proof model if VNRA is involved.&lt;/p&gt;
&lt;p&gt;A UDR attached to subnet X is no longer sufficient evidence of enforcement. At best, it is evidence that the design intends to steer traffic towards path Y. If that path matters, the design should also define how the forwarding result will be validated.&lt;/p&gt;
&lt;p&gt;That changes architecture review materially. Route declaration alone should not be accepted as path compliance evidence in VNRA-influenced designs.&lt;/p&gt;
&lt;h3 id="operational-impact"&gt;Operational impact
&lt;/h3&gt;&lt;p&gt;Troubleshooting needs to split into two questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What route did Azure select?&lt;/li&gt;
&lt;li&gt;What path did the packet actually take?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you collapse those into one question, you will misdiagnose problems.&lt;/p&gt;
&lt;p&gt;This is the practical workflow shift. Effective routes remain a starting point, but if route selection and observed behaviour disagree, that disagreement is not noise. It is the signal.&lt;/p&gt;
&lt;h3 id="governance-impact"&gt;Governance impact
&lt;/h3&gt;&lt;p&gt;Many organisations still review route tables as if they prove policy enforcement.&lt;/p&gt;
&lt;p&gt;In VNRA scenarios, that review model is incomplete. Route tables prove declared intent, not necessarily behavioural compliance. If audit, architecture, or change control processes are certifying path enforcement based solely on subnet UDRs, they are approving configuration, not proving outcome.&lt;/p&gt;
&lt;p&gt;That is not just a networking detail. It is a control weakness.&lt;/p&gt;
&lt;h3 id="reliability-impact"&gt;Reliability impact
&lt;/h3&gt;&lt;p&gt;Ambiguous path authority is dangerous during incidents.&lt;/p&gt;
&lt;p&gt;When a path fails cleanly, rollback is usually straightforward. When a path is only partially explained by the route configuration, every incident takes longer because engineers are trying to reconcile two truths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the route table says one thing&lt;/li&gt;
&lt;li&gt;the packet behaviour suggests another&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That slows containment, weakens fault isolation, and makes “safe” changes less safe than they look.&lt;/p&gt;
&lt;h2 id="implementation-artefact"&gt;Implementation Artefact
&lt;/h2&gt;&lt;p&gt;This series deliberately avoids deployment walkthroughs, and that matters here.&lt;/p&gt;
&lt;p&gt;A UDR declaration artefact on its own is not especially useful in this post because route configuration is not the disputed part of the argument. The contested issue is whether route declaration proves forwarding behaviour. Showing Bicep or CLI to create a route table would add configuration detail without adding confidence to the thesis, so it is intentionally omitted.&lt;/p&gt;
&lt;p&gt;The more useful operational artefact is a validation mindset: pair route inspection with an observable data-plane check from the workload context you actually care about.&lt;/p&gt;
&lt;p&gt;If you need a shorthand test for design review, use this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If we have only inspected the effective route, we have verified intent.
If we have also observed the path from the originating subnet, we have started to verify enforcement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is the artefact that should survive into production operations.&lt;/p&gt;
&lt;h2 id="patterns-that-create-ambiguity"&gt;Patterns That Create Ambiguity
&lt;/h2&gt;&lt;h3 id="we-own-the-route-table-so-we-own-the-path"&gt;“We own the route table, so we own the path”
&lt;/h3&gt;&lt;p&gt;This is a control-plane assumption, not a proven operational truth.&lt;/p&gt;
&lt;p&gt;If VNRA can influence forwarding outcomes beyond what the route table alone proves, route ownership and path ownership are no longer the same thing.&lt;/p&gt;
&lt;h3 id="the-effective-route-is-correct-so-the-issue-must-be-somewhere-else"&gt;“The effective route is correct, so the issue must be somewhere else”
&lt;/h3&gt;&lt;p&gt;That is often where advanced teams lose time.&lt;/p&gt;
&lt;p&gt;The effective route may be correct in the narrow sense that Azure selected the expected route. That still does not settle whether the reviewed path assumption survived contact with the data plane.&lt;/p&gt;
&lt;h3 id="adding-a-udr-makes-the-design-more-deterministic"&gt;“Adding a UDR makes the design more deterministic”
&lt;/h3&gt;&lt;p&gt;Sometimes it does.&lt;/p&gt;
&lt;p&gt;But in VNRA-influenced topologies, adding a UDR can also create a second explanation for path behaviour without eliminating the first. That is not increased determinism. It is layered intent.&lt;/p&gt;
&lt;p&gt;If the environment cannot clearly tell you which layer is authoritative for a given flow, the design is less deterministic than it was before.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="the-platform-may-not-give-you-a-dramatic-failure-signal"&gt;The platform may not give you a dramatic failure signal
&lt;/h3&gt;&lt;p&gt;The awkward scenarios are not always the ones where Azure rejects a route or reports an obvious fault.&lt;/p&gt;
&lt;p&gt;The more dangerous case is where the UDR remains present, valid, and reviewable, while operators assume that means the packet path is proven. The hazard is false certainty, not visible breakage.&lt;/p&gt;
&lt;h3 id="symmetry-should-be-validated-not-assumed"&gt;Symmetry should be validated, not assumed
&lt;/h3&gt;&lt;p&gt;Even if the forward-path evidence looks clean, do not assume the return path is governed by the same logic. Once multiple routing influences exist, symmetry becomes an operational claim that needs proof.&lt;/p&gt;
&lt;p&gt;Detailed return-path analysis is out of scope here, but this is one of the first places ambiguous routing authority tends to surface.&lt;/p&gt;
&lt;h3 id="shared-route-tables-can-hide-confidence-gaps"&gt;Shared route tables can hide confidence gaps
&lt;/h3&gt;&lt;p&gt;A common route table applied to multiple workloads can create the impression that path behaviour is equally understood for all of them.&lt;/p&gt;
&lt;p&gt;That may be true at the level of declared intent. It is not automatically true at the level of observed forwarding.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="1-stop-treating-subnet-udrs-as-path-enforcement-evidence"&gt;1. Stop treating subnet UDRs as path enforcement evidence
&lt;/h3&gt;&lt;p&gt;In VNRA-influenced environments, a UDR is evidence of intent. Treating it as proof of enforcement is the mistake.&lt;/p&gt;
&lt;h3 id="2-define-a-proof-standard-for-critical-paths"&gt;2. Define a proof standard for critical paths
&lt;/h3&gt;&lt;p&gt;If a traffic path matters, decide in advance what evidence counts. A good minimum standard is effective route inspection plus at least one data-plane validation method from a representative source.&lt;/p&gt;
&lt;h3 id="3-separate-route-review-from-path-assurance"&gt;3. Separate route review from path assurance
&lt;/h3&gt;&lt;p&gt;Architecture review can approve declared intent. Operational validation should prove actual behaviour. Those are related, but they are not the same control.&lt;/p&gt;
&lt;h3 id="4-use-disagreement-as-a-trigger-not-an-anomaly"&gt;4. Use disagreement as a trigger, not an anomaly
&lt;/h3&gt;&lt;p&gt;If the route view looks right but the path looks wrong, do not treat that as an edge case to investigate later. Treat it as a primary indicator that your model of forwarding authority is incomplete.&lt;/p&gt;
&lt;h3 id="5-reject-ambiguous-designs-early"&gt;5. Reject ambiguous designs early
&lt;/h3&gt;&lt;p&gt;If a design requires too much explanation to answer “who really controls this packet path?”, it will be worse under incident pressure. Ambiguity is not sophistication.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; UDRs still matter with VNRA, but they are no longer sufficient evidence of deterministic packet steering. If you have only inspected the route table, you have reviewed intent; if you have observed the path, you have started to prove reality.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-routing-appliance-overview" target="_blank" rel="noopener"
&gt;Overview of Azure Virtual Network routing appliances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure virtual network traffic routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/diagnose-vm-network-routing-problem" target="_blank" rel="noopener"
&gt;Diagnose a virtual machine routing problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview" target="_blank" rel="noopener"
&gt;Azure Network Watcher overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/" target="_blank" rel="noopener"
&gt;Azure Virtual Network documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>When Routes Disagree: VNRA Precedence and Conflict Resolution in Azure</title><link>https://blog.brewedinthecloud.com/p/vnra-route-precedence-and-conflict-resolution/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/vnra-route-precedence-and-conflict-resolution/</guid><description>&lt;p&gt;If you have ever looked at an Azure effective route table and thought, &lt;em&gt;that should not be the route that wins&lt;/em&gt;, this is the part that matters.&lt;/p&gt;
&lt;p&gt;Route precedence in Azure is often explained as if each routing feature gets a turn at being authoritative. System routes do the baseline work, BGP propagated routes inject dynamic reachability, User Defined Routes (UDRs) override intent, and VNRA somehow arrives as a new control point that sits above the rest.&lt;/p&gt;
&lt;p&gt;That framing is convenient. It is also what causes people to misread packet paths.&lt;/p&gt;
&lt;p&gt;The stronger and more useful position is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;VNRA is not a separate precedence domain. It changes routing outcomes inside Azure’s existing route selection logic, and the only version that matters is the effective route behaviour seen by the workload NIC.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That changes something you design and operate straight away. You stop asking whether VNRA “wins” against UDRs, BGP, or system routes as if it were a fourth referee. Instead, you ask what prefixes are present, which route source owns the winning prefix, and what next hop is actually selected for the packet.&lt;/p&gt;
&lt;p&gt;That is the difference between platform intent and data-plane truth.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption is that Azure routing is layered by feature:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;system routes are default behaviour&lt;/li&gt;
&lt;li&gt;propagated routes add learned reachability&lt;/li&gt;
&lt;li&gt;UDRs override platform defaults&lt;/li&gt;
&lt;li&gt;VNRA adds a new routing authority on top&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That model breaks because Azure does not forward packets based on feature hierarchy. It forwards packets based on the effective route selected for a destination from the source NIC.&lt;/p&gt;
&lt;p&gt;VNRA matters, but not because it suspends the normal rules. It matters because it affects the set of candidate routes and next-hop outcomes that Azure can realise. Once those candidates exist, Azure still resolves forwarding the same way it always has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;longest prefix match first&lt;/li&gt;
&lt;li&gt;route source precedence only when prefixes are equal&lt;/li&gt;
&lt;li&gt;the selected route becomes the packet path&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the mental shift is simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;VNRA should be treated as a routing outcome modifier visible through effective route behaviour, not as a separate precedence domain.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you treat it as a special layer above the rest, you will keep looking for feature interactions when the real answer is usually just prefix specificity plus route source precedence.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure route selection is less mysterious when you strip it back to packet behaviour.&lt;/p&gt;
&lt;p&gt;For any destination, Azure evaluates the effective route set applied to the source interface. The decision process is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find all matching routes for the destination IP&lt;/li&gt;
&lt;li&gt;Select the most specific prefix&lt;/li&gt;
&lt;li&gt;If multiple routes have the same prefix length, apply route source precedence&lt;/li&gt;
&lt;li&gt;Use the winning route’s next hop&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That means the first real question is never &lt;em&gt;which routing feature is in charge&lt;/em&gt;. It is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Which route actually wins for this prefix on this NIC?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That sounds obvious, but it gets lost quickly once VNRA enters the conversation. Engineers start attributing precedence to the feature rather than to the route that became effective.&lt;/p&gt;
&lt;h3 id="a-data-plane-view-of-route-selection"&gt;A data-plane view of route selection
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart TD
A[Packet arrives at source NIC] --&gt; B[Match destination against effective routes]
B --&gt; C{Matching routes exist?}
C --&gt;|No| D[No explicit match beyond platform defaults]
C --&gt;|Yes| E[Select longest prefix match]
E --&gt; F{Equal prefix candidates remain?}
F --&gt;|No| G[Use selected next hop]
F --&gt;|Yes| H[Apply route source precedence]
H --&gt; I[Install winning route as forwarding decision]
I --&gt; G
&lt;/div&gt;
&lt;p&gt;The key point is deliberately plain: VNRA does not replace this logic. It shows up through it.&lt;/p&gt;
&lt;h2 id="route-source-conflicts-in-practice"&gt;Route Source Conflicts in Practice
&lt;/h2&gt;&lt;p&gt;The route sources involved are not new, even if the design looks new.&lt;/p&gt;
&lt;h3 id="system-routes"&gt;System routes
&lt;/h3&gt;&lt;p&gt;System routes are Azure’s built-in opinion about reachability. They remain valid until something more specific exists, or an equal-prefix route with higher precedence takes their place.&lt;/p&gt;
&lt;p&gt;The mistake is to treat them as irrelevant once you start using VNRA. They are still part of the candidate set, and they still win whenever nothing more specific or higher-precedence applies.&lt;/p&gt;
&lt;h3 id="propagated-routes"&gt;Propagated routes
&lt;/h3&gt;&lt;p&gt;BGP propagated routes can override system routes for the same prefix. They do not override a more specific route from another source, and they do not outrank a UDR for an equal prefix.&lt;/p&gt;
&lt;p&gt;This is where people often start blaming VNRA for inconsistency when the real cause is simpler: a propagated route exists for a narrower prefix than the summarised path they expected to carry appliance-bound traffic.&lt;/p&gt;
&lt;h3 id="udrs"&gt;UDRs
&lt;/h3&gt;&lt;p&gt;UDRs are still the clearest way to impose routing intent for a specific prefix. For equal prefixes, a UDR takes precedence over propagated and system routes.&lt;/p&gt;
&lt;p&gt;That does not make UDRs universally dominant. A broad UDR only controls traffic where no more specific route exists. If you define a default route or a large summary and then allow narrower prefixes to appear from another source, Azure will choose the narrower route every time.&lt;/p&gt;
&lt;p&gt;That is not an exception. That is the design consequence of using broad routing intent.&lt;/p&gt;
&lt;h3 id="where-vnra-fits"&gt;Where VNRA fits
&lt;/h3&gt;&lt;p&gt;This is the line to stay disciplined on:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;VNRA does not appear as a separate route-precedence layer that overrides Azure routing rules. Its impact is expressed through the effective routes and next-hop decisions Azure realises.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So when engineers say “VNRA overrode my route”, what they usually mean is one of four things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a more specific route existed than the one they expected to drive traffic through the appliance&lt;/li&gt;
&lt;li&gt;an equal-prefix route with higher precedence was effective&lt;/li&gt;
&lt;li&gt;the route they expected was configured, but not the route selected&lt;/li&gt;
&lt;li&gt;they were reasoning from design intent, not from the effective route table on the workload NIC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is not semantics. It is the operational difference between understanding Azure routing and narrating it.&lt;/p&gt;
&lt;h2 id="what-actually-creates-ambiguity"&gt;What Actually Creates Ambiguity
&lt;/h2&gt;&lt;p&gt;Here is the harder opinion this topic needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VNRA does not introduce routing ambiguity. Overlapping prefixes and poor route intent do. VNRA just makes that ambiguity harder to ignore.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That matters because a lot of post-deployment confusion gets framed as platform inconsistency when it is really unresolved routing intent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;broad appliance steering is expected to cover everything&lt;/li&gt;
&lt;li&gt;narrower prefixes are introduced later by propagation or platform behaviour&lt;/li&gt;
&lt;li&gt;traffic follows the narrower route&lt;/li&gt;
&lt;li&gt;the team concludes VNRA is unpredictable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But the route selection was predictable. The design was not precise enough.&lt;/p&gt;
&lt;p&gt;If you want deterministic packet paths, your prefixes need to be deterministic. VNRA cannot rescue vague routing intent.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This changes how you assess routing risk.&lt;/p&gt;
&lt;h3 id="reliability"&gt;Reliability
&lt;/h3&gt;&lt;p&gt;A route conflict does not need to cause packet loss to be a problem. If traffic takes a path other than the one assumed by the design, reliability becomes conditional. The system may work until a dependency expects inspection, symmetry, or path locality that is no longer true.&lt;/p&gt;
&lt;h3 id="security"&gt;Security
&lt;/h3&gt;&lt;p&gt;If your security model depends on traffic traversing an appliance path, broad route intent is not enough. Any more specific competing route can bypass that path without creating a visible outage.&lt;/p&gt;
&lt;p&gt;That means inspection assumptions are only as strong as your prefix discipline.&lt;/p&gt;
&lt;h3 id="scalability"&gt;Scalability
&lt;/h3&gt;&lt;p&gt;The larger the environment, the more likely it is that summarised intent and specific reachability will collide. VNRA does not make large environments harder to reason about by itself. It exposes where the routing model was already under-specified.&lt;/p&gt;
&lt;h3 id="operational-clarity"&gt;Operational clarity
&lt;/h3&gt;&lt;p&gt;The practical question remains:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How would this change something I design, deploy, or operate?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It means you validate routing by effective outcome, not by feature configuration. And it means broad steering constructs should be treated as coarse guidance unless you have actively controlled competing specific prefixes.&lt;/p&gt;
&lt;h2 id="implementation-example"&gt;Implementation Example
&lt;/h2&gt;&lt;p&gt;This post is not a deployment guide, but precedence claims need a concrete artefact. The right artefact here is the effective route table, because that is where Azure shows the realised forwarding candidates.&lt;/p&gt;
&lt;h3 id="azure-cli-inspect-effective-routes-on-a-nic"&gt;Azure CLI: inspect effective routes on a NIC
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network nic show-effective-route-table &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-network-prod &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name nic-app-01 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --output table
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For this topic, the fields that matter are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;destination prefix&lt;/li&gt;
&lt;li&gt;route source&lt;/li&gt;
&lt;li&gt;next hop type&lt;/li&gt;
&lt;li&gt;next hop IP, where applicable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your routing argument is not visible there, it is not yet a data-plane argument.&lt;/p&gt;
&lt;h3 id="example-conflict"&gt;Example conflict
&lt;/h3&gt;&lt;p&gt;Assume the effective route table contains the following entries:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Next Hop Type&lt;/th&gt;
&lt;th&gt;Next Hop&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;10.20.0.0/16&lt;/td&gt;
&lt;td&gt;Virtual network&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VirtualNetworkGateway&lt;/td&gt;
&lt;td&gt;10.20.10.0/24&lt;/td&gt;
&lt;td&gt;Virtual network gateway&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;10.20.0.0/16&lt;/td&gt;
&lt;td&gt;Virtual appliance&lt;/td&gt;
&lt;td&gt;10.0.1.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;0.0.0.0/0&lt;/td&gt;
&lt;td&gt;Virtual appliance&lt;/td&gt;
&lt;td&gt;10.0.1.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Now apply packet logic.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Traffic to &lt;code&gt;10.20.10.7&lt;/code&gt; follows the &lt;code&gt;/24&lt;/code&gt; propagated route because it is the most specific match&lt;/li&gt;
&lt;li&gt;Traffic to &lt;code&gt;10.20.50.9&lt;/code&gt; follows the &lt;code&gt;/16&lt;/code&gt; UDR because it is an equal-prefix conflict with the system route and the UDR has higher precedence&lt;/li&gt;
&lt;li&gt;Traffic to &lt;code&gt;8.8.8.8&lt;/code&gt; follows the &lt;code&gt;0.0.0.0/0&lt;/code&gt; UDR unless a more specific route exists&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of those outcomes require a special VNRA rule. They only require Azure to apply normal route selection.&lt;/p&gt;
&lt;h2 id="deterministic-vs-non-deterministic-outcomes"&gt;Deterministic vs Non-Deterministic Outcomes
&lt;/h2&gt;&lt;p&gt;This distinction needs to be blunt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Azure route selection is deterministic once the effective route set is realised. The non-determinism people experience is usually in route convergence, propagation timing, or control-plane state visibility not in the precedence engine itself.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is an important separation.&lt;/p&gt;
&lt;p&gt;If the same NIC has the same effective routes and the same destination, Azure should produce the same forwarding decision. If the observed behaviour changes over time, the first suspicion should be changing route state, not changing precedence logic.&lt;/p&gt;
&lt;p&gt;In VNRA discussions, that matters because people often attribute temporary inconsistency to the feature when they are really observing asynchronous route realisation.&lt;/p&gt;
&lt;p&gt;That does not make the problem trivial. It just means the problem is different.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="broad-appliance-steering-does-not-guarantee-universal-appliance-transit"&gt;Broad appliance steering does not guarantee universal appliance transit
&lt;/h3&gt;&lt;p&gt;A default route or summary route pointing to an appliance only governs traffic where no narrower match exists. If you need deterministic inspection for a destination set, summarised intent alone is weak control.&lt;/p&gt;
&lt;h3 id="route-presence-is-not-route-selection"&gt;Route presence is not route selection
&lt;/h3&gt;&lt;p&gt;A route being present in the effective route table does not mean it is the route used for your destination. It only means it is a candidate.&lt;/p&gt;
&lt;h3 id="equal-prefix-reasoning-is-often-skipped-too-early"&gt;Equal-prefix reasoning is often skipped too early
&lt;/h3&gt;&lt;p&gt;Engineers jump to route source precedence before checking whether the conflicting routes even have equal prefixes. Most disputes disappear once you compare prefix length honestly.&lt;/p&gt;
&lt;h3 id="vnra-can-be-blamed-for-decisions-it-did-not-make"&gt;VNRA can be blamed for decisions it did not make
&lt;/h3&gt;&lt;p&gt;If the winning path is the result of a more specific propagated route or an equal-prefix UDR, the routing logic is doing exactly what Azure normally does. VNRA may be involved in the design, but not in the precedence mechanism.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="design-routing-intent-at-the-prefix-level"&gt;Design routing intent at the prefix level
&lt;/h3&gt;&lt;p&gt;Do not ask whether VNRA should “take precedence”. Ask which exact prefixes must be controlled, and what other sources may advertise or inject overlapping routes.&lt;/p&gt;
&lt;h3 id="treat-broad-routes-as-coarse-policy-not-hard-enforcement"&gt;Treat broad routes as coarse policy, not hard enforcement
&lt;/h3&gt;&lt;p&gt;A summary or default route gives directional intent. It does not prove exclusive path ownership.&lt;/p&gt;
&lt;h3 id="validate-from-the-workload-nic"&gt;Validate from the workload NIC
&lt;/h3&gt;&lt;p&gt;Configured route tables tell you what you meant. Effective routes tell you what Azure is prepared to do. For conflict resolution, only the latter settles the question.&lt;/p&gt;
&lt;h3 id="call-overlapping-prefixes-what-they-are"&gt;Call overlapping prefixes what they are
&lt;/h3&gt;&lt;p&gt;If two routing sources are competing for the same traffic set because the prefix model is sloppy, that is not platform complexity. It is unresolved design intent.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Most “VNRA routing surprises” are not VNRA surprises at all. They are ordinary Azure route selection rules exposing a design that relied on broad intent where specific control was required.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-routing-appliance-overview" target="_blank" rel="noopener"
&gt;Overview of Azure Virtual Network routing appliances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure virtual network traffic routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/diagnose-network-routing-problem" target="_blank" rel="noopener"
&gt;Diagnose a virtual machine routing problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/" target="_blank" rel="noopener"
&gt;Azure Virtual Network documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/cli/azure/network/nic#az-network-nic-show-effective-route-table" target="_blank" rel="noopener"
&gt;Azure CLI &lt;code&gt;az network nic show-effective-route-table&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Virtual Network Routing Appliance: When Packet Truth Moves Away from the Edge</title><link>https://blog.brewedinthecloud.com/p/vnra-packet-truth-moves-away-from-the-edge/</link><pubDate>Tue, 30 Jun 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/vnra-packet-truth-moves-away-from-the-edge/</guid><description>&lt;p&gt;In plain Azure networking, plenty of engineers get away with a simple habit: check the effective routes on the NIC, sanity-check the subnet, and infer the packet path from there.&lt;/p&gt;
&lt;p&gt;Most of the time, that shortcut is good enough.&lt;/p&gt;
&lt;p&gt;VNRA is where it starts to break.&lt;/p&gt;
&lt;p&gt;Not because Azure suddenly becomes opaque, and not because route evaluation stops mattering. The change is more useful than that. Once VNRA is introduced, the packet path is no longer best understood from the edge inward. The centre of gravity moves. Forwarding intent becomes more centralised, and attachment-level effective routes become a local view of a broader forwarding design.&lt;/p&gt;
&lt;p&gt;That is the shift this post is about.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption is straightforward:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I can see the effective routes on the NIC or subnet, I can explain how the packet will move.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That assumption holds often enough in Azure to become muscle memory. It is also exactly the habit VNRA exposes.&lt;/p&gt;
&lt;p&gt;The better mental model is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VNRA does not replace Azure routing. It recentres forwarding intent around a shared routing control point, which means NIC- and subnet-level effective routes are no longer the authoritative explanation of end-to-end packet behaviour.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is an important distinction.&lt;/p&gt;
&lt;p&gt;This is not about obscurity. Azure has not become mysterious. System routes still exist. User-defined routes (UDRs) still matter. Route precedence still matters. Longest prefix match still matters.&lt;/p&gt;
&lt;p&gt;What changes is where packet truth lives.&lt;/p&gt;
&lt;p&gt;Before VNRA, many engineers reason from the edge inward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;inspect the source attachment&lt;/li&gt;
&lt;li&gt;read the effective routes&lt;/li&gt;
&lt;li&gt;infer the path&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With VNRA in the design, that shortcut becomes unreliable. You now need to reason from the forwarding design outward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;understand the role of the shared routing control point&lt;/li&gt;
&lt;li&gt;then interpret local effective routes in that context&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is a design shift, an operations shift, and a troubleshooting shift.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;VNRA does not turn Azure into a traditional routed fabric with a core router that owns the whole network. Azure still owns the underlying virtual network fabric. The platform still provides system behaviour. Effective routes still express local route-selection context.&lt;/p&gt;
&lt;p&gt;What changes is that forwarding expectations increasingly need to be interpreted relative to VNRA’s role in the path.&lt;/p&gt;
&lt;p&gt;That makes VNRA less like a simple next-hop override and more like the &lt;strong&gt;logical centre of forwarding intent&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="before-vnra"&gt;Before VNRA
&lt;/h3&gt;&lt;p&gt;In a conventional Azure design, an engineer might look at the source NIC, inspect its effective routes, and treat that as a near-final explanation of packet behaviour.&lt;/p&gt;
&lt;p&gt;That is not perfectly complete, but it is often operationally serviceable.&lt;/p&gt;
&lt;p&gt;A familiar mental flow looks like this:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Source NIC] --&gt; B[Effective route evaluation]
B --&gt; C[Winning route selected]
C --&gt; D[Azure native forwarding path]
D --&gt; E[Destination]
&lt;/div&gt;
&lt;h3 id="after-vnra"&gt;After VNRA
&lt;/h3&gt;&lt;p&gt;With VNRA present, the route evaluation at the source still matters, but it no longer tells the whole story on its own. The winning route needs to be interpreted in the context of a forwarding design whose centre now sits at the routing appliance.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TB
subgraph SpokeA[Spoke A]
A1[Source workload]
A2[Source NIC effective routes]
end
subgraph Hub[Shared routing domain]
H1[VNRA as forwarding control point]
end
subgraph SpokeB[Spoke B]
B1[Destination workload]
end
A1 --&gt; A2
A2 --&gt; H1
H1 --&gt; B1
&lt;/div&gt;
&lt;p&gt;The point is not that Azure stops selecting routes at the source. It does not.&lt;/p&gt;
&lt;p&gt;The point is that the source attachment no longer gives you a sufficient explanation of the full packet path. It gives you a &lt;strong&gt;local route-selection view&lt;/strong&gt; inside a forwarding design that now has a more central control point.&lt;/p&gt;
&lt;h2 id="a-concrete-scenario-spoke-to-spoke-traffic"&gt;A Concrete Scenario: Spoke-to-Spoke Traffic
&lt;/h2&gt;&lt;p&gt;This is where the old instinct starts to fail.&lt;/p&gt;
&lt;p&gt;Assume you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a workload in Spoke A&lt;/li&gt;
&lt;li&gt;a workload in Spoke B&lt;/li&gt;
&lt;li&gt;VNRA positioned in the shared routing domain&lt;/li&gt;
&lt;li&gt;traffic between the spokes expected to follow that central forwarding design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An engineer checks the effective routes on the source NIC in Spoke A and sees the expected destination prefix. That is useful, but it only answers part of the question.&lt;/p&gt;
&lt;p&gt;It tells you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what route-selection context exists at the source attachment&lt;/li&gt;
&lt;li&gt;which route is likely to win locally&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt;, by itself, prove that the end-to-end packet path is correctly understood purely from that edge view.&lt;/p&gt;
&lt;p&gt;That is the mistake to avoid.&lt;/p&gt;
&lt;p&gt;In a VNRA-centred design, the source NIC route table is no longer the best place to infer the whole story. The authoritative interpretation now sits with the shared forwarding design that the appliance represents.&lt;/p&gt;
&lt;p&gt;So the practical shift is this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pre-VNRA habit:&lt;/strong&gt; read the packet path from the source edge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VNRA-aware habit:&lt;/strong&gt; read the packet path from the forwarding centre, then use edge effective routes to validate local context&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is a very different troubleshooting posture.&lt;/p&gt;
&lt;h2 id="what-changes-in-effective-routes"&gt;What Changes in Effective Routes
&lt;/h2&gt;&lt;p&gt;This is where precision matters.&lt;/p&gt;
&lt;p&gt;The change is &lt;strong&gt;not&lt;/strong&gt; that effective routes become wrong.&lt;/p&gt;
&lt;p&gt;The change is &lt;strong&gt;not&lt;/strong&gt; that Azure starts hiding route information.&lt;/p&gt;
&lt;p&gt;The change is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Effective routes remain useful for understanding local route-selection context, but they are no longer sufficient on their own to explain end-to-end packet behaviour once VNRA becomes the logical centre of forwarding intent.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is a narrower and more defensible claim.&lt;/p&gt;
&lt;h3 id="what-still-holds"&gt;What still holds
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Longest prefix match still applies.&lt;/li&gt;
&lt;li&gt;Route precedence still applies.&lt;/li&gt;
&lt;li&gt;UDRs still influence forwarding intent.&lt;/li&gt;
&lt;li&gt;System routes still exist.&lt;/li&gt;
&lt;li&gt;Propagated routes still matter where applicable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="what-changes-operationally"&gt;What changes operationally
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A familiar-looking effective route table can create false confidence.&lt;/li&gt;
&lt;li&gt;Local route correctness does not guarantee correct packet-path interpretation.&lt;/li&gt;
&lt;li&gt;The packet path can no longer be safely inferred from attachment-level visibility alone.&lt;/li&gt;
&lt;li&gt;Route inspection becomes one step in analysis, not the final answer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the real impact.&lt;/p&gt;
&lt;h2 id="azure-default-routing-behaviour-does-not-disappear"&gt;Azure Default Routing Behaviour Does Not Disappear
&lt;/h2&gt;&lt;p&gt;One easy mistake is to overstate what VNRA changes.&lt;/p&gt;
&lt;p&gt;VNRA does not mean Azure abandons its default routing model. The platform is still doing what the platform does. Azure has not become a blank underlay underneath your appliance.&lt;/p&gt;
&lt;p&gt;That matters because this is &lt;strong&gt;not&lt;/strong&gt; an article arguing that VNRA replaces Azure routing.&lt;/p&gt;
&lt;p&gt;It is arguing something more specific:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VNRA changes the operational locus of truth for packet-path interpretation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is why engineers get caught.&lt;/p&gt;
&lt;p&gt;They compare route objects before and after VNRA, see something broadly familiar, and conclude the forwarding story is still edge-readable in the same way. It often is not.&lt;/p&gt;
&lt;p&gt;The route constructs may still look recognisable. The packet-path explanation is what changes.&lt;/p&gt;
&lt;h2 id="why-next-hop-thinking-is-not-enough"&gt;Why Next-Hop Thinking Is Not Enough
&lt;/h2&gt;&lt;p&gt;A lot of Azure route interpretation compresses two ideas into one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which route wins&lt;/li&gt;
&lt;li&gt;what packet path that creates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without VNRA, that shortcut often survives.&lt;/p&gt;
&lt;p&gt;With VNRA, it becomes much less safe.&lt;/p&gt;
&lt;p&gt;The route winner at the source attachment still matters, but the realised forwarding expectation now needs to be interpreted relative to the appliance-centred design. If you skip that second step, you can end up with a route table that looks correct and an understanding of packet behaviour that is not.&lt;/p&gt;
&lt;p&gt;That is why this topic matters in production.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;So how would this change something you design, deploy, or operate?&lt;/p&gt;
&lt;p&gt;It changes &lt;strong&gt;where you validate packet truth&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="design"&gt;Design
&lt;/h3&gt;&lt;p&gt;When VNRA is in the forwarding design, you should stop validating routing solely from the edge.&lt;/p&gt;
&lt;p&gt;Instead, design reviews need to ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what is the intended central forwarding path?&lt;/li&gt;
&lt;li&gt;which flows depend on that shared routing control point?&lt;/li&gt;
&lt;li&gt;do local effective routes support that intent, rather than supposedly define it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That sounds subtle, but it changes how deterministic your design really is.&lt;/p&gt;
&lt;p&gt;A route table can be technically correct and still be a poor explanation of the intended packet path.&lt;/p&gt;
&lt;h3 id="deployment"&gt;Deployment
&lt;/h3&gt;&lt;p&gt;Successful deployment is no longer proven by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a route object being present&lt;/li&gt;
&lt;li&gt;an effective route appearing on a NIC&lt;/li&gt;
&lt;li&gt;an appliance existing in the environment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those are useful checks, not sufficient proof.&lt;/p&gt;
&lt;p&gt;If VNRA is the centre of forwarding intent, deployment validation has to confirm that the intended traffic classes actually align with that central design. Otherwise you have validated configuration artefacts, not forwarding behaviour.&lt;/p&gt;
&lt;h3 id="operations"&gt;Operations
&lt;/h3&gt;&lt;p&gt;This is where the change becomes most visible.&lt;/p&gt;
&lt;p&gt;Your runbooks need to separate two different questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Is local route selection at the attachment point correct?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is the packet path behaving according to the VNRA-centred forwarding design?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Those are not the same question.&lt;/p&gt;
&lt;p&gt;Without that distinction, teams end up diagnosing packet-path issues as though they were route-precedence issues, or vice versa.&lt;/p&gt;
&lt;p&gt;That is how incident response gets slower and less accurate.&lt;/p&gt;
&lt;h2 id="implementation-example-effective-routes-as-local-evidence"&gt;Implementation Example: Effective Routes as Local Evidence
&lt;/h2&gt;&lt;p&gt;The Azure CLI still gives you a useful first view.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network nic show-effective-route-table &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-network-prod &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name spokea-app01-nic
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That output tells you the local route-selection context for that NIC.&lt;/p&gt;
&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; by itself prove the full end-to-end path once VNRA is acting as the shared routing control point.&lt;/p&gt;
&lt;p&gt;A VNRA-aware interpretation looks more like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Source NIC effective routes:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 10.20.0.0/16 via VirtualNetwork
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 10.30.0.0/16 via UserDefinedRoute
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;What this tells you:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- The source attachment has a visible route-selection context.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- A specific route source is winning locally.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;What this does not tell you on its own:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- That the full packet path is correctly understood purely from this edge view.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- That the observed forwarding behaviour aligns with the VNRA-centred design.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That is the practical shift. The command has not changed. The meaning you assign to its output has.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;h3 id="familiar-route-output-creates-false-confidence"&gt;Familiar route output creates false confidence
&lt;/h3&gt;&lt;p&gt;This is probably the biggest trap.&lt;/p&gt;
&lt;p&gt;The effective route table can look entirely reasonable while still being an incomplete explanation of actual packet behaviour. Engineers trust familiar output quickly. VNRA punishes that habit.&lt;/p&gt;
&lt;h3 id="local-route-correctness-and-path-correctness-are-different-things"&gt;Local route correctness and path correctness are different things
&lt;/h3&gt;&lt;p&gt;You can have a locally sensible route outcome and still misread the real packet path if you are treating the source attachment as the authoritative viewpoint.&lt;/p&gt;
&lt;p&gt;That matters most when traffic between shared network domains is expected to conform to a centrally expressed forwarding design.&lt;/p&gt;
&lt;h3 id="comparing-before-and-after-route-tables-can-mislead-you"&gt;Comparing before and after route tables can mislead you
&lt;/h3&gt;&lt;p&gt;If your only test is “did the effective route entries visibly change?”, you may miss the actual shift.&lt;/p&gt;
&lt;p&gt;VNRA is often less about inventing new-looking route artefacts and more about changing where the authoritative packet-path interpretation now sits.&lt;/p&gt;
&lt;h3 id="split-responsibility-makes-diagnosis-worse"&gt;Split responsibility makes diagnosis worse
&lt;/h3&gt;&lt;p&gt;If one team validates route objects and another validates appliance health, but neither owns packet-path interpretation end to end, VNRA will expose that gap quickly.&lt;/p&gt;
&lt;p&gt;This is not a governance post, so I will leave it there. Operationally, though, the boundary matters.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="1-stop-treating-edge-effective-routes-as-the-whole-packet-narrative"&gt;1. Stop treating edge effective routes as the whole packet narrative
&lt;/h3&gt;&lt;p&gt;They are still useful. They are no longer authoritative on their own.&lt;/p&gt;
&lt;h3 id="2-model-packet-paths-from-the-forwarding-centre-outward"&gt;2. Model packet paths from the forwarding centre outward
&lt;/h3&gt;&lt;p&gt;If VNRA sits at the heart of forwarding intent, start there. Then use attachment-level route views to confirm local context.&lt;/p&gt;
&lt;h3 id="3-separate-route-correctness-from-forwarding-correctness-in-your-runbooks"&gt;3. Separate route correctness from forwarding correctness in your runbooks
&lt;/h3&gt;&lt;p&gt;Make this explicit. It will prevent a lot of bad diagnosis during incidents.&lt;/p&gt;
&lt;h3 id="4-challenge-designs-that-rely-on-edge-inference-alone"&gt;4. Challenge designs that rely on edge inference alone
&lt;/h3&gt;&lt;p&gt;If the only way to explain a path is by reading local route tables and hoping that tells the whole story, the design is probably under-validated.&lt;/p&gt;
&lt;h3 id="5-favour-determinism-over-cleverness"&gt;5. Favour determinism over cleverness
&lt;/h3&gt;&lt;p&gt;A VNRA-centred design should make packet intent clearer, not turn troubleshooting into guesswork.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; VNRA is not interesting because it adds another routing target. It is interesting because it moves packet truth away from the edge. Once forwarding intent is centralised, effective routes become local evidence, not the final explanation.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-routing-appliance-overview" target="_blank" rel="noopener"
&gt;Overview of Azure Virtual Network routing appliances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure virtual network traffic routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/diagnose-vm-network-routing-problem" target="_blank" rel="noopener"
&gt;Diagnose a virtual machine routing problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview" target="_blank" rel="noopener"
&gt;Azure Network Watcher overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Designing Private Connectivity for Adversarial Conditions</title><link>https://blog.brewedinthecloud.com/p/pe-attacks-designing-for-adversarial-conditions/</link><pubDate>Tue, 23 Jun 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/pe-attacks-designing-for-adversarial-conditions/</guid><description>&lt;p&gt;A Private Endpoint can make an architecture diagram look safer in the same way a locked internal door feels safer than one opening onto the street.&lt;/p&gt;
&lt;p&gt;That feeling is not meaningless, but it is easy to over-trust.&lt;/p&gt;
&lt;p&gt;In this series, we have already established that Private Endpoint changes exposure, not the existence of attack surface. This post takes the next step: what should you actually do with that idea when you are designing private connectivity for production environments that will drift, fail, and eventually contain something you did not intend to trust?&lt;/p&gt;
&lt;p&gt;Because that is the real design question.&lt;/p&gt;
&lt;p&gt;Not whether a service is private.&lt;/p&gt;
&lt;p&gt;Whether the private path remains safe when something on the inside is already wrong.&lt;/p&gt;
&lt;p&gt;That should change something you design, deploy, and operate. It should push you away from treating private connectivity as a security outcome, and towards treating it as a dependency chain that must be intentionally constrained.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption is simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the PaaS service is reachable only through a Private Endpoint, then the network has meaningfully reduced trust risk.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That assumption breaks because “private” is doing too much work.&lt;/p&gt;
&lt;p&gt;Private Endpoint reduces one category of exposure: public network reachability. That can be useful. It can remove accidental internet exposure, reduce opportunistic scanning, and simplify some perimeter decisions.&lt;/p&gt;
&lt;p&gt;But none of that means the resulting private path is trustworthy.&lt;/p&gt;
&lt;p&gt;A Private Endpoint does not assert that the calling workload is legitimate. It does not prove the caller came from the application you expected. It does not make private DNS authoritative in a security sense. It does not prevent an internal foothold from using the same route you built for valid traffic.&lt;/p&gt;
&lt;p&gt;The dangerous shift is not technical. It is psychological.&lt;/p&gt;
&lt;p&gt;Teams move from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“this service is exposed, so we need to control access carefully”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“this service is private, so the network is already doing most of the work”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is how implicit trust gets introduced. Quietly, incrementally, and usually in the name of convenience.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Private connectivity to Azure PaaS is not one control. It is a chain of dependencies.&lt;/p&gt;
&lt;p&gt;That chain usually includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a client resolving the service name to a private address rather than the public endpoint&lt;/li&gt;
&lt;li&gt;network reachability from the source workload to the Private Endpoint path&lt;/li&gt;
&lt;li&gt;control-plane permissions that determine who can create, approve, modify, or redirect that path&lt;/li&gt;
&lt;li&gt;service-side authentication and authorisation that still decide what the caller can actually do&lt;/li&gt;
&lt;li&gt;operational processes that govern how changes to any of those dependencies are reviewed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the thing you are really designing.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Workload] --&gt; B[DNS Resolution]
B --&gt; C[Private IP for PaaS Service]
C --&gt; D[Routing and Reachability]
D --&gt; E[Private Endpoint Path]
E --&gt; F[Azure PaaS Service]
F --&gt; G[Service-side Authorisation]
H[Control Plane Permissions] --&gt; B
H --&gt; E
H --&gt; F
&lt;/div&gt;
&lt;p&gt;The point is not that the chain is complicated. The point is that a lot of trust gets smuggled into the environment through dependencies that are often treated as plumbing.&lt;/p&gt;
&lt;p&gt;Three of those dependencies matter most.&lt;/p&gt;
&lt;h3 id="dns-becomes-security-significant"&gt;DNS becomes security-significant
&lt;/h3&gt;&lt;p&gt;Private DNS is not just a convenience layer once it starts steering clients towards sensitive internal service paths.&lt;/p&gt;
&lt;p&gt;If a network can resolve a service name to a Private Endpoint address, it has gained internal knowledge and possibly internal reachability. If that resolution scope is broader than the set of intended consumers, you have expanded trust whether you meant to or not.&lt;/p&gt;
&lt;p&gt;DNS is not the security boundary. But it absolutely becomes part of the exposure model.&lt;/p&gt;
&lt;h3 id="reachability-becomes-a-privilege"&gt;Reachability becomes a privilege
&lt;/h3&gt;&lt;p&gt;A route to a Private Endpoint is not neutral plumbing. It is permission to attempt access.&lt;/p&gt;
&lt;p&gt;Whether the service ultimately accepts the request depends on other controls, but broad reachability still expands the attack surface around that service. If too many internal networks can get there, too many internal workloads can participate in probing, misuse, and lateral movement.&lt;/p&gt;
&lt;p&gt;Private does not mean narrow.&lt;/p&gt;
&lt;h3 id="control-plane-authority-shapes-data-plane-exposure"&gt;Control-plane authority shapes data-plane exposure
&lt;/h3&gt;&lt;p&gt;Who can approve a Private Endpoint? Who can link a private DNS zone? Who can alter the target service configuration in a way that changes effective exposure?&lt;/p&gt;
&lt;p&gt;Those are not background administrative concerns. They define who can reshape the trust path.&lt;/p&gt;
&lt;p&gt;If the same operational boundary can create the path, advertise the path, and widen the path without meaningful review, then the design is not just technically permissive. It is organisationally permissive.&lt;/p&gt;
&lt;h2 id="designing-for-adversarial-conditions"&gt;Designing for Adversarial Conditions
&lt;/h2&gt;&lt;p&gt;If you accept that private connectivity is hostile-adjacent, the design objective changes.&lt;/p&gt;
&lt;p&gt;You are no longer trying to make access private in the abstract. You are trying to make private access:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;explicitly bounded&lt;/li&gt;
&lt;li&gt;hard to repurpose&lt;/li&gt;
&lt;li&gt;easy to review&lt;/li&gt;
&lt;li&gt;observable when misused&lt;/li&gt;
&lt;li&gt;survivable when internal assumptions fail&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That means designing against abuse, not just designing for successful application traffic.&lt;/p&gt;
&lt;h2 id="trust-boundaries-need-to-be-declared-not-inferred"&gt;Trust Boundaries Need to Be Declared, Not Inferred
&lt;/h2&gt;&lt;p&gt;One of the more persistent design mistakes with Private Endpoint is that teams describe connectivity as though it explains trust.&lt;/p&gt;
&lt;p&gt;They say things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the app subnet can access the database privately&lt;/li&gt;
&lt;li&gt;the spoke can reach storage over Private Link&lt;/li&gt;
&lt;li&gt;the service is internal-only now&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of those statements define a trust boundary. They describe a route.&lt;/p&gt;
&lt;p&gt;A trust boundary around private PaaS access usually spans several things at once:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the specific workloads expected to initiate the connection&lt;/li&gt;
&lt;li&gt;the network scopes from which they are allowed to do so&lt;/li&gt;
&lt;li&gt;the DNS path that makes the service discoverable&lt;/li&gt;
&lt;li&gt;the service-side identity and authorisation model&lt;/li&gt;
&lt;li&gt;the administrative scope allowed to change any of the above&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If those conditions are not explicit, the trust boundary is not explicit.&lt;/p&gt;
&lt;p&gt;How would this change something you design, deploy, or operate?&lt;/p&gt;
&lt;p&gt;It means a Private Endpoint should not pass design review simply because the service no longer has public access. It should only pass if the intended consumers, resolution scope, reachability scope, and change authority are all named and defensible.&lt;/p&gt;
&lt;h2 id="broad-dns-linkage-is-not-a-neutral-convenience-choice"&gt;Broad DNS Linkage Is Not a Neutral Convenience Choice
&lt;/h2&gt;&lt;p&gt;This is the pattern the article is prepared to reject outright.&lt;/p&gt;
&lt;p&gt;If private DNS zones are linked broadly to shared or inherited network scopes by default, the design should be treated as over-trusting until proven otherwise.&lt;/p&gt;
&lt;p&gt;That is not just an operational shortcut. It is an expansion of internal trust.&lt;/p&gt;
&lt;p&gt;The reason is simple. Broad private DNS linkage does at least two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it widens internal service discovery&lt;/li&gt;
&lt;li&gt;it often widens effective access assumptions, even where service-side controls still exist&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That means “link it everywhere for simplicity” is not a harmless design preference. It is a decision to make the private path discoverable by more of the environment than may actually need it.&lt;/p&gt;
&lt;p&gt;For adversarial design, that should fail review unless the broader scope is explicitly justified.&lt;/p&gt;
&lt;p&gt;This is one of the most common places where Private Endpoint quietly shifts from “reduced public exposure” to “expanded internal trust surface”.&lt;/p&gt;
&lt;h2 id="inherited-reachability-is-not-a-trust-decision"&gt;Inherited Reachability Is Not a Trust Decision
&lt;/h2&gt;&lt;p&gt;A second pattern worth rejecting is inherited reachability through convenience peering, shared transit assumptions, or broad east-west connectivity.&lt;/p&gt;
&lt;p&gt;If a workload can reach a Private Endpoint mainly because the network topology made it easy, the design is incomplete.&lt;/p&gt;
&lt;p&gt;Convenience routing is not a trust decision.&lt;/p&gt;
&lt;p&gt;This matters because many estates end up with exactly this shape:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a central or shared network hosts the resolution path&lt;/li&gt;
&lt;li&gt;peered networks inherit access expectations&lt;/li&gt;
&lt;li&gt;workloads well outside the original design scope can now resolve or reach the endpoint&lt;/li&gt;
&lt;li&gt;nobody can clearly say whether that exposure is intentional&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is not a mature private connectivity design. That is ambient access.&lt;/p&gt;
&lt;p&gt;Private Endpoint should narrow consumer scope, not quietly rely on whichever networks happen to already be connected.&lt;/p&gt;
&lt;h2 id="control-plane-concentration-should-be-treated-as-abuse-prone"&gt;Control-Plane Concentration Should Be Treated as Abuse-Prone
&lt;/h2&gt;&lt;p&gt;A lot of technical reviews focus only on where packets flow.&lt;/p&gt;
&lt;p&gt;That is not enough.&lt;/p&gt;
&lt;p&gt;If one operational boundary can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;create the Private Endpoint&lt;/li&gt;
&lt;li&gt;advertise it through DNS&lt;/li&gt;
&lt;li&gt;and alter target service exposure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;without independent review, the design should be treated as abuse-prone.&lt;/p&gt;
&lt;p&gt;That does not mean every environment needs elaborate bureaucracy. It means concentrated change authority is part of the threat model. A private path is easier to trust than to continuously validate, and that is exactly why control-plane concentration matters.&lt;/p&gt;
&lt;p&gt;This is often missed because it does not show up in architecture diagrams. But in production estates, the ability to reshape a trust path is often as important as the path itself.&lt;/p&gt;
&lt;h2 id="design-review-tests"&gt;Design Review Tests
&lt;/h2&gt;&lt;p&gt;The quickest way to improve Private Endpoint designs is to stop describing them as “best practice” and start evaluating them as review decisions.&lt;/p&gt;
&lt;p&gt;The table below is intentionally opinionated. It is not a reference architecture. It is a set of cues for deciding whether risk is being constrained or merely relocated.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Design condition&lt;/th&gt;
&lt;th style="text-align: right"&gt;Operationally convenient&lt;/th&gt;
&lt;th style="text-align: right"&gt;Adversarially sound&lt;/th&gt;
&lt;th&gt;Review outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Private DNS linked broadly across shared or inherited VNets&lt;/td&gt;
&lt;td style="text-align: right"&gt;High&lt;/td&gt;
&lt;td style="text-align: right"&gt;Low&lt;/td&gt;
&lt;td&gt;Reject unless consumer scope is explicitly justified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private Endpoint reachable through general peering convenience rather than named consumer scope&lt;/td&gt;
&lt;td style="text-align: right"&gt;High&lt;/td&gt;
&lt;td style="text-align: right"&gt;Low&lt;/td&gt;
&lt;td&gt;Reject unless reachability is intentionally constrained&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same team can create endpoint, manage DNS path, and change target service exposure without meaningful review&lt;/td&gt;
&lt;td style="text-align: right"&gt;High&lt;/td&gt;
&lt;td style="text-align: right"&gt;Low&lt;/td&gt;
&lt;td&gt;Escalate for separation or compensating control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only named consumer networks can resolve and reach the service path&lt;/td&gt;
&lt;td style="text-align: right"&gt;Medium&lt;/td&gt;
&lt;td style="text-align: right"&gt;High&lt;/td&gt;
&lt;td&gt;Acceptable if monitoring and change review are in place&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS scope is narrower than general platform connectivity and reviewed as a security dependency&lt;/td&gt;
&lt;td style="text-align: right"&gt;Medium&lt;/td&gt;
&lt;td style="text-align: right"&gt;High&lt;/td&gt;
&lt;td&gt;Strong signal that trust is intentional&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This is the practical shift the article is arguing for.&lt;/p&gt;
&lt;p&gt;Do not ask only whether the service is private.&lt;/p&gt;
&lt;p&gt;Ask whether the private path is narrow enough, reviewable enough, and observable enough to survive internal compromise.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This changes more than network diagrams.&lt;/p&gt;
&lt;p&gt;It changes what should pass architecture review, what should trigger operational scrutiny, and what should be treated as a security-relevant platform change.&lt;/p&gt;
&lt;h3 id="design-impact"&gt;Design impact
&lt;/h3&gt;&lt;p&gt;You should stop accepting “private-only” as evidence that exposure is constrained. Consumer scope, DNS scope, reachability scope, and change authority all need to be explicit.&lt;/p&gt;
&lt;h3 id="operational-impact"&gt;Operational impact
&lt;/h3&gt;&lt;p&gt;DNS links, Private Endpoint approvals, and route changes should be reviewed as trust-path changes, not background networking tasks.&lt;/p&gt;
&lt;h3 id="reliability-impact"&gt;Reliability impact
&lt;/h3&gt;&lt;p&gt;The more broadly the private path is shared, the more outages and emergency fixes tend to widen trust in the name of restoring service. Designs that rely on broad convenience are harder to tighten later.&lt;/p&gt;
&lt;h3 id="security-impact"&gt;Security impact
&lt;/h3&gt;&lt;p&gt;A compromised internal workload should not automatically inherit useful private access to sensitive PaaS resources just because it exists somewhere inside the estate.&lt;/p&gt;
&lt;p&gt;If your design cannot make that claim with confidence, the risk is not constrained.&lt;/p&gt;
&lt;h2 id="implementation-artefact"&gt;Implementation Artefact
&lt;/h2&gt;&lt;p&gt;This post intentionally omits deployment code.&lt;/p&gt;
&lt;p&gt;That is deliberate.&lt;/p&gt;
&lt;p&gt;The risk discussed here is not in how to create a Private Endpoint. It is in how broadly the trust path around that endpoint is allowed to exist. In this case, a design-review artefact is more useful than Bicep or CLI because the architectural failure mode is excessive implicit trust, not deployment complexity.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="shared-platforms-often-become-shared-trust-zones"&gt;Shared platforms often become shared trust zones
&lt;/h3&gt;&lt;p&gt;A workload platform may be centrally managed and still be multi-tenant in practice. If multiple application teams share compute, runtime, or network adjacency, “internal consumer” becomes a much weaker category than diagrams suggest.&lt;/p&gt;
&lt;h3 id="temporary-troubleshooting-access-tends-to-outlive-the-incident"&gt;Temporary troubleshooting access tends to outlive the incident
&lt;/h3&gt;&lt;p&gt;Emergency DNS links, broad peering changes, and “just for now” connectivity often survive long after the original problem has gone away. In adversarial terms, temporary convenience is one of the most common ways permanent trust expansion happens.&lt;/p&gt;
&lt;h3 id="private-only-language-hides-weak-consumer-definition"&gt;Private-only language hides weak consumer definition
&lt;/h3&gt;&lt;p&gt;If a team cannot name which workloads are supposed to consume the service, private connectivity is already too broad conceptually, even before the network proves it.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;For this topic, best practice is less about using the right Azure feature and more about refusing weak trust assumptions.&lt;/p&gt;
&lt;h3 id="fail-designs-where-discovery-scope-exceeds-consumer-scope"&gt;Fail designs where discovery scope exceeds consumer scope
&lt;/h3&gt;&lt;p&gt;If more networks can resolve the service than are explicitly approved to consume it, the design is over-trusting.&lt;/p&gt;
&lt;h3 id="fail-designs-where-reachability-is-inherited-by-convenience"&gt;Fail designs where reachability is inherited by convenience
&lt;/h3&gt;&lt;p&gt;If access exists because peering or shared routing made it easy, rather than because consumer scope was intentionally defined, the design is incomplete.&lt;/p&gt;
&lt;h3 id="treat-dns-and-private-endpoint-changes-as-exposure-changes"&gt;Treat DNS and Private Endpoint changes as exposure changes
&lt;/h3&gt;&lt;p&gt;Do not classify these as low-risk plumbing updates. They modify how internal trust is expressed.&lt;/p&gt;
&lt;h3 id="separate-trust-path-control-or-compensate-explicitly"&gt;Separate trust-path control, or compensate explicitly
&lt;/h3&gt;&lt;p&gt;If endpoint creation, DNS control, and target exposure sit inside one operational boundary, that should trigger either separation or a named review control. It should not be invisible.&lt;/p&gt;
&lt;h3 id="design-for-verification"&gt;Design for verification
&lt;/h3&gt;&lt;p&gt;A mature design should let you answer, without archaeology:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;who can resolve this service&lt;/li&gt;
&lt;li&gt;who can reach it&lt;/li&gt;
&lt;li&gt;who can change that&lt;/li&gt;
&lt;li&gt;how unexpected use would be noticed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If those answers depend on tribal knowledge, the design is weaker than it appears.&lt;/p&gt;
&lt;h2 id="indicators-that-private-endpoint-risk-is-intentionally-constrained"&gt;Indicators That Private Endpoint Risk Is Intentionally Constrained
&lt;/h2&gt;&lt;p&gt;Private Endpoint risk is being meaningfully constrained when most of the following are true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the set of networks that can resolve the service is explicitly smaller than the general platform network scope&lt;/li&gt;
&lt;li&gt;the set of workloads that can reach the service is intentionally defined rather than inherited&lt;/li&gt;
&lt;li&gt;service-side authorisation remains mandatory and visible&lt;/li&gt;
&lt;li&gt;control-plane authority over endpoint creation, DNS path, and target exposure is not casually concentrated&lt;/li&gt;
&lt;li&gt;unexpected resolution, connection attempts, or path changes are observable&lt;/li&gt;
&lt;li&gt;incident-driven access expansions are time-bound and reviewed out&lt;/li&gt;
&lt;li&gt;architecture documentation names trust assumptions directly instead of implying that internal location is enough&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If those conditions are absent, the environment may still be private, but it is not especially constrained.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Private Endpoint is most dangerous when it removes just enough visible exposure to make everyone stop asking where trust went.&lt;/p&gt;
&lt;p&gt;If your design relies on “internal networks” as the reason a PaaS service is safe to expose privately, you have not designed a trust boundary. You have named a location.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview" target="_blank" rel="noopener"
&gt;What is Azure Private Endpoint?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-dns" target="_blank" rel="noopener"
&gt;Azure Private Endpoint private DNS integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/benchmark/azure/baselines/azure-private-link-security-baseline" target="_blank" rel="noopener"
&gt;Azure Private Link security considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/develop/threat-modeling-tool" target="_blank" rel="noopener"
&gt;Threat modelling for Azure applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Private Endpoint Sprawl and Shadow Access: When Private Starts Meaning Unseen</title><link>https://blog.brewedinthecloud.com/p/pe-attacks-sprawl-and-shadow-access/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/pe-attacks-sprawl-and-shadow-access/</guid><description>&lt;p&gt;Private Endpoints often arrive with the sort of confidence that makes people stop asking second-order questions.&lt;/p&gt;
&lt;p&gt;The first one is usually deliberate. A shared service needs to be consumed privately, the path is approved, DNS is wired up, and everyone feels like exposure has been reduced. Then another team needs access from a different virtual network. Then another environment gets its own endpoint. Then a migration leaves the old one behind. A year later, the architecture still looks private, but it is no longer especially clear.&lt;/p&gt;
&lt;p&gt;That is the problem this post is really about.&lt;/p&gt;
&lt;p&gt;Private Endpoint sprawl is not just untidy networking. It is the slow expansion of internal reachability to services that many teams still think of as tightly contained. The risk is not that Private Endpoints magically bypass identity or authorisation. The risk is that more internal footholds now inherit viable paths to high-value services, and defenders lose confidence that the approved path is the only path that matters.&lt;/p&gt;
&lt;p&gt;That changes something you design, deploy, and operate. If a new Private Endpoint is treated as routine plumbing rather than as a new internal exposure point, your architecture can accumulate shadow access long before anyone notices.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption goes something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a service is only reachable through Private Endpoints, exposure is reduced and control has improved.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is true only while the private access paths remain deliberate, bounded, and visible.&lt;/p&gt;
&lt;p&gt;What breaks the mental model is scale.&lt;/p&gt;
&lt;p&gt;A Private Endpoint is not just a safer service setting. It is a new network presence for a platform service inside a virtual network you control imperfectly, with DNS and routing dependencies you may not fully own, and with trust implications that extend beyond the service team.&lt;/p&gt;
&lt;p&gt;One endpoint is a design choice.&lt;/p&gt;
&lt;p&gt;Several endpoints to the same service across different networks is no longer just connectivity. It is topology. And once those endpoints span different trust zones or administrative boundaries, it becomes security-relevant sprawl.&lt;/p&gt;
&lt;p&gt;That is the shift worth holding onto:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Private Endpoint sprawl does not weaken identity controls by itself. It weakens your certainty about where sensitive services are reachable from after a compromise.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Sprawl is rarely the result of one bad design meeting. It is usually the accumulation of locally reasonable decisions.&lt;/p&gt;
&lt;h3 id="teams-create-endpoints-close-to-workloads"&gt;Teams create endpoints close to workloads
&lt;/h3&gt;&lt;p&gt;A workload team needs private access to a Key Vault, Storage Account, SQL Database, or Cosmos DB account owned elsewhere. Rather than consuming an already understood path or challenging the design, they create a new Private Endpoint in their own virtual network.&lt;/p&gt;
&lt;p&gt;Technically, that may be fine.&lt;/p&gt;
&lt;p&gt;Architecturally, the same shared service now has another private network presence in another part of the estate. That means another trust zone can originate traffic to it, another DNS context can resolve it privately, and another team now influences the effective exposure of the target service.&lt;/p&gt;
&lt;h3 id="service-ownership-and-access-path-ownership-diverge"&gt;Service ownership and access-path ownership diverge
&lt;/h3&gt;&lt;p&gt;This is where the architecture starts to lie to you.&lt;/p&gt;
&lt;p&gt;The service owner may still control the Key Vault or Storage Account itself, but they often do not control every network from which private access now exists. A sensitive service can look tightly governed from the resource perspective while being privately reachable from networks the service owner neither administers nor reviews regularly.&lt;/p&gt;
&lt;p&gt;At that point, the exposure boundary is no longer defined only by the service configuration. It is also defined by every approved Private Endpoint connection and every network that hosts one.&lt;/p&gt;
&lt;h3 id="dns-makes-duplication-easier-to-ignore"&gt;DNS makes duplication easier to ignore
&lt;/h3&gt;&lt;p&gt;Private DNS does exactly what it is supposed to do: it makes the service name resolve in the right place without the application caring too much.&lt;/p&gt;
&lt;p&gt;Operationally, that convenience can hide architectural drift.&lt;/p&gt;
&lt;p&gt;Consumers continue to use the same name. Connections still work. The duplication disappears behind name resolution. Over time, the platform may end up with several private access paths to the same service across linked zones and virtual networks, but very few people can say with confidence where that service resolves privately and where it does not.&lt;/p&gt;
&lt;h3 id="old-access-paths-tend-to-survive"&gt;Old access paths tend to survive
&lt;/h3&gt;&lt;p&gt;Private Endpoints are easy to create and oddly persistent.&lt;/p&gt;
&lt;p&gt;Migration endpoint? Left behind.
Temporary analytics integration? Still there.
Retired workload in a linked subscription? Endpoint survives.
Replacement endpoint after a redesign? Old one never cleaned up.&lt;/p&gt;
&lt;p&gt;This is where shadow access starts to matter. The network path still exists, the name may still resolve, and the target service is still privately reachable from a place that is no longer part of anyone’s active design intent.&lt;/p&gt;
&lt;h2 id="a-simple-view-of-sprawl"&gt;A Simple View of Sprawl
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
subgraph SharedService["Shared Service Subscription"]
KV["Key Vault"]
SA["Storage Account"]
end
subgraph Prod["Prod Trust Zone"]
PE1["PE to Key Vault"]
PE2["PE to Storage"]
App1["Prod App"]
end
subgraph Dev["Lower-Assurance Dev Zone"]
PE3["PE to Key Vault"]
App2["Dev App"]
end
subgraph Analytics["Separately Administered Analytics Zone"]
PE4["PE to Storage"]
PE5["PE to Key Vault"]
App3["Data Job"]
end
KV --&gt; PE1
KV --&gt; PE3
KV --&gt; PE5
SA --&gt; PE2
SA --&gt; PE4
App1 --&gt; PE1
App1 --&gt; PE2
App2 --&gt; PE3
App3 --&gt; PE4
App3 --&gt; PE5
&lt;/div&gt;
&lt;p&gt;Nothing here is automatically insecure.&lt;/p&gt;
&lt;p&gt;That is exactly why sprawl survives.&lt;/p&gt;
&lt;p&gt;The issue is not endpoint count in isolation. The issue is that shared services are now privately reachable from multiple trust zones with different operational controls, different DNS views, and potentially different security assumptions. If one of those zones is compromised, the attacker may inherit private line of sight to services that were mentally modelled as more tightly contained.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This is the point where the article has to matter beyond architecture diagrams.&lt;/p&gt;
&lt;h3 id="design-impact"&gt;Design impact
&lt;/h3&gt;&lt;p&gt;A second Private Endpoint to the same service is not automatically a problem.&lt;/p&gt;
&lt;p&gt;A second Private Endpoint in a different trust zone should be treated as architectural debt by default until someone can justify why compromise of that zone should still permit private reachability to the target service.&lt;/p&gt;
&lt;p&gt;That is the design decision most teams skip.&lt;/p&gt;
&lt;p&gt;They ask whether the application needs private access. They do not ask whether this particular network should be allowed to host a private access path to that service. Those are different questions. The second one is the security question.&lt;/p&gt;
&lt;p&gt;If the hosting network is lower-assurance, loosely governed, or simply administered by a different team with different standards, then the new endpoint is not just enabling connectivity. It is extending the service’s effective internal exposure.&lt;/p&gt;
&lt;h3 id="deployment-impact"&gt;Deployment impact
&lt;/h3&gt;&lt;p&gt;Private Endpoint sprawl is often created by valid infrastructure-as-code.&lt;/p&gt;
&lt;p&gt;That is why it is easy to miss.&lt;/p&gt;
&lt;p&gt;Every endpoint can be deployed through a clean module, approved through a normal workflow, and attached to the right subnet. Nothing looks broken in the deployment pipeline. The problem is that deployment success says very little about whether the overall estate should contain that many private access paths to the same service.&lt;/p&gt;
&lt;p&gt;In other words, good IaC can still encode a bad reachability model.&lt;/p&gt;
&lt;h3 id="operational-impact"&gt;Operational impact
&lt;/h3&gt;&lt;p&gt;In an incident, the question is no longer:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Does this service have private access?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It becomes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How many private origins can still reach it, and which of those no longer belong to a workload anyone actively operates?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is a much harder question to answer under pressure.&lt;/p&gt;
&lt;p&gt;The moment suspicious access appears against a vault, storage account, or database, responders need to understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which Private Endpoints connect to it&lt;/li&gt;
&lt;li&gt;Which subscriptions and resource groups own those endpoints&lt;/li&gt;
&lt;li&gt;Which virtual networks and subnets host them&lt;/li&gt;
&lt;li&gt;Which DNS zones make the target resolvable&lt;/li&gt;
&lt;li&gt;Which endpoints still correspond to real workloads&lt;/li&gt;
&lt;li&gt;Which paths were approved historically but no longer fit the current design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you cannot answer those questions quickly, your containment options are slower and your confidence in the service boundary is weaker than you thought.&lt;/p&gt;
&lt;h3 id="security-impact"&gt;Security impact
&lt;/h3&gt;&lt;p&gt;The security issue is not that Private Endpoints bypass service authentication. They do not.&lt;/p&gt;
&lt;p&gt;The issue is that they increase the set of internal origins from which authenticated access can be attempted after compromise, reduce confidence in where the service is actually reachable from, and make it harder to distinguish intended private access from inherited shadow paths.&lt;/p&gt;
&lt;p&gt;That matters in practice.&lt;/p&gt;
&lt;p&gt;An attacker with a foothold in a lower-assurance or forgotten network does not need the endpoint itself to be misconfigured. If that network still has private resolution and routable reachability to a high-value service, the attacker has inherited a path that may not exist in anyone’s current threat model. Even if identity controls still block them initially, the blast radius, staging options, and containment assumptions have changed.&lt;/p&gt;
&lt;p&gt;That is why sprawl is an attack-surface problem rather than just an inventory problem.&lt;/p&gt;
&lt;h2 id="architectural-symptoms-of-sprawl"&gt;Architectural Symptoms of Sprawl
&lt;/h2&gt;&lt;p&gt;Sprawl is usually visible through patterns, not labels.&lt;/p&gt;
&lt;h3 id="the-same-service-has-private-endpoints-in-multiple-differently-trusted-networks"&gt;The same service has Private Endpoints in multiple differently trusted networks
&lt;/h3&gt;&lt;p&gt;That should trigger scrutiny immediately.&lt;/p&gt;
&lt;p&gt;Not because multiple endpoints are always wrong, but because duplicated private access across trust zones should be presumed to be debt until proven otherwise. If the justification does not survive compromise-based reasoning, it is not a strong justification.&lt;/p&gt;
&lt;h3 id="service-owners-cannot-enumerate-all-private-access-paths-confidently"&gt;Service owners cannot enumerate all private access paths confidently
&lt;/h3&gt;&lt;p&gt;If the team responsible for a sensitive shared service cannot quickly identify all approved Private Endpoint connections and where they land, then part of the service boundary already lives outside that team’s usable control.&lt;/p&gt;
&lt;p&gt;That is not a documentation issue. It is an exposure issue.&lt;/p&gt;
&lt;h3 id="dns-behaviour-varies-by-environment-in-ways-no-one-can-explain-cleanly"&gt;DNS behaviour varies by environment in ways no one can explain cleanly
&lt;/h3&gt;&lt;p&gt;When a service resolves privately in some places, publicly in others, and through different linked DNS constructs across the estate, teams tend to treat it as naming complexity.&lt;/p&gt;
&lt;p&gt;Often it is evidence that connectivity spread faster than architecture discipline.&lt;/p&gt;
&lt;h3 id="retired-workloads-still-leave-active-private-access-behind"&gt;Retired workloads still leave active private access behind
&lt;/h3&gt;&lt;p&gt;This is one of the clearest forms of shadow access.&lt;/p&gt;
&lt;p&gt;The application may be gone, but the endpoint remains, the connection is still approved, and the target service is still privately reachable from that network. That path may not be monitored closely because everyone thinks the workload was retired.&lt;/p&gt;
&lt;h3 id="environment-separation-exists-on-paper-more-than-in-reachability"&gt;Environment separation exists on paper more than in reachability
&lt;/h3&gt;&lt;p&gt;The problem is not that dev, test, analytics, and prod are different labels.&lt;/p&gt;
&lt;p&gt;The problem starts when differently administered or lower-assurance networks can host equivalent private access paths into shared services that people assume sit behind production-grade controls. At that point, your environment model is doing more work than the network design.&lt;/p&gt;
&lt;h2 id="implementation-example-inspecting-for-duplicated-private-reachability"&gt;Implementation Example: Inspecting for Duplicated Private Reachability
&lt;/h2&gt;&lt;p&gt;For this topic, the useful artefact is not deployment code. It is an inspection pattern.&lt;/p&gt;
&lt;p&gt;A simple Private Endpoint inventory is rarely enough. What matters is whether the same target resource is reachable through several endpoints spread across different subscriptions or ownership boundaries. That is the shape of sprawl.&lt;/p&gt;
&lt;h3 id="azure-cli-example"&gt;Azure CLI example
&lt;/h3&gt;&lt;p&gt;The following command is intentionally basic, but it is more useful than deployment syntax for this discussion because it starts with the right question: which target resources have multiple Private Endpoints pointing at them?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network private-endpoint list &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --query &lt;span class="s2"&gt;&amp;#34;sort_by([].{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; pe:name,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; rg:resourceGroup,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; subscription:id,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; subnet:properties.subnet.id,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; targets:properties.privateLinkServiceConnections[].properties.privateLinkServiceId
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; }, &amp;amp;pe)&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; -o json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;On its own, this is just raw inventory. The useful next step is analytical, not procedural:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Group by target resource ID&lt;/li&gt;
&lt;li&gt;Look for shared services with multiple endpoints&lt;/li&gt;
&lt;li&gt;Check whether those endpoints sit in different subscriptions or trust zones&lt;/li&gt;
&lt;li&gt;Identify endpoints whose owning workload is retired, unclear, or differently administered&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The interesting cases are not simply “many Private Endpoints exist”. The interesting cases are “this one high-value service is privately reachable from more places than the architecture claims”.&lt;/p&gt;
&lt;h3 id="what-to-look-for"&gt;What to look for
&lt;/h3&gt;&lt;p&gt;A small synthetic example makes the point:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target service&lt;/th&gt;
&lt;th style="text-align: right"&gt;Private Endpoint count&lt;/th&gt;
&lt;th style="text-align: right"&gt;Subscription spread&lt;/th&gt;
&lt;th style="text-align: right"&gt;Trust zone spread&lt;/th&gt;
&lt;th&gt;Owner clarity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shared Key Vault A&lt;/td&gt;
&lt;td style="text-align: right"&gt;3&lt;/td&gt;
&lt;td style="text-align: right"&gt;3&lt;/td&gt;
&lt;td style="text-align: right"&gt;Prod, Dev, Analytics&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage Account B&lt;/td&gt;
&lt;td style="text-align: right"&gt;2&lt;/td&gt;
&lt;td style="text-align: right"&gt;1&lt;/td&gt;
&lt;td style="text-align: right"&gt;Prod only&lt;/td&gt;
&lt;td&gt;Clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL Server C&lt;/td&gt;
&lt;td style="text-align: right"&gt;1&lt;/td&gt;
&lt;td style="text-align: right"&gt;1&lt;/td&gt;
&lt;td style="text-align: right"&gt;Prod only&lt;/td&gt;
&lt;td&gt;Clear&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Only one of these rows should make you uncomfortable immediately.&lt;/p&gt;
&lt;p&gt;Not because three is a magic number, but because a shared secret store privately exposed across multiple administrative or trust boundaries is exactly where “private” starts to mean “unseen”.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;h3 id="some-multi-endpoint-designs-are-valid"&gt;Some multi-endpoint designs are valid
&lt;/h3&gt;&lt;p&gt;Yes, there are legitimate reasons to expose the same service privately into multiple networks.&lt;/p&gt;
&lt;p&gt;But legitimacy should be demonstrated, not assumed. If those endpoints cross trust boundaries, the burden of proof should be higher. “The application needed to connect” is not enough on its own.&lt;/p&gt;
&lt;h3 id="counting-endpoints-alone-is-a-weak-metric"&gt;Counting endpoints alone is a weak metric
&lt;/h3&gt;&lt;p&gt;A large estate may have many Private Endpoints without having serious sprawl.&lt;/p&gt;
&lt;p&gt;The stronger signal is duplicated reachability to the same sensitive service across different trust zones, ownership boundaries, or stale workload footprints.&lt;/p&gt;
&lt;h3 id="endpoint-inventory-is-not-the-same-as-effective-reachability"&gt;Endpoint inventory is not the same as effective reachability
&lt;/h3&gt;&lt;p&gt;Even with a good list of endpoint resources, you can still misunderstand exposure if you ignore DNS links, peering, routing, or path changes introduced by centralised network patterns.&lt;/p&gt;
&lt;p&gt;Private access is a system property, not just a resource property.&lt;/p&gt;
&lt;h3 id="approved-once-does-not-mean-appropriate-now"&gt;Approved once does not mean appropriate now
&lt;/h3&gt;&lt;p&gt;An endpoint may have been justified when created and still be risky now.&lt;/p&gt;
&lt;p&gt;Architectures change. Environments get repurposed. Ownership shifts. Old exceptions become inherited assumptions. Historical approval does not preserve present validity.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Within the bounds of this post, the strongest practices are architectural.&lt;/p&gt;
&lt;h3 id="treat-every-new-private-endpoint-as-a-new-internal-exposure-point"&gt;Treat every new Private Endpoint as a new internal exposure point
&lt;/h3&gt;&lt;p&gt;Do not review it as routine plumbing.&lt;/p&gt;
&lt;p&gt;Ask which new network origins now gain private line of sight to the service, and whether those origins still fit the intended trust model.&lt;/p&gt;
&lt;h3 id="default-to-suspicion-when-duplicate-endpoints-cross-trust-zones"&gt;Default to suspicion when duplicate endpoints cross trust zones
&lt;/h3&gt;&lt;p&gt;This is the opinionated line worth keeping.&lt;/p&gt;
&lt;p&gt;If the same service needs multiple Private Endpoints in differently trusted or differently administered networks, treat that as architectural debt by default until the design can justify it under compromise assumptions.&lt;/p&gt;
&lt;h3 id="review-target-service-spread-not-just-endpoint-counts"&gt;Review target-service spread, not just endpoint counts
&lt;/h3&gt;&lt;p&gt;A platform can have a high number of endpoints and still be relatively disciplined.&lt;/p&gt;
&lt;p&gt;What you need to understand is which high-value services are privately reachable from how many distinct places, under whose control, and whether those paths still map to live business intent.&lt;/p&gt;
&lt;h3 id="include-dns-and-ownership-in-the-exposure-model"&gt;Include DNS and ownership in the exposure model
&lt;/h3&gt;&lt;p&gt;Private access is only meaningful if you understand how workloads discover the service and who controls the network objects that make that possible.&lt;/p&gt;
&lt;p&gt;If service ownership does not include usable visibility of private access paths, the service boundary is already weaker than it appears.&lt;/p&gt;
&lt;h3 id="treat-orphaned-private-paths-as-security-relevant-until-proven-otherwise"&gt;Treat orphaned private paths as security-relevant until proven otherwise
&lt;/h3&gt;&lt;p&gt;A Private Endpoint attached to a retired, forgotten, or poorly understood workload should not be considered harmless background noise. It should be treated as shadow access until someone proves it still belongs in the architecture.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Private Endpoint sprawl is what happens when private connectivity stops being a deliberate design and becomes a habit.&lt;/p&gt;
&lt;p&gt;The danger is not that private access makes a service insecure by itself. The danger is that duplicated private paths quietly reshape trust, reachability, and incident assumptions until your architecture says “contained” while your network says otherwise.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview" target="_blank" rel="noopener"
&gt;Azure Private Endpoint documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-link-overview" target="_blank" rel="noopener"
&gt;What is Azure Private Link?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-dns" target="_blank" rel="noopener"
&gt;Azure Private Endpoint DNS configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/cli/azure/network/private-endpoint" target="_blank" rel="noopener"
&gt;Azure CLI - Private Endpoint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Private Link Doesn’t Stop Exfiltration. It Just Changes the Route</title><link>https://blog.brewedinthecloud.com/p/pe-attacks-exfiltration/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/pe-attacks-exfiltration/</guid><description>&lt;p&gt;You can disable public network access, tighten internet egress, and still leave a perfectly usable path for data to leave the workload.&lt;/p&gt;
&lt;p&gt;That is the trap with Private Link. It reduces one kind of exposure while making another kind of path feel safe by default. Once a service is reachable over a Private Endpoint, it starts behaving like trusted internal plumbing. In a lot of estates, that trust arrives long before anybody has defined whether the path should exist, who should own it, or how broadly it should resolve.&lt;/p&gt;
&lt;p&gt;That is why this post treats Private Endpoints as part of the internal attack surface, not as a security boundary.&lt;/p&gt;
&lt;p&gt;The practical question is not whether the traffic stays private.&lt;/p&gt;
&lt;p&gt;It is whether the trust relationship created by that private path is explicit, constrained, and observable enough to rely on.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption is familiar:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If the service has no public endpoint and is only reachable over Private Endpoint, then exfiltration risk is largely removed.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That sounds neat on a slide. It breaks in real estates.&lt;/p&gt;
&lt;p&gt;Private Endpoint does not mean data cannot leave. It means data can leave through a path that now looks internal, often carries less scrutiny, and is easier to describe as “approved” without proving what that approval actually covers.&lt;/p&gt;
&lt;p&gt;The more useful mental model is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Private Endpoint is a trust edge.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is not just a private IP for a platform service. It is a decision to make a managed service reachable from a specific network context under a specific name-resolution model, with all the downstream service behaviour and authorisation complexity that implies.&lt;/p&gt;
&lt;p&gt;That should change how you design, deploy, and operate. You should review a new Private Endpoint the way you would review any new trust relationship, not the way you would review a harmless network attachment.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Private Link gives your workload a private network path to a supported Azure platform service. DNS resolution typically steers the client to the Private Endpoint IP, and the Azure fabric carries the traffic to the target service.&lt;/p&gt;
&lt;p&gt;That changes the shape of the path, but not the need to govern it.&lt;/p&gt;
&lt;p&gt;A Private Endpoint by itself does &lt;strong&gt;not&lt;/strong&gt; grant meaningful data access. The service behind it still enforces its own authentication and authorisation model. That matters, because the real exfiltration risk appears when three things combine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;private reachability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;broad or inherited name resolution&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;service permissions that allow data use, storage, or onward movement&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That combination is where an unexamined data path emerges.&lt;/p&gt;
&lt;p&gt;So the real issue is not “Private Link secretly bypasses all security”. It does not.&lt;/p&gt;
&lt;p&gt;The issue is that many teams govern the endpoint object, but not the trust relationship around it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which workloads can resolve the name&lt;/li&gt;
&lt;li&gt;which subnets can reach the interface&lt;/li&gt;
&lt;li&gt;which identities can use the service meaningfully&lt;/li&gt;
&lt;li&gt;which service instance sits behind the endpoint&lt;/li&gt;
&lt;li&gt;which downstream service behaviours are now in scope&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the operational gap. The platform gives you private transport. It does not tell you whether the resulting path should be trusted.&lt;/p&gt;
&lt;h2 id="the-architectural-blind-spot"&gt;The Architectural Blind Spot
&lt;/h2&gt;&lt;p&gt;A lot of Azure estates now have strong language around “no public access” and “private-only service consumption”. Both can be sensible controls. But they often create an unhelpful shortcut in architecture reviews:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;public endpoint disabled&lt;/li&gt;
&lt;li&gt;Private Endpoint deployed&lt;/li&gt;
&lt;li&gt;issue considered solved&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is not solved. It has moved.&lt;/p&gt;
&lt;p&gt;If a workload can privately reach a storage account, database, or messaging service and has the service-level permissions to use it, then you already have a sanctioned outbound data path. The fact that the packet did not hit the public internet does not make that path harmless.&lt;/p&gt;
&lt;p&gt;This is where the trust-edge model matters. A Private Endpoint should not be assessed as “more secure networking” in the abstract. It should be assessed as a concrete relationship between:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a source workload&lt;/li&gt;
&lt;li&gt;a resolution path&lt;/li&gt;
&lt;li&gt;a destination service&lt;/li&gt;
&lt;li&gt;a set of service permissions&lt;/li&gt;
&lt;li&gt;a trust boundary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If one of those is undefined, the path is probably being trusted implicitly.&lt;/p&gt;
&lt;h2 id="dns-is-where-trust-quietly-expands"&gt;DNS Is Where Trust Quietly Expands
&lt;/h2&gt;&lt;p&gt;In many Azure estates, the most important policy decision behind a Private Endpoint is not the endpoint itself.&lt;/p&gt;
&lt;p&gt;It is which networks are allowed to resolve the name.&lt;/p&gt;
&lt;p&gt;This is one of the easiest places for accidental trust expansion to happen. A Private Endpoint may be created for one application or subnet, but the corresponding private DNS zone is often linked far more broadly than the original use case required. Once that happens, reachability stops being a narrow application decision and starts becoming a platform-wide convenience feature.&lt;/p&gt;
&lt;p&gt;That changes something important operationally.&lt;/p&gt;
&lt;p&gt;A service that was supposed to be privately reachable by one workload can become resolvable by many workloads. If network paths and service permissions also line up, you have quietly widened the set of systems that can use that service as a data path.&lt;/p&gt;
&lt;p&gt;That is not a DNS hygiene problem. It is an architecture problem with DNS symptoms.&lt;/p&gt;
&lt;h2 id="a-typical-exfiltration-pattern-without-the-hype"&gt;A Typical Exfiltration Pattern Without the Hype
&lt;/h2&gt;&lt;p&gt;We do not need to get into malware behaviour or offensive detail to see the design issue.&lt;/p&gt;
&lt;p&gt;A common pattern looks like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an application subnet can resolve a private service name&lt;/li&gt;
&lt;li&gt;the subnet can reach the Private Endpoint&lt;/li&gt;
&lt;li&gt;the workload has valid service credentials or managed identity access&lt;/li&gt;
&lt;li&gt;the destination service is treated as inherently safe because it has no public endpoint&lt;/li&gt;
&lt;li&gt;the path is not reviewed as an outbound trust relationship&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, the environment has not eliminated outbound data movement. It has created a low-friction private route for it.&lt;/p&gt;
&lt;p&gt;The most common examples are not exotic:&lt;/p&gt;
&lt;h3 id="private-storage-as-an-internal-sink"&gt;Private storage as an internal sink
&lt;/h3&gt;&lt;p&gt;A private-only storage account can become an internal drop location simply because it is reachable, resolvable, and writable from more places than intended.&lt;/p&gt;
&lt;h3 id="east-adjacent-movement-across-landing-zones"&gt;East-adjacent movement across landing zones
&lt;/h3&gt;&lt;p&gt;A workload in one application trust zone may be able to write data to a private service hosted in another platform, subscription, or spoke. The traffic stays private, but the trust boundary crossing is real.&lt;/p&gt;
&lt;h3 id="service-mediated-onward-movement"&gt;Service-mediated onward movement
&lt;/h3&gt;&lt;p&gt;The first hop may be private, but once data lands in the service, downstream platform behaviours matter. Export, replication, integration, or secondary consumers may extend the effective data path well beyond the source workload’s original boundary.&lt;/p&gt;
&lt;p&gt;The mistake is not using these services. The mistake is reviewing only the transport path and ignoring what the service is now allowed to do in the broader design.&lt;/p&gt;
&lt;h2 id="visualising-the-problem"&gt;Visualising the Problem
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
A[Source workload] --&gt; B[Private DNS resolution]
B --&gt; C[Private Endpoint]
C --&gt; D[Azure PaaS service]
D --&gt; E[Data written or staged]
D --&gt; F[Service-side downstream behaviour]
D --&gt; G[Consumer in another trust zone]
H[Shared DNS zone links] --&gt; B
I[Service permissions] --&gt; D
style C fill:#d9edf7,stroke:#31708f
style D fill:#fcf8e3,stroke:#8a6d3b
style E fill:#f2dede,stroke:#a94442
style F fill:#f2dede,stroke:#a94442
style G fill:#f2dede,stroke:#a94442
style H fill:#f5f5f5,stroke:#666666
style I fill:#f5f5f5,stroke:#666666
&lt;/div&gt;
&lt;p&gt;The useful takeaway here is that the Private Endpoint is not the whole story. The meaningful risk sits in the combination of resolution scope, network reachability, service authorisation, and downstream service behaviour.&lt;/p&gt;
&lt;h2 id="why-no-public-endpoint-can-become-a-blind-spot"&gt;Why “No Public Endpoint” Can Become a Blind Spot
&lt;/h2&gt;&lt;p&gt;Disabling public access is often the right move. It removes a class of exposure cleanly.&lt;/p&gt;
&lt;p&gt;But there is a difference between &lt;strong&gt;reducing exposure&lt;/strong&gt; and &lt;strong&gt;controlling data paths&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;“No public endpoint” can create false confidence because it sounds like a complete answer. In practice, it often just shifts scrutiny away from the remaining path. The service is now considered private, the traffic looks internal, and the path gets less attention precisely because it appears more controlled.&lt;/p&gt;
&lt;p&gt;That is how unmanaged trust grows in mature environments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the path is real&lt;/li&gt;
&lt;li&gt;the path is approved in principle&lt;/li&gt;
&lt;li&gt;the scope of that approval is unclear&lt;/li&gt;
&lt;li&gt;visibility is fragmented&lt;/li&gt;
&lt;li&gt;ownership is diluted across networking, platform, and application teams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The end state is not a dramatic security failure. It is something more common and more dangerous: a private data path that nobody is actively governing.&lt;/p&gt;
&lt;h2 id="how-this-changes-design-deployment-and-operations"&gt;How This Changes Design, Deployment, and Operations
&lt;/h2&gt;&lt;p&gt;This is the practical anchor.&lt;/p&gt;
&lt;h3 id="design"&gt;Design
&lt;/h3&gt;&lt;p&gt;Treat each Private Endpoint as a trust-edge decision.&lt;/p&gt;
&lt;p&gt;Do not stop at “the app needs private access to Storage”. Define:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which workload needs it&lt;/li&gt;
&lt;li&gt;which exact service instance it should reach&lt;/li&gt;
&lt;li&gt;which networks should resolve the name&lt;/li&gt;
&lt;li&gt;which trust boundaries are being crossed&lt;/li&gt;
&lt;li&gt;which downstream service behaviours are acceptable&lt;/li&gt;
&lt;li&gt;which cases are explicitly out of scope&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That changes design because you stop modelling Private Endpoints as generic network plumbing and start modelling them as approved service relationships.&lt;/p&gt;
&lt;h3 id="deployment"&gt;Deployment
&lt;/h3&gt;&lt;p&gt;Treat creation of a Private Endpoint as introduction of a new sanctioned private data path.&lt;/p&gt;
&lt;p&gt;That means the deployment is not complete when the resource exists. It is complete when the trust conditions around it are also understood:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;source scope&lt;/li&gt;
&lt;li&gt;DNS scope&lt;/li&gt;
&lt;li&gt;destination ownership&lt;/li&gt;
&lt;li&gt;expected service use&lt;/li&gt;
&lt;li&gt;reviewability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If those are missing, the deployment is technically correct but architecturally incomplete.&lt;/p&gt;
&lt;h3 id="operations"&gt;Operations
&lt;/h3&gt;&lt;p&gt;Review Private Endpoints the way you would review long-lived firewall rules or peering relationships: as objects that outlast the project that created them.&lt;/p&gt;
&lt;p&gt;That changes operations because your questions become sharper:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which workloads can resolve this service name today&lt;/li&gt;
&lt;li&gt;which trust zones can reach this endpoint now&lt;/li&gt;
&lt;li&gt;does the destination still have a valid owner&lt;/li&gt;
&lt;li&gt;would anybody notice if a workload started using this path differently&lt;/li&gt;
&lt;li&gt;does the current DNS linkage still match the original design intent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is far more useful than simply counting how many Private Endpoints exist.&lt;/p&gt;
&lt;h2 id="governance-query-example"&gt;Governance Query Example
&lt;/h2&gt;&lt;p&gt;For this kind of article, deployment syntax is not the interesting artefact. The harder problem is whether the estate can identify Private Endpoints that have become unmanaged trust relationships.&lt;/p&gt;
&lt;p&gt;A governance-oriented query is more useful than a create example because it tests whether your environment can answer basic architectural questions at scale.&lt;/p&gt;
&lt;p&gt;The Azure Resource Graph query below looks for Private Endpoints and surfaces signals that deserve review:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;missing ownership tags&lt;/li&gt;
&lt;li&gt;missing business-purpose tags&lt;/li&gt;
&lt;li&gt;the subnet hosting the endpoint&lt;/li&gt;
&lt;li&gt;the target resource behind the connection&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resources
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where type =~ &amp;#39;microsoft.network/privateendpoints&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| extend peSubnetId = tostring(properties.subnet.id)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| extend connections = properties.privateLinkServiceConnections
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| mv-expand conn = connections
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| extend targetResourceId = tostring(conn.properties.privateLinkServiceId)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; subscriptionId,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; resourceGroup,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; privateEndpoint = name,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; peSubnetId,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; targetResourceId,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; owner = tostring(tags.Owner),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; businessPurpose = tostring(tags.BusinessPurpose)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| extend ownerState = iif(isempty(owner), &amp;#39;Missing&amp;#39;, &amp;#39;Present&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| extend purposeState = iif(isempty(businessPurpose), &amp;#39;Missing&amp;#39;, &amp;#39;Present&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by ownerState desc, purposeState desc, subscriptionId asc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This does not prove exfiltration risk by itself, and it should not be oversold. What it &lt;em&gt;does&lt;/em&gt; show is whether your estate can identify private service paths that lack even basic ownership and intent metadata.&lt;/p&gt;
&lt;p&gt;That matters because unmanaged trust tends to appear before confirmed misuse does.&lt;/p&gt;
&lt;p&gt;If your platform team cannot quickly answer who owns a Private Endpoint, why it exists, and which service it reaches, then your “private-only” posture is probably carrying more implicit trust than you think.&lt;/p&gt;
&lt;h2 id="indicators-that-the-data-path-is-being-trusted-implicitly"&gt;Indicators That the Data Path Is Being Trusted Implicitly
&lt;/h2&gt;&lt;p&gt;These are the signs I would look for in a real environment.&lt;/p&gt;
&lt;h3 id="private-dns-zone-links-are-broader-than-the-application-need"&gt;Private DNS zone links are broader than the application need
&lt;/h3&gt;&lt;p&gt;This is one of the strongest indicators that convenience has overtaken design intent.&lt;/p&gt;
&lt;h3 id="private-endpoints-exist-without-clear-ownership-metadata"&gt;Private Endpoints exist without clear ownership metadata
&lt;/h3&gt;&lt;p&gt;If the object is live but nobody clearly owns the path, it is already under-governed.&lt;/p&gt;
&lt;h3 id="shared-services-are-reachable-across-multiple-trust-zones-by-default"&gt;Shared services are reachable across multiple trust zones by default
&lt;/h3&gt;&lt;p&gt;That may be intentional, but it should be visible and explicitly defended, not inherited silently.&lt;/p&gt;
&lt;h3 id="architecture-documents-describe-private-access-but-not-approved-data-destinations"&gt;Architecture documents describe “private access” but not “approved data destinations”
&lt;/h3&gt;&lt;p&gt;That wording usually means the transport decision was reviewed but the data-path decision was not.&lt;/p&gt;
&lt;h3 id="public-access-is-disabled-and-that-is-treated-as-the-end-of-the-conversation"&gt;Public access is disabled and that is treated as the end of the conversation
&lt;/h3&gt;&lt;p&gt;This is the most common mental shortcut. It reduces one risk and masks another.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="private-reachability-is-not-the-same-as-authorised-use"&gt;Private reachability is not the same as authorised use
&lt;/h3&gt;&lt;p&gt;A workload still needs valid service-level permissions. The risk comes from the combination of path and permission, not from private transport alone.&lt;/p&gt;
&lt;h3 id="dns-scope-can-widen-faster-than-endpoint-deployment"&gt;DNS scope can widen faster than endpoint deployment
&lt;/h3&gt;&lt;p&gt;You can accidentally expand reachability through name resolution changes without creating any new Private Endpoint resources.&lt;/p&gt;
&lt;h3 id="cross-subscription-does-not-mean-cross-trust-is-understood"&gt;Cross-subscription does not mean cross-trust is understood
&lt;/h3&gt;&lt;p&gt;Administrative boundaries are not the same as trust boundaries. A private path into another team’s service is still a trust decision even if it lives inside the same tenant.&lt;/p&gt;
&lt;h3 id="service-subresources-matter"&gt;Service subresources matter
&lt;/h3&gt;&lt;p&gt;Different subresources can expose materially different capabilities. Reviewing access only at the service label level is often too coarse.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="1-review-private-endpoints-as-trust-edges"&gt;1. Review Private Endpoints as trust edges
&lt;/h3&gt;&lt;p&gt;Make this the default posture. If a new endpoint creates a new path to a managed service, it deserves trust-boundary review.&lt;/p&gt;
&lt;h3 id="2-keep-dns-scope-as-narrow-as-the-use-case"&gt;2. Keep DNS scope as narrow as the use case
&lt;/h3&gt;&lt;p&gt;Private resolution should be deliberate. Broad inherited zone links are one of the easiest ways to create accidental trust expansion.&lt;/p&gt;
&lt;h3 id="3-separate-transport-approval-from-data-path-approval"&gt;3. Separate transport approval from data-path approval
&lt;/h3&gt;&lt;p&gt;A service being reachable privately does not automatically make it an approved destination for sensitive or high-value data.&lt;/p&gt;
&lt;h3 id="4-require-ownership-and-business-purpose-for-every-private-endpoint"&gt;4. Require ownership and business purpose for every Private Endpoint
&lt;/h3&gt;&lt;p&gt;If the relationship matters, it should be attributable. If it is not attributable, it should not be trusted by default.&lt;/p&gt;
&lt;h3 id="5-review-by-trust-boundary-not-just-by-subscription-or-vnet"&gt;5. Review by trust boundary, not just by subscription or VNet
&lt;/h3&gt;&lt;p&gt;The real question is who can now reach which service under which name and permissions, not which administrative container the resource lives in.&lt;/p&gt;
&lt;h3 id="6-assume-private-paas-traffic-is-under-observed-until-proven-otherwise"&gt;6. Assume private PaaS traffic is under-observed until proven otherwise
&lt;/h3&gt;&lt;p&gt;Do not assume your visibility model kept up with your connectivity model.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Private Link is very good at removing public exposure. That is exactly why it can hide bad assumptions so well.
If the service is private, broadly resolvable, and meaningfully usable, then you do not have “no exfiltration path”. You have a trusted one.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview" target="_blank" rel="noopener"
&gt;Azure Private Endpoint documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-link-overview" target="_blank" rel="noopener"
&gt;What is Azure Private Link?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-dns" target="_blank" rel="noopener"
&gt;Azure Private Endpoint DNS configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/governance/resource-graph/overview" target="_blank" rel="noopener"
&gt;Azure Resource Graph overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/storage/common/storage-network-security" target="_blank" rel="noopener"
&gt;Azure Storage networking for secure access&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Private Endpoint Doesn’t Save You from DNS</title><link>https://blog.brewedinthecloud.com/p/pe-attacks-dns-vector/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/pe-attacks-dns-vector/</guid><description>&lt;p&gt;When teams talk about securing Azure PaaS with Private Endpoint, the conversation usually settles on the network path.&lt;/p&gt;
&lt;p&gt;The service now has a private IP. Traffic stays off the internet. Exposure is reduced. Everyone breathes a bit easier.&lt;/p&gt;
&lt;p&gt;That is not wrong. It is just incomplete.&lt;/p&gt;
&lt;p&gt;A Private Endpoint changes how traffic reaches a service, but it does not, by itself, guarantee that the client is reaching the right service. In most real deployments, that decision still rides on DNS. The path may be private, but the destination is still selected by name resolution.&lt;/p&gt;
&lt;p&gt;That changes something you design, deploy, and operate straight away: &lt;strong&gt;a Private Endpoint gives you a private transport path, not destination integrity&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption is simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We replaced the public endpoint with a private one, so the connectivity risk is mostly solved.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That assumption holds only if you treat connectivity as a pure routing problem. Most workloads do not connect to abstract network paths. They connect to service names. If the wrong system answers the naming question, the network can still do exactly what it was configured to do while the application reaches the wrong destination, fails unexpectedly, or inherits trust from systems its owners never intended to rely on.&lt;/p&gt;
&lt;p&gt;Treating Private Endpoint as the security boundary while treating DNS as background plumbing is a category error.&lt;/p&gt;
&lt;p&gt;A private IP narrows exposure. It does not remove the need to trust the path that tells clients where that IP should be.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Private Endpoint consumption feels clean because the application often keeps using a familiar service name. DNS simply returns a private address instead of a public one, and the application connects as normal.&lt;/p&gt;
&lt;p&gt;That convenience hides an important dependency chain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The client must query the intended resolver.&lt;/li&gt;
&lt;li&gt;That resolver must use the intended zones and records.&lt;/li&gt;
&lt;li&gt;The returned answer must identify the intended Private Endpoint.&lt;/li&gt;
&lt;li&gt;No intermediate control should override that answer unexpectedly.&lt;/li&gt;
&lt;li&gt;The service-layer connection must still validate against the expected service identity.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The critical point is that Private Endpoint secures reachability to a private destination. DNS still participates in deciding which destination that is.&lt;/p&gt;
&lt;p&gt;That distinction matters because different DNS failures lead to different outcomes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;some failures break access entirely&lt;/li&gt;
&lt;li&gt;some send clients to an unexpected private target&lt;/li&gt;
&lt;li&gt;some change which administrative domain effectively controls service targeting&lt;/li&gt;
&lt;li&gt;some create confusing partial outages that look like network or platform faults&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not all of those outcomes are compromise. That is exactly why this gets missed. Engineers often reserve the word “security” for direct unauthorised access, when in practice loss of destination control is already a security-relevant condition.&lt;/p&gt;
&lt;h2 id="a-simple-trust-map"&gt;A Simple Trust Map
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
A[Application workload] --&gt; B[Configured DNS resolver]
B --&gt; C[Private DNS authority or delegated resolution path]
C --&gt; D[Private Endpoint IP]
D --&gt; E[Azure service via Private Link]
X[DNS admin influence]
Y[Resolver path drift]
Z[Incorrect or stale record]
X -. changes authority .-&gt; C
Y -. changes dependency .-&gt; B
Z -. changes target selection .-&gt; D
&lt;/div&gt;
&lt;p&gt;This is the part many designs flatten into “internal DNS”.&lt;/p&gt;
&lt;p&gt;From a threat-model perspective, that is too coarse. The question is not just whether the answer is private. The question is &lt;strong&gt;who can influence the answer, and therefore influence where trusted traffic goes&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="where-the-attack-surface-actually-appears"&gt;Where the Attack Surface Actually Appears
&lt;/h2&gt;&lt;h3 id="private-dns-becomes-part-of-the-trust-boundary"&gt;Private DNS becomes part of the trust boundary
&lt;/h3&gt;&lt;p&gt;Once a workload depends on private DNS records to reach a Private Endpoint-backed service, those records stop being neutral support objects. They become part of the application’s effective trust boundary.&lt;/p&gt;
&lt;p&gt;That is the shift many teams miss.&lt;/p&gt;
&lt;p&gt;A private DNS zone, a linked resolution path, or an override record may look operationally harmless because none of them move packets by themselves. But they can still influence service targeting. In a Private Endpoint architecture, that means they can influence which private destination a workload treats as authoritative.&lt;/p&gt;
&lt;p&gt;That does not mean every DNS issue enables interception or data theft. Often it does not. But it absolutely can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deny access to a required service&lt;/li&gt;
&lt;li&gt;redirect clients towards an unintended private destination&lt;/li&gt;
&lt;li&gt;shift effective control of service targeting into another administrative domain&lt;/li&gt;
&lt;li&gt;create persistent failure modes that survive application redeployments and network reviews&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is enough to treat DNS as attack surface rather than plumbing.&lt;/p&gt;
&lt;h3 id="shared-dns-paths-broaden-trust-beyond-the-vnet"&gt;Shared DNS paths broaden trust beyond the VNet
&lt;/h3&gt;&lt;p&gt;This is where the comforting subnet diagram starts to mislead.&lt;/p&gt;
&lt;p&gt;A workload may sit in an isolated landing zone, use a locked-down subnet, and connect only to Private Endpoints. On paper, that looks tightly contained. But if name resolution depends on shared DNS services, central platform teams, hybrid resolvers, or external administrative paths, then the workload’s connectivity trust extends beyond its own network boundary.&lt;/p&gt;
&lt;p&gt;In other words, the VNet does not fully describe who influences where that workload goes.&lt;/p&gt;
&lt;p&gt;That matters in larger Azure estates because teams often assume Private Endpoint localises risk to the consuming network. In practice, DNS can reintroduce shared dependencies in ways the network design no longer makes obvious.&lt;/p&gt;
&lt;h3 id="dns-risk-is-persistent-not-a-day-0-problem"&gt;DNS risk is persistent, not a day-0 problem
&lt;/h3&gt;&lt;p&gt;Private Endpoint risk is often discussed as a provisioning concern: the endpoint is created, the record exists, the application connects, done.&lt;/p&gt;
&lt;p&gt;That is the wrong lifecycle.&lt;/p&gt;
&lt;p&gt;DNS is mutable by design. Records change. Zones move. Links are added. Resolver paths are centralised, migrated, inherited, or quietly overridden. Organisationally, ownership drifts even when infrastructure diagrams do not.&lt;/p&gt;
&lt;p&gt;That means the DNS risk attached to a Private Endpoint is not limited to initial deployment quality. It persists as long as the workload depends on that resolution path. An attacker, careless change, or platform-side drift does not need to touch the application subnet or the Private Endpoint NIC to change runtime behaviour.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;h3 id="design-review-needs-a-different-question"&gt;Design review needs a different question
&lt;/h3&gt;&lt;p&gt;During design review, the question is no longer just:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Does this workload use a Private Endpoint?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It also needs to be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Who can change where this workload believes that service lives?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is a materially different architecture question.&lt;/p&gt;
&lt;p&gt;It forces you to examine DNS ownership, zone authority, resolver dependencies, and shared platform controls as part of application connectivity trust. If those controls sit outside the workload’s intended trust boundary, then part of the workload’s security posture sits outside that boundary too.&lt;/p&gt;
&lt;h3 id="shared-services-can-quietly-centralise-influence"&gt;Shared services can quietly centralise influence
&lt;/h3&gt;&lt;p&gt;Centralised DNS often looks like operational maturity. Sometimes it is. But it also centralises the ability to change service targeting for many workloads at once.&lt;/p&gt;
&lt;p&gt;That does not automatically make centralisation wrong. It does mean the blast radius is architectural, not just administrative.&lt;/p&gt;
&lt;p&gt;If a central DNS path influences resolution for Private Endpoint-backed services across multiple landing zones, then one change path may affect systems that otherwise look isolated in network diagrams. For technical decision makers, that should change how DNS authority is classified. For operators, it should change which dependencies get examined first when failures appear inconsistent.&lt;/p&gt;
&lt;h3 id="incident-response-assumptions-need-tightening"&gt;Incident response assumptions need tightening
&lt;/h3&gt;&lt;p&gt;In incident triage, “it resolved to a private IP” should not be treated as proof that the workload reached the intended service.&lt;/p&gt;
&lt;p&gt;That assumption is too weak for Private Endpoint architectures.&lt;/p&gt;
&lt;p&gt;A private answer may still be stale, unintended, inherited from the wrong resolution path, or aligned to the wrong environment. If teams use “private IP observed” as a proxy for “trustworthy destination confirmed”, they will misdiagnose issues and overlook one of the most important control dependencies in the path.&lt;/p&gt;
&lt;p&gt;This is where the article’s thesis stops being theoretical. It changes how you investigate outages, dependency failures, and unexplained behaviour in supposedly isolated environments.&lt;/p&gt;
&lt;h2 id="a-behavioural-example"&gt;A Behavioural Example
&lt;/h2&gt;&lt;p&gt;Consider an application that retrieves secrets from Azure Key Vault through a Private Endpoint.&lt;/p&gt;
&lt;p&gt;The application team has done the expected things. Public network access is restricted. The consuming subnet can reach the Private Endpoint. Egress is tightly controlled. On a network diagram, the design looks sound.&lt;/p&gt;
&lt;p&gt;But the vault name resolves through a shared DNS path outside the application team’s direct control.&lt;/p&gt;
&lt;p&gt;A later change in that path does not need to alter routes, firewall rules, or the Private Endpoint itself to affect the application. It only needs to alter where the application believes the vault lives. The likely outcome is not dramatic movie-style interception. More often it is failed access, wrong-environment targeting, or a dependency outage that presents like an Azure networking issue even though the transport path is doing exactly what it was told.&lt;/p&gt;
&lt;p&gt;That is the operational trap: &lt;strong&gt;the application team can lose effective control of service targeting without any visible network change in its own subscription&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="private-is-not-the-same-as-correct"&gt;“Private” is not the same as “correct”
&lt;/h3&gt;&lt;p&gt;A private IP answer only tells you something about address scope. It does not prove the answer came from the intended authority or points to the intended service instance.&lt;/p&gt;
&lt;h3 id="dns-influence-is-easy-to-hide-inside-legitimate-administration"&gt;DNS influence is easy to hide inside legitimate administration
&lt;/h3&gt;&lt;p&gt;A malicious route change often looks suspicious. A DNS record change may look like normal infrastructure maintenance, especially in shared services environments.&lt;/p&gt;
&lt;h3 id="network-isolation-can-disguise-naming-dependency"&gt;Network isolation can disguise naming dependency
&lt;/h3&gt;&lt;p&gt;The more locked down the packet path becomes, the easier it is for teams to assume the remaining dependencies are benign. In Private Endpoint architectures, that assumption gets dangerous quickly.&lt;/p&gt;
&lt;h3 id="service-layer-controls-still-matter"&gt;Service-layer controls still matter
&lt;/h3&gt;&lt;p&gt;DNS influence does not automatically equal successful compromise. Authentication, authorisation, and certificate validation still shape the final outcome. But they do not make DNS irrelevant; they define how far a bad DNS outcome can propagate.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;h3 id="treat-dns-authority-as-part-of-connectivity-security"&gt;Treat DNS authority as part of connectivity security
&lt;/h3&gt;&lt;p&gt;If DNS determines which private destination a workload reaches, then DNS authority is not ancillary. It is part of the workload’s effective connectivity security model.&lt;/p&gt;
&lt;h3 id="review-change-authority-not-just-network-reachability"&gt;Review change authority, not just network reachability
&lt;/h3&gt;&lt;p&gt;Packet path reviews are not enough. You also need to understand who can change resolver behaviour, zone data, or other name-resolution dependencies that alter target selection.&lt;/p&gt;
&lt;h3 id="classify-shared-dns-services-by-blast-radius"&gt;Classify shared DNS services by blast radius
&lt;/h3&gt;&lt;p&gt;A shared resolver or private DNS authority serving multiple Private Endpoint consumers is a multi-system trust dependency. Treat it accordingly.&lt;/p&gt;
&lt;h3 id="separate-private-transport-from-trusted-destination-in-your-thinking"&gt;Separate private transport from trusted destination in your thinking
&lt;/h3&gt;&lt;p&gt;A packet can stay on a private path and still fail to reach the intended service. Those are different properties, and mature designs treat them separately.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Private Endpoint reduces exposure, but DNS still decides where trust lands. If you model Private Endpoint as the boundary and DNS as plumbing, you are securing the road while outsourcing the destination.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview" target="_blank" rel="noopener"
&gt;What is Azure Private Endpoint?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/" target="_blank" rel="noopener"
&gt;Azure Private Link documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/dns/" target="_blank" rel="noopener"
&gt;Azure DNS documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/dns/private-dns-overview" target="_blank" rel="noopener"
&gt;Azure Private DNS documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Private Endpoint Control Planes: Private Reachability Isn’t Trusted Reachability</title><link>https://blog.brewedinthecloud.com/p/pe-attacks-control-plane-risks/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/pe-attacks-control-plane-risks/</guid><description>&lt;p&gt;You can take a sensitive service off the public internet, pin it behind a Private Endpoint, and come away feeling like the trust problem is mostly solved.&lt;/p&gt;
&lt;p&gt;That feeling is exactly where the trouble starts.&lt;/p&gt;
&lt;p&gt;Private Endpoints can reduce exposure. They can narrow the network paths that reach a service. But they do not prove that the environments consuming that service privately are legitimate, or that the administrative chain which created that private path deserves trust.&lt;/p&gt;
&lt;p&gt;The real design error is not exposing a service privately. It is assuming that any environment able to consume it privately has therefore earned trust.&lt;/p&gt;
&lt;p&gt;That is a control-plane problem, not a networking success story.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption is simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a service is only reachable through a Private Endpoint, then access is effectively trusted because it is no longer public.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That assumption compresses two different questions into one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how traffic reaches the service;&lt;/li&gt;
&lt;li&gt;whether the thing reaching it should be trusted.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Private Endpoints only answer the first one.&lt;/p&gt;
&lt;p&gt;They change the path. They do not validate the consumer, the administrators who created the path, or the approval decisions that allowed it to exist. The private IP is not the trust boundary. It is the output of a series of management decisions.&lt;/p&gt;
&lt;p&gt;So the useful shift in mental model is this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;private connectivity is a routing property&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;trusted connectivity is an authority decision&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private Endpoints affect the first one, not the second&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The moment a team treats private reachability as evidence that a consumer environment has been legitimately trusted, they stop inspecting the layer where trust was actually granted.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Private Endpoint is usually discussed as if it were a networking feature with some management overhead attached.&lt;/p&gt;
&lt;p&gt;That framing is backwards.&lt;/p&gt;
&lt;p&gt;It is a control-plane object that creates a private data-plane path.&lt;/p&gt;
&lt;p&gt;That path exists only because a chain of administrative decisions makes it exist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a Private Endpoint resource is created;&lt;/li&gt;
&lt;li&gt;it is placed in a subnet within a virtual network;&lt;/li&gt;
&lt;li&gt;it references a specific Private Link-capable subresource;&lt;/li&gt;
&lt;li&gt;a connection request is raised and allowed through the target service’s approval model;&lt;/li&gt;
&lt;li&gt;DNS then enables clients to use that private path.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By the time packets flow, the trust decisions have already happened.&lt;/p&gt;
&lt;h3 id="approval-is-a-trust-decision"&gt;Approval is a trust decision
&lt;/h3&gt;&lt;p&gt;Approval is often treated as a minor workflow event. It is not. It is the point at which a service owner, delegated operator, or service-specific approval path allows a particular consumer environment to establish private reachability.&lt;/p&gt;
&lt;p&gt;That is a trust decision.&lt;/p&gt;
&lt;p&gt;It is also one of the reasons Private Endpoint can be over-trusted architecturally. The assurance conveyed by a successful private connection is not perfectly uniform across Azure services or ownership models. Teams generalise from one service pattern to another, see a working private path, and assume it carries the same trust meaning everywhere. It does not.&lt;/p&gt;
&lt;p&gt;If your architecture treats “connected privately” as if it implied a consistent trust posture across services, you are relying on a certainty the platform does not actually provide.&lt;/p&gt;
&lt;h3 id="the-endpoint-and-the-service-do-not-share-the-same-ownership-story"&gt;The endpoint and the service do not share the same ownership story
&lt;/h3&gt;&lt;p&gt;A Private Endpoint is a separate Azure resource. It can live in a different resource group, subscription, or operating domain from the service it connects to.&lt;/p&gt;
&lt;p&gt;That is not just an implementation detail. It means the protected service and the private path to it can have different lifecycle owners, different administrative scopes, and different review habits.&lt;/p&gt;
&lt;p&gt;This is the point many reviews miss: hardening the service does not tell you enough if someone else can still instantiate and retain private reachability to it.&lt;/p&gt;
&lt;h3 id="administrative-separation-is-not-trusted-separation"&gt;Administrative separation is not trusted separation
&lt;/h3&gt;&lt;p&gt;Subscriptions and resource groups are useful operational boundaries. They are not evidence of trustworthy separation by themselves.&lt;/p&gt;
&lt;p&gt;If the same administrators, inherited permissions, or approval practices can still bridge those scopes through management actions, then the boundary is structural, not trustworthy.&lt;/p&gt;
&lt;p&gt;This is the design mistake that shows up repeatedly in Azure estates: teams see separate subscriptions and infer separate trust. In reality, they have reviewed layout, not authority.&lt;/p&gt;
&lt;h2 id="trust-flow-not-just-packet-flow"&gt;Trust Flow, Not Just Packet Flow
&lt;/h2&gt;&lt;p&gt;The control-plane risk is easier to see when the trust relationships are explicit.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Identity with Private Endpoint management access] --&gt; B[Create or modify Private Endpoint]
B --&gt; C[Consumer VNet and subnet placement]
B --&gt; D[Connection request to target resource]
D --&gt; E[Service-specific approval path]
E --&gt; F[Private connectivity established]
F --&gt; G[Private DNS mapping]
G --&gt; H[Client workload uses private path]
I[Platform admin] --&gt; C
J[DNS admin] --&gt; G
&lt;/div&gt;
&lt;p&gt;The interesting part is not where the packets flow. It is where trust gets asserted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the identity allowed to create the endpoint;&lt;/li&gt;
&lt;li&gt;the team controlling the subnet where it lands;&lt;/li&gt;
&lt;li&gt;the approval path for the target resource;&lt;/li&gt;
&lt;li&gt;the DNS authority that makes the path usable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If those actors sit in different places, with different review standards, then “internal-only access” is really the product of several loosely connected trust decisions.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This changes how you should interpret private connectivity in production.&lt;/p&gt;
&lt;h3 id="private-access-does-not-prove-the-consumer-was-ever-properly-vouched-for"&gt;Private access does not prove the consumer was ever properly vouched for
&lt;/h3&gt;&lt;p&gt;A service may be reachable only over Private Endpoint and still be exposed to environments that were never meaningfully validated as legitimate consumers.&lt;/p&gt;
&lt;p&gt;That is the central operational mistake: teams use private reachability as a proxy for consumer legitimacy.&lt;/p&gt;
&lt;p&gt;The path is private. The trust judgement behind it may be weak, inherited, stale, or simply assumed.&lt;/p&gt;
&lt;h3 id="service-owners-can-lose-control-of-access-without-changing-the-service"&gt;Service owners can lose control of access without changing the service
&lt;/h3&gt;&lt;p&gt;If endpoint creation, subnet placement, approval, and DNS are controlled by different operating groups, then access can expand without the target service configuration changing in any obvious way.&lt;/p&gt;
&lt;p&gt;That means a service can look hardened while the practical conditions of who can reach it are being altered elsewhere.&lt;/p&gt;
&lt;h3 id="drift-preserves-trust-long-after-intent-disappears"&gt;Drift preserves trust long after intent disappears
&lt;/h3&gt;&lt;p&gt;A stale Private Endpoint is not just a clean-up problem. It can preserve private access from an environment that has been retired, repurposed, handed to another team, or no longer deserves the implied trust of a live private path.&lt;/p&gt;
&lt;p&gt;Most control-plane risk does not arrive dramatically. It lingers.&lt;/p&gt;
&lt;h3 id="how-would-this-change-something-i-design-deploy-or-operate"&gt;How would this change something I design, deploy, or operate?
&lt;/h3&gt;&lt;p&gt;It should change your review posture.&lt;/p&gt;
&lt;p&gt;Do not stop at “is this service private?” Ask which identities, teams, and approval paths can create or preserve private reachability to it. If the answer depends on administrative sprawl, inherited control, or assumptions about what “internal” means, then the architecture is trusting more than it intends.&lt;/p&gt;
&lt;h2 id="abuse-scenarios-that-matter"&gt;Abuse Scenarios That Matter
&lt;/h2&gt;&lt;p&gt;The risk is not endpoint creation in isolation. The risk appears when endpoint creation, placement into a reachable network, service approval, and usable name resolution combine into a private path that looks legitimate simply because it works.&lt;/p&gt;
&lt;h3 id="a-consumer-environment-gains-a-private-path-it-was-never-meant-to-have"&gt;A consumer environment gains a private path it was never meant to have
&lt;/h3&gt;&lt;p&gt;An operator creates a Private Endpoint into a subnet already reachable by workloads they control. The target service connection is then approved through a weak or overly routine process, and the necessary DNS conditions are in place for those workloads to resolve the service privately.&lt;/p&gt;
&lt;p&gt;Nothing has become public. But a new trusted-looking path now exists from an environment nobody properly vouched for.&lt;/p&gt;
&lt;h3 id="approval-becomes-habit-instead-of-judgement"&gt;Approval becomes habit instead of judgement
&lt;/h3&gt;&lt;p&gt;A team responsible for approving Private Endpoint connections sees requests from “internal” subscriptions and treats them as normal by default. The endpoint is private, the naming looks familiar, and the approval goes through without a real question being asked about whether that consumer environment should have reachability at all.&lt;/p&gt;
&lt;p&gt;That is not a tooling problem. It is trust being inferred from private placement.&lt;/p&gt;
&lt;h3 id="old-environments-retain-private-access-by-inertia"&gt;Old environments retain private access by inertia
&lt;/h3&gt;&lt;p&gt;An application is migrated or retired, but the Private Endpoint remains, DNS still resolves, and the consumer network is still reachable. The original service owner assumes the old path was cleaned up. The platform team assumes the service owner still needs it.&lt;/p&gt;
&lt;p&gt;No one is actively deciding to trust the path. The trust simply never got revoked.&lt;/p&gt;
&lt;h2 id="implementation-example"&gt;Implementation Example
&lt;/h2&gt;&lt;p&gt;This is not a deployment guide, but the resource shape is useful because it exposes where the control-plane split actually lives.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/privateEndpoints@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;pe-app-sql-prod&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-network-prod/providers/Microsoft.Network/virtualNetworks/vnet-hub-prod/subnets/snet-private-endpoints&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateLinkServiceConnections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;sqlConnection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateLinkServiceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-data-prod/providers/Microsoft.Sql/servers/sql-prod-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupIds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;sqlServer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;requestMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Prod application connectivity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The useful part is not the syntax. It is what the object tells you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the endpoint lives in its own management scope;&lt;/li&gt;
&lt;li&gt;the subnet is controlled separately;&lt;/li&gt;
&lt;li&gt;the target service may sit under different ownership;&lt;/li&gt;
&lt;li&gt;the connection request is a trust event before it is a traffic path.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is why “the service is private” is not enough. The service may be private while the authority to create private reachability sits in a different part of the estate entirely.&lt;/p&gt;
&lt;p&gt;You can also inspect Private Endpoint connection state directly:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network private-endpoint-connection list &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --id &lt;span class="s2"&gt;&amp;#34;/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-data-prod/providers/Microsoft.Sql/servers/sql-prod-01&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --query &lt;span class="s2"&gt;&amp;#34;[].{name:name,status:properties.privateLinkServiceConnectionState.status,description:properties.privateLinkServiceConnectionState.description}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The command matters less than the discipline behind it. If you are not looking at which consumers have private connectivity to a service, you are trusting historical approvals more than current intent.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="working-connectivity-can-disguise-poor-trust-decisions"&gt;Working connectivity can disguise poor trust decisions
&lt;/h3&gt;&lt;p&gt;Once a name resolves privately and the application works, the path starts to feel legitimate by default. But functional connectivity is not proof that the consumer environment was ever supposed to be trusted.&lt;/p&gt;
&lt;h3 id="inconsistent-service-behaviour-creates-false-assumptions"&gt;Inconsistent service behaviour creates false assumptions
&lt;/h3&gt;&lt;p&gt;Private Endpoint approval and ownership patterns vary across Azure services. The risk is not just operational complexity. It is that teams assume a consistent trust model where none exists.&lt;/p&gt;
&lt;h3 id="persistence-is-often-the-bigger-problem-than-deletion"&gt;Persistence is often the bigger problem than deletion
&lt;/h3&gt;&lt;p&gt;Accidental deletion creates incidents, so it gets attention. Quietly persistent connectivity is often more dangerous because it preserves trust without forcing anyone to rejustify it.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;This is not a role design or privileged workflow post, so I will stay out of RBAC mechanics. The practical design implications are still clear.&lt;/p&gt;
&lt;h3 id="treat-private-endpoint-creation-as-a-security-relevant-action"&gt;Treat Private Endpoint creation as a security-relevant action
&lt;/h3&gt;&lt;p&gt;Creating a Private Endpoint can extend private reachability to a sensitive service without changing the service configuration itself. That alone makes it worth treating as more than routine network plumbing.&lt;/p&gt;
&lt;h3 id="review-private-consumers-not-just-protected-services"&gt;Review private consumers, not just protected services
&lt;/h3&gt;&lt;p&gt;A service review is incomplete if it asks only how the service is protected and never asks who can privately attach to it.&lt;/p&gt;
&lt;h3 id="treat-subscription-boundaries-as-operational-structure-not-proof-of-trust"&gt;Treat subscription boundaries as operational structure, not proof of trust
&lt;/h3&gt;&lt;p&gt;If the same management actors can still bridge those boundaries, then the separation may be useful administratively while meaningless from a trust perspective.&lt;/p&gt;
&lt;h3 id="make-one-question-unavoidable-in-design-review"&gt;Make one question unavoidable in design review
&lt;/h3&gt;&lt;p&gt;For any sensitive service exposed through Private Endpoint, ask:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Which identities, teams, and approval paths can create, approve, or preserve private reachability to this service, and why should that imply trust in the consuming environment?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If that question is difficult to answer, the trust model is weaker than the network diagram suggests.&lt;/p&gt;
&lt;h3 id="design-lifecycle-ownership-into-the-path-itself"&gt;Design lifecycle ownership into the path itself
&lt;/h3&gt;&lt;p&gt;Private connectivity should have a clear owner, reason for existence, and review trigger. Otherwise, it becomes part of the environment’s inherited internal attack surface.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Private Endpoints are good at making traffic private. They are useless as proof that the private consumer has earned trust. Once private reachability gets mistaken for trusted reachability, the control plane becomes the part of the attack surface nobody is watching.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview" target="_blank" rel="noopener"
&gt;Azure Private Endpoint documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-link-overview" target="_blank" rel="noopener"
&gt;What is Azure Private Link?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/manage-private-endpoint" target="_blank" rel="noopener"
&gt;Manage a private endpoint connection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-resource-manager/management/overview" target="_blank" rel="noopener"
&gt;Azure resource management overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/security-considerations" target="_blank" rel="noopener"
&gt;Private Link security considerations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Why “Private” Does Not Mean “Secure”</title><link>https://blog.brewedinthecloud.com/p/pe-attacks-private-does-not-mean-secure/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/pe-attacks-private-does-not-mean-secure/</guid><description>&lt;p&gt;Private Endpoint has a branding problem.&lt;/p&gt;
&lt;p&gt;The word &lt;em&gt;private&lt;/em&gt; lands in architecture discussions like a shortcut for &lt;em&gt;safe&lt;/em&gt;. Public access is removed, the service gets a private IP, and somewhere between design review and production rollout, reduced exposure gets mistaken for established trust.&lt;/p&gt;
&lt;p&gt;That is the mistake.&lt;/p&gt;
&lt;p&gt;A private endpoint is useful. Often very useful. But if your security posture improves mainly because you made something harder to reach from the internet, you have changed exposure, not proven safety. You have narrowed the path, not validated the caller, the dependency chain, or the operational control around it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Private Endpoint reduces exposure; it does not create trust.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is the lens for this post.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The failure usually starts with a quiet assumption:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a resource is reachable only over private connectivity, it is now a trusted internal service.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That assumption sounds reasonable because private addressing still carries a lot of inherited meaning. It feels contained. Managed. Ours.&lt;/p&gt;
&lt;p&gt;In Azure, that is a dangerous shortcut.&lt;/p&gt;
&lt;p&gt;Private Endpoint changes &lt;strong&gt;where traffic can come from&lt;/strong&gt;. It does not answer whether the source is legitimate, whether the network path is well governed, whether DNS is correct, or whether the service is being reached by something already compromised.&lt;/p&gt;
&lt;p&gt;The deeper problem is not technical misunderstanding. It is classification.&lt;/p&gt;
&lt;p&gt;When teams treat Private Endpoint as a &lt;strong&gt;security control in its own right&lt;/strong&gt;, they start making downstream design decisions as though network privateness is evidence of trust. That is where architecture drifts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;internal paths become loosely trusted&lt;/li&gt;
&lt;li&gt;segmentation becomes harder to justify&lt;/li&gt;
&lt;li&gt;DNS gets treated as plumbing instead of a security dependency&lt;/li&gt;
&lt;li&gt;control-plane permissions become more powerful than the design admits&lt;/li&gt;
&lt;li&gt;monitoring gets weaker because “private” has already been mentally filed under “safe”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is why this is more than semantics. Misclassifying the control changes the system built around it.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Private Endpoint gives an Azure service a private IP in your virtual network through Azure Private Link. That changes the &lt;strong&gt;reachability path&lt;/strong&gt; to the service.&lt;/p&gt;
&lt;p&gt;It does not make the service inherently trustworthy.
It does not validate the caller.
It does not harden the data path on its own.
It does not replace authentication, authorisation, encryption, governance, or operational verification.&lt;/p&gt;
&lt;p&gt;What it does do is narrow the set of places from which the service can be reached.&lt;/p&gt;
&lt;p&gt;That matters. Exposure reduction is real. Internet-wide scanning, casual probing, and broad unsolicited connectivity become less relevant when access is forced through private network paths. That is a legitimate security improvement.&lt;/p&gt;
&lt;p&gt;But it is still only one kind of improvement.&lt;/p&gt;
&lt;p&gt;The mistake is turning this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fewer things can reach the service&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;into this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Things that can reach the service are now trustworthy&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those are completely different claims.&lt;/p&gt;
&lt;p&gt;A more accurate model is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Private Endpoint is an exposure-reduction mechanism&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It is not a trust mechanism&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It is not a security boundary&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It should not be treated as a compensating control for weak architecture elsewhere&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last point matters most. The architectural mistake is not deploying Private Endpoint. The mistake is using it to justify trust decisions it was never designed to support.&lt;/p&gt;
&lt;h2 id="private-endpoint-as-part-of-the-attack-surface"&gt;Private Endpoint as Part of the Attack Surface
&lt;/h2&gt;&lt;p&gt;If you are threat modelling properly, a Private Endpoint should be treated as part of the &lt;strong&gt;internal attack surface&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That means the question is not “is this service private now?”&lt;/p&gt;
&lt;p&gt;It is closer to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which networks can route to it?&lt;/li&gt;
&lt;li&gt;which systems can resolve its name?&lt;/li&gt;
&lt;li&gt;which workloads can reach it after compromise?&lt;/li&gt;
&lt;li&gt;which teams or automation can create, approve, or modify the connection path?&lt;/li&gt;
&lt;li&gt;which changes to DNS or endpoint lifecycle would silently alter trust assumptions?&lt;/li&gt;
&lt;li&gt;which telemetry would tell us the endpoint is being used in a way we did not intend?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is a very different posture from “public access disabled, job done”.&lt;/p&gt;
&lt;h3 id="the-dependency-chain-is-the-story"&gt;The dependency chain is the story
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
A[Workload or User] --&gt; B[DNS Resolution]
B --&gt; C[Routing to Private IP]
C --&gt; D[Private Endpoint]
D --&gt; E[Private Link Mapping]
E --&gt; F[Azure Service]
G[Peering / Hybrid Connectivity] --&gt; C
H[RBAC / Policy / Approval Workflow] --&gt; D
I[Private DNS Zone Links / Forwarders] --&gt; B
J[Monitoring / Logs / Alerts] --&gt; D
style D fill:#d9edf7,stroke:#31708f,stroke-width:2px
style B fill:#fcf8e3,stroke:#8a6d3b,stroke-width:1px
style H fill:#f2dede,stroke:#a94442,stroke-width:1px
style I fill:#f2dede,stroke:#a94442,stroke-width:1px
&lt;/div&gt;
&lt;p&gt;Private Endpoint is only one component in a chain that includes name resolution, network pathing, control-plane permissions, and ongoing operational ownership.&lt;/p&gt;
&lt;p&gt;An attacker does not need to defeat Private Link itself. They need one viable path through the surrounding system.&lt;/p&gt;
&lt;p&gt;That is why calling Private Endpoint a security control is too generous. It encourages the wrong mental model about where assurance actually comes from.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This changes design and operations in some concrete ways.&lt;/p&gt;
&lt;h2 id="1-a-compromised-internal-workload-can-still-use-the-private-path"&gt;1. A compromised internal workload can still use the private path
&lt;/h2&gt;&lt;p&gt;A storage account or Key Vault behind a Private Endpoint is still reachable by any compromised workload that can route and resolve to it.&lt;/p&gt;
&lt;p&gt;If you mentally classified the endpoint as “secure because private”, you are more likely to have under-invested in segmentation, workload isolation, or internal traffic scrutiny. The attacker does not need public ingress. They just need to land somewhere that already sits inside the allowed path.&lt;/p&gt;
&lt;p&gt;This is the most common failure of the “private equals safe” assumption: the service is no longer internet-facing, but it is still entirely usable from the wrong place for the wrong reason.&lt;/p&gt;
&lt;p&gt;That should change how you design. A Private Endpoint should be treated as a &lt;strong&gt;sensitive internal destination&lt;/strong&gt;, not a trustworthy one.&lt;/p&gt;
&lt;h2 id="2-dns-becomes-a-security-dependency-not-just-a-networking-detail"&gt;2. DNS becomes a security dependency, not just a networking detail
&lt;/h2&gt;&lt;p&gt;Private Endpoint increases your reliance on private DNS zones, forwarding rules, resolver paths, and link governance.&lt;/p&gt;
&lt;p&gt;That is not background plumbing. It is part of the trust path.&lt;/p&gt;
&lt;p&gt;If DNS ownership is fragmented, forwarding is inconsistent, or zone links are changed without proper control, the architecture can drift without most teams noticing. The service still looks private. The assumptions around how it is resolved and reached may no longer be true.&lt;/p&gt;
&lt;p&gt;This should change how you operate. Name resolution for private services needs explicit ownership, change discipline, and verification. If your design depends on DNS but your operating model treats it as somebody else’s problem, you do not have a complete security design.&lt;/p&gt;
&lt;h2 id="3-control-plane-permissions-can-silently-reshape-trust"&gt;3. Control-plane permissions can silently reshape trust
&lt;/h2&gt;&lt;p&gt;The endpoint itself is a data-plane object, but the trust around it is heavily influenced by control-plane actions.&lt;/p&gt;
&lt;p&gt;Who can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;create a private endpoint&lt;/li&gt;
&lt;li&gt;approve a connection&lt;/li&gt;
&lt;li&gt;link or unlink private DNS zones&lt;/li&gt;
&lt;li&gt;alter policy exemptions&lt;/li&gt;
&lt;li&gt;move workloads into reachable network segments&lt;/li&gt;
&lt;li&gt;change routing or forwarding behaviour&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those permissions matter because they can alter who reaches what, and how, without changing the application code or the service itself.&lt;/p&gt;
&lt;p&gt;If Private Endpoint is treated as a security control, teams often stop short of asking who can mutate the control surface around it. That creates false assurance. The path is private, but the governance over the path may still be loose.&lt;/p&gt;
&lt;p&gt;This should change what you review in design governance. The security question is not just “does this use Private Endpoint?” but “who can change the path, resolution, and approval model around it?”&lt;/p&gt;
&lt;h2 id="how-would-this-change-something-i-design-deploy-or-operate"&gt;How would this change something I design, deploy, or operate?
&lt;/h2&gt;&lt;p&gt;It changes the classification.&lt;/p&gt;
&lt;p&gt;I would not treat Private Endpoint as a control that establishes trust. I would treat it as an &lt;strong&gt;exposure-reduction mechanism&lt;/strong&gt; that still sits inside a broader system of trust decisions.&lt;/p&gt;
&lt;p&gt;That means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;designing internal reachability as something to constrain, not automatically trust&lt;/li&gt;
&lt;li&gt;treating private DNS as part of the security architecture&lt;/li&gt;
&lt;li&gt;reviewing control-plane permissions as part of endpoint risk&lt;/li&gt;
&lt;li&gt;monitoring private-only service access as potentially high-signal, not low-risk&lt;/li&gt;
&lt;li&gt;refusing to let “it’s private” close a design discussion that should still include governance and failure modes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the design review ends at “public access disabled”, it has ended too early.&lt;/p&gt;
&lt;h2 id="implementation-example-verify-the-dependency-surface-not-just-the-endpoint"&gt;Implementation Example: Verify the Dependency Surface, Not Just the Endpoint
&lt;/h2&gt;&lt;p&gt;The useful operational question is rarely “does a Private Endpoint exist?”&lt;/p&gt;
&lt;p&gt;It is more often “what trust and dependency surface now exists because it does?”&lt;/p&gt;
&lt;p&gt;A simple example is enumerating endpoint state and DNS relationships so they can be reviewed as part of operational governance rather than assumed to be correct.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List private endpoints in a subscription with key governance context&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network private-endpoint list &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --query &lt;span class="s2"&gt;&amp;#34;[].{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; name:name,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; resourceGroup:resourceGroup,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; location:location,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; subnet:id,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; connections:privateLinkServiceConnections[].privateLinkServiceId,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; nics:networkInterfaces[].id,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; provisioningState:provisioningState
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; }&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; -o table
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List Private DNS zone links for review&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network private-dns link vnet list &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group &amp;lt;dns-rg&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --zone-name &amp;lt;private-zone-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; -o table
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is not presented as a deployment step. It is a reminder that the operational surface includes more than the endpoint object itself. If you cannot quickly identify which endpoints exist, which networks they live in, and how DNS is linked around them, you are relying on privateness more than you are governing it.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="private-only-can-reduce-visibility-if-teams-are-not-deliberate"&gt;Private-only can reduce visibility if teams are not deliberate
&lt;/h3&gt;&lt;p&gt;Some organisations monitor internet-facing services heavily and assume private paths are lower risk. That can create a blind spot where the more sensitive destination gets less scrutiny simply because it is no longer public.&lt;/p&gt;
&lt;h3 id="internal-often-spans-more-than-one-trust-domain"&gt;“Internal” often spans more than one trust domain
&lt;/h3&gt;&lt;p&gt;Peering, hub-and-spoke topologies, hybrid connectivity, and shared platform services can all widen effective reachability. If your architecture talks about “the internal network” as though it were one trust zone, you are already abstracting away the problem.&lt;/p&gt;
&lt;h3 id="exposure-reduction-can-still-be-the-right-call"&gt;Exposure reduction can still be the right call
&lt;/h3&gt;&lt;p&gt;None of this is an argument against Private Endpoint. Reducing public exposure is often sensible and worthwhile. The warning is about over-claiming what that decision buys you.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat Private Endpoint as &lt;strong&gt;exposure reduction&lt;/strong&gt;, not trust establishment&lt;/li&gt;
&lt;li&gt;Model private DNS as a security dependency with explicit ownership&lt;/li&gt;
&lt;li&gt;Review which internal networks and workloads can actually reach private endpoints&lt;/li&gt;
&lt;li&gt;Include control-plane permissions and approval paths in the threat model&lt;/li&gt;
&lt;li&gt;Monitor access to private-only services as part of your internal attack surface&lt;/li&gt;
&lt;li&gt;Challenge any design language that treats “private” as equivalent to “trusted”&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Private Endpoint is valuable precisely because it reduces exposure. The trouble starts when that benefit gets inflated into a trust claim. Once “private” becomes shorthand for “safe”, the rest of the architecture starts inheriting confidence it never earned.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview" target="_blank" rel="noopener"
&gt;What is Azure Private Endpoint?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-link-overview" target="_blank" rel="noopener"
&gt;What is Azure Private Link?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/dns/private-dns-overview" target="_blank" rel="noopener"
&gt;Azure Private DNS documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/hub-spoke" target="_blank" rel="noopener"
&gt;Azure architecture guidance for hub-spoke network topology&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Designing Networks That Fail Predictably</title><link>https://blog.brewedinthecloud.com/p/network-fails-designing-predictability/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/network-fails-designing-predictability/</guid><description>&lt;p&gt;Every network fails eventually.&lt;/p&gt;
&lt;p&gt;Sometimes it’s physical. Sometimes it’s logical. Often it’s self‑inflicted, a containment rule pushed with the best intentions that quietly turns into a kill switch.&lt;/p&gt;
&lt;p&gt;The difference between a survivable incident and a chaotic one isn’t whether the network failed. It’s whether the failure behaved the way you &lt;em&gt;expected&lt;/em&gt; it to.&lt;/p&gt;
&lt;p&gt;Predictable failure isn’t about being pessimistic. It’s about staying in control when parts of the system are no longer trustworthy.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
“If we design enough resilience and security into the network, failure becomes unlikely and manageable when it happens.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Resilience delays failure; it doesn’t define its shape.&lt;/p&gt;
&lt;p&gt;As Azure networks grow, they accumulate invisible dependencies: centralised inspection, forced tunnelling, identity‑driven policy, platform service reachability. Under stress, those dependencies don’t fail cleanly. They fail &lt;em&gt;asymmetrically&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Some flows work. Others silently die. And the controls meant to protect you become the fastest way to lose visibility and access.&lt;/p&gt;
&lt;p&gt;Predictable failure starts by accepting that &lt;strong&gt;not all controls deserve to survive an incident&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In real incidents, containment actions usually remove connectivity faster than they restore clarity.&lt;/p&gt;
&lt;p&gt;The most common pattern looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Suspicious activity is detected&lt;/li&gt;
&lt;li&gt;Egress is tightly constrained or forced through central inspection&lt;/li&gt;
&lt;li&gt;A dependency breaks DNS, identity, logging, update paths&lt;/li&gt;
&lt;li&gt;Defender access degrades alongside attacker access&lt;/li&gt;
&lt;li&gt;The network is now “secure” but unmanaged&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Azure doesn’t distinguish between &lt;em&gt;defensive isolation&lt;/em&gt; and &lt;em&gt;self‑denial&lt;/em&gt;. The platform will happily enforce whatever policy you give it, even if that policy collapses your ability to respond.&lt;/p&gt;
&lt;p&gt;Designing for predictable failure means deciding &lt;strong&gt;which capabilities must outlive containment&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This changes how you design, deploy, and operate networks in a very practical way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You stop treating centralised egress inspection as an invariant&lt;/li&gt;
&lt;li&gt;You explicitly prioritise &lt;strong&gt;defender access and telemetry&lt;/strong&gt; over uniform traffic control&lt;/li&gt;
&lt;li&gt;You design containment to &lt;em&gt;reduce attacker capability first&lt;/em&gt;, not &lt;em&gt;remove all connectivity&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;You accept that some security controls are conditional, not absolute&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key shift: &lt;strong&gt;losing inspection is survivable; losing control is not&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="designing-for-controlled-degradation"&gt;Designing for Controlled Degradation
&lt;/h2&gt;&lt;h3 id="1-fail-closed-at-trust-boundaries-not-at-egress"&gt;1. Fail Closed at Trust Boundaries, Not at Egress
&lt;/h3&gt;&lt;p&gt;Under stress, the first thing you should be willing to lose is &lt;em&gt;cross‑trust communication&lt;/em&gt;, not operator reachability.&lt;/p&gt;
&lt;p&gt;That means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;East‑west traffic between trust zones fails before north‑south management access&lt;/li&gt;
&lt;li&gt;Isolation targets workloads, not the paths used to observe and recover them&lt;/li&gt;
&lt;li&gt;Containment reduces blast radius without collapsing the control plane&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Centralised egress inspection is valuable, until it becomes the narrowest choke point in the system.&lt;/p&gt;
&lt;h3 id="2-intentionally-relax-centralised-egress-inspection-during-containment"&gt;2. Intentionally Relax Centralised Egress Inspection During Containment
&lt;/h3&gt;&lt;p&gt;This is the uncomfortable trade‑off.&lt;/p&gt;
&lt;p&gt;In a containment scenario, it is often safer to temporarily allow &lt;strong&gt;direct workload egress&lt;/strong&gt; than to enforce forced tunnelling through a brittle inspection path.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Forced egress concentrates failure into a single dependency&lt;/li&gt;
&lt;li&gt;When that dependency degrades, logging, updates, and identity often follow&lt;/li&gt;
&lt;li&gt;Defender access and telemetry are frequently collateral damage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is not an argument against inspection. It’s an argument against treating it as non‑negotiable during failure.&lt;/p&gt;
&lt;p&gt;Predictable failure means being explicit about this ordering:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I am willing to lose uniform egress inspection before I am willing to lose defender access, telemetry, or recovery paths.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="3-preserve-defender-control-paths-at-all-costs"&gt;3. Preserve Defender Control Paths at All Costs
&lt;/h3&gt;&lt;p&gt;If a containment action can sever:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bastion or jump host access&lt;/li&gt;
&lt;li&gt;Break‑glass identities&lt;/li&gt;
&lt;li&gt;Log and alert egress&lt;/li&gt;
&lt;li&gt;Platform management endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…then it’s not a security control, it’s a denial‑of‑service against your own responders.&lt;/p&gt;
&lt;p&gt;Defender paths should be &lt;strong&gt;architecturally boring&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Minimal dependencies&lt;/li&gt;
&lt;li&gt;Few enforcement layers&lt;/li&gt;
&lt;li&gt;Hard to accidentally include in broad deny rules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If these paths disappear during containment, the network has failed &lt;em&gt;chaotically&lt;/em&gt;, regardless of how “secure” it looks.&lt;/p&gt;
&lt;h2 id="implementation-example-encoding-failure-order-with-nsgs"&gt;Implementation Example: Encoding Failure Order with NSGs
&lt;/h2&gt;&lt;p&gt;This example is intentionally simple. It’s not a pattern to copy wholesale, it’s a way to encode &lt;strong&gt;failure intent&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workloadNsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2023-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nsg-workload-zone&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Allow trusted intra-zone traffic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-IntraZone&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.20.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Default deny for cross-zone traffic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny-CrossZone&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualNetwork&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;What this demonstrates:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Failure occurs first at trust boundaries&lt;/li&gt;
&lt;li&gt;Intra‑zone operation continues&lt;/li&gt;
&lt;li&gt;Containment is explicit and reversible&lt;/li&gt;
&lt;li&gt;The network degrades along known seams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NSGs alone won’t save you but encoding &lt;em&gt;failure order&lt;/em&gt; in policy forces architectural clarity.&lt;/p&gt;
&lt;h2 id="visualising-predictable-failure"&gt;Visualising Predictable Failure
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
subgraph Management
Admins
Bastion
end
subgraph ZoneA["Workload Zone A"]
AppA
end
subgraph ZoneB["Workload Zone B"]
AppB
end
Admins --&gt; Bastion --&gt; ZoneA
Admins --&gt; Bastion --&gt; ZoneB
ZoneA -.isolated first.-x ZoneB
&lt;/div&gt;
&lt;p&gt;When containment is applied:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workload‑to‑workload trust is severed&lt;/li&gt;
&lt;li&gt;Management access remains intact&lt;/li&gt;
&lt;li&gt;Egress inspection may be relaxed to preserve visibility&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s not weakness, that’s control.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Relaxing egress inspection &lt;strong&gt;does increase short‑term risk&lt;/strong&gt; that risk must be bounded and time‑limited&lt;/li&gt;
&lt;li&gt;Attackers may attempt to exploit relaxed paths but defender lockout is usually worse&lt;/li&gt;
&lt;li&gt;Platform dependencies (DNS, identity, logging) often bypass intended failure order&lt;/li&gt;
&lt;li&gt;“Temporary” containment rules have a habit of becoming permanent scars&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Predictable failure requires ongoing review, not just good intent.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Decide and document &lt;strong&gt;which control fails first&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Treat centralised inspection as conditional under stress&lt;/li&gt;
&lt;li&gt;Keep defender access paths simple and isolated&lt;/li&gt;
&lt;li&gt;Avoid deep dependency chains in security enforcement&lt;/li&gt;
&lt;li&gt;Assume containment will be executed by tired humans&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If your network only behaves safely when every control is intact, it isn’t resilient, it’s fragile. Predictable failure means choosing control over coverage when it matters most.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/network-security-groups-overview" target="_blank" rel="noopener"
&gt;Azure Network Security Groups – Concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/framework/security/design-network-segmentation" target="_blank" rel="noopener"
&gt;Design network segmentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/network-best-practices" target="_blank" rel="noopener"
&gt;Azure security best practices for network isolation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>When Your Network Trust Model Stops Matching Your Org Chart</title><link>https://blog.brewedinthecloud.com/p/network-fails-misaligned-trust-boundaries-cloud-networks/</link><pubDate>Thu, 28 May 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/network-fails-misaligned-trust-boundaries-cloud-networks/</guid><description>&lt;p&gt;If you’re in an airport or café, you don’t join every open Wi‑Fi network just because your laptop can see it.&lt;/p&gt;
&lt;p&gt;You make a trust decision often subconsciously about &lt;em&gt;which&lt;/em&gt; networks you’re willing to attach yourself to.&lt;/p&gt;
&lt;p&gt;In Azure networking, we routinely forget that same rule.&lt;/p&gt;
&lt;p&gt;VNets get peered. Shared services get connected. Temporary exceptions become permanent.&lt;br&gt;
Connectivity is established and trust quietly follows, whether anyone intended it or not.&lt;/p&gt;
&lt;p&gt;This post is about what happens when &lt;strong&gt;organisational trust&lt;/strong&gt; and &lt;strong&gt;network trust&lt;/strong&gt; stop lining up and why that gap becomes a long‑term security failure mode.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Subscriptions, VNets, and peering boundaries reflect how much we trust different teams and workloads.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Azure networking has no concept of &lt;em&gt;intentional trust&lt;/em&gt;. It only understands &lt;em&gt;reachability&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If two networks can communicate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trust exists&lt;/li&gt;
&lt;li&gt;Authority exists&lt;/li&gt;
&lt;li&gt;Blast radius exists&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whether that aligns with how your organisation actually thinks about risk is irrelevant to the platform.&lt;/p&gt;
&lt;p&gt;Just like Wi‑Fi, the network won’t stop you joining something unsafe it assumes you meant to.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;VNet peering itself is &lt;strong&gt;not technically transitive&lt;/strong&gt;. Azure won’t magically forward traffic through multiple peerings.&lt;/p&gt;
&lt;p&gt;But &lt;strong&gt;trust becomes transitive in practice&lt;/strong&gt; through three mechanisms:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Routing&lt;/strong&gt;&lt;br&gt;
Once networks can exchange routes, traffic paths emerge that were never explicitly designed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Name resolution&lt;/strong&gt;&lt;br&gt;
Shared or linked Private DNS zones turn reachability into discoverability a subtle but powerful trust signal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shared platform services&lt;/strong&gt;&lt;br&gt;
Firewalls, Bastion, jump hosts, monitoring agents, outbound NAT these services often sit &lt;em&gt;inside&lt;/em&gt; a network that everyone peers to.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Azure does not distinguish between:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“I trust this network with production data”&lt;/li&gt;
&lt;li&gt;“I just needed DNS during a migration”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Connectivity is connectivity. Trust is implied.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="1-shared-services-vnets-become-trust-authorities"&gt;1. Shared Services VNets Become Trust Authorities
&lt;/h3&gt;&lt;p&gt;A shared services VNet is often described as “just plumbing”.&lt;/p&gt;
&lt;p&gt;In reality, once it is broadly peered, it becomes part of your &lt;strong&gt;security boundary&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Anything that can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resolve names&lt;/li&gt;
&lt;li&gt;Route traffic&lt;/li&gt;
&lt;li&gt;Enforce (or bypass) inspection&lt;/li&gt;
&lt;li&gt;Act as an administrative entry point&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…is no longer neutral infrastructure. It is trusted.&lt;/p&gt;
&lt;p&gt;This is not inherently wrong but it is frequently &lt;strong&gt;unacknowledged&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="2-trust-outlives-the-reason-it-was-granted"&gt;2. Trust Outlives the Reason It Was Granted
&lt;/h3&gt;&lt;p&gt;Most peerings are created for good reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Migrations&lt;/li&gt;
&lt;li&gt;Platform integrations&lt;/li&gt;
&lt;li&gt;Temporary access&lt;/li&gt;
&lt;li&gt;“We’ll clean this up later”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problem is not the decision, it’s the lack of an expiry.&lt;/p&gt;
&lt;p&gt;Years later:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Teams have changed&lt;/li&gt;
&lt;li&gt;Workloads have been repurposed&lt;/li&gt;
&lt;li&gt;Environments have shifted criticality&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The network still enforces yesterday’s trust model with today’s consequences.&lt;/p&gt;
&lt;h3 id="3-subscription-boundaries-provide-false-comfort"&gt;3. Subscription Boundaries Provide False Comfort
&lt;/h3&gt;&lt;p&gt;Subscriptions feel like security boundaries because they align with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cost centres&lt;/li&gt;
&lt;li&gt;Ownership&lt;/li&gt;
&lt;li&gt;RBAC (Role-Based Access Control)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But from a network perspective, once peered, they are irrelevant.&lt;/p&gt;
&lt;p&gt;A compromised workload doesn’t care which subscription it lives in only which networks it can talk to.&lt;/p&gt;
&lt;h2 id="implementation-example-accidental-trust-by-connectivity"&gt;Implementation Example: Accidental Trust by Connectivity
&lt;/h2&gt;&lt;p&gt;A familiar pattern:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
Hub[Shared Services VNet]
Prod[Production VNet]
NonProd[Non-Production VNet]
Legacy[Legacy VNet]
Hub --- Prod
Hub --- NonProd
Hub --- Legacy
&lt;/div&gt;
&lt;p&gt;This diagram looks tidy. Centralised. Sensible.&lt;/p&gt;
&lt;p&gt;What it doesn’t show:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;That &lt;strong&gt;Non‑Prod and Legacy now share a trust anchor with Prod&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;That &lt;strong&gt;Hub failures propagate everywhere&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;That &lt;strong&gt;any misjudgement in Hub affects all environments equally&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The network has no way to express “I trust this less”.&lt;/p&gt;
&lt;h2 id="concrete-artefact-trust-with-no-intent-or-expiry"&gt;Concrete Artefact: Trust With No Intent or Expiry
&lt;/h2&gt;&lt;p&gt;A typical peering definition:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubToSpoke&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-to-spoke&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useRemoteGateways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This resource encodes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connectivity&lt;/li&gt;
&lt;li&gt;Routing behaviour&lt;/li&gt;
&lt;li&gt;Gateway inheritance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What it does &lt;strong&gt;not&lt;/strong&gt; encode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why the trust exists&lt;/li&gt;
&lt;li&gt;How long it should exist&lt;/li&gt;
&lt;li&gt;What level of risk was accepted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From the platform’s perspective, this is a permanent trust relationship.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Private DNS is a trust amplifier&lt;/strong&gt;&lt;br&gt;
If a workload can resolve a private endpoint name, someone assumed it was allowed to exist in the same trust domain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Temporary peerings rarely get removed&lt;/strong&gt;&lt;br&gt;
Especially those created during incidents or migrations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inherited routing bypasses original threat models&lt;/strong&gt;&lt;br&gt;
UDRs and forced tunnelling often survive long after the assumptions that justified them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security reviews skew toward new designs&lt;/strong&gt;&lt;br&gt;
Drift happens in the parts of the network nobody wants to touch.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices-without-turning-this-into-segmentation-advice"&gt;Best Practices (Without Turning This Into Segmentation Advice)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Treat network adjacency as a trust decision&lt;/strong&gt;&lt;br&gt;
If you wouldn’t join an unknown Wi‑Fi network, don’t implicitly trust a VNet just because it’s convenient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assume trust decays over time&lt;/strong&gt;&lt;br&gt;
Every peering should eventually be questioned, even if nothing appears broken.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Design shared services as least‑trusted, not most‑connected&lt;/strong&gt;&lt;br&gt;
Broad reach does not mean broad trust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Review trust, not just topology&lt;/strong&gt;&lt;br&gt;
Ask &lt;em&gt;who is trusted to talk to whom&lt;/em&gt; and whether that still matches reality.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Azure networking can’t truly express trust but it very clearly expresses &lt;strong&gt;where we pretend trust exists&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If your network diagram hasn’t changed in years, your trust model almost certainly has just without anyone consciously agreeing to it or documenting it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview" target="_blank" rel="noopener"
&gt;Azure Virtual Network peering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/well-architected/service-guides/azure-firewall" target="_blank" rel="noopener"
&gt;Azure Firewall architecture considerations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>DNS Is Not Plumbing: The Hidden Network Dependency You’re Already Trusting</title><link>https://blog.brewedinthecloud.com/p/network-fails-dns-hidden-network-dependency/</link><pubDate>Tue, 26 May 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/network-fails-dns-hidden-network-dependency/</guid><description>&lt;p&gt;DNS is the most trusted system in your Azure environment that almost nobody consciously designs for.&lt;/p&gt;
&lt;p&gt;It’s set up early, it works quietly, and once it’s stable it fades into the background. Years later, entire environments still depend on decisions made when the first virtual network (VNet) was deployed often by people who’ve long since moved on.&lt;/p&gt;
&lt;p&gt;That longevity is the problem.&lt;/p&gt;
&lt;p&gt;This post isn’t about DNS outages or misconfiguration. It’s about how &lt;strong&gt;centralised DNS becomes a hidden security dependency&lt;/strong&gt;, shaping trust and failure domains long after your network design is considered “done”.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
DNS is infrastructure plumbing. Centralise it, keep it simple, and it will fade into the background.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why this misleads:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Centralised DNS &lt;em&gt;does&lt;/em&gt; reduce ambiguity. That’s why it’s the right operational choice in most Azure estates.&lt;/p&gt;
&lt;p&gt;But reducing ambiguity has a side‑effect:&lt;br&gt;
it creates a &lt;strong&gt;single source of assumed correctness&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Once DNS is trusted implicitly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Applications stop questioning where they connect&lt;/li&gt;
&lt;li&gt;Network controls assume names map to the “right” thing&lt;/li&gt;
&lt;li&gt;Engineers stop revisiting name ownership and intent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DNS doesn’t just resolve names, it defines &lt;strong&gt;who you trust by default&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure treats DNS as an ambient dependency.&lt;/p&gt;
&lt;p&gt;Most workloads and platform services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resolve names &lt;strong&gt;before&lt;/strong&gt; meaningful network or application validation&lt;/li&gt;
&lt;li&gt;Cache DNS results well beyond the moment of resolution&lt;/li&gt;
&lt;li&gt;Assume resolver responses are stable and authoritative&lt;/li&gt;
&lt;li&gt;Treat successful resolution as proof of legitimacy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Crucially, DNS resolution happens &lt;em&gt;outside&lt;/em&gt; most of your explicit security controls. NSGs (Network Security Groups), UDRs (User‑Defined Routes), and firewalls all act &lt;em&gt;after&lt;/em&gt; a name has already been trusted.&lt;/p&gt;
&lt;p&gt;Once a name exists, what it points to later becomes a powerful and often invisible control surface.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="centralised-dns-operationally-correct-securitysensitive"&gt;Centralised DNS: Operationally Correct, Security‑Sensitive
&lt;/h3&gt;&lt;p&gt;Let’s be clear: &lt;strong&gt;centralised DNS is usually the least‑bad option&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A single control plane&lt;/li&gt;
&lt;li&gt;Clearer support boundaries&lt;/li&gt;
&lt;li&gt;Faster troubleshooting&lt;/li&gt;
&lt;li&gt;Reduced cognitive load during incidents&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The risk isn’t centralisation.&lt;/p&gt;
&lt;p&gt;The risk is that &lt;em&gt;everything&lt;/em&gt; now implicitly trusts that central authority indefinitely.&lt;/p&gt;
&lt;p&gt;One stale record, one reused name, or one compromised resolution path can silently redirect traffic without a single firewall rule changing.&lt;/p&gt;
&lt;p&gt;Centralisation doesn’t create fragility.&lt;br&gt;
It &lt;strong&gt;compresses trust into one place&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="decentralised-dns-complexity-as-false-safety"&gt;Decentralised DNS: Complexity as False Safety
&lt;/h3&gt;&lt;p&gt;Decentralised DNS often looks safer on paper:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Smaller blast radius&lt;/li&gt;
&lt;li&gt;Local ownership&lt;/li&gt;
&lt;li&gt;Fewer global dependencies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In practice, it introduces a different and often worse failure mode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ambiguous ownership&lt;/li&gt;
&lt;li&gt;Inconsistent naming semantics&lt;/li&gt;
&lt;li&gt;Environment‑specific behaviour&lt;/li&gt;
&lt;li&gt;Debugging paralysis (“where is this even defined?”)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Decentralisation doesn’t remove risk.&lt;br&gt;
It hides it behind complexity and entropy.&lt;/p&gt;
&lt;h3 id="dns-failures-rarely-look-like-outages"&gt;DNS Failures Rarely Look Like Outages
&lt;/h3&gt;&lt;p&gt;Most DNS‑related failures don’t stop systems outright.&lt;/p&gt;
&lt;p&gt;They show up as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Traffic flowing somewhere “unexpected”&lt;/li&gt;
&lt;li&gt;Intermittent connectivity issues&lt;/li&gt;
&lt;li&gt;Security controls apparently being bypassed&lt;/li&gt;
&lt;li&gt;Engineers adding records to “fix” symptoms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are trust failures, not availability failures.&lt;/p&gt;
&lt;h2 id="how-this-changes-what-you-design-and-operate"&gt;How This Changes What You Design and Operate
&lt;/h2&gt;&lt;p&gt;This should change how you think about &lt;strong&gt;network trust&lt;/strong&gt;, not how you configure DNS.&lt;/p&gt;
&lt;p&gt;In real environments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS zones outlive VNets, subnets, and teams&lt;/li&gt;
&lt;li&gt;Names persist long after their original intent is gone&lt;/li&gt;
&lt;li&gt;Centralisation amplifies the consequences of assumption&lt;/li&gt;
&lt;li&gt;DNS becomes a de facto security boundary whether acknowledged or not&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If DNS is the single source of truth, then its &lt;em&gt;assumed correctness&lt;/em&gt; deserves the same scrutiny as firewall policy or identity trust.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;This series avoids configuration guidance, but &lt;strong&gt;visibility matters&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Most engineers are less certain about DNS trust than they think.&lt;/p&gt;
&lt;h3 id="inspect-what-a-vm-actually-trusts"&gt;Inspect What a VM Actually Trusts
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az vm show &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-app-prod &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name vm-api-01 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --query &lt;span class="s2"&gt;&amp;#34;networkProfile.networkInterfaces[0].dnsSettings&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This tells you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether DNS is inherited or explicitly defined&lt;/li&gt;
&lt;li&gt;Which resolver IPs the workload actually trusts&lt;/li&gt;
&lt;li&gt;Whether that trust was intentional or accidental&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Observation is the first step to challenging assumptions.&lt;/p&gt;
&lt;h2 id="the-hidden-dependency-pattern"&gt;The Hidden Dependency Pattern
&lt;/h2&gt;&lt;div class="mermaid"&gt;graph TD
App[Application VM]
DNS[Central DNS Resolver]
Intended[Intended Internal Service]
Drift[Unintended Target]
App --&gt;|Resolve api.internal| DNS
DNS --&gt;|Returns IP| App
App --&gt;|Traffic| Intended
DNS -. record drift / reuse .-&gt; Drift
&lt;/div&gt;
&lt;p&gt;The network path never changes.&lt;br&gt;
Only the &lt;em&gt;meaning&lt;/em&gt; of the name does.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;DNS caching masks failures until TTL expiry&lt;/li&gt;
&lt;li&gt;Name reuse couples systems across time, not architecture&lt;/li&gt;
&lt;li&gt;Platform services may resolve names differently to your expectations&lt;/li&gt;
&lt;li&gt;Engineers often fix DNS symptoms instead of revisiting trust&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most dangerous DNS failures are quiet.&lt;/p&gt;
&lt;h2 id="best-practices-without-configuration"&gt;Best Practices (Without Configuration)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat DNS zones as long‑lived security assets&lt;/li&gt;
&lt;li&gt;Assign explicit ownership for every namespace&lt;/li&gt;
&lt;li&gt;Review DNS records with the same discipline as firewall rules&lt;/li&gt;
&lt;li&gt;Assume DNS failures will be subtle, not catastrophic&lt;/li&gt;
&lt;li&gt;Design services to validate &lt;em&gt;what&lt;/em&gt; they connect to, not just &lt;em&gt;where&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is posture, not syntax.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Centralised DNS is the right operational choice, which is exactly why its implicit trust is so dangerous when left unexamined.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/dns/dns-overview" target="_blank" rel="noopener"
&gt;Azure DNS overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances?tabs=redhat" target="_blank" rel="noopener"
&gt;Name resolution in Azure virtual networks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/benchmark/azure/baselines/virtual-network-security-baseline" target="_blank" rel="noopener"
&gt;Azure networking security baseline&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Routing Decisions That Quietly Create Security Gaps</title><link>https://blog.brewedinthecloud.com/p/network-fails-routing-decisions-security-gaps/</link><pubDate>Thu, 21 May 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/network-fails-routing-decisions-security-gaps/</guid><description>&lt;p&gt;Routing still feels like plumbing.&lt;/p&gt;
&lt;p&gt;You change where packets go, traffic flows again, and the incident closes. Nothing &lt;em&gt;looks&lt;/em&gt; less secure. No rules changed. No alerts fired. Yet something fundamental may have shifted not availability, but &lt;strong&gt;who is now allowed to talk to whom&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This post is about routing decisions that don’t break connectivity, they quietly break &lt;strong&gt;trust boundaries&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
Routing is a connectivity concern. Security is enforced elsewhere.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
In Azure, routing determines the &lt;em&gt;effective security perimeter&lt;/em&gt;. If a route expands reachability beyond the documented trust boundary, that expansion &lt;strong&gt;is a security failure&lt;/strong&gt;, regardless of intent.&lt;/p&gt;
&lt;p&gt;Security controls only matter if traffic actually traverses them. Routing decides whether they ever get the chance.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure evaluates routing before most security controls can apply policy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User‑defined routes (UDRs) override platform defaults.&lt;/li&gt;
&lt;li&gt;Peering enables reachability that security rules often assume is constrained.&lt;/li&gt;
&lt;li&gt;Abstractions hide the effective path until it matters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure will faithfully forward packets along any valid route. It does not validate whether that path aligns with your security intent or whether it expands trust beyond what was ever reviewed.&lt;/p&gt;
&lt;p&gt;Routing doesn’t just connect networks.&lt;br&gt;
It &lt;strong&gt;redefines the trust model the rest of your security stack assumes&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="routing-as-an-unreviewed-trust-expansion"&gt;Routing as an Unreviewed Trust Expansion
&lt;/h2&gt;&lt;h3 id="convenience-routes"&gt;Convenience Routes
&lt;/h3&gt;&lt;p&gt;A common change request:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We just need workload A to reach service B.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The route gets added. The problem is solved. But if that route enables A to reach &lt;em&gt;everything&lt;/em&gt; B can reach, the trust boundary has already expanded.&lt;/p&gt;
&lt;p&gt;No firewall rule changed.&lt;br&gt;
But the security posture did.&lt;/p&gt;
&lt;p&gt;If reachability grows beyond what was explicitly documented and approved, the routing change itself is the failure not the firewall configuration.&lt;/p&gt;
&lt;h3 id="asymmetric-paths-invisible-impact"&gt;Asymmetric Paths, Invisible Impact
&lt;/h3&gt;&lt;p&gt;Azure does not enforce symmetric routing.&lt;/p&gt;
&lt;p&gt;It’s easy to create designs where traffic passes through inspection on the way out, but returns via a different path governed by system routes or peering behaviour.&lt;/p&gt;
&lt;p&gt;From a security perspective, this means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enforcement becomes partial&lt;/li&gt;
&lt;li&gt;Logs represent only a subset of reality&lt;/li&gt;
&lt;li&gt;Policy confidence decays over time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you can’t explain the full bidirectional path, you can’t reliably define the trust boundary.&lt;/p&gt;
&lt;h3 id="accidental-transitivity"&gt;Accidental Transitivity
&lt;/h3&gt;&lt;p&gt;Routing plus peering enables &lt;strong&gt;implicit trust chains&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Network A can reach B.&lt;br&gt;
B can reach C.&lt;br&gt;
A can now often reach C even if nobody intended that relationship to exist.&lt;/p&gt;
&lt;p&gt;No new security rule was added.&lt;br&gt;
But effective reachability expanded anyway.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This failure mode shows up operationally, not at design time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security reviews pass while posture degrades&lt;/strong&gt;&lt;br&gt;
Controls are correct, the path is not.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Visibility becomes misleading&lt;/strong&gt;&lt;br&gt;
Logs show inspected traffic, not &lt;em&gt;all possible traffic&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Change risk compounds silently&lt;/strong&gt;&lt;br&gt;
Each routing change inherits and extends existing trust relationships.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security ownership blurs&lt;/strong&gt;&lt;br&gt;
Routing changes feel “network‑only”, but their impact is architectural.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This changes how routing should be treated in production:&lt;br&gt;
&lt;strong&gt;as a security‑significant change, not a connectivity tweak.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="implementation-example-a-route-that-expands-trust"&gt;Implementation Example: A Route That Expands Trust
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appRouteTable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/routeTables@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;rt-app-subnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;to-shared-services&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.40.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualAppliance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopIpAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.20.0.4&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;On paper, this sends app traffic through an inspection point.&lt;/p&gt;
&lt;p&gt;In practice, this route should be treated as a &lt;strong&gt;security failure&lt;/strong&gt; if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;10.40.0.0/16&lt;/code&gt; contains more than the explicitly intended services&lt;/li&gt;
&lt;li&gt;It enables reachability beyond the documented trust boundary&lt;/li&gt;
&lt;li&gt;The return path does not traverse the same enforcement points&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The route may be technically correct and still security‑incorrect.&lt;/p&gt;
&lt;h2 id="visualising-the-trust-shift"&gt;Visualising the Trust Shift
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
A[App Subnet] --&gt;|UDR| F[Inspection Point]
F --&gt; B[Shared Services]
B --&gt; C[Additional Networks]
C -. Implicit Reachability .-&gt; A
&lt;/div&gt;
&lt;p&gt;The security gap is not the firewall.&lt;br&gt;
It’s the &lt;strong&gt;unreviewed expansion of reachability beyond intent&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Platform‑managed routes may expand reachability without obvious configuration changes.&lt;/li&gt;
&lt;li&gt;Multiple route tables create inconsistent trust enforcement across subnets.&lt;/li&gt;
&lt;li&gt;Security tooling reports where traffic was &lt;em&gt;seen&lt;/em&gt;, not everywhere it &lt;em&gt;could go&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat routing changes as &lt;strong&gt;trust boundary changes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Document intended reachability, not just IP ranges&lt;/li&gt;
&lt;li&gt;Review routes for &lt;strong&gt;what they enable&lt;/strong&gt;, not what they fix&lt;/li&gt;
&lt;li&gt;Assume transitivity unless explicitly disproven&lt;/li&gt;
&lt;li&gt;If intent and reachability diverge, classify it as a security issue&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If routing expands reachability beyond what you can explicitly justify, the design is already insecure even if every security control still looks correct.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure virtual network traffic routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/diagnose-network-routing-problem" target="_blank" rel="noopener"
&gt;Effective routes in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/network-overview" target="_blank" rel="noopener"
&gt;Azure network security fundamentals&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>When the VNet Becomes a Yes‑Man: Over‑Trusted Internal Traffic in Azure</title><link>https://blog.brewedinthecloud.com/p/network-fails-over-trusted-internal-traffic-azure/</link><pubDate>Tue, 19 May 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/network-fails-over-trusted-internal-traffic-azure/</guid><description>&lt;p&gt;Most Azure environments don’t fail because someone opened the perimeter too wide.&lt;/p&gt;
&lt;p&gt;They fail because &lt;em&gt;inside the network&lt;/em&gt;, everything slowly learned it didn’t need to ask anymore.&lt;/p&gt;
&lt;p&gt;Reachability became normal. Then expected. Then invisible.&lt;/p&gt;
&lt;p&gt;By the time anyone questions it, the network has already answered &lt;em&gt;yes&lt;/em&gt; on their behalf.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“If traffic is inside the VNet or coming from on‑prem it’s already trusted.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This isn’t usually stated out loud. It just emerges.&lt;/p&gt;
&lt;p&gt;VNets start small. On‑prem connectivity is enabled for migration speed. Shared services need to be reachable. Early workloads benefit from convenience, and nothing breaks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it misleads:&lt;/strong&gt;&lt;br&gt;
VNets don’t stay small and neither does connectivity intent.&lt;/p&gt;
&lt;p&gt;As environments grow, reachability expands faster than understanding. What began as a deliberate exception turns into a default, and “inside the network” quietly becomes shorthand for &lt;em&gt;safe enough&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That’s not a security philosophy problem.&lt;br&gt;
It’s a network failure caused by trust inheritance.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure VNets are &lt;strong&gt;routing domains&lt;/strong&gt;, not trust domains.&lt;/p&gt;
&lt;p&gt;They provide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Layer‑3 connectivity&lt;/li&gt;
&lt;li&gt;Flat reachability by default&lt;/li&gt;
&lt;li&gt;No concept of workload sensitivity or intent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure is doing exactly what it’s designed to do.&lt;/p&gt;
&lt;p&gt;The failure happens when &lt;strong&gt;connectivity is treated as authorisation&lt;/strong&gt; especially across boundaries that were never meant to be peers.&lt;/p&gt;
&lt;p&gt;Over time, this pattern emerges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On‑prem networks can reach most VNets&lt;/li&gt;
&lt;li&gt;New workloads inherit that reachability automatically&lt;/li&gt;
&lt;li&gt;No explicit decision is made because none is required&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, the network isn’t enforcing intent.&lt;br&gt;
It’s amplifying convenience.&lt;/p&gt;
&lt;h2 id="the-real-question-youre-facing"&gt;The Real Question You’re Facing
&lt;/h2&gt;&lt;p&gt;You’re not choosing between &lt;em&gt;open&lt;/em&gt; and &lt;em&gt;locked‑down&lt;/em&gt; networking.&lt;/p&gt;
&lt;p&gt;You’re choosing between:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Implicit trust via reachability&lt;/strong&gt;, or&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explicit trust via declared intent&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If on‑prem can reach everything simply because it’s on‑prem, the network has already made a trust decision it just didn’t document it.&lt;/p&gt;
&lt;h2 id="a-necessary-reframe-onprem-is-a-zone-not-a-peer"&gt;A Necessary Reframe: On‑Prem Is a Zone, Not a Peer
&lt;/h2&gt;&lt;p&gt;In a mature Azure environment, on‑prem should not be treated as “just another VNet”.&lt;/p&gt;
&lt;p&gt;It is a &lt;strong&gt;distinct network zone&lt;/strong&gt; with different ownership, lifecycle, and failure characteristics.&lt;/p&gt;
&lt;p&gt;A defensible default looks like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;On‑prem can reach shared services by default.&lt;br&gt;
Workload networks must opt‑in.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This isn’t about assuming compromise.&lt;br&gt;
It’s about preventing &lt;em&gt;ambient trust&lt;/em&gt; from spreading via routing.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This failure mode shows up operationally long before any incident.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New workloads become reachable from on‑prem without discussion&lt;/li&gt;
&lt;li&gt;Architects can’t clearly state why certain paths exist&lt;/li&gt;
&lt;li&gt;Shared services quietly become transit points&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Operational impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connectivity reviews focus on NSGs instead of intent&lt;/li&gt;
&lt;li&gt;Change risk increases because blast radius is unclear&lt;/li&gt;
&lt;li&gt;Removing access is harder than granting it ever was&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Security impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal boundaries blur&lt;/li&gt;
&lt;li&gt;Lateral movement becomes a property of the network&lt;/li&gt;
&lt;li&gt;Containment relies on “nothing changing” rather than design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The network didn’t break suddenly.&lt;br&gt;
It drifted and no one noticed.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="what-overtrust-looks-like-at-scale"&gt;What Over‑Trust Looks Like at Scale
&lt;/h3&gt;&lt;p&gt;After a few years of growth, many environments resemble this:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
OP[On‑Prem Network]
HUB[Shared Services VNet]
APP1[App VNet]
APP2[App VNet]
DATA[Data VNet]
OP --- HUB
OP --- APP1
OP --- APP2
OP --- DATA
HUB --- APP1
HUB --- APP2
&lt;/div&gt;
&lt;p&gt;Nothing here violates Azure best practices.&lt;/p&gt;
&lt;p&gt;The failure is behavioural:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On‑prem reachability is assumed, not justified&lt;/li&gt;
&lt;li&gt;New VNets inherit access automatically&lt;/li&gt;
&lt;li&gt;No one can say which paths are intentional&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how-the-failure-creeps-in"&gt;How the Failure Creeps In
&lt;/h3&gt;&lt;p&gt;A typical peering or gateway configuration (simplified):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This isn’t wrong.&lt;/p&gt;
&lt;p&gt;But over time, it’s interpreted as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Anything internal can probably talk to this.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That assumption scales faster than architecture diagrams.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Private endpoints don’t fix this&lt;/strong&gt;&lt;br&gt;
They often reinforce the idea that “private” equals “safe”, even as reachability expands.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Peering intent fades faster than peering configs&lt;/strong&gt;&lt;br&gt;
The network remembers decisions long after teams forget why they were made.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Change velocity accelerates trust drift&lt;/strong&gt;&lt;br&gt;
Especially when new workloads are created by teams far from the original design.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices-without-tooling"&gt;Best Practices (Without Tooling)
&lt;/h2&gt;&lt;p&gt;Staying within network design, not enforcement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define &lt;strong&gt;where on‑prem can reach by default&lt;/strong&gt; and write it down&lt;/li&gt;
&lt;li&gt;Treat workload reachability as an &lt;strong&gt;opt‑in decision&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Periodically review &lt;strong&gt;which paths exist purely because they’re easy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Design shared services as &lt;strong&gt;intentional choke points&lt;/strong&gt;, not accidental hubs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are design disciplines, not firewall strategies.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If a new workload can be reached from on‑prem without anyone explicitly deciding that it should, the network has already failed even if nothing is broken yet.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview" target="_blank" rel="noopener"
&gt;Azure Virtual Network peering overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/hub-spoke" target="_blank" rel="noopener"
&gt;Hub‑spoke network topology in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/network-overview" target="_blank" rel="noopener"
&gt;Azure networking security concepts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>When ‘Secure by Design’ Fails in Production</title><link>https://blog.brewedinthecloud.com/p/network-fails-secure-by-design-fails-in-production/</link><pubDate>Thu, 14 May 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/network-fails-secure-by-design-fails-in-production/</guid><description>&lt;p&gt;“Secure by design” is one of those phrases that sounds definitive.&lt;/p&gt;
&lt;p&gt;It implies an end state that if you get the architecture right up front, security becomes a property of the system rather than something you constantly fight.&lt;/p&gt;
&lt;p&gt;In Azure production environments, that belief doesn’t just fail.&lt;br&gt;
It quietly dissolves, one well‑intentioned change at a time.&lt;/p&gt;
&lt;p&gt;Not because engineers forget how to design securely but because &lt;strong&gt;the assumptions that made the design secure are nobody’s job to preserve&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
Security fails when controls are missing, misconfigured, or ignored.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it misleads:&lt;/strong&gt;&lt;br&gt;
In mature Azure estates, most controls exist.&lt;br&gt;
The failure happens elsewhere when &lt;strong&gt;security assumptions decay across organisational and technical boundaries&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;“Secure by design” assumes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;stable ownership&lt;/li&gt;
&lt;li&gt;stable dependencies&lt;/li&gt;
&lt;li&gt;stable trust boundaries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of those survive scale.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In enterprise Azure environments, ownership is divided by &lt;strong&gt;control plane&lt;/strong&gt;, not by &lt;strong&gt;security outcome&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Typically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Network teams&lt;/strong&gt; own connectivity&lt;br&gt;
(VNets, peering, UDRs, Private Endpoints)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System administrators&lt;/strong&gt; own operations&lt;br&gt;
(VM access, patching, agents)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DBAs&lt;/strong&gt; own data platforms&lt;br&gt;
(SQL configuration, firewall rules)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application teams&lt;/strong&gt; own app behaviour and data usage&lt;br&gt;
(SDKs, outbound calls, feature flags)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security teams&lt;/strong&gt; own policy&lt;br&gt;
(standards, approvals, alerts not packet flow)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft&lt;/strong&gt; owns the platform but not how you use it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everyone owns &lt;em&gt;something&lt;/em&gt;.&lt;br&gt;
No one owns &lt;strong&gt;the security assumptions that exist &lt;em&gt;between&lt;/em&gt; these domains&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Those assumptions include things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“This app cannot laterally reach other environments”&lt;/li&gt;
&lt;li&gt;“All outbound traffic is inspected”&lt;/li&gt;
&lt;li&gt;“Only intended consumers can reach this data store”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They are real.&lt;br&gt;
They are critical.&lt;br&gt;
And they are almost never explicitly owned.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This is where “secure by design” fails in production.&lt;/p&gt;
&lt;p&gt;Not through a single bad change, but through &lt;strong&gt;coordinated innocence&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A network team enables VNet peering “for integration”&lt;/li&gt;
&lt;li&gt;A DBA adds a firewall exception “to unblock delivery”&lt;/li&gt;
&lt;li&gt;An app team introduces a new dependency “for a feature”&lt;/li&gt;
&lt;li&gt;A security team approves because policy conditions are met&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each change is defensible in isolation.&lt;br&gt;
Collectively, they invalidate the original threat model.&lt;/p&gt;
&lt;p&gt;At small scale, this works because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;people remember why things exist&lt;/li&gt;
&lt;li&gt;blast radius is limited&lt;/li&gt;
&lt;li&gt;informal review catches mistakes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At enterprise scale:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;assumptions outlive the people who made them&lt;/li&gt;
&lt;li&gt;undocumented dependencies become business‑critical&lt;/li&gt;
&lt;li&gt;trust paths multiply faster than anyone models them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Security doesn’t fail loudly.&lt;br&gt;
It &lt;strong&gt;drifts&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;Consider a common shared‑services pattern.&lt;/p&gt;
&lt;h3 id="original-design-intent"&gt;Original design intent
&lt;/h3&gt;&lt;div class="mermaid"&gt;graph TD
A[App VNet] --&gt;|Peering| B[Shared Services VNet]
B --&gt; C[Azure Firewall]
C --&gt; D[Internet]
&lt;/div&gt;
&lt;p&gt;Security assumption:&lt;br&gt;
&lt;strong&gt;All app egress is inspected and controlled centrally.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="two-years-later"&gt;Two years later
&lt;/h3&gt;&lt;div class="mermaid"&gt;graph TD
A[App VNet] --&gt;|Peering| B[Shared Services VNet]
A --&gt; E[Another App VNet]
E --&gt; F[Private Endpoint]
F --&gt; G[PaaS Service]
&lt;/div&gt;
&lt;p&gt;Nothing here violates Azure’s rules.&lt;/p&gt;
&lt;p&gt;But several assumptions are now false:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Traffic no longer consistently traverses the firewall&lt;/li&gt;
&lt;li&gt;DNS resolution now determines reachability&lt;/li&gt;
&lt;li&gt;App VNets can reach more than originally intended&lt;/li&gt;
&lt;li&gt;Firewall logs no longer represent the full picture&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A subtle but powerful example is VNet peering itself:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetPeering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;app-to-shared&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That single flag establishes &lt;strong&gt;permanent lateral trust&lt;/strong&gt; unless explicitly revisited.&lt;/p&gt;
&lt;p&gt;It is rarely reviewed again — because no team owns the assumption it creates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How would this change something I design, deploy, or operate?&lt;/strong&gt;&lt;br&gt;
You stop treating connectivity as reversible plumbing and start treating it as a long‑lived security commitment.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Private Endpoints don’t “break security” — they break assumptions&lt;/strong&gt;&lt;br&gt;
Especially when routing, DNS, and inspection models were designed first&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logging creates false confidence&lt;/strong&gt;&lt;br&gt;
Firewall and NSG flow logs only tell the truth about traffic they actually see&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy enforces existence, not intent&lt;/strong&gt;&lt;br&gt;
A rule can be compliant and still dangerous&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temporary exceptions become structural dependencies&lt;/strong&gt;&lt;br&gt;
And nobody volunteers to remove them&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Not prescriptive steps — but mindset shifts that survive scale:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Assume security assumptions will decay&lt;/strong&gt;
Design review is not a one‑time event&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treat network changes as security changes by default&lt;/strong&gt;
Even when raised by non‑security teams&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimise implicit trust&lt;/strong&gt;
Especially lateral trust created by peering and shared DNS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make connectivity decisions expensive to forget&lt;/strong&gt;
If you can’t explain &lt;em&gt;why&lt;/em&gt; it exists, it shouldn’t be permanent&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Secure‑by‑design fails not because no one owns security, but because &lt;strong&gt;no one is accountable for preserving security assumptions as the organisation fragments&lt;/strong&gt;. In Azure, drift isn’t an exception — it’s the default behaviour.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;The failure mode described here doesn’t come from a single misconfiguration, it emerges from how Azure architectures divide responsibility across teams.&lt;/p&gt;
&lt;p&gt;These references are useful not because they solve that problem, but because they implicitly assume it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Shared Responsibility Model&lt;/strong&gt;&lt;br&gt;
Clearly defines where Microsoft’s responsibility ends and where ungoverned shared accountability begins.&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/shared-responsibility" target="_blank" rel="noopener"
&gt;https://learn.microsoft.com/azure/security/fundamentals/shared-responsibility&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Zero Trust Architecture (Azure)&lt;/strong&gt;&lt;br&gt;
Highlights the mismatch between static network trust and continuous verification models.&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/security/zero-trust/azure-infrastructure-overview" target="_blank" rel="noopener"
&gt;https://learn.microsoft.com/security/zero-trust/azure-infrastructure-overview&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hub‑Spoke Network Reference Architecture&lt;/strong&gt;&lt;br&gt;
A common starting point whose security assumptions rarely survive enterprise‑scale operation without explicit ownership.&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/hub-spoke" target="_blank" rel="noopener"
&gt;https://learn.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/hub-spoke&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Designing for Fewer East–West Options (Not Zero)</title><link>https://blog.brewedinthecloud.com/p/east-west-designing-fewer-options/</link><pubDate>Tue, 12 May 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/east-west-designing-fewer-options/</guid><description>&lt;p&gt;If you’ve ever tried to clean a cluttered bench mid‑shift, you know the trick isn’t perfection it’s &lt;em&gt;removing places where clutter can spread&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;East–west traffic is the same.&lt;/p&gt;
&lt;p&gt;Once an attacker is inside your Azure estate, the problem isn’t whether lateral movement is possible.&lt;br&gt;
It’s &lt;strong&gt;how many plausible directions they can go next&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Designing for zero east–west traffic is fantasy.&lt;br&gt;
Designing for &lt;em&gt;fewer options&lt;/em&gt; deliberately is architecture.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
“Internal connectivity is fine. We’ll trust it unless there’s a reason not to.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
This assumes internal networks are stable trust zones. They aren’t.&lt;/p&gt;
&lt;p&gt;In real Azure estates, east–west paths accumulate quietly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new VNet peering to “unblock delivery”&lt;/li&gt;
&lt;li&gt;A Private Endpoint added for convenience&lt;/li&gt;
&lt;li&gt;A shared services VNet that slowly becomes transit infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each change feels reasonable in isolation.&lt;br&gt;
Collectively, they create &lt;strong&gt;unbounded lateral optionality&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The core mistake isn’t trusting internal traffic.&lt;br&gt;
It’s failing to ask: &lt;em&gt;from this point of compromise, where can I go next?&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;A more useful mental model is &lt;strong&gt;bounded lateral radius&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;An Azure network has meaningfully reduced east–west risk when compromise of a single workload results in a small, predictable set of lateral paths not an open‑ended search space.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is not about neat diagrams or tidy segmentation.&lt;br&gt;
It’s about &lt;strong&gt;outcomes from the attacker’s starting point&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If an attacker lands in one subnet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can they only reach one or two specific services?&lt;/li&gt;
&lt;li&gt;Or do they quickly discover multiple VNets, shared dependencies, and alternate routes?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;East–west risk grows when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connectivity is cheap and reversible&lt;/li&gt;
&lt;li&gt;Shared services relay traffic instead of terminating it&lt;/li&gt;
&lt;li&gt;New paths don’t require justification&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure makes all of this easy, which is why architecture has to be intentional.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Designing for fewer east–west options changes how you think about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blast radius&lt;/strong&gt;&lt;br&gt;
Networks are designed around &lt;em&gt;where compromise stops&lt;/em&gt;, not where workloads live.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared dependencies&lt;/strong&gt;&lt;br&gt;
Anything broadly reachable is inside the blast radius by definition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change conversations&lt;/strong&gt;&lt;br&gt;
Adding connectivity becomes a security‑relevant decision, not plumbing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This directly answers the practical question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How would this change something I design, deploy, or operate?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You stop optimising for convenience first and start optimising for &lt;em&gt;predictable containment&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="make-lateral-paths-explicit-and-rare"&gt;Make Lateral Paths Explicit and Rare
&lt;/h3&gt;&lt;p&gt;A hub‑and‑spoke model only helps if the hub does &lt;strong&gt;not&lt;/strong&gt; quietly become a router.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubToSpoke&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-to-app-spoke&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowGatewayTransit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useRemoteGateways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This snippet isn’t about syntax.&lt;br&gt;
It’s about &lt;strong&gt;default behaviour&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Two flags here are doing real containment work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;allowForwardedTraffic: false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allowGatewayTransit: false&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Removing either one does not usually break functionality.&lt;br&gt;
What it breaks is &lt;strong&gt;bounded lateral radius&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;With forwarded traffic or gateway transit enabled, a compromised spoke doesn’t just reach the hub it can &lt;strong&gt;use the hub to explore elsewhere&lt;/strong&gt;. The hub becomes a lateral movement amplifier rather than a boundary.&lt;/p&gt;
&lt;p&gt;This is how east–west risk is usually introduced:&lt;br&gt;
not by adding new connectivity, but by &lt;strong&gt;failing to prevent transit&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="treat-shared-services-as-a-containment-tradeoff"&gt;Treat Shared Services as a Containment Trade‑Off
&lt;/h3&gt;&lt;p&gt;A broadly peered “shared services” VNet is not neutral.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Shared services VNets almost always expand lateral radius, often dramatically.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If a service is reachable from many workloads:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It sits inside many blast radii&lt;/li&gt;
&lt;li&gt;It becomes a lateral pivot, not just a dependency&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Operational necessity doesn’t change this reality.&lt;/p&gt;
&lt;p&gt;If a service must be shared, then the blast radius is &lt;strong&gt;knowingly widened&lt;/strong&gt; and should be treated as a high‑risk architectural decision, not a default pattern.&lt;/p&gt;
&lt;h3 id="private-endpoints-visibility-not-immunity"&gt;Private Endpoints: Visibility, Not Immunity
&lt;/h3&gt;&lt;p&gt;Private Endpoints don’t break the bounded‑radius model.&lt;br&gt;
They expose where it isn’t being enforced.&lt;/p&gt;
&lt;p&gt;Each Private Endpoint is an &lt;strong&gt;explicit east–west path&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It crosses VNets&lt;/li&gt;
&lt;li&gt;It expands reachable surface area&lt;/li&gt;
&lt;li&gt;It persists quietly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you can’t explain &lt;em&gt;why&lt;/em&gt; a Private Endpoint exists and which blast radius it belongs to then lateral radius is already unbounded.&lt;/p&gt;
&lt;h2 id="visualising-bounded-lateral-radius"&gt;Visualising Bounded Lateral Radius
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
A[App VNet] --&gt;|Explicit| B[API VNet]
B --&gt;|Private Endpoint| C[PaaS Service]
A -. No direct path .-&gt; C
A -. No peering .-&gt; D[Admin VNet]
&lt;/div&gt;
&lt;p&gt;From &lt;code&gt;App VNet&lt;/code&gt;, there is &lt;strong&gt;one obvious direction&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That’s the goal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Not isolation&lt;/li&gt;
&lt;li&gt;Not zero‑trust theatre&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predictable movement&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shared services creep&lt;/strong&gt;&lt;br&gt;
What starts as DNS or automation often becomes transit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private Endpoint sprawl&lt;/strong&gt;&lt;br&gt;
Endpoint count is less important than endpoint &lt;em&gt;intent&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delivery pressure&lt;/strong&gt;&lt;br&gt;
If adding a new east–west path is easy, your architecture is optimised for attackers, not operators.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Design networks around &lt;strong&gt;points of compromise&lt;/strong&gt;, not environments&lt;/li&gt;
&lt;li&gt;Assume shared reachability &lt;strong&gt;expands blast radius unless proven otherwise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Make east–west connectivity &lt;strong&gt;nameable and explainable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Prefer terminating connections over relaying ones&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A simple test:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If you can’t name every lateral path out of a workload without querying tooling, optionality hasn’t been reduced, it’s just been obscured.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; You don’t control lateral movement by drawing boundaries.&lt;br&gt;
You control it by deciding, deliberately, how much choice you’re willing to give an attacker.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview" target="_blank" rel="noopener"
&gt;Azure Virtual Network peering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview" target="_blank" rel="noopener"
&gt;Private Endpoint architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/adopt/prevent-reduce-business-damage-breach-infrastructure" target="_blank" rel="noopener"
&gt;Implement security breach prevention and recovery infrastructure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Hybrid East–West: When Two Networks Become One Problem</title><link>https://blog.brewedinthecloud.com/p/east-west-two-networks-one-problem/</link><pubDate>Thu, 07 May 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/east-west-two-networks-one-problem/</guid><description>&lt;p&gt;Hybrid networking usually starts with good intentions.&lt;/p&gt;
&lt;p&gt;A site‑to‑site VPN or ExpressRoute is approved to “unlock value”. Azure workloads need to talk to on‑prem systems, operations need visibility, shared services need reach. The diagram still shows two boxes, so it &lt;em&gt;feels&lt;/em&gt; contained.&lt;/p&gt;
&lt;p&gt;But the moment east–west traffic crosses that link, containment stops being an architectural fact and becomes an assumption.&lt;/p&gt;
&lt;p&gt;And assumptions don’t survive attackers.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
On‑prem and Azure are separate security domains that just happen to be connected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
East–west traffic doesn’t understand organisational boundaries. Once routing and DNS align, hybrid connectivity collapses those domains into a single lateral movement surface selectively, but decisively.&lt;/p&gt;
&lt;p&gt;Hybrid doesn’t “extend” your network.&lt;br&gt;
It &lt;strong&gt;redefines adjacency&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Hybrid east–west behaves less like cross‑environment communication and more like &lt;strong&gt;internal traffic with extra hops&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Three forces make this unavoidable.&lt;/p&gt;
&lt;h3 id="1-routing-turns-distance-into-trivia"&gt;1. Routing Turns Distance into Trivia
&lt;/h3&gt;&lt;p&gt;From a packet’s perspective, an RFC1918 prefix reachable via ExpressRoute or VPN is just another route.&lt;/p&gt;
&lt;p&gt;If Azure workloads can route to on‑prem subnets, then adjacency exists regardless of intent, documentation, or team boundaries.&lt;/p&gt;
&lt;p&gt;This is where many designs fail quietly: segmentation may exist &lt;em&gt;within&lt;/em&gt; environments, but hybrid routing stitches those segments together in ways no single team models end‑to‑end.&lt;/p&gt;
&lt;h3 id="2-dns-collapses-discovery"&gt;2. DNS Collapses Discovery
&lt;/h3&gt;&lt;p&gt;Shared DNS is the most underestimated hybrid risk.&lt;/p&gt;
&lt;p&gt;Private DNS zone links, conditional forwarders, split‑horizon records, all introduced for operability unify discovery across environments. Once names resolve, targets are discoverable. Once discoverable, they are reachable &lt;em&gt;by design&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Hybrid DNS rarely mirrors trust boundaries. It mirrors convenience.&lt;/p&gt;
&lt;h3 id="3-legacy-trust-survives-the-move"&gt;3. Legacy Trust Survives the Move
&lt;/h3&gt;&lt;p&gt;This is the uncomfortable part.&lt;/p&gt;
&lt;p&gt;Treating Azure VNets as an extension of the on‑prem “internal network” is no longer a risk &lt;strong&gt;it is an architectural failure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That failure usually shows up as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Broad RFC1918 route advertisement&lt;/li&gt;
&lt;li&gt;Shared DNS namespaces without containment intent&lt;/li&gt;
&lt;li&gt;Implicit trust based on IP origin rather than workload purpose&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These assumptions made sense in legacy estates. Carrying them into Azure turns hybrid connectivity into an amplifier for lateral movement.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This materially changes how you &lt;strong&gt;design, deploy, and operate&lt;/strong&gt; hybrid estates.&lt;/p&gt;
&lt;h3 id="containment-stops-at-the-wrong-places"&gt;Containment Stops at the Wrong Places
&lt;/h3&gt;&lt;p&gt;If a compromised Azure workload can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resolve on‑prem service names&lt;/li&gt;
&lt;li&gt;Route to broad on‑prem prefixes&lt;/li&gt;
&lt;li&gt;Reach shared or management services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then containment is no longer environment‑scoped. It’s estate‑wide.&lt;/p&gt;
&lt;p&gt;At that point, “hybrid” is not a boundary it’s a corridor.&lt;/p&gt;
&lt;h3 id="blast-radius-expands-by-default"&gt;Blast Radius Expands by Default
&lt;/h3&gt;&lt;p&gt;Most hybrid designs are asymmetric:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure workloads gain broad on‑prem reach&lt;/li&gt;
&lt;li&gt;On‑prem systems only require narrow Azure access&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That imbalance is perfect for lateral movement &lt;em&gt;out&lt;/em&gt; of Azure and &lt;em&gt;into&lt;/em&gt; legacy environments where controls are weakest and trust is highest.&lt;/p&gt;
&lt;h3 id="change-control-quietly-becomes-a-security-decision"&gt;Change Control Quietly Becomes a Security Decision
&lt;/h3&gt;&lt;p&gt;Adding a VNet peering, linking a DNS zone, or advertising a new route can silently expand the attack surface.&lt;/p&gt;
&lt;p&gt;These changes are often treated as networking hygiene, not trust‑boundary modifications.&lt;/p&gt;
&lt;p&gt;That mismatch is structural, not procedural.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="visualising-the-hybrid-eastwest-surface"&gt;Visualising the Hybrid East–West Surface
&lt;/h3&gt;&lt;p&gt;The tunnel isn’t the risk.&lt;br&gt;
Everything that becomes reachable &lt;em&gt;because&lt;/em&gt; of it is.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Azure Workload VNet]
B[Azure Shared Services VNet]
C[On‑Prem App Network]
D[On‑Prem Infra Network]
A --&gt; B
B --&gt; C
C --&gt; D
A -. DNS Resolution .-&gt; C
A -. Routing .-&gt; D
&lt;/div&gt;
&lt;p&gt;Once routing and DNS align, lateral movement doesn’t care which side of the cloud boundary it starts on.&lt;/p&gt;
&lt;h3 id="route-reality-check-azure-cli"&gt;Route Reality Check (Azure CLI)
&lt;/h3&gt;&lt;p&gt;This isn’t about configuring routes it’s about recognising adjacency.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network nic show-effective-route-table &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-prod &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name nic-app-01
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If an application NIC shows broad on‑prem prefixes with a &lt;strong&gt;Virtual network gateway&lt;/strong&gt; next hop, the question is no longer &lt;em&gt;“is this needed?”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It’s &lt;em&gt;“why is this workload adjacent to legacy infrastructure at all?”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That output isn’t just diagnostic data.&lt;br&gt;
It’s evidence of a trust decision already made.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;h3 id="doesnt-this-explode-cost-and-complexity"&gt;“Doesn’t This Explode Cost and Complexity?”
&lt;/h3&gt;&lt;p&gt;Yes, &lt;strong&gt;it can&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Rejecting universal hybrid adjacency often means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More deliberate workload placement&lt;/li&gt;
&lt;li&gt;Fewer but more intentional hybrid crossing points&lt;/li&gt;
&lt;li&gt;Increased up‑front design effort&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What it does &lt;em&gt;not&lt;/em&gt; automatically mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One tunnel per workload&lt;/li&gt;
&lt;li&gt;Dozens of ExpressRoutes&lt;/li&gt;
&lt;li&gt;Infinite network sprawl&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most estates don’t suffer because they have too many hybrid connections.&lt;br&gt;
They suffer because &lt;em&gt;everything&lt;/em&gt; is allowed to use the same one.&lt;/p&gt;
&lt;p&gt;Flat hybrid designs trade visible complexity for invisible blast radius. The cost doesn’t disappear — it just shows up later, under incident response and compensating controls.&lt;/p&gt;
&lt;h3 id="but-its-expressroute-its-private"&gt;“But It’s ExpressRoute, It’s Private”
&lt;/h3&gt;&lt;p&gt;Private doesn’t mean constrained.&lt;/p&gt;
&lt;p&gt;ExpressRoute often increases east–west risk because it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Encourages broader route propagation&lt;/li&gt;
&lt;li&gt;Reduces perceived scrutiny&lt;/li&gt;
&lt;li&gt;Becomes the default path for “just make it work” connectivity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The transport isn’t the issue. Reachability is.&lt;/p&gt;
&lt;h3 id="asymmetric-visibility-persists"&gt;Asymmetric Visibility Persists
&lt;/h3&gt;&lt;p&gt;Hybrid east–west paths routinely cross tooling boundaries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure flow logs on one side&lt;/li&gt;
&lt;li&gt;Legacy monitoring on the other&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No single team sees the full lateral path. That blind spot is architectural, not operational.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat hybrid routing and DNS changes as &lt;strong&gt;trust‑boundary decisions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Minimise advertised prefixes, especially management and shared services&lt;/li&gt;
&lt;li&gt;Avoid universal hybrid adjacency by default; justify it explicitly&lt;/li&gt;
&lt;li&gt;Review effective routes from workload NICs, not diagrams&lt;/li&gt;
&lt;li&gt;Accept that reducing blast radius may increase design effort and choose it anyway&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn’t about blocking traffic.&lt;br&gt;
It’s about being intentional about &lt;strong&gt;who becomes adjacent to what&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Hybrid connectivity doesn’t give attackers new capabilities it gives them &lt;em&gt;continuity&lt;/em&gt;.&lt;br&gt;
If everything is hybrid‑adjacent, then cloud and on‑prem aren’t environments anymore they’re just terrain.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/diagnose-network-routing-problem" target="_blank" rel="noopener"
&gt;Azure Effective Routes Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/" target="_blank" rel="noopener"
&gt;Hybrid Networking Architecture in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/dns/private-dns-overview" target="_blank" rel="noopener"
&gt;Azure Private DNS Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Segmentation vs Reality: Why East–West Risk Persists</title><link>https://blog.brewedinthecloud.com/p/east-west-segmentation-vs-reality-risk/</link><pubDate>Tue, 05 May 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/east-west-segmentation-vs-reality-risk/</guid><description>&lt;p&gt;Segmentation looks solid right up until something breaks.&lt;/p&gt;
&lt;p&gt;Not a pentest.&lt;br&gt;
Not a red‑team exercise.&lt;br&gt;
A real outage, at 2am, with customers waiting.&lt;/p&gt;
&lt;p&gt;That’s when the boundaries you designed start bending and some of them never snap back. East–west risk persists not because teams ignore segmentation, but because &lt;strong&gt;operations reward connectivity long after intent is forgotten&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
“If environments and tiers are segmented, lateral movement is constrained.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Segmentation is usually designed as a &lt;em&gt;static layout&lt;/em&gt;, while real systems are &lt;em&gt;dynamic under pressure&lt;/em&gt;. Once compromise is assumed, the question isn’t whether boundaries exist, it’s &lt;strong&gt;whether they survive shared services and incident response&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Most don’t.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In real Azure estates, segmentation fails less often because of missing controls and more often because of &lt;strong&gt;where trust accumulates&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Two forces dominate:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Shared services that span environments by design&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational exceptions made under urgency and never undone&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Neither feels risky in isolation. Together, they flatten the estate.&lt;/p&gt;
&lt;h3 id="where-teams-think-enforcement-lives"&gt;Where teams think enforcement lives
&lt;/h3&gt;&lt;p&gt;Boundaries are often assumed to be enforced by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VNets and peering layouts&lt;/li&gt;
&lt;li&gt;Subscription separation&lt;/li&gt;
&lt;li&gt;“This is prod, that isn’t”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But enforcement actually emerges from &lt;strong&gt;who can reach what during normal operations&lt;/strong&gt; especially automation and responders. That reach expands steadily unless actively constrained.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="example-1-the-shared-build-agent-that-becomes-the-bridge"&gt;Example 1: The Shared Build Agent That Becomes the Bridge
&lt;/h3&gt;&lt;p&gt;A central CI/CD build agent subnet deploys to multiple application VNets across prod and non‑prod. It needs access to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Source artefacts&lt;/li&gt;
&lt;li&gt;Deployment endpoints&lt;/li&gt;
&lt;li&gt;Management APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From an ops perspective, this is sensible. From a compromise perspective, it’s decisive.&lt;/p&gt;
&lt;p&gt;If a single build agent VM or pipeline identity is compromised, segmentation between environments becomes largely theoretical. East–west reach isn’t gained through clever movement it’s inherited.&lt;/p&gt;
&lt;p&gt;This is segmentation collapsing &lt;strong&gt;by design convenience&lt;/strong&gt;, not misconfiguration.&lt;/p&gt;
&lt;h3 id="example-2-incident-response-exceptions-that-never-roll-back"&gt;Example 2: Incident Response Exceptions That Never Roll Back
&lt;/h3&gt;&lt;p&gt;During a production incident, teams temporarily allow additional east–west access to diagnose or stabilise the system. The change is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Time‑boxed in intent&lt;/li&gt;
&lt;li&gt;Permanent in practice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No one updates the diagram. No one re‑validates the boundary. The estate now contains a path that only exists because &lt;em&gt;things once went wrong&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Multiply this across incidents, migrations, and staff turnover, and segmentation slowly becomes an archival concept.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;This isn’t about adding more rules. It’s about &lt;strong&gt;making segmentation intent explicit and reviewable&lt;/strong&gt;, especially around shared services.&lt;/p&gt;
&lt;h3 id="encoding-segmentation-intent-for-shared-services"&gt;Encoding segmentation intent for shared services
&lt;/h3&gt;&lt;p&gt;Below is a deliberately lightweight Bicep example that tags a shared service VNet with &lt;em&gt;declared blast radius&lt;/em&gt;. This does not enforce isolation it makes erosion visible.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sharedServicesVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnet-shared-services&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;shared-services&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;permittedEnvironments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;prod,nonprod&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eastWestRisk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;high&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;platform-team&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Why this matters operationally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shared services are &lt;strong&gt;explicitly acknowledged&lt;/strong&gt; as risk concentrators&lt;/li&gt;
&lt;li&gt;Platform teams can be challenged on blast radius during reviews&lt;/li&gt;
&lt;li&gt;Drift between “should reach” and “does reach” becomes auditable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Segmentation that can’t be reasoned about programmatically won’t survive growth.&lt;/p&gt;
&lt;h3 id="what-eastwest-reality-often-looks-like"&gt;What east–west reality often looks like
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
BuildAgent[Shared Build Agent]
ProdApp[Prod App Tier]
NonProdApp[Non‑Prod App Tier]
IncidentAccess[Temporary Incident Access]
BuildAgent --&gt; ProdApp
BuildAgent --&gt; NonProdApp
IncidentAccess --&gt; ProdApp
&lt;/div&gt;
&lt;p&gt;None of these paths are accidental. That’s the point.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shared services are rarely treated as first‑class risk domains&lt;/strong&gt;&lt;br&gt;
They’re optimised for reliability and speed, not containment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Incident changes bypass architecture review by necessity&lt;/strong&gt;&lt;br&gt;
If rollback isn’t operationally enforced, it won’t happen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Segmentation reviews usually happen pre‑deployment&lt;/strong&gt;&lt;br&gt;
East–west risk emerges post‑incident and post‑migration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat shared services as &lt;strong&gt;deliberate blast‑radius expanders&lt;/strong&gt;, not neutral infrastructure.&lt;/li&gt;
&lt;li&gt;Assume any access granted during incidents will persist unless actively removed.&lt;/li&gt;
&lt;li&gt;Regularly review segmentation &lt;strong&gt;starting from shared services outward&lt;/strong&gt;, not from app tiers inward.&lt;/li&gt;
&lt;li&gt;Prefer fewer boundaries that survive incidents over many that don’t.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is not about perfection, it’s about survivability under stress.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Segmentation rarely fails at design time.&lt;br&gt;
It fails when convenience and urgency quietly outvote intent and no one is accountable for restoring the boundary.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/security/fundamentals/network-overview" target="_blank" rel="noopener"
&gt;Azure network security overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/adopt/prevent-reduce-business-damage-breach-infrastructure" target="_blank" rel="noopener"
&gt;Implement security breach prevention and recovery infrastructure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/framework/security/overview" target="_blank" rel="noopener"
&gt;Azure Well‑Architected Framework – Security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How Azure Networking Quietly Enables Lateral Movement</title><link>https://blog.brewedinthecloud.com/p/east-west-networking-quietly-enables-lateral-movement/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/east-west-networking-quietly-enables-lateral-movement/</guid><description>&lt;p&gt;Most Azure estates don’t &lt;em&gt;feel&lt;/em&gt; flat.&lt;/p&gt;
&lt;p&gt;They have hubs, spokes, subnets, and diagrams that suggest intent and order. On paper, things look segmented. Contained. Reasonable.&lt;/p&gt;
&lt;p&gt;Yet once something unwanted lands inside, movement often feels frictionless like walking through an open-plan office where every door politely steps aside.&lt;/p&gt;
&lt;p&gt;That isn’t because someone forgot a firewall rule.&lt;br&gt;
It’s because Azure networking is doing exactly what it was designed to do.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
Internal Azure networks are segmented unless you explicitly connect them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Azure optimises for &lt;em&gt;reachability, symmetry, and operational correctness&lt;/em&gt;. Once you create connectivity, Azure assumes you meant it, and it works hard to preserve stable, symmetric paths between everything involved.&lt;/p&gt;
&lt;p&gt;East–west movement isn’t an attacker trick.&lt;br&gt;
It’s an architectural outcome.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Let’s talk about behaviour, not marketing diagrams.&lt;/p&gt;
&lt;h3 id="symmetric-hub-routing-is-the-real-enabler"&gt;Symmetric hub routing is the real enabler
&lt;/h3&gt;&lt;p&gt;Azure VNet peering itself is non‑transitive. On its own, it doesn’t flatten anything.&lt;/p&gt;
&lt;p&gt;Transitivity appears when architects (often correctly, at the time):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Centralise routing through a hub&lt;/li&gt;
&lt;li&gt;Introduce Azure Firewall or NVAs&lt;/li&gt;
&lt;li&gt;Apply default UDRs (&lt;code&gt;0.0.0.0/0&lt;/code&gt;) from spokes to the hub&lt;/li&gt;
&lt;li&gt;Expect symmetric paths for reliability and troubleshooting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, the hub stops being a boundary and becomes a &lt;strong&gt;routing fabric&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Once symmetry is restored, spoke‑to‑spoke reachability isn’t an accident it’s the inevitable result of a design optimised for correctness.&lt;/p&gt;
&lt;h3 id="azure-preserves-paths-aggressively"&gt;Azure preserves paths aggressively
&lt;/h3&gt;&lt;p&gt;Azure system routes and platform behaviour:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prefer the most specific prefix&lt;/li&gt;
&lt;li&gt;Preserve return paths when they exist&lt;/li&gt;
&lt;li&gt;Avoid blackholing traffic unless explicitly instructed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is excellent for application uptime.&lt;br&gt;
It’s also excellent for internal exploration.&lt;/p&gt;
&lt;p&gt;If a packet can get there &lt;em&gt;and&lt;/em&gt; come back, Azure will try very hard to keep that path stable.&lt;/p&gt;
&lt;h2 id="a-hard-admission"&gt;A Hard Admission
&lt;/h2&gt;&lt;p&gt;I’ve implemented symmetric hub routing myself more than once.&lt;/p&gt;
&lt;p&gt;It solved real problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Predictable traffic flows&lt;/li&gt;
&lt;li&gt;Fewer asymmetric failures&lt;/li&gt;
&lt;li&gt;Easier troubleshooting at 2am&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I underestimated wasn’t the firewall or the rules.&lt;br&gt;
It was how completely Azure erased any remaining sense of internal boundary once symmetry was restored.&lt;/p&gt;
&lt;p&gt;The design was &lt;em&gt;correct&lt;/em&gt;.&lt;br&gt;
The blast radius was just larger than I intended.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This isn’t theoretical. It changes outcomes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design&lt;/strong&gt;&lt;br&gt;
Symmetric hub routing collapses routing domains. Once in a spoke, the rest of the estate becomes &lt;em&gt;discoverable by default&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;br&gt;
The same paths that propagate traffic propagate failures security incidents and outages share infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;br&gt;
Lateral movement becomes a question of &lt;em&gt;which routes exist&lt;/em&gt;, not which controls failed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;br&gt;
Broad east–west flows quietly consume firewall throughput and bandwidth even during normal operation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Practical anchor:&lt;/strong&gt;&lt;br&gt;
This should change when and how freely, you restore routing symmetry in your designs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="implementation-example"&gt;Implementation Example
&lt;/h2&gt;&lt;h3 id="the-standard-hubandspoke-pattern"&gt;The “standard” hub‑and‑spoke pattern
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
SpokeA --&gt; Hub
SpokeB --&gt; Hub
Hub --&gt; SpokeA
Hub --&gt; SpokeB
Hub --&gt; SharedServices
SharedServices --&gt; Hub
&lt;/div&gt;
&lt;p&gt;No direct peering between spokes.&lt;br&gt;
Yet full spoke‑to‑spoke reachability exists via the hub.&lt;/p&gt;
&lt;h3 id="the-udr-that-makes-it-inevitable"&gt;The UDR that makes it inevitable
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeRouteTable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/routeTables@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;rt-spoke-default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default-to-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0.0.0.0/0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualAppliance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopIpAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.4&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Hub firewall or NVA&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This single route:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Restores symmetry&lt;/li&gt;
&lt;li&gt;Makes the hub a transit router&lt;/li&gt;
&lt;li&gt;Removes natural routing boundaries between spokes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Operationally clean.&lt;br&gt;
Architecturally expansive.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Peering flags don’t save you&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;AllowForwardedTraffic = false&lt;/code&gt; doesn’t help once routing is reintroduced elsewhere.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gateway transit magnifies the effect&lt;/strong&gt;&lt;br&gt;
Shared gateways flatten routing domains even further.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Private Endpoints don’t change this&lt;/strong&gt;&lt;br&gt;
They reduce exposure, not reachability. Routes still define movement.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="guidance-for-future-designs"&gt;Guidance for Future Designs
&lt;/h2&gt;&lt;p&gt;This isn’t about banning hubs or symmetry. It’s about intent.&lt;/p&gt;
&lt;h3 id="treat-routing-symmetry-as-privileged"&gt;Treat routing symmetry as privileged
&lt;/h3&gt;&lt;p&gt;In Azure, symmetric routing is not neutral.&lt;br&gt;
It is a &lt;em&gt;privileged capability&lt;/em&gt; that should be granted deliberately and narrowly.&lt;/p&gt;
&lt;p&gt;If symmetry isn’t required, let paths fail closed.&lt;/p&gt;
&lt;h3 id="design-routing-domains-not-just-vnets"&gt;Design routing domains, not just VNets
&lt;/h3&gt;&lt;p&gt;VNets and spokes are implementation details.&lt;br&gt;
Routing domains define blast radius.&lt;/p&gt;
&lt;p&gt;If two workloads don’t need to talk &lt;em&gt;both ways&lt;/em&gt;, they don’t belong in the same routing domain regardless of how tidy the diagram looks.&lt;/p&gt;
&lt;h3 id="make-hubs-earn-their-reach"&gt;Make hubs earn their reach
&lt;/h3&gt;&lt;p&gt;Centralised hubs trade convenience for scale including the scale of failure.&lt;/p&gt;
&lt;p&gt;Every east–west path enabled by a hub should be justified.&lt;br&gt;
“Operational simplicity” alone is not a sufficient reason.&lt;/p&gt;
&lt;h3 id="defer-symmetry-dont-default-to-it"&gt;Defer symmetry, don’t default to it
&lt;/h3&gt;&lt;p&gt;Today, I treat symmetric hub routing as an optimisation to be earned late not a baseline assumed early.&lt;/p&gt;
&lt;p&gt;That single shift changes how networks age under pressure.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Azure rewards correctness and connectivity.&lt;br&gt;
Restraint is something you have to design &lt;em&gt;against&lt;/em&gt; the platform on purpose.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure virtual network traffic routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview" target="_blank" rel="noopener"
&gt;Virtual network peering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/hub-spoke" target="_blank" rel="noopener"
&gt;Hub-spoke network topology in Azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Trust Boundaries That Exist Only in Diagrams</title><link>https://blog.brewedinthecloud.com/p/east-west-trust-boundaries/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/east-west-trust-boundaries/</guid><description>&lt;p&gt;Most Azure environments are beautifully segmented, on paper.&lt;/p&gt;
&lt;p&gt;Prod, non‑prod, shared services, landing zones. Clean lines. Sensible colours. Everyone agrees where the trust boundaries &lt;em&gt;are supposed&lt;/em&gt; to be.&lt;/p&gt;
&lt;p&gt;Then a single workload gets compromised, and suddenly the attacker has options.&lt;/p&gt;
&lt;p&gt;Not because anyone misconfigured a firewall.&lt;br&gt;
Because the &lt;em&gt;boundary never existed at runtime&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Different subscriptions, VNets, or environments imply different trust levels.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Azure does not enforce trust.&lt;br&gt;
Azure enforces &lt;em&gt;reachability&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A trust boundary only exists where &lt;strong&gt;no routable path exists at runtime&lt;/strong&gt;.&lt;br&gt;
If packets can flow, trust already exists regardless of ownership, intent, or documentation.&lt;/p&gt;
&lt;p&gt;Everything else is risk management dressed up as segmentation.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure networking behaves like software, not policy.&lt;/p&gt;
&lt;p&gt;Once east–west reachability is present:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The platform routes packets without regard for environment labels&lt;/li&gt;
&lt;li&gt;Subscriptions are ignored entirely by the data plane&lt;/li&gt;
&lt;li&gt;VNets become peers the moment routing allows it&lt;/li&gt;
&lt;li&gt;Workloads assume whatever the network allows them to see&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What architects often describe as “implicit trust” is actually &lt;strong&gt;emergent trust&lt;/strong&gt; — created unintentionally by routing decisions.&lt;/p&gt;
&lt;p&gt;Three types of trust are routinely conflated:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trust Type&lt;/th&gt;
&lt;th&gt;What it governs&lt;/th&gt;
&lt;th&gt;What it does &lt;em&gt;not&lt;/em&gt; govern&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Administrative trust&lt;/td&gt;
&lt;td&gt;Who can deploy or change resources&lt;/td&gt;
&lt;td&gt;Runtime communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network trust&lt;/td&gt;
&lt;td&gt;IP reachability&lt;/td&gt;
&lt;td&gt;Workload intent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workload trust&lt;/td&gt;
&lt;td&gt;What the application expects&lt;/td&gt;
&lt;td&gt;Network exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Only one of these determines lateral movement potential: &lt;strong&gt;network reachability&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This is why east–west traffic is the real attack surface.&lt;/p&gt;
&lt;p&gt;In live Azure estates, “diagram‑only” boundaries collapse into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shared services VNets acting as lateral movement bridges&lt;/li&gt;
&lt;li&gt;Hub‑and‑spoke designs where isolation is assumed, not enforced&lt;/li&gt;
&lt;li&gt;Environment separation that disappears once routing converges&lt;/li&gt;
&lt;li&gt;Legacy peerings that quietly expand blast radius year after year&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From an attacker’s perspective, the estate is mapped by a single question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“What IP space can I reach next?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If the answer spans environments, subscriptions, or tiers — the boundary was imaginary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How would this change something I design, deploy, or operate?&lt;/strong&gt;&lt;br&gt;
You stop asking &lt;em&gt;who owns this network&lt;/em&gt; and start asking &lt;em&gt;what can this workload actually reach at runtime&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="the-invisible-trust-of-vnet-peering"&gt;The Invisible Trust of VNet Peering
&lt;/h3&gt;&lt;p&gt;Nothing here declares trust:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeToHubPeering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;spoke-to-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useRemoteGateways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;But at runtime:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Routes are exchanged&lt;/li&gt;
&lt;li&gt;IP reachability exists&lt;/li&gt;
&lt;li&gt;Any listening service becomes a lateral movement candidate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The trust relationship is not configured.&lt;br&gt;
It &lt;strong&gt;emerges&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Peering itself isn’t “transitive” — but &lt;em&gt;reachability becomes effectively transitive&lt;/em&gt; once routing and shared paths exist.&lt;/p&gt;
&lt;p&gt;That distinction matters operationally, not architecturally.&lt;/p&gt;
&lt;h3 id="visualising-trust-vs-reachability"&gt;Visualising Trust vs Reachability
&lt;/h3&gt;&lt;p&gt;Most diagrams show connectivity.&lt;br&gt;
Attackers care about &lt;em&gt;paths&lt;/em&gt;.&lt;/p&gt;
&lt;div class="mermaid"&gt;graph LR
A[Prod App VNet]
B[Non-Prod App VNet]
C[Shared Services VNet]
A --- C
B --- C
style A fill:#cce5ff
style B fill:#d5f5e3
style C fill:#f9e79f
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Intended trust:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prod trusts Shared&lt;/li&gt;
&lt;li&gt;Non‑Prod trusts Shared&lt;/li&gt;
&lt;li&gt;Prod does not trust Non‑Prod&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Runtime reality:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prod ↔ Shared ↔ Non‑Prod&lt;/li&gt;
&lt;li&gt;A routable path exists&lt;/li&gt;
&lt;li&gt;Therefore, trust exists&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The network does not infer your intent.&lt;br&gt;
It enforces physics.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Subscription boundaries have &lt;strong&gt;zero impact&lt;/strong&gt; on packet flow&lt;/li&gt;
&lt;li&gt;Environment naming is invisible to the data plane&lt;/li&gt;
&lt;li&gt;“Temporary” peerings almost never get removed&lt;/li&gt;
&lt;li&gt;Shared services quietly accumulate the widest blast radius&lt;/li&gt;
&lt;li&gt;Once breached, containment follows routing — not diagrams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this requires negligence.&lt;br&gt;
It emerges from reasonable defaults applied over time.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat &lt;strong&gt;absence of reachability&lt;/strong&gt; as the only real trust boundary&lt;/li&gt;
&lt;li&gt;Assume any routable east–west path will eventually be abused&lt;/li&gt;
&lt;li&gt;Design shared services as &lt;strong&gt;risk concentrators&lt;/strong&gt;, not neutral hubs&lt;/li&gt;
&lt;li&gt;Regularly review &lt;em&gt;effective reachability&lt;/em&gt;, not intended architecture&lt;/li&gt;
&lt;li&gt;If two environments must not trust each other, &lt;strong&gt;they must not be routable — full stop&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is Assume Breach applied to network design, not policy.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;If a trust boundary isn’t enforced by the platform at runtime, it isn’t a boundary — it’s a diagram annotation.&lt;/p&gt;
&lt;p&gt;Good Azure architecture starts by being honest about where packets can actually go.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview" target="_blank" rel="noopener"
&gt;Azure virtual network peering overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/security/fundamentals/network-overview" target="_blank" rel="noopener"
&gt;Azure networking security overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/adopt/prevent-reduce-business-damage-breach-infrastructure" target="_blank" rel="noopener"
&gt;Implement security breach prevention and recovery infrastructure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>East–West Traffic Is Where Cloud Incidents Actually Spread</title><link>https://blog.brewedinthecloud.com/p/east-west-traffic-spread/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/east-west-traffic-spread/</guid><description>&lt;p&gt;Most cloud incidents don’t escalate because someone was clever at breaking in.&lt;/p&gt;
&lt;p&gt;They escalate because the environment was already &lt;em&gt;helpful&lt;/em&gt; once they arrived.&lt;/p&gt;
&lt;p&gt;If you’ve ever sat in a post‑incident review thinking, &lt;em&gt;“I didn’t realise those systems could talk to each other”&lt;/em&gt;, you’ve already seen where the real damage happens east–west traffic.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
“Internal traffic is safer. The perimeter is where risk lives.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Under an Assume Breach mindset, &lt;em&gt;internal reachability is the primary blast‑radius multiplier&lt;/em&gt;. East–west paths are rarely designed to contain failure. They’re designed to keep systems working as requirements evolve.&lt;/p&gt;
&lt;p&gt;That makes them durable, invisible, and dangerous under compromise.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In Azure estates, east–west traffic isn’t centrally planned. It &lt;em&gt;emerges&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It emerges from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Incremental connectivity added to unblock delivery&lt;/li&gt;
&lt;li&gt;Runtime dependencies discovered after go‑live&lt;/li&gt;
&lt;li&gt;Legacy behaviour preserved to avoid outages&lt;/li&gt;
&lt;li&gt;Organisational pressure to keep things moving&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each individual decision is reasonable. Collectively, they form traversal paths no one set out to design, but which attackers can rely on.&lt;/p&gt;
&lt;p&gt;The platform doesn’t distinguish between “architectural intent” and “operational necessity”. Routing and reachability follow what exists &lt;em&gt;now&lt;/em&gt;, not what was drawn.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Here’s a common post‑incident pattern.&lt;/p&gt;
&lt;p&gt;A business application is described and diagrammed, as a classic three‑tier design: web, app, data. During a containment exercise, outbound connectivity from the app tier back to the web tier is disabled as a scream test.&lt;/p&gt;
&lt;p&gt;Production breaks.&lt;/p&gt;
&lt;p&gt;Investigation shows the app tier is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing files back to the web tier for user access, and/or&lt;/li&gt;
&lt;li&gt;Responding directly to users under certain workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this was malicious. All of it was &lt;em&gt;required&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The bidirectional connectivity wasn’t an accident it was an operational dependency that formed after the original design. Over time, that dependency became untouchable.&lt;/p&gt;
&lt;p&gt;From a breach perspective, compromise of the app tier now inherently includes a path back to user‑facing surfaces without exploiting anything new.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How would this change something I design, deploy, or operate?&lt;/strong&gt;&lt;br&gt;
You stop trusting tier labels and start validating &lt;em&gt;directional behaviour&lt;/em&gt;. “Internal” no longer means “contained”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="structural-reasons-eastwest-paths-persist"&gt;Structural Reasons East–West Paths Persist
&lt;/h2&gt;&lt;p&gt;These paths survive because they acquire protection through necessity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They’re justified post‑hoc as “how the app works”&lt;/li&gt;
&lt;li&gt;They’re undocumented because they evolved organically&lt;/li&gt;
&lt;li&gt;They can’t be removed without immediate impact&lt;/li&gt;
&lt;li&gt;They cross boundaries that were never designed as security controls&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The phrase that shows up in reviews is telling: &lt;strong&gt;“unexpected but required”&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Once something is required, it stops being questioned and becomes architectural fact.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="architecture-view-how-runtime-behaviour-overrides-design"&gt;Architecture View: How Runtime Behaviour Overrides Design
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
U[User] --&gt; W[Web Tier]
W --&gt; A[App Tier]
A --&gt; D[Data Tier]
A --&gt;|Operational Dependency| W
style A fill:#f5f5f5
style W fill:#f5f5f5
&lt;/div&gt;
&lt;p&gt;The diagram says “three tiers”.&lt;br&gt;
The runtime says “bidirectional”.&lt;/p&gt;
&lt;p&gt;Attackers only need to follow what already works.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“Same app” is not a containment boundary&lt;/strong&gt;&lt;br&gt;
Lateral movement doesn’t care about application ownership.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scream tests reveal truth late&lt;/strong&gt;&lt;br&gt;
By the time you can’t disable a path, it’s already structural.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Directionality is rarely validated&lt;/strong&gt;&lt;br&gt;
Engineers confirm &lt;em&gt;that&lt;/em&gt; traffic flows, not &lt;em&gt;who initiates it&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Removal risk entrenches exposure&lt;/strong&gt;&lt;br&gt;
The harder a path is to remove, the more dangerous it becomes under breach.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Without touching specific controls:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Treat east–west connectivity as &lt;strong&gt;intentional architecture&lt;/strong&gt;, not background plumbing&lt;/li&gt;
&lt;li&gt;Validate &lt;em&gt;direction of initiation&lt;/em&gt;, not just reachability&lt;/li&gt;
&lt;li&gt;Assume every “temporary” dependency will outlive its justification&lt;/li&gt;
&lt;li&gt;Design internal paths so they can fail without collapsing user‑facing surfaces&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Containment is a design outcome, not a firewall feature.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; In cloud environments, lateral movement usually isn’t enabled by attackers, it’s enabled by applications quietly evolving past their original design.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/security/benchmark/azure/security-controls-v3-network-security" target="_blank" rel="noopener"
&gt;Microsoft Learn — &lt;em&gt;Assume breach and network security concepts&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/networking/" target="_blank" rel="noopener"
&gt;Azure Architecture Centre — &lt;em&gt;Network design principles&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Networks That Fail Safely Under Breach Conditions</title><link>https://blog.brewedinthecloud.com/p/assume-breach-networks-fail-safely-under-breach-conditions/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/assume-breach-networks-fail-safely-under-breach-conditions/</guid><description>&lt;p&gt;Most Azure networks are designed like espresso machines: finely tuned, pressure‑balanced, and very unhappy when you pull the wrong lever.&lt;/p&gt;
&lt;p&gt;Under steady state, that precision feels like quality engineering.&lt;br&gt;
Under breach conditions, it often turns out to be fragility.&lt;/p&gt;
&lt;p&gt;Assume breach changes the question from &lt;em&gt;“How do I keep them out?”&lt;/em&gt; to a much less comfortable one:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“What happens to my network when someone is already in and I start breaking things on purpose?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
If a network is secure enough to prevent compromise, it will behave sensibly once compromised.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Most Azure networks are optimised for &lt;em&gt;normal operations&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shared route tables for consistency&lt;/li&gt;
&lt;li&gt;Centralised inspection paths&lt;/li&gt;
&lt;li&gt;Broad east‑west reachability “inside the VNet”&lt;/li&gt;
&lt;li&gt;Security controls designed to be added, not activated&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These choices feel clean and efficient, right up until containment is required.&lt;br&gt;
At that point, the network stops being infrastructure and becomes a &lt;strong&gt;live incident tool&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Networks that were never designed to fail don’t fail gracefully. They fail &lt;em&gt;globally&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Once breach is assumed, the network’s job changes.&lt;/p&gt;
&lt;p&gt;It is no longer primarily a preventative control.&lt;br&gt;
It is an &lt;strong&gt;active constraint system&lt;/strong&gt; that must support human decision‑making under stress.&lt;/p&gt;
&lt;p&gt;Fail‑safe networks behave differently in four key ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Localised trust&lt;/strong&gt; – Compromise in one subnet does not imply reachability elsewhere.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predictable degradation&lt;/strong&gt; – Containment actions reduce capability in known, bounded ways.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asymmetric pain&lt;/strong&gt; – Attackers lose freedom faster than defenders lose visibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defender‑first control&lt;/strong&gt; – Emergency actions don’t depend on shared components that attackers may already influence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The absence of these traits is what makes a network &lt;em&gt;brittle&lt;/em&gt;, regardless of how “secure” it looks on a diagram.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This reframes several everyday Azure design decisions.&lt;/p&gt;
&lt;h3 id="shared-route-tables-are-actively-unsafe-under-breach"&gt;Shared Route Tables Are Actively Unsafe Under Breach
&lt;/h3&gt;&lt;p&gt;This is the strongest claim in this post, and it’s deliberate.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;single shared UDR (User‑Defined Route) per VNet or app tier&lt;/strong&gt; is not just sub‑optimal, it is &lt;em&gt;dangerous&lt;/em&gt; under assume‑breach conditions.&lt;/p&gt;
&lt;p&gt;Here’s what actually happens during an incident:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A single subnet is suspected of compromise.&lt;/li&gt;
&lt;li&gt;Containment requires changing egress or east‑west routing.&lt;/li&gt;
&lt;li&gt;The route table is shared.&lt;/li&gt;
&lt;li&gt;Isolation becomes a &lt;strong&gt;multi‑subnet blast event&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Legitimate workloads break.&lt;/li&gt;
&lt;li&gt;On‑call engineers hesitate.&lt;/li&gt;
&lt;li&gt;The attacker benefits from defender uncertainty.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that moment, routing is no longer a connectivity concern.&lt;br&gt;
It is a &lt;strong&gt;blast‑radius control plane&lt;/strong&gt; and you’ve centralised it.&lt;/p&gt;
&lt;p&gt;If isolating one subnet requires asking &lt;em&gt;“what else uses this route table?”&lt;/em&gt;, the network does not fail safely.&lt;/p&gt;
&lt;h3 id="failsafe-means-small-reversible-mistakes"&gt;Fail‑Safe Means “Small, Reversible Mistakes”
&lt;/h3&gt;&lt;p&gt;Under pressure, defenders will make imperfect calls.&lt;br&gt;
Fail‑safe networks are designed around that reality.&lt;/p&gt;
&lt;p&gt;Good failure looks like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One subnet isolated, not a whole tier&lt;/li&gt;
&lt;li&gt;One workload degraded, not all egress&lt;/li&gt;
&lt;li&gt;Defender access preserved&lt;/li&gt;
&lt;li&gt;Telemetry still flowing&lt;/li&gt;
&lt;li&gt;Clear rollback paths&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bad failure looks like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Widespread outages caused by containment&lt;/li&gt;
&lt;li&gt;Automation immediately undoing emergency changes&lt;/li&gt;
&lt;li&gt;Engineers afraid to touch the network mid‑incident&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Assume breach is not about perfect response. It’s about &lt;strong&gt;survivable response&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;This is about &lt;em&gt;shape&lt;/em&gt;, not templates.&lt;/p&gt;
&lt;h3 id="subnetscoped-isolation-via-nsgs"&gt;Subnet‑Scoped Isolation via NSGs
&lt;/h3&gt;&lt;p&gt;One practical pattern is designing isolation to be &lt;strong&gt;subnet‑local&lt;/strong&gt;, without touching shared routing or central firewalls.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isolationNsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2023-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nsg-isolation-app1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny-All-Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-Defender-Access&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;110&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Tcp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzureBastion&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;22&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Boundary of this approach:&lt;/strong&gt;&lt;br&gt;
NSGs don’t override routing, and they don’t magically preserve return paths. They work &lt;em&gt;because&lt;/em&gt; routing blast radius has already been constrained elsewhere. If your isolation depends on a shared UDR, this pattern collapses.&lt;/p&gt;
&lt;h3 id="architectural-shape-containment-without-global-impact"&gt;Architectural Shape: Containment Without Global Impact
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
subgraph VNet
subgraph ZoneA["App Zone A"]
A1[App Subnet]
end
subgraph ZoneB["App Zone B"]
B1[App Subnet]
end
subgraph Control["Defender Control Plane"]
Bastion
Logs
end
end
A1 --&gt;|Explicit, Limited Paths| B1
A1 --&gt;|Telemetry Only| Logs
Bastion --&gt; A1
&lt;/div&gt;
&lt;p&gt;The important property here is not segmentation it’s &lt;strong&gt;decision locality&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Containment decisions apply where the problem exists, not everywhere trust happens to be shared.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automation can be an attacker’s ally&lt;/strong&gt;&lt;br&gt;
Policy and IaC pipelines that auto‑remediate “drift” will happily undo containment unless explicitly designed not to. This is not a tooling bug, it’s a design failure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service and private endpoints can surprise you&lt;/strong&gt;&lt;br&gt;
Under containment, DNS resolution and endpoint reachability may not follow your mental model of “blocked traffic”. Treat them as reachability shortcuts that need explicit consideration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platform traffic still matters&lt;/strong&gt;&lt;br&gt;
Over‑zealous denies can break health probes, backups, or agent connectivity. Fail‑safe design preserves defender visibility first.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat routing as a &lt;strong&gt;blast‑radius control&lt;/strong&gt;, not a convenience layer.&lt;/li&gt;
&lt;li&gt;Avoid shared UDRs where containment scope matters.&lt;/li&gt;
&lt;li&gt;Design isolation actions that are &lt;strong&gt;subnet‑local and reversible&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Preserve defender access and telemetry under all containment states.&lt;/li&gt;
&lt;li&gt;Assume automation will act and decide whether it should during incidents.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; I’ve made the shared‑UDR decision myself, more than once because it looked clean and “enterprise‑ready”.&lt;br&gt;
Working through assume breach has forced me to re‑learn that convenience today often becomes fragility tomorrow, and that’s now something I actively push back on in my own designs.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure Virtual Network Routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/network-security-groups-overview" target="_blank" rel="noopener"
&gt;Azure Network Security Groups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/bastion/bastion-overview" target="_blank" rel="noopener"
&gt;Azure Bastion Architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mapping Attacker Movement Through Azure Networks</title><link>https://blog.brewedinthecloud.com/p/assume-breach-mapping-attacker-movement/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/assume-breach-mapping-attacker-movement/</guid><description>&lt;p&gt;Most Azure networks aren’t breached because they’re badly built.&lt;br&gt;
They’re breached because they’re &lt;strong&gt;too well connected&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Hub‑and‑spoke. Shared services. Clean routing. Minimal friction.&lt;br&gt;
All sensible, until someone is already inside.&lt;/p&gt;
&lt;p&gt;At that point, your network diagram stops being documentation and starts being a &lt;strong&gt;movement map&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Assume breach isn’t about stopping entry.&lt;br&gt;
It’s about deciding &lt;strong&gt;how far someone can walk once they’re through the door&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If it’s internal and peered, it’s trusted enough.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This usually manifests as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Broad hub‑to‑spoke peering&lt;/li&gt;
&lt;li&gt;Shared services VNets reachable from everywhere&lt;/li&gt;
&lt;li&gt;Routing optimised for convenience, not containment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why it misleads:&lt;/strong&gt;&lt;br&gt;
Azure networking is not &lt;em&gt;transitive&lt;/em&gt; in protocol terms but it is &lt;strong&gt;effectively transitive in operational reality&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If Azure’s control plane gives you a valid route:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The destination exists&lt;/li&gt;
&lt;li&gt;The return path exists&lt;/li&gt;
&lt;li&gt;The trust decision has already been made&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NSGs may block traffic, but &lt;strong&gt;routing defines possibility&lt;/strong&gt;.&lt;br&gt;
And possibility is all an attacker needs to plan movement.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Attackers don’t need clever tricks to move through Azure networks.&lt;br&gt;
They rely on the same primitives your workloads do.&lt;/p&gt;
&lt;h3 id="routing-defines-the-playing-field"&gt;Routing Defines the Playing Field
&lt;/h3&gt;&lt;p&gt;System routes and peering expose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which address spaces are reachable&lt;/li&gt;
&lt;li&gt;Which segments are adjacent&lt;/li&gt;
&lt;li&gt;Which services sit “between” environments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once a route exists, that relationship is discoverable, regardless of whether traffic is later denied.&lt;/p&gt;
&lt;h3 id="peering-is-a-trust-boundary-whether-you-admit-it-or-not"&gt;Peering Is a Trust Boundary (Whether You Admit It or Not)
&lt;/h3&gt;&lt;p&gt;VNet peering establishes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mutual reachability&lt;/li&gt;
&lt;li&gt;Automatic return paths&lt;/li&gt;
&lt;li&gt;Address‑space visibility&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From an assume‑breach lens, peering answers the most important question an attacker asks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“What am I implicitly trusted to talk to?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="shared-services-quietly-become-pivots"&gt;Shared Services Quietly Become Pivots
&lt;/h3&gt;&lt;p&gt;Jump hosts, automation, internal APIs, update services these aren’t neutral.&lt;br&gt;
They are &lt;strong&gt;high‑leverage infrastructure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When they’re broadly reachable, they stop being helpers and start being &lt;strong&gt;accelerators&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This reframes how you should design and operate Azure networks.&lt;/p&gt;
&lt;h3 id="design-from-connectivity-to-containment"&gt;Design: From Connectivity to Containment
&lt;/h3&gt;&lt;p&gt;The key question is no longer:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Who needs access to this?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It becomes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If this subnet is compromised, what trust does it inherit?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That shift usually leads to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Smaller, purpose‑bound VNets&lt;/li&gt;
&lt;li&gt;Fewer unconditional peerings&lt;/li&gt;
&lt;li&gt;Explicit containment boundaries that exist &lt;em&gt;before&lt;/em&gt; an incident&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="incident-response-optionality-matters"&gt;Incident Response: Optionality Matters
&lt;/h3&gt;&lt;p&gt;During an incident you can’t redesign the network.&lt;br&gt;
You can only &lt;strong&gt;remove paths&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Architectures that collapse operations and containment into the same peering force bad choices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep dangerous paths open to preserve access&lt;/li&gt;
&lt;li&gt;Or cut everything and accept collateral damage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Assume breach is about preserving &lt;strong&gt;choice under pressure&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="the-diagram-that-actually-matters"&gt;The Diagram That Actually Matters
&lt;/h3&gt;&lt;p&gt;Most diagrams show connectivity.&lt;br&gt;
This one highlights &lt;strong&gt;the single link that usually breaks containment&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Compromised Workload&lt;br/&gt;Spoke-App-1] --&gt;|System Routes| B[App Subnets]
B --&gt;|Peering| C[Hub VNet]
C --&gt;|Peering| D[Shared Services VNet]
C --&gt;|Peering| E[Spoke-App-2]
D --&gt; F[Jump Hosts]
D --&gt; G[Automation / APIs]
style A fill:#ffdddd
style D fill:#ffe0b2
style C fill:#e3f2fd
style B fill:#f5f5f5
%% Emphasis
B --&gt;|Incident-Critical Trust Path| D
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Judgement, not illustration:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a single peering link enables both &lt;em&gt;normal operations&lt;/em&gt; and &lt;em&gt;lateral movement during compromise&lt;/em&gt;, it is the wrong trust boundary.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In most environments, that link is:
&lt;strong&gt;Spoke → Shared Services (often via the hub)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That is the path you will want to cut first and often can’t.&lt;/p&gt;
&lt;h3 id="inspecting-the-paths-youve-already-allowed"&gt;Inspecting the Paths You’ve Already Allowed
&lt;/h3&gt;&lt;p&gt;You don’t need attacker tooling to see this. Azure exposes it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network nic show-effective-route-table &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-app1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name nic-app1-vm01
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When you review effective routes, ask one question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If this destination were compromised, could I afford to isolate it immediately?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If the answer is no, that’s not connectivity, it’s &lt;strong&gt;embedded trust&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="shared-services-unacceptable-vs-merely-risky"&gt;Shared Services: Unacceptable vs Merely Risky
&lt;/h2&gt;&lt;p&gt;This is where most architectures quietly fail assume breach.&lt;/p&gt;
&lt;h3 id="shared-services-are-unacceptable-when"&gt;Shared Services Are &lt;strong&gt;Unacceptable&lt;/strong&gt; When
&lt;/h3&gt;&lt;p&gt;All of the following are true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Broadly reachable from multiple spokes&lt;/li&gt;
&lt;li&gt;Required during incidents (access, recovery, automation)&lt;/li&gt;
&lt;li&gt;Difficult to isolate without breaking everything else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this state, compromise of &lt;em&gt;any&lt;/em&gt; spoke plausibly exposes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The tools you use to respond&lt;/li&gt;
&lt;li&gt;The systems you rely on to recover&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s not risk it’s &lt;strong&gt;self‑defeating design&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="shared-services-are-merely-risky-when"&gt;Shared Services Are &lt;strong&gt;Merely Risky&lt;/strong&gt; When
&lt;/h3&gt;&lt;p&gt;Risk is a conscious trade when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The service is not required for containment&lt;/li&gt;
&lt;li&gt;Trust is one‑way and disposable&lt;/li&gt;
&lt;li&gt;Losing it degrades visibility, not control&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples that often fall here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log ingestion&lt;/li&gt;
&lt;li&gt;Metrics collection&lt;/li&gt;
&lt;li&gt;Read‑only artifact distribution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The distinction isn’t &lt;em&gt;shared vs not shared&lt;/em&gt;.&lt;br&gt;
It’s &lt;strong&gt;optional vs non‑optional under duress&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Firewalls and NVAs&lt;/strong&gt;&lt;br&gt;
Centralising enforcement doesn’t remove trust it concentrates it. Treat them as blast‑radius multipliers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Private Endpoints&lt;/strong&gt;&lt;br&gt;
They add paths. They do not remove the need to reason about trust boundaries.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Overlapping address spaces&lt;/strong&gt;&lt;br&gt;
They delay containment decisions when time matters most.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat hub‑and‑spoke as a &lt;strong&gt;routing pattern&lt;/strong&gt;, not a trust model&lt;/li&gt;
&lt;li&gt;Classify services by &lt;em&gt;incident criticality&lt;/em&gt;, not convenience&lt;/li&gt;
&lt;li&gt;Minimise peerings you cannot sever quickly&lt;/li&gt;
&lt;li&gt;Regularly review effective routes with a containment mindset&lt;/li&gt;
&lt;li&gt;Document which links you would cut first before you need to&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Hub‑and‑spoke isn’t the problem.&lt;br&gt;
Assuming the hub and what lives behind it, is always trusted is.&lt;/p&gt;
&lt;p&gt;Design networks so you can afford to be wrong.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure Virtual Network routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview" target="_blank" rel="noopener"
&gt;Virtual network peering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works" target="_blank" rel="noopener"
&gt;Effective routes and security rules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Designing for Containment Over Prevention</title><link>https://blog.brewedinthecloud.com/p/assume-breach-designing-containment/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/assume-breach-designing-containment/</guid><description>&lt;p&gt;Most Azure networks are designed like a pub with a strict door policy:&lt;br&gt;
check IDs, keep trouble out, assume everyone inside behaves.&lt;/p&gt;
&lt;p&gt;It works right up until it doesn’t and when it fails, the network usually has nothing useful left to say.&lt;/p&gt;
&lt;p&gt;Assume‑breach changes the job of networking entirely.&lt;br&gt;
&lt;strong&gt;Your network isn’t there to stop the first compromise. It’s there to stop the second, third, and fourth.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;h3 id="the-common-assumption"&gt;The common assumption
&lt;/h3&gt;&lt;p&gt;If we get prevention right with private endpoints, no public IPs, hardened ingress then lateral movement becomes unlikely.&lt;/p&gt;
&lt;h3 id="why-it-breaks"&gt;Why it breaks
&lt;/h3&gt;&lt;p&gt;Once an attacker gains a foothold anywhere inside the VNet, most Azure networks quietly revert to trust‑by‑proximity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Large, shared address spaces&lt;/li&gt;
&lt;li&gt;East‑west traffic implicitly allowed&lt;/li&gt;
&lt;li&gt;Shared “infrastructure” services reachable from everywhere&lt;/li&gt;
&lt;li&gt;Few boundaries that can be tightened quickly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, prevention has already failed.&lt;br&gt;
&lt;strong&gt;Containment is what decides whether the blast radius stays small or becomes organisational.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure networking enforces &lt;strong&gt;reachability&lt;/strong&gt;, not intent.&lt;/p&gt;
&lt;p&gt;If a packet is routable and allowed by rules, Azure will move it consistently, quickly, and without judgement. There is no native concept of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“This workload is untrusted”&lt;/li&gt;
&lt;li&gt;“This subnet is compromised”&lt;/li&gt;
&lt;li&gt;“This path should only exist during normal operations”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Containment emerges only when you design &lt;strong&gt;friction into the graph&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Boundaries that limit who can talk to whom&lt;/li&gt;
&lt;li&gt;Paths that are explicit, narrow, and easy to revoke&lt;/li&gt;
&lt;li&gt;Shared services that don’t silently collapse isolation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think less about moats.&lt;br&gt;
Think about &lt;strong&gt;fire doors that actually close&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="containment-as-a-measurable-outcome"&gt;Containment as a Measurable Outcome
&lt;/h2&gt;&lt;p&gt;If containment matters, it has to be &lt;strong&gt;testable without an incident&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here’s a blunt, design‑time metric:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From any compromised workload, how many distinct network trust boundaries can it reach without a change request?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not “in theory”.&lt;br&gt;
Not “with enough effort”.&lt;br&gt;
Right now, as deployed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the answer is &lt;em&gt;most subnets in the VNet&lt;/em&gt; → containment is weak&lt;/li&gt;
&lt;li&gt;If the answer is &lt;em&gt;only its own role and one or two justified dependencies&lt;/em&gt; → containment exists&lt;/li&gt;
&lt;li&gt;If answering requires trawling NSGs, routes, and diagrams → containment is unknowable (also a failure)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn’t a SOC metric.&lt;br&gt;
It’s an architectural smell test.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Designing for containment changes what “good” looks like.&lt;/p&gt;
&lt;h3 id="blast-radius-becomes-explicit"&gt;Blast radius becomes explicit
&lt;/h3&gt;&lt;p&gt;A compromised workload should expose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One role&lt;/li&gt;
&lt;li&gt;One isolation unit&lt;/li&gt;
&lt;li&gt;One small set of outbound paths&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If compromise meaningfully increases reachability, your network is amplifying the incident.&lt;/p&gt;
&lt;h3 id="time-becomes-a-defensive-control"&gt;Time becomes a defensive control
&lt;/h3&gt;&lt;p&gt;Every boundary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slows reconnaissance&lt;/li&gt;
&lt;li&gt;Forces noisier behaviour&lt;/li&gt;
&lt;li&gt;Buys response time &lt;strong&gt;without relying on alerts&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Containment isn’t binary, it’s cumulative friction.&lt;/p&gt;
&lt;h3 id="defenders-regain-leverage"&gt;Defenders regain leverage
&lt;/h3&gt;&lt;p&gt;Good containment designs provide &lt;strong&gt;fast levers&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Subnets you can isolate without redeploying&lt;/li&gt;
&lt;li&gt;Routes you can blackhole surgically&lt;/li&gt;
&lt;li&gt;Rules you can tighten without breaking unrelated systems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If isolation requires redesign, it won’t happen under pressure.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="segmentation-designed-for-incidents-not-diagrams"&gt;Segmentation designed for incidents, not diagrams
&lt;/h3&gt;&lt;p&gt;This isn’t about tier purity.&lt;br&gt;
It’s about what happens &lt;strong&gt;after AppA is compromised&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
Internet --&gt;|Inbound| Edge
Edge --&gt; AppA
Edge --&gt; AppB
AppA --&gt; DataA
AppB --&gt; DataB
AppA -. blocked .-&gt; AppB
AppB -. blocked .-&gt; AppA
style AppA fill:#e3f2fd
style AppB fill:#e8f5e9
&lt;/div&gt;
&lt;p&gt;In this design:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AppA compromise does &lt;strong&gt;not&lt;/strong&gt; grant visibility or reachability into AppB&lt;/li&gt;
&lt;li&gt;Isolation of AppA:
&lt;ul&gt;
&lt;li&gt;Touches one subnet or NSG&lt;/li&gt;
&lt;li&gt;Does not affect AppB traffic paths&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Defender action is local, not global&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The topology isn’t clever.&lt;br&gt;
&lt;strong&gt;The failure mode is.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="nsgs-as-containment-brakes-not-hygiene"&gt;NSGs as containment brakes, not hygiene
&lt;/h3&gt;&lt;p&gt;An NSG excerpt enforcing &lt;em&gt;explicit east‑west denial&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2023-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appA-nsg&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-Edge-In&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Tcp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Edge subnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny-VNet-In&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualNetwork&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This rule doesn’t assume workloads behave.&lt;br&gt;
It assumes one of them eventually won’t.&lt;/p&gt;
&lt;h2 id="shared-services-where-containment-quietly-dies"&gt;Shared Services: Where Containment Quietly Dies
&lt;/h2&gt;&lt;p&gt;Most containment failures aren’t caused by app tiers they’re caused by &lt;strong&gt;shared infrastructure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;DNS is the usual culprit.&lt;/p&gt;
&lt;p&gt;A single, shared DNS resolver reachable from every subnet becomes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A universal discovery service&lt;/li&gt;
&lt;li&gt;An implicit trust bridge&lt;/li&gt;
&lt;li&gt;Often, a stepping stone toward management planes or legacy systems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During incidents, DNS is rarely locked down first.&lt;br&gt;
Which means once a workload is compromised, &lt;strong&gt;name resolution collapses isolation&lt;/strong&gt; even if IP‑level rules look sound.&lt;/p&gt;
&lt;p&gt;If every subnet can talk to the same DNS endpoint:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You don’t have independent containment zones&lt;/li&gt;
&lt;li&gt;You have one network with polite boundaries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Containment requires shared services to be &lt;strong&gt;deliberately constrained&lt;/strong&gt;, not just centrally managed.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service tags hide scope creep&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;VirtualNetwork&lt;/code&gt; expands as you add subnets. Containment erodes quietly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Operational convenience pressures boundaries&lt;/strong&gt;&lt;br&gt;
If every exception weakens isolation, the design is already too brittle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Management paths matter&lt;/strong&gt;&lt;br&gt;
Backup agents, patching, diagnostics, these are often the first lateral paths attackers exploit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices-containmentbiased"&gt;Best Practices (Containment‑Biased)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Design subnets as &lt;strong&gt;discrete isolation units&lt;/strong&gt;, not convenience buckets&lt;/li&gt;
&lt;li&gt;Prefer explicit allow paths over clever deny logic&lt;/li&gt;
&lt;li&gt;Make isolation actions fast, local, and reversible&lt;/li&gt;
&lt;li&gt;Treat route tables as &lt;strong&gt;incident controls&lt;/strong&gt;, not static plumbing&lt;/li&gt;
&lt;li&gt;Regularly answer the containment question not once, but continuously&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If your network only works when everything behaves, it’s not defensive, it’s optimistic.&lt;br&gt;
Containment is what turns inevitable failure into survivable failure.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/network-security-groups-overview" target="_blank" rel="noopener"
&gt;Azure network security groups overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/sfi/network-isolation#guidance" target="_blank" rel="noopener"
&gt;Network isolation (Secure Future Initiative)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure routing and user-defined routes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Network Isolation During Active Compromise: Designing for the Worst Day</title><link>https://blog.brewedinthecloud.com/p/assume-breach-network-isolation-during-compromise/</link><pubDate>Thu, 09 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/assume-breach-network-isolation-during-compromise/</guid><description>&lt;p&gt;Finding an attacker in your environment isn’t like spotting someone rattling the front door.&lt;br&gt;
It’s like hearing footsteps upstairs.&lt;/p&gt;
&lt;p&gt;At that point, the question isn’t &lt;em&gt;how did they get in?&lt;/em&gt;&lt;br&gt;
It’s &lt;em&gt;how far can they go next and how fast can you stop that from getting worse?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In an assume‑breach model, &lt;strong&gt;network isolation is not an emergency manoeuvre&lt;/strong&gt;.&lt;br&gt;
It’s a downgrade path the network already understands.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;h3 id="the-common-assumption"&gt;The common assumption
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;“If something gets compromised, we’ll isolate it.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Isolation is treated as an &lt;strong&gt;action&lt;/strong&gt; something responders &lt;em&gt;do&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="why-it-breaks"&gt;Why it breaks
&lt;/h3&gt;&lt;p&gt;During an active compromise:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You don’t know what’s already hostile&lt;/li&gt;
&lt;li&gt;You don’t have time to redesign trust&lt;/li&gt;
&lt;li&gt;You can’t safely assume the control plane is clean&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If isolation requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New VNets&lt;/li&gt;
&lt;li&gt;New peerings&lt;/li&gt;
&lt;li&gt;Rule surgery across shared infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…then you don’t have isolation.&lt;/p&gt;
&lt;p&gt;You have hope.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Isolation that works under pressure is a &lt;strong&gt;structural property&lt;/strong&gt;, not a procedural one.&lt;/p&gt;
&lt;p&gt;The network must already encode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Where trust is allowed&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Where trust is explicitly &lt;em&gt;not&lt;/em&gt; allowed&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How a workload can be downgraded into a less‑trusted state&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is not about perfect segmentation.&lt;br&gt;
It’s about &lt;strong&gt;pre‑authorised damage containment&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The key shift:&lt;br&gt;
Isolation is not “blocking traffic”.&lt;br&gt;
Isolation is &lt;strong&gt;forcing a workload into a smaller, poorer, deliberately constrained network world&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="design"&gt;Design
&lt;/h3&gt;&lt;p&gt;You stop grouping networks by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application name&lt;/li&gt;
&lt;li&gt;Team ownership&lt;/li&gt;
&lt;li&gt;Environment labels&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And start grouping them by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blast radius tolerance&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containment requirements&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What you are willing to lose without collapsing everything else&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This almost always means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fewer fully‑meshed networks&lt;/li&gt;
&lt;li&gt;More intentional asymmetry&lt;/li&gt;
&lt;li&gt;Shared services treated as amplification risks, not conveniences&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reliability"&gt;Reliability
&lt;/h3&gt;&lt;p&gt;Isolation‑capable designs fail &lt;strong&gt;unevenly&lt;/strong&gt;, not catastrophically.&lt;/p&gt;
&lt;p&gt;You trade some steady‑state elegance for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Predictable degradation&lt;/li&gt;
&lt;li&gt;Fewer “everything is on fire” incidents&lt;/li&gt;
&lt;li&gt;Clear containment boundaries under stress&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Availability becomes &lt;strong&gt;graduated&lt;/strong&gt;, not binary.&lt;/p&gt;
&lt;h3 id="security"&gt;Security
&lt;/h3&gt;&lt;p&gt;Once credentials or a workload are compromised:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;East‑west movement is constrained by structure, not rules&lt;/li&gt;
&lt;li&gt;Shared services don’t become free pivot points&lt;/li&gt;
&lt;li&gt;Containment actions are coarse, fast, and reversible&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cost"&gt;Cost
&lt;/h3&gt;&lt;p&gt;Yes, this often costs more:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More VNets&lt;/li&gt;
&lt;li&gt;More thought&lt;/li&gt;
&lt;li&gt;More architectural discipline&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It costs far less than rebuilding trust after full lateral spread.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;This is not about NSGs, firewalls, or playbooks.&lt;br&gt;
This is about &lt;strong&gt;what the network makes possible and impossible by design&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="designed-isolation-as-a-downgrade-path"&gt;Designed isolation as a downgrade path
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
subgraph Prod VNet
A[App Tier]
B[Data Tier]
end
subgraph Shared Services VNet
C[Identity &amp; Control]
D[Observability]
end
subgraph Isolation VNet
E[Quarantine]
end
%% Normal operations
A --&gt; B
A --&gt; C
B --&gt; C
A --&gt; D
B --&gt; D
%% Containment downgrade
A -. isolate .-&gt; E
B -. isolate .-&gt; E
%% Explicitly impossible paths
E -.-x C
E -.-x B
&lt;/div&gt;
&lt;p&gt;What this diagram deliberately shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Isolation is a downgrade&lt;/strong&gt;, not an alternative steady state&lt;/li&gt;
&lt;li&gt;Workloads can move &lt;em&gt;into&lt;/em&gt; quarantine, not back into shared trust&lt;/li&gt;
&lt;li&gt;Quarantine has no path to identity or control services&lt;/li&gt;
&lt;li&gt;Some connections are &lt;strong&gt;structurally absent&lt;/strong&gt;, not “normally blocked”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your design cannot express these absences, isolation will be fragile.&lt;/p&gt;
&lt;h3 id="structural-artefact-isolation-that-exists-before-you-need-it"&gt;Structural artefact: isolation that exists before you need it
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isolationVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnet-isolation&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.240.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prodVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnet-prod&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prodToIsolationPeering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;prodVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/prod-to-isolation&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isolationVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowGatewayTransit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;What matters here is not configuration detail, but &lt;strong&gt;intent&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The isolation VNet exists independently of any incident&lt;/li&gt;
&lt;li&gt;A downgrade path is pre‑authorised&lt;/li&gt;
&lt;li&gt;There is &lt;strong&gt;no equivalent peering to shared services&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Containment does not require new infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If isolation requires new peerings, you are already too late.&lt;/p&gt;
&lt;h2 id="designed-isolation-vs-wishful-containment"&gt;Designed Isolation vs Wishful Containment
&lt;/h2&gt;&lt;p&gt;This distinction is non‑negotiable.&lt;/p&gt;
&lt;h3 id="designed-isolation"&gt;Designed isolation
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Downgrade paths exist ahead of time&lt;/li&gt;
&lt;li&gt;Shared services are not universally reachable&lt;/li&gt;
&lt;li&gt;Containment changes &lt;em&gt;routing&lt;/em&gt;, not architecture&lt;/li&gt;
&lt;li&gt;Isolation is fast, coarse, and survivable&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="wishful-containment"&gt;Wishful containment
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Flat or fully‑meshed VNets&lt;/li&gt;
&lt;li&gt;Shared services reachable from everywhere&lt;/li&gt;
&lt;li&gt;Isolation requires redesign or mass rule changes&lt;/li&gt;
&lt;li&gt;“We’ll block it when it happens”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only one of these survives an active compromise.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shared services are blast‑radius multipliers&lt;/strong&gt;&lt;br&gt;
If everything depends on them, nothing can be isolated safely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fully‑meshed peering kills partial containment&lt;/strong&gt;&lt;br&gt;
You either isolate everything or nothing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Late isolation is usually ineffective&lt;/strong&gt;&lt;br&gt;
Lateral movement is measured in minutes, not hours.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Over‑isolation can blind responders&lt;/strong&gt;&lt;br&gt;
If quarantine breaks logging or telemetry, you lose visibility when it matters most.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat isolation as a &lt;strong&gt;network state&lt;/strong&gt;, not an action&lt;/li&gt;
&lt;li&gt;Design explicit downgrade paths and only a few&lt;/li&gt;
&lt;li&gt;Group networks by &lt;strong&gt;failure tolerance&lt;/strong&gt;, not org charts&lt;/li&gt;
&lt;li&gt;Assume shared services are hostile &lt;em&gt;by default&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;If isolation requires design changes, it doesn’t exist&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If your network can’t force a compromised workload into a smaller, poorer world &lt;strong&gt;without redesign&lt;/strong&gt;, you didn’t design for isolation, you designed for optimism.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/concepts-and-best-practices" target="_blank" rel="noopener"
&gt;Azure Virtual Network design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/network-overview" target="_blank" rel="noopener"
&gt;Network security in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/framework/" target="_blank" rel="noopener"
&gt;Azure architecture design principles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Defining Blast Radius in Azure Networks</title><link>https://blog.brewedinthecloud.com/p/assume-breach-defining-blast-radius/</link><pubDate>Tue, 07 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/assume-breach-defining-blast-radius/</guid><description>&lt;p&gt;Most Azure networks aren’t designed to fail gracefully.&lt;/p&gt;
&lt;p&gt;They’re designed to be &lt;em&gt;convenient&lt;/em&gt;: easy peering, wide address space, few hard edges. Everything works, deployments are fast, nobody blocks progress.&lt;/p&gt;
&lt;p&gt;Until something breaks in the worst possible way, a compromised workload already inside the network and you discover that “convenient” and “contained” are rarely the same thing.&lt;/p&gt;
&lt;p&gt;In an assume‑breach model, blast radius isn’t theoretical. It’s the difference between an incident and an outage‑shaped investigation.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;h3 id="the-common-assumption"&gt;The common assumption
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;VNets are boundaries. If we didn’t mean for things to talk, security controls will handle it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This model treats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Address space as neutral&lt;/li&gt;
&lt;li&gt;Peering as low‑risk plumbing&lt;/li&gt;
&lt;li&gt;Routing as an implementation detail&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Security, in this framing, lives elsewhere.&lt;/p&gt;
&lt;h3 id="why-it-breaks"&gt;Why it breaks
&lt;/h3&gt;&lt;p&gt;Azure networking is opinionated in one quiet but important way:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If traffic is routable, the platform assumes it’s legitimate.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VNets, peerings, and routes don’t express &lt;em&gt;intent&lt;/em&gt;. They express &lt;em&gt;possibility&lt;/em&gt;. Once a packet has a valid path, Azure does not ask whether that path aligns with your threat model.&lt;/p&gt;
&lt;p&gt;In an incident, possibility always beats intent.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Blast radius in Azure networks is shaped by &lt;strong&gt;structural reachability&lt;/strong&gt;, not by how carefully your firewall rules are written.&lt;/p&gt;
&lt;p&gt;Three mechanics matter most.&lt;/p&gt;
&lt;h3 id="address-space-sets-the-outer-limit"&gt;Address space sets the outer limit
&lt;/h3&gt;&lt;p&gt;CIDR ranges define what &lt;em&gt;could ever&lt;/em&gt; be reached.&lt;/p&gt;
&lt;p&gt;If two workloads sit in address spaces that can be routed between:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They are part of the same potential blast radius&lt;/li&gt;
&lt;li&gt;Any containment relies on controls outside the network layer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Addressing is not bookkeeping. It’s scope definition.&lt;/p&gt;
&lt;h3 id="peering-collapses-assumed-boundaries"&gt;Peering collapses assumed boundaries
&lt;/h3&gt;&lt;p&gt;VNet peering creates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full IP reachability between address spaces&lt;/li&gt;
&lt;li&gt;No inherent notion of trust direction&lt;/li&gt;
&lt;li&gt;No concept of “only for these workloads”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From a routing perspective, peered VNets behave like a single, larger network unless you deliberately constrain paths.&lt;/p&gt;
&lt;p&gt;That’s efficient. It’s also expansive.&lt;/p&gt;
&lt;h3 id="routing-decides-how-compromise-spreads"&gt;Routing decides how compromise spreads
&lt;/h3&gt;&lt;p&gt;User Defined Routes (UDRs), system routes, and propagated paths answer one question during an incident:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Where can packets actually go right now?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The answer is often broader and less remembered than architects expect.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Under assume breach, blast radius isn’t an abstract risk. It shows up as very concrete outcomes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Non‑Prod compromise that suddenly has line‑of‑sight to Prod&lt;/li&gt;
&lt;li&gt;A “small” spoke that can reach far more than its owners realise&lt;/li&gt;
&lt;li&gt;An incident response slowed down by surprise connectivity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The pattern is consistent: &lt;strong&gt;networks optimised for convenience quietly optimise for spread&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="blast-radius-smell-tests"&gt;Blast Radius Smell Tests
&lt;/h2&gt;&lt;p&gt;These aren’t best practices. They’re gut checks you can run against a real estate &lt;em&gt;as it exists today&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="1-reachability-without-intent"&gt;1. Reachability Without Intent
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Question to ask:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Can this workload reach IP ranges it was never explicitly designed to talk to simply because routing allows it?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If the answer is yes, that reachability is part of your blast radius, regardless of firewall posture.&lt;/p&gt;
&lt;p&gt;This smell commonly comes from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Just in case” peering&lt;/li&gt;
&lt;li&gt;Broad, loosely allocated address space&lt;/li&gt;
&lt;li&gt;Default routes no one has reviewed in years&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Under breach conditions, attackers care about what’s reachable, not what was intended.&lt;/p&gt;
&lt;h3 id="2-environment-boundaries-that-only-exist-in-diagrams"&gt;2. Environment Boundaries That Only Exist in Diagrams
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Question to ask:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;If I ignore names, subscriptions, and tags, are Prod and Non‑Prod actually isolated at the routing layer?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If environments are routable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They are not isolated&lt;/li&gt;
&lt;li&gt;They simply rely on convention to stay apart&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attackers don’t see environments. They see IP ranges and next hops.&lt;/p&gt;
&lt;p&gt;If a Non‑Prod workload is compromised, the network decides whether that incident stays there, not your naming standards.&lt;/p&gt;
&lt;h3 id="3-temporary-connectivity-that-never-left"&gt;3. Temporary Connectivity That Never Left
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Question to ask:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Which peerings or routes would surprise you if they appeared in an incident review?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Migration links, troubleshooting routes, one‑off access that “we’ll remove later” these quietly accumulate.&lt;/p&gt;
&lt;p&gt;They are dangerous because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They’re forgotten&lt;/li&gt;
&lt;li&gt;They’re rarely monitored&lt;/li&gt;
&lt;li&gt;They aren’t defended in anyone’s mental model&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Routing doesn’t care how old a decision is.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="visualising-accidental-blast-radius"&gt;Visualising accidental blast radius
&lt;/h3&gt;&lt;div class="mermaid"&gt;graph TD
Shared["Shared Services VNet&lt;br/&gt;10.0.0.0/16"]
Prod["Prod VNet&lt;br/&gt;10.1.0.0/16"]
NonProd["Non‑Prod VNet&lt;br/&gt;10.2.0.0/16"]
Shared --- Prod
Shared --- NonProd
&lt;/div&gt;
&lt;p&gt;This looks segmented.&lt;/p&gt;
&lt;p&gt;From a routing perspective, it often isn’t. Shared services become an implicit bridge unless paths are deliberately constrained.&lt;/p&gt;
&lt;h3 id="a-peering-that-widens-scope-by-default"&gt;A peering that widens scope by default
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nonProdToShared&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2023-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nonprod-to-shared&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nonProdVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Nothing here is misconfigured.&lt;/p&gt;
&lt;p&gt;But combined with similar peerings elsewhere, this enables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lateral reach that wasn’t consciously designed&lt;/li&gt;
&lt;li&gt;Incident paths that rely entirely on downstream controls to stop spread&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s blast radius expressed as configuration.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription boundaries don’t limit routing&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Address space reuse hides, rather than reduces, blast radius&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Old peerings are rarely re‑evaluated&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default system routes often enable more reach than diagrams suggest&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you haven’t inspected effective routes during a failure scenario, you don’t actually know your containment story.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat &lt;strong&gt;every routable path as an explicit trust decision&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Align address space with &lt;strong&gt;containment goals&lt;/strong&gt;, not just growth&lt;/li&gt;
&lt;li&gt;Periodically review &lt;strong&gt;reachable IP ranges&lt;/strong&gt;, not just VNets&lt;/li&gt;
&lt;li&gt;Remove connectivity that no one can clearly justify today&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is architectural discipline, not extra tooling.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Blast radius is rarely expanded by bold decisions.&lt;br&gt;
It’s expanded by quiet ones no one revisits.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview" target="_blank" rel="noopener"
&gt;Azure Virtual Network Peering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure Routing Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/diagnose-network-routing-problem" target="_blank" rel="noopener"
&gt;Effective Routes in Azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Easter Weekend AI Project</title><link>https://blog.brewedinthecloud.com/p/ai-weekender/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/ai-weekender/</guid><description>&lt;h2 id="an-easter-weekend-experiment-with-copilot-cli"&gt;An Easter Weekend Experiment with Copilot CLI
&lt;/h2&gt;&lt;p&gt;Over the Easter weekend I decided to get my hands dirty with something a little different. No production workloads, no architectural diagrams, no pressure. Just a small, contained experiment to see what GitHub Copilot CLI actually feels like when you let it roam a bit.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/post/ai-weekender/gh-copilotcli-startup.png"
loading="lazy"
alt="GitHub Copilot CLI Startup"
&gt;&lt;/p&gt;
&lt;p&gt;The target was my personal resume site. It already existed and technically did the job, but if I’m being honest it was being held together with good intentions and duct tape. Functional, but inconsistent, messy, and very clearly something I’d been meaning to clean up “one day”.&lt;/p&gt;
&lt;p&gt;This felt like the right kind of project to experiment on.&lt;/p&gt;
&lt;h2 id="the-mission-intentionally-vague"&gt;The Mission (Intentionally Vague)
&lt;/h2&gt;&lt;p&gt;The brief I gave Copilot CLI was deliberately loose: &lt;em&gt;modernise it&lt;/em&gt;.&lt;br&gt;
No wireframes. No detailed spec. No careful breakdown of tasks. I just pointed it at the repo and let it ask questions.&lt;/p&gt;
&lt;p&gt;That looseness was intentional. I wasn’t trying to see how well it followed instructions, but how it behaved when it had room to propose rather than just execute.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/post/ai-weekender/gh-copilotcli-themission.png"
loading="lazy"
alt="GitHub Copilot CLI Mission"
&gt;&lt;/p&gt;
&lt;h2 id="from-idea-to-running-locally"&gt;From Idea to Running Locally
&lt;/h2&gt;&lt;p&gt;After a bit of back‑and‑forth and a couple of nudges from me on concepts I cared about, Copilot CLI put together a plan, created a new branch, scaffolded the changes, handled npm, and got a local version running.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/post/ai-weekender/gh-copilotcli-resumeready.png"
loading="lazy"
alt="GitHub Copilot CLI Result"
&gt;&lt;/p&gt;
&lt;p&gt;End to end, including me stopping to take notes for this post, the whole thing took around 30 minutes.&lt;/p&gt;
&lt;p&gt;That’s not nothing.&lt;/p&gt;
&lt;h2 id="what-actually-changed"&gt;What Actually Changed
&lt;/h2&gt;&lt;p&gt;Cosmetically, the result isn’t a dramatic departure. If you didn’t know to look, you might not even notice much difference at first glance.&lt;/p&gt;
&lt;p&gt;Under the hood though, it’s a different story. The code is cleaner, better structured, and actually commented throughout in a way the original never was. The site feels like something I’d be comfortable picking up again in six months without immediately regretting past‑me’s decisions.&lt;/p&gt;
&lt;p&gt;There were also a few small additions that came from giving the AI a bit of creative freedom. A simple theme switcher, for example. Slightly weird, not strictly necessary, and probably something I wouldn’t have bothered implementing manually—but I was happy to have it along for the ride.&lt;/p&gt;
&lt;p&gt;I’m not a UX designer, and I didn’t pretend to be. But letting Copilot suggest alternate approaches to layout and UX, rather than just fixing exactly what I pointed at, genuinely lifted the site in ways I wouldn’t have thought to ask for.&lt;/p&gt;
&lt;h2 id="why-this-was-interesting"&gt;Why This Was Interesting
&lt;/h2&gt;&lt;p&gt;The most useful part of the exercise wasn’t speed, and it wasn’t raw code generation.&lt;/p&gt;
&lt;p&gt;It was what happened when I stopped treating the tool like a very fast typist and instead let it propose options. Plans. Alternatives. Things to react to rather than instructions to follow.&lt;/p&gt;
&lt;p&gt;That shift—from “do this” to “show me what you’d do”—was where the value showed up.&lt;/p&gt;
&lt;h2 id="a-thought-before-you-try-something-similar"&gt;A Thought Before You Try Something Similar
&lt;/h2&gt;&lt;p&gt;This kind of experiment works precisely because the stakes are low. I wouldn’t point Copilot CLI at a regulated production system and say “modernise it” with a straight face.&lt;/p&gt;
&lt;p&gt;But if your AI usage still looks like autocomplete, boilerplate, or shaving a few minutes off typing, you’re probably missing the more interesting part.&lt;/p&gt;
&lt;p&gt;If you’re going to play with these tools, do it somewhere safe—and do it in a way that forces you to exercise judgment, not just measure speed.&lt;/p&gt;
&lt;p&gt;That’s where things actually start to get interesting.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/features/copilot/cli/" target="_blank" rel="noopener"
&gt;GitHub Copilot CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-how-to-get-started/" target="_blank" rel="noopener"
&gt;GitHub Copilot CLI Get Started&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Assume Breach: Why Flat VNets and Permissive NSGs Fail When It Matters</title><link>https://blog.brewedinthecloud.com/p/assume-breach-network-design-principle/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/assume-breach-network-design-principle/</guid><description>&lt;p&gt;Most Azure environments aren’t breached because the firewall was missing.&lt;/p&gt;
&lt;p&gt;They’re breached because &lt;strong&gt;once something failed, nothing slowed the attacker down&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Flat VNets and permissive NSGs feel productive. They reduce friction. They keep deployments moving.&lt;br&gt;
But under an assume‑breach model, they don’t just &lt;em&gt;fail to help&lt;/em&gt; — they actively make things worse.&lt;/p&gt;
&lt;p&gt;This post reframes assume breach as a &lt;strong&gt;network design principle&lt;/strong&gt;, then calls out two design choices that are incompatible with it.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;h3 id="the-common-assumption"&gt;The common assumption
&lt;/h3&gt;&lt;p&gt;If everything is “internal”, broad connectivity is fine.&lt;/p&gt;
&lt;p&gt;We can always tighten it later.&lt;br&gt;
NSGs document intent.&lt;br&gt;
Segmentation is something we add when security asks for it.&lt;/p&gt;
&lt;h3 id="why-it-breaks-in-the-cloud"&gt;Why it breaks in the cloud
&lt;/h3&gt;&lt;p&gt;In Azure, compromise doesn’t arrive politely at the edge.&lt;/p&gt;
&lt;p&gt;It arrives through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;leaked credentials&lt;/li&gt;
&lt;li&gt;over‑permissioned workloads&lt;/li&gt;
&lt;li&gt;compromised build agents&lt;/li&gt;
&lt;li&gt;exposed management endpoints&lt;/li&gt;
&lt;li&gt;misconfigured services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once &lt;em&gt;any&lt;/em&gt; internal workload is hostile, the question isn’t &lt;em&gt;can it get in?&lt;/em&gt;&lt;br&gt;
It’s &lt;strong&gt;how far can it go before anyone notices?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Flat networks and permissive rules answer that question very badly.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Assume breach treats networking as a &lt;strong&gt;containment mechanism&lt;/strong&gt;, not a convenience layer.&lt;/p&gt;
&lt;p&gt;When a workload is compromised, the network should:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;restrict what it can see&lt;/li&gt;
&lt;li&gt;restrict what it can reach&lt;/li&gt;
&lt;li&gt;restrict how quietly it can move&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the network does none of those things, it’s not neutral — it’s an accelerator.&lt;/p&gt;
&lt;p&gt;Two common Azure patterns fail this test consistently.&lt;/p&gt;
&lt;h2 id="design-flaw-1-flat-vnets-justified-by-its-all-internal"&gt;Design Flaw #1: Flat VNets Justified by “It’s All Internal”
&lt;/h2&gt;&lt;h3 id="what-this-looks-like"&gt;What this looks like
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;One large VNet&lt;/li&gt;
&lt;li&gt;Multiple subnets by tier or function&lt;/li&gt;
&lt;li&gt;NSGs with wide &lt;code&gt;VirtualNetwork&lt;/code&gt; allows&lt;/li&gt;
&lt;li&gt;East‑west traffic largely unrestricted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is often defended as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;simpler&lt;/li&gt;
&lt;li&gt;easier to operate&lt;/li&gt;
&lt;li&gt;faster to deploy&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="why-its-actively-dangerous"&gt;Why it’s actively dangerous
&lt;/h3&gt;&lt;p&gt;Under assume breach, a flat VNet &lt;strong&gt;pre‑authorises lateral movement&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Once an attacker compromises:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a single VM&lt;/li&gt;
&lt;li&gt;an app service with VNet integration&lt;/li&gt;
&lt;li&gt;a container with network access&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They inherit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cheap reconnaissance&lt;/li&gt;
&lt;li&gt;broad reachability&lt;/li&gt;
&lt;li&gt;low‑noise scanning opportunities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The network doesn’t slow them down.&lt;br&gt;
It helps them map your environment faster than you can respond.&lt;/p&gt;
&lt;p&gt;This isn’t a theoretical risk. It’s how most real cloud incidents expand.&lt;/p&gt;
&lt;h2 id="design-flaw-2-nsgs-used-as-documentation-instead-of-enforcement"&gt;Design Flaw #2: NSGs Used as Documentation Instead of Enforcement
&lt;/h2&gt;&lt;h3 id="what-this-looks-like-1"&gt;What this looks like
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Large rule sets with “temporary” allows&lt;/li&gt;
&lt;li&gt;Broad source prefixes “for flexibility”&lt;/li&gt;
&lt;li&gt;Deny rules that technically exist but rarely trigger&lt;/li&gt;
&lt;li&gt;Rules written to avoid breaking anything — ever&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NSGs become a &lt;strong&gt;record of intent&lt;/strong&gt;, not a constraint.&lt;/p&gt;
&lt;h3 id="why-its-actively-dangerous-1"&gt;Why it’s actively dangerous
&lt;/h3&gt;&lt;p&gt;In a breach, ambiguity favours the attacker.&lt;/p&gt;
&lt;p&gt;Permissive rules mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;unclear blast radius&lt;/li&gt;
&lt;li&gt;unpredictable access paths&lt;/li&gt;
&lt;li&gt;difficulty reasoning under pressure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When incident response begins, teams often discover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rules no one remembers adding&lt;/li&gt;
&lt;li&gt;dependencies no one documented&lt;/li&gt;
&lt;li&gt;access paths no one intended&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, tightening the network risks breaking production — so it doesn’t happen.&lt;/p&gt;
&lt;p&gt;The attacker keeps moving.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="design"&gt;Design
&lt;/h3&gt;&lt;p&gt;You stop grouping resources by convenience and start grouping by &lt;strong&gt;what you’re willing to lose together&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If a subnet is compromised, what &lt;em&gt;must&lt;/em&gt; still be unreachable?&lt;/p&gt;
&lt;h3 id="reliability"&gt;Reliability
&lt;/h3&gt;&lt;p&gt;Containment prevents security incidents from becoming availability incidents.&lt;/p&gt;
&lt;p&gt;A compromised workload shouldn’t be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reach other workloads of the same tier&lt;/li&gt;
&lt;li&gt;traverse management paths&lt;/li&gt;
&lt;li&gt;interfere with recovery mechanisms&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="security"&gt;Security
&lt;/h3&gt;&lt;p&gt;Security posture improves &lt;strong&gt;after failure&lt;/strong&gt;, not just before it.&lt;/p&gt;
&lt;p&gt;That’s the difference between:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a design that looks secure on a diagram&lt;/li&gt;
&lt;li&gt;a design that survives partial compromise&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cost"&gt;Cost
&lt;/h3&gt;&lt;p&gt;More segmentation costs something.&lt;/p&gt;
&lt;p&gt;Unbounded lateral movement costs far more — usually measured in downtime, incident duration, and lost confidence rather than Azure spend.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;Assume breach doesn’t require complex tooling.&lt;br&gt;
It requires &lt;strong&gt;default denial and explicit intent&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="example-nsg-as-enforcement-not-commentary"&gt;Example: NSG as enforcement, not commentary
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workloadsubnetresourcegroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;rg-aue-networking&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workloadvnetname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnet-workload&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workloadsubnetname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnet-workload&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nsgName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nsg-workload&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workloadSubnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;workloadsubnetresourcegroup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;workloadvnetname&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;workloadsubnetname&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workloadSubnetNsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nsgName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-Explicit-Dependency&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Tcp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workloadSubnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// dependency subnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny-East-West-Default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualNetwork&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This doesn’t stop compromise.&lt;br&gt;
It &lt;strong&gt;defines how far compromise can travel&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That’s the point.&lt;/p&gt;
&lt;h2 id="visualising-the-difference"&gt;Visualising the Difference
&lt;/h2&gt;&lt;h3 id="flat-trustbydefault-design"&gt;Flat, trust‑by‑default design
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
CompromisedWorkload --&gt; SubnetA
SubnetA --&gt; SubnetB
SubnetB --&gt; SubnetC
SubnetC --&gt; Data
&lt;/div&gt;
&lt;p&gt;Movement is easy, fast, and quiet.&lt;/p&gt;
&lt;h3 id="assumebreachoriented-design"&gt;Assume‑breach‑oriented design
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
CompromisedWorkload --&gt; SubnetA
SubnetA -.blocked.- SubnetB
SubnetA --&gt; ExplicitDependency
&lt;/div&gt;
&lt;p&gt;The attacker hits friction immediately.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Over‑segmentation can hurt operability&lt;br&gt;
If engineers can’t diagnose issues during an incident, the design has overshot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Platform traffic still needs consideration&lt;br&gt;
Health probes, control plane access, and managed service behaviour must be explicitly allowed — not assumed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NSGs are not policy engines&lt;br&gt;
Keep rules few, intentional, and aggressively pruned.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat “internal” as a routing concept, not a trust guarantee&lt;/li&gt;
&lt;li&gt;Design subnets around failure domains, not org charts&lt;/li&gt;
&lt;li&gt;Default to east‑west deny, then add explicit intent&lt;/li&gt;
&lt;li&gt;Regularly delete rules you can’t justify under breach&lt;/li&gt;
&lt;li&gt;Revisit network boundaries after incidents — not just audits&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Flat networks and permissive NSGs don’t just fail under breach — they make compromise faster, quieter, and harder to contain.&lt;/p&gt;
&lt;p&gt;If your network can’t limit damage after something goes wrong, it’s not defensive architecture. It’s optimism.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/network-security-groups-overview" target="_blank" rel="noopener"
&gt;Azure Network Security Groups overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/network-best-practices" target="_blank" rel="noopener"
&gt;Azure network security best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/resiliency/" target="_blank" rel="noopener"
&gt;Azure architecture for resilience&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Global Secure Access MVP: Secure and Private Without Pretending It’s a Network</title><link>https://blog.brewedinthecloud.com/p/gsa-mvp-implementation/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/gsa-mvp-implementation/</guid><description>&lt;p&gt;Global Secure Access (GSA) is easy to misunderstand because it &lt;em&gt;looks&lt;/em&gt; like a network product.&lt;/p&gt;
&lt;p&gt;There’s a client. There are connectors. Traffic flows somewhere else. The instinct is to treat it like a VPN refresh and design the end state up front. That instinct is also how teams end up with oversized blast radii and no clean rollback.&lt;/p&gt;
&lt;p&gt;This post takes a different position: &lt;strong&gt;a successful GSA rollout behaves more like introducing a new control plane than replacing old plumbing&lt;/strong&gt;. The goal here is not completeness. It’s observability, reversibility, and learning fast.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The common assumption:&lt;/strong&gt;&lt;br&gt;
You must model all access paths before enabling Global Secure Access.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it misleads:&lt;/strong&gt;&lt;br&gt;
GSA is policy‑driven software that happens to move packets. Its failure modes are not link failures or route leaks they’re policy mismatches, connector health issues, and identity gaps.&lt;/p&gt;
&lt;p&gt;A minimum viable implementation (MVP) should therefore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Limit who is affected&lt;/li&gt;
&lt;li&gt;Limit what traffic is touched&lt;/li&gt;
&lt;li&gt;Expose operational behaviour early&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your first deployment can’t be safely undone in minutes, it’s too big.&lt;/p&gt;
&lt;h2 id="how-it-really-works-mvp-view"&gt;How It Really Works (MVP View)
&lt;/h2&gt;&lt;p&gt;At runtime, the GSA client classifies traffic locally and forwards selected flows to Microsoft’s Security Service Edge (SSE). Decisions are enforced using Conditional Access signals before traffic reaches Microsoft 365, the internet, or a private app.&lt;/p&gt;
&lt;p&gt;Private Access extends this model by introducing &lt;strong&gt;connectors that only ever make outbound connections&lt;/strong&gt;. No inbound exposure, no implicit network reachability.&lt;/p&gt;
&lt;p&gt;This is not network extension. It’s &lt;strong&gt;identity‑mediated brokering&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="mvp-traffic-flow-overview"&gt;MVP Traffic Flow Overview
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
User[Windows Device&lt;br/&gt;GSA Client] --&gt;|M365 &amp; Internet| SSE[Microsoft Security Service Edge]
SSE --&gt;|Policy Allowed| Internet[Internet / Microsoft 365]
User --&gt;|Private App FQDN| SSE
SSE --&gt;|Authorised| Connector[Private Network Connector]
Connector --&gt; App[Private Application]
Connector -.-&gt;|Outbound HTTPS Only| SSE
&lt;/div&gt;
&lt;p&gt;This diagram is intentionally boring. That’s the point. Complexity lives in policy, not topology.&lt;/p&gt;
&lt;h2 id="mvp-scope-and-explicit-nongoals"&gt;MVP Scope and Explicit Non‑Goals
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;In scope&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft 365 traffic&lt;/li&gt;
&lt;li&gt;Limited internet access&lt;/li&gt;
&lt;li&gt;One private application&lt;/li&gt;
&lt;li&gt;Windows devices only&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Explicitly out of scope&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full VPN replacement&lt;/li&gt;
&lt;li&gt;Broad internet inspection&lt;/li&gt;
&lt;li&gt;Application portfolios&lt;/li&gt;
&lt;li&gt;Non‑HTTP legacy protocols&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deferring these is not a limitation. It’s an architectural choice.&lt;/p&gt;
&lt;h2 id="step-1--enable-global-secure-access"&gt;Step 1 – Enable Global Secure Access
&lt;/h2&gt;&lt;p&gt;In the &lt;strong&gt;Microsoft Entra admin centre&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Global Secure Access → Settings&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Global Secure Access&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nothing routes yet. This is a control‑plane activation, not a traffic change.&lt;/p&gt;
&lt;h2 id="step-2--define-a-constrained-pilot"&gt;Step 2 – Define a Constrained Pilot
&lt;/h2&gt;&lt;p&gt;Create a security group:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GSA-MVP-Pilot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This group is your blast radius. If you can’t clearly articulate why someone belongs here, they don’t.&lt;/p&gt;
&lt;h2 id="step-3--enable-secure-access-traffic-profiles"&gt;Step 3 – Enable Secure Access Traffic Profiles
&lt;/h2&gt;&lt;p&gt;Under &lt;strong&gt;Traffic forwarding&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable &lt;strong&gt;Microsoft 365&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Internet Access&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Leave advanced inspection features disabled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this stage, enabling profiles without clients deployed changes nothing a useful property when rolling out safely.&lt;/p&gt;
&lt;h2 id="step-4--deploy-the-gsa-client-windows"&gt;Step 4 – Deploy the GSA Client (Windows)
&lt;/h2&gt;&lt;p&gt;Deploy the Global Secure Access client via &lt;strong&gt;Microsoft Intune&lt;/strong&gt; and assign it to &lt;code&gt;GSA-MVP-Pilot&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This step matters less for &lt;em&gt;how&lt;/em&gt; it’s done and more for &lt;em&gt;what it enables&lt;/em&gt;: device‑level traffic classification that participates in Conditional Access decisions.&lt;/p&gt;
&lt;p&gt;If the client doesn’t connect reliably, stop. Everything else depends on this.&lt;/p&gt;
&lt;h2 id="step-5--validate-secure-access-first"&gt;Step 5 – Validate Secure Access First
&lt;/h2&gt;&lt;p&gt;Before touching Private Access:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Confirm Microsoft 365 works as expected&lt;/li&gt;
&lt;li&gt;Confirm internet access behaves normally&lt;/li&gt;
&lt;li&gt;Inspect &lt;strong&gt;Global Secure Access traffic logs&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You’re validating signal quality, not just connectivity.&lt;/p&gt;
&lt;p&gt;If Secure Access isn’t observable and predictable, Private Access will amplify the confusion.&lt;/p&gt;
&lt;h2 id="step-6--deploy-private-network-connectors"&gt;Step 6 – Deploy Private Network Connectors
&lt;/h2&gt;&lt;p&gt;Deploy at least &lt;strong&gt;two connectors per location&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows Server&lt;/li&gt;
&lt;li&gt;Outbound HTTPS only&lt;/li&gt;
&lt;li&gt;Close to the application, not the users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Connector health is now part of your application’s availability story. Treat it that way.&lt;/p&gt;
&lt;h2 id="step-7--publish-a-single-private-application"&gt;Step 7 – Publish a Single Private Application
&lt;/h2&gt;&lt;p&gt;In &lt;strong&gt;Private Access → Applications&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define the application by &lt;strong&gt;FQDN and port&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Avoid CIDR‑based definitions&lt;/li&gt;
&lt;li&gt;Assign access to &lt;code&gt;GSA-MVP-Pilot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Red flags for MVP inclusion:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hard‑coded IP dependencies&lt;/li&gt;
&lt;li&gt;Embedded DNS assumptions&lt;/li&gt;
&lt;li&gt;Latency‑sensitive chatty protocols&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some apps are simply bad first candidates. Excluding them is a design decision, not a failure.&lt;/p&gt;
&lt;h2 id="step-8--enforce-conditional-access"&gt;Step 8 – Enforce Conditional Access
&lt;/h2&gt;&lt;p&gt;Create a Conditional Access policy scoped to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users: &lt;code&gt;GSA-MVP-Pilot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cloud app: Global Secure Access&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Require:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compliant device&lt;/li&gt;
&lt;li&gt;MFA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without this, you’re proxying traffic not governing access.&lt;/p&gt;
&lt;h2 id="step-9--validate-private-access-behaviour"&gt;Step 9 – Validate Private Access Behaviour
&lt;/h2&gt;&lt;p&gt;From a pilot device:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Access the private app via its FQDN&lt;/li&gt;
&lt;li&gt;Confirm authentication flow&lt;/li&gt;
&lt;li&gt;Monitor connector metrics and sign‑ins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Expect additional latency compared to on‑network access. The trade‑off is explicit control and visibility.&lt;/p&gt;
&lt;p&gt;If that trade‑off is unacceptable for a given app, that’s valuable information early.&lt;/p&gt;
&lt;h2 id="gotchas-that-actually-matter"&gt;Gotchas That Actually Matter
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Connector resource starvation looks like “random slowness”&lt;/li&gt;
&lt;li&gt;DNS mismatches fail silently&lt;/li&gt;
&lt;li&gt;Policy changes can have wider impact than expected&lt;/li&gt;
&lt;li&gt;Break‑glass access paths must be planned, not improvised&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are operational problems, not configuration mistakes.&lt;/p&gt;
&lt;h2 id="best-practices-for-moving-beyond-mvp"&gt;Best Practices for Moving Beyond MVP
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Expand users slower than applications&lt;/li&gt;
&lt;li&gt;Add connectors before you need them&lt;/li&gt;
&lt;li&gt;Version and review policy changes&lt;/li&gt;
&lt;li&gt;Monitor GSA like an application dependency&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At scale, this is an access platform, not a feature.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Global Secure Access rewards teams that treat access as a living control system. If you approach it like static plumbing, it will behave like one until it doesn’t.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/training/modules/deploy-configure-microsoft-entra-global-secure-access/" target="_blank" rel="noopener"
&gt;Microsoft Learn: Deploy and configure Microsoft Entra Global Secure Access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/global-secure-access/" target="_blank" rel="noopener"
&gt;Microsoft Docs: Global Secure Access overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Where Global Secure Access Fits in Enterprise Azure Architectures</title><link>https://blog.brewedinthecloud.com/p/gsa-azure-architectures/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/gsa-azure-architectures/</guid><description>&lt;p&gt;Most enterprise Azure architectures still draw a clean picture: management groups, landing zones, hubs, spokes, firewalls and somewhere off to the side, &lt;em&gt;user access&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Global Secure Access (GSA) refuses to stay in that box.&lt;/p&gt;
&lt;p&gt;If you try to drop it into your hub as “the new VPN”, you’ll spend months fighting the platform and each other. This post is about placing GSA &lt;strong&gt;where it actually belongs&lt;/strong&gt; in Azure‑centric enterprise architectures, and why getting that placement wrong causes more organisational pain than technical failure.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
Global Secure Access is a networking service that should sit alongside Azure Firewall, VPN Gateway, or ExpressRoute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why that breaks:&lt;/strong&gt;&lt;br&gt;
GSA doesn’t participate in your virtual network topology. It doesn’t understand subnets, routes, or east‑west flows. It never becomes part of your Azure data plane.&lt;/p&gt;
&lt;p&gt;The correct mental model is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Global Secure Access lives in the identity and access plane not the network plane.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once traffic passes GSA, Azure networking starts. Before that, it’s an identity problem.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;At a behavioural level, Global Secure Access:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Anchors user traffic to Microsoft’s edge&lt;/li&gt;
&lt;li&gt;Evaluates identity, device posture, and context through Microsoft Entra&lt;/li&gt;
&lt;li&gt;Forwards &lt;em&gt;authorised&lt;/em&gt; traffic to Microsoft‑managed service endpoints&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What it deliberately does &lt;strong&gt;not&lt;/strong&gt; do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terminate inside your VNets&lt;/li&gt;
&lt;li&gt;Participate in routing decisions&lt;/li&gt;
&lt;li&gt;Enforce segmentation inside Azure&lt;/li&gt;
&lt;li&gt;Replace firewalls, NSGs, or platform controls&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From Azure’s point of view, GSA‑sourced traffic simply arrives &lt;strong&gt;pre‑authorised&lt;/strong&gt;. Everything after that remains a platform responsibility.&lt;/p&gt;
&lt;h2 id="architectural-placement-in-enterprise-azure"&gt;Architectural Placement in Enterprise Azure
&lt;/h2&gt;&lt;h3 id="above-subscriptions-not-inside-them"&gt;Above subscriptions, not inside them
&lt;/h3&gt;&lt;p&gt;Because GSA is Entra‑scoped:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It fronts &lt;strong&gt;all subscriptions and environments&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It ignores management group boundaries&lt;/li&gt;
&lt;li&gt;It doesn’t care about landing zone topology&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That makes it a &lt;strong&gt;pre‑network control layer&lt;/strong&gt;, not a shared service VNet.&lt;/p&gt;
&lt;p&gt;This also explains why it scales cleanly across dev, test, and prod without duplicating access infrastructure.&lt;/p&gt;
&lt;h2 id="responsibility-boundaries-this-is-where-teams-trip"&gt;Responsibility Boundaries (This Is Where Teams Trip)
&lt;/h2&gt;&lt;p&gt;Global Secure Access forces a line most enterprises haven’t clearly drawn:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;GSA&lt;/th&gt;
&lt;th&gt;Azure Platform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;User identity&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device posture&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access decision&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blast radius control&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network segmentation&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;East‑west traffic&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A hard‑earned lesson from the field:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GSA fails fastest in organisations that haven’t agreed who owns access decisions versus blast‑radius control.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If network teams try to “own” GSA, they’ll look for IPs and routes that don’t exist.&lt;br&gt;
If identity teams ignore platform constraints, Conditional Access quietly becomes a segmentation substitute.&lt;/p&gt;
&lt;p&gt;Neither ends well.&lt;/p&gt;
&lt;h2 id="preview-reality-not-a-tier0-dependency"&gt;Preview Reality: Not a Tier‑0 Dependency
&lt;/h2&gt;&lt;p&gt;GSA is evolving quickly which makes it powerful, but also unsuitable as a &lt;strong&gt;tier‑0 dependency&lt;/strong&gt; today.&lt;/p&gt;
&lt;p&gt;Architectural implications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Losing GSA &lt;strong&gt;must not&lt;/strong&gt; lock you out of Azure administration or identity recovery&lt;/li&gt;
&lt;li&gt;Critical break‑glass paths should not depend on GSA availability&lt;/li&gt;
&lt;li&gt;Early adoption should focus on &lt;strong&gt;learning placement&lt;/strong&gt;, not removing fallback access paths&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn’t caution for caution’s sake it’s about respecting change velocity in identity‑driven services.&lt;/p&gt;
&lt;h2 id="where-it-fits-and-common-antipatterns"&gt;Where It Fits and Common Anti‑Patterns
&lt;/h2&gt;&lt;h3 id="where-it-fits-well"&gt;Where it fits well
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Azure‑hosted private applications with Entra integration&lt;/li&gt;
&lt;li&gt;Microsoft 365 and SaaS consolidation&lt;/li&gt;
&lt;li&gt;Identity‑first Zero Trust strategies&lt;/li&gt;
&lt;li&gt;Enterprises reducing IP‑based allow‑listing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="antipatterns-to-avoid"&gt;Anti‑patterns to avoid
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Invisible network means no network responsibility&lt;/strong&gt;&lt;br&gt;
When user ingress becomes identity‑anchored, platform teams sometimes disengage entirely. The result is unclear failure domains and slower incident response.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GSA as a private endpoint replacement&lt;/strong&gt;&lt;br&gt;
Identity‑based access does not remove the need for network isolation. East‑west containment still matters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One access layer to rule them all&lt;/strong&gt;&lt;br&gt;
Forcing GSA to front service‑to‑service or automation traffic creates brittle designs and breaks non‑interactive workloads.&lt;/p&gt;
&lt;h2 id="signals-that-change-and-what-replaces-them"&gt;Signals That Change (And What Replaces Them)
&lt;/h2&gt;&lt;p&gt;Introducing GSA quietly invalidates a set of assumptions many platform teams rely on.&lt;/p&gt;
&lt;h3 id="signals-you-should-stop-expecting"&gt;Signals you should stop expecting
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Source IP addresses as identity&lt;/li&gt;
&lt;li&gt;Packet captures at the VNet edge for user traffic&lt;/li&gt;
&lt;li&gt;Firewall rule hit counts as access evidence&lt;/li&gt;
&lt;li&gt;Network logs answering “who accessed what”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="signals-you-need-to-replace-them-with"&gt;Signals you need to replace them with
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Entra sign‑in and audit logs as the &lt;strong&gt;primary access record&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Application‑level telemetry for success and failure&lt;/li&gt;
&lt;li&gt;Policy evaluation outcomes instead of rule matches&lt;/li&gt;
&lt;li&gt;Clear escalation paths between identity, platform, and app teams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Put simply:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Access becomes an identity event first, and a network event second.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Your operational model needs to follow that order.&lt;/p&gt;
&lt;h2 id="conceptual-placement-diagram"&gt;Conceptual Placement Diagram
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
User[User Device] --&gt; GSA[Global Secure Access Edge]
GSA --&gt; Entra[Microsoft Entra ID]
Entra --&gt;|Authorised Access| AppEndpoint[Azure App Endpoint]
AppEndpoint --&gt; VNet[Landing Zone VNets]
VNet --&gt; Firewall[Azure Firewall / NSGs]
&lt;/div&gt;
&lt;p&gt;GSA gates entry.&lt;br&gt;
Azure networking governs everything after.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat GSA as an &lt;strong&gt;identity capability&lt;/strong&gt;, not a network service&lt;/li&gt;
&lt;li&gt;Keep Azure network segmentation intact&lt;/li&gt;
&lt;li&gt;Align GSA ownership with identity governance teams&lt;/li&gt;
&lt;li&gt;Document responsibility boundaries explicitly&lt;/li&gt;
&lt;li&gt;Avoid turning Conditional Access into a proxy for segmentation&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Global Secure Access doesn’t simplify Azure networking it &lt;strong&gt;removes user ingress from it&lt;/strong&gt;.&lt;br&gt;
That only works if your organisation is ready to change how it thinks about access, visibility, and responsibility.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/entra/global-secure-access/" target="_blank" rel="noopener"
&gt;Microsoft Entra Global Secure Access documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/security/zero-trust/" target="_blank" rel="noopener"
&gt;Zero Trust architecture overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/ready/enterprise-scale/" target="_blank" rel="noopener"
&gt;Azure enterprise-scale architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Securing SaaS and Private Apps with Global Secure Access</title><link>https://blog.brewedinthecloud.com/p/gsa-securing-saas/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/gsa-securing-saas/</guid><description>&lt;p&gt;For a long time, securing applications has followed a comfortable sequence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make the app reachable&lt;/li&gt;
&lt;li&gt;Authenticate the user&lt;/li&gt;
&lt;li&gt;Hope nothing changes mid‑session&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Global Secure Access (GSA) challenges that order. It assumes that &lt;em&gt;change is the default&lt;/em&gt; users roam, devices drift out of compliance, risk signals evolve and asks whether access should still exist &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That framing matters when you’re securing both SaaS and private applications, because it moves the problem away from network exposure and toward &lt;strong&gt;session‑level trust&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
SaaS applications are secured with identity. Private applications are secured with networks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Attackers don’t differentiate. They exploit &lt;strong&gt;authorised sessions&lt;/strong&gt;, not architectural categories.&lt;/p&gt;
&lt;p&gt;Global Secure Access treats SaaS and private apps the same way: as destinations that require an explicit, continuously justified decision to access. The control plane doesn’t care &lt;em&gt;where&lt;/em&gt; the app lives only &lt;em&gt;who&lt;/em&gt; is accessing it, &lt;em&gt;from what&lt;/em&gt;, and &lt;em&gt;under what conditions&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The real shift isn’t SaaS versus private.&lt;br&gt;
It’s &lt;strong&gt;implicit reachability versus evaluated access&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Global Secure Access inserts a user‑aware enforcement layer in front of application traffic.&lt;/p&gt;
&lt;p&gt;In practice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users authenticate with Microsoft Entra ID.&lt;/li&gt;
&lt;li&gt;Traffic is associated with an authenticated &lt;strong&gt;user session&lt;/strong&gt;, not an IP address.&lt;/li&gt;
&lt;li&gt;Conditional Access (CA) policies are evaluated based on identity, device state, and risk.&lt;/li&gt;
&lt;li&gt;Access is granted or denied &lt;em&gt;before&lt;/em&gt; traffic reaches the application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An important boundary to be explicit about:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Global Secure Access evaluates access to the &lt;strong&gt;session&lt;/strong&gt;, not authorisation &lt;em&gt;inside&lt;/em&gt; the application.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If an application accepts a bearer token indefinitely, &lt;strong&gt;GSA won’t save you from that design choice&lt;/strong&gt;. It can revoke or deny future access, but it cannot fix weak application‑level trust models.&lt;/p&gt;
&lt;p&gt;That distinction is where a lot of confusion and overconfidence creeps in.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="saas-applications"&gt;SaaS applications
&lt;/h3&gt;&lt;p&gt;With GSA in place, SaaS access stops being a one‑time decision at sign‑in.&lt;/p&gt;
&lt;p&gt;You gain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consistent Conditional Access enforcement across SaaS providers&lt;/li&gt;
&lt;li&gt;Explicit session lifetime controls&lt;/li&gt;
&lt;li&gt;The ability to react to changing risk signals&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Operationally, this means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A user’s access can be revoked without touching the app.&lt;/li&gt;
&lt;li&gt;Unmanaged or risky devices don’t quietly retain access.&lt;/li&gt;
&lt;li&gt;Location and corporate networks stop being trusted signals by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="private-applications"&gt;Private applications
&lt;/h3&gt;&lt;p&gt;For private apps, the impact is more structural.&lt;/p&gt;
&lt;p&gt;Access no longer requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Broad network reachability&lt;/li&gt;
&lt;li&gt;IP allow‑listing gymnastics&lt;/li&gt;
&lt;li&gt;Assuming “on the network” equals “trusted”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users are authorised &lt;strong&gt;per application&lt;/strong&gt;, not per subnet.&lt;/li&gt;
&lt;li&gt;Reachability follows identity, not topology.&lt;/li&gt;
&lt;li&gt;Lateral movement opportunities are significantly reduced.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This doesn’t modernise legacy applications but it does &lt;strong&gt;contain their blast radius&lt;/strong&gt; far more effectively than network‑centric controls.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="conceptual-access-flow"&gt;Conceptual access flow
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
User[User + Device]
GSA[Global Secure Access]
CA[Conditional Access]
SaaS[SaaS Application]
Private[Private Application]
User --&gt; GSA
GSA --&gt; CA
CA --&gt;|Allowed| SaaS
CA --&gt;|Allowed| Private
CA --&gt;|Blocked| User
&lt;/div&gt;
&lt;p&gt;The application never sees the request unless identity and session policy say it should.&lt;/p&gt;
&lt;h3 id="conditional-access-policy-illustrative"&gt;Conditional Access policy (illustrative)
&lt;/h3&gt;&lt;p&gt;Below is a simplified Conditional Access policy targeting a private application accessed via Global Secure Access.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;displayName&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;GSA - Private App - Require Compliant Device&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;conditions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;users&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;includeUsers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;All&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;applications&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;includeApplications&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;private-app-enterprise-app-id&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;clientAppTypes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mobileAppsAndDesktopClients&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;grantControls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;operator&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AND&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;builtInControls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mfa&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;compliantDevice&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sessionControls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;signInFrequency&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hours&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Why this matters in production:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Access can be withdrawn centrally without redeploying the app.&lt;/li&gt;
&lt;li&gt;Device posture becomes a hard requirement, not guidance.&lt;/li&gt;
&lt;li&gt;Session lifetime is an explicit decision, not an accident.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authorised misuse still exists&lt;/strong&gt;&lt;br&gt;
Global Secure Access is excellent at preventing unauthorised access. It is far less effective at containing &lt;em&gt;authorised abuse&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Legacy token behaviour matters&lt;/strong&gt;&lt;br&gt;
Long‑lived or non‑expiring tokens undermine session‑based controls. Identity enforcement can only be as strong as the app’s trust model.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Policy confidence depends on signal quality&lt;/strong&gt;&lt;br&gt;
Device compliance and risk signals must be reliable. Weak inputs lead to confident but wrong decisions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feature maturity varies&lt;/strong&gt;&lt;br&gt;
Parts of Global Secure Access are still evolving. Always confirm GA status before relying on specific behaviours in production designs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat SaaS and private apps identically in access policy language.&lt;/li&gt;
&lt;li&gt;Be explicit about &lt;strong&gt;session lifetime&lt;/strong&gt; this is a business decision, not a technical default.&lt;/li&gt;
&lt;li&gt;Use device compliance as a baseline requirement, not a conditional add‑on.&lt;/li&gt;
&lt;li&gt;Design access policies around &lt;em&gt;user intent&lt;/em&gt;, not network location.&lt;/li&gt;
&lt;li&gt;Document where GSA enforcement ends and application responsibility begins.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Global Secure Access materially reduces attacks that rely on &lt;strong&gt;unauthorised reachability&lt;/strong&gt; stolen credentials, unmanaged devices, and accidental exposure. It does very little to stop attacks that occur &lt;em&gt;after legitimate access is granted&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In other words: GSA is very good at deciding who gets to knock on the door and mostly irrelevant once you’ve let the wrong person inside.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/entra/global-secure-access/" target="_blank" rel="noopener"
&gt;Microsoft Entra Global Secure Access documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/overview" target="_blank" rel="noopener"
&gt;Conditional Access concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/" target="_blank" rel="noopener"
&gt;Zero Trust and Microsoft Entra&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Designing Hybrid User Access with Identity‑Driven Routing</title><link>https://blog.brewedinthecloud.com/p/gsa-identity-driven-hybrid-user-access/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/gsa-identity-driven-hybrid-user-access/</guid><description>&lt;p&gt;Every time we talk about identity‑driven access, someone eventually says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“So networking won’t need to worry about user access anymore, right?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That question alone tells you where most hybrid designs go wrong.&lt;/p&gt;
&lt;p&gt;Global Secure Access (GSA) doesn’t remove the network from user access.&lt;br&gt;
It &lt;strong&gt;changes where decisions are made&lt;/strong&gt;, not who carries the pager.&lt;/p&gt;
&lt;p&gt;If you design hybrid user access assuming identity ownership replaces network ownership, you’re setting yourself up for confused outages and slower recovery not better security.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;h3 id="the-common-assumption"&gt;The common assumption
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Identity‑based access replaces network‑based access.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This frames identity and networking as competing models.&lt;/p&gt;
&lt;h3 id="why-this-breaks-down"&gt;Why this breaks down
&lt;/h3&gt;&lt;p&gt;In real hybrid estates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Packets still traverse networks you own and operate&lt;/li&gt;
&lt;li&gt;Latency, path asymmetry, DNS, and MTU still matter&lt;/li&gt;
&lt;li&gt;When users can’t connect, the networking team still gets called first&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Identity doesn’t replace networking.&lt;br&gt;
It &lt;strong&gt;moves the access decision upstream&lt;/strong&gt;, before transport is exercised.&lt;/p&gt;
&lt;p&gt;That distinction matters operationally.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;h3 id="identity-is-the-control-plane-not-the-data-plane"&gt;Identity is the control plane, not the data plane
&lt;/h3&gt;&lt;p&gt;With GSA, identity determines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Who is allowed&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Under what conditions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;To which class of resource&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What it does &lt;em&gt;not&lt;/em&gt; do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eliminate routing complexity&lt;/li&gt;
&lt;li&gt;Remove dependency on underlying connectivity&lt;/li&gt;
&lt;li&gt;Magically simplify incident response&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once access is approved, traffic still flows via:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft’s global edge (for SaaS and some private access), or&lt;/li&gt;
&lt;li&gt;Existing enterprise paths (VPNs, ExpressRoute, on‑prem routing)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;strong&gt;decision logic is centralised&lt;/strong&gt;.&lt;br&gt;
The &lt;strong&gt;transport remains distributed&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That separation is the architectural shift.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="how-this-changes-what-you-design-deploy-and-operate"&gt;How this changes what you design, deploy, and operate
&lt;/h3&gt;&lt;h4 id="design"&gt;Design
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;You stop designing networks around “trusted locations”&lt;/li&gt;
&lt;li&gt;You start designing around &lt;strong&gt;decision boundaries&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Identity boundary (who is allowed)&lt;/li&gt;
&lt;li&gt;Application boundary (what they’re accessing)&lt;/li&gt;
&lt;li&gt;Transport boundary (how traffic moves)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="operations"&gt;Operations
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Incidents still land with networking — and that’s correct&lt;/li&gt;
&lt;li&gt;Identity becomes a &lt;em&gt;diagnostic input&lt;/em&gt;, not the owner of resolution&lt;/li&gt;
&lt;li&gt;Faster isolation when teams share a common mental model&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="reliability"&gt;Reliability
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Identity failures and transport failures decouple &lt;em&gt;slightly&lt;/em&gt;, not fully&lt;/li&gt;
&lt;li&gt;Clearer blast radius when access logic is centralised&lt;/li&gt;
&lt;li&gt;Fewer cascading failures caused by duplicated controls&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conceptual-architecture-hybrid-not-replaced"&gt;Conceptual Architecture: Hybrid, Not Replaced
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
User[User Device]
IdP[Microsoft Entra ID]
GSA[Global Secure Access Edge]
SaaS[SaaS Applications]
PrivateApp[Private Applications]
CorpNet[Enterprise Network]
OnPrem[On‑Prem Resources]
User --&gt; IdP
IdP --&gt;|Access Decision| GSA
GSA --&gt; SaaS
GSA --&gt; PrivateApp
GSA --&gt; CorpNet
CorpNet --&gt; OnPrem
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Key point:&lt;/strong&gt;&lt;br&gt;
Identity determines &lt;em&gt;whether&lt;/em&gt; traffic is allowed.&lt;br&gt;
Networking determines &lt;em&gt;whether it actually flows&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="decision-boundaries-that-matter-in-practice"&gt;Decision Boundaries That Matter in Practice
&lt;/h2&gt;&lt;h3 id="saas-vs-private-applications"&gt;SaaS vs Private Applications
&lt;/h3&gt;&lt;p&gt;This is where most organisations draw the &lt;strong&gt;first clean line&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SaaS&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity‑first access is natural&lt;/li&gt;
&lt;li&gt;Transport complexity is largely abstracted&lt;/li&gt;
&lt;li&gt;Networking impact is minimal and predictable&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Private applications&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity gates access&lt;/li&gt;
&lt;li&gt;Networking still owns reachability, performance, and failure modes&lt;/li&gt;
&lt;li&gt;Coexistence with VPNs and fixed paths is normal — often long‑term&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The mistake is assuming both categories behave the same operationally.&lt;/p&gt;
&lt;h2 id="transitional-states-are-the-architecture"&gt;Transitional States Are the Architecture
&lt;/h2&gt;&lt;p&gt;Hybrid user access is not a phase — it’s a sustained state.&lt;/p&gt;
&lt;p&gt;Common patterns that actually work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dual paths by design&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Identity‑driven access for modern apps&lt;/li&gt;
&lt;li&gt;Legacy paths retained for brittle workloads&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identity consistency first&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Centralise access decisions before touching transport&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application‑level intent&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Each app declares &lt;em&gt;identity requirements&lt;/em&gt; independently of network paths&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your architecture diagram doesn’t show coexistence, it’s lying.&lt;/p&gt;
&lt;h2 id="operational-reality-who-owns-the-incident"&gt;Operational Reality: Who Owns the Incident?
&lt;/h2&gt;&lt;p&gt;This is the uncomfortable part.&lt;/p&gt;
&lt;p&gt;When a user can’t reach an internal app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The ticket goes to networking&lt;/li&gt;
&lt;li&gt;The networking team must diagnose:
&lt;ul&gt;
&lt;li&gt;Identity decision outcome&lt;/li&gt;
&lt;li&gt;Edge routing behaviour&lt;/li&gt;
&lt;li&gt;Underlying path health&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Identity‑driven routing &lt;strong&gt;does not remove networking ownership&lt;/strong&gt;.&lt;br&gt;
It raises the bar on what networking teams need to understand and observe.&lt;/p&gt;
&lt;p&gt;The success metric isn’t fewer tickets.&lt;br&gt;
It’s &lt;strong&gt;faster, more confident diagnosis&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That only happens when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Networking teams understand identity‑driven access models&lt;/li&gt;
&lt;li&gt;They have visibility into identity decisions&lt;/li&gt;
&lt;li&gt;Identity and network tooling are treated as part of the same system&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-theres-no-implementation-section-here"&gt;Why There’s No Implementation Section Here
&lt;/h2&gt;&lt;p&gt;This post intentionally avoids configuration snippets.&lt;/p&gt;
&lt;p&gt;At this stage of design:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implementation details create false confidence&lt;/li&gt;
&lt;li&gt;Feature‑level controls distract from architectural intent&lt;/li&gt;
&lt;li&gt;The real risk is &lt;em&gt;misaligned ownership&lt;/em&gt;, not misconfigured policies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Concrete implementation belongs later, once the decision boundaries are agreed.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identity success ≠ connectivity success&lt;/strong&gt;&lt;br&gt;
Approval does not guarantee reachability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ambiguous routing during coexistence&lt;/strong&gt;&lt;br&gt;
Multiple valid paths confuse users and operators alike.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team silos become incident amplifiers&lt;/strong&gt;&lt;br&gt;
If identity and networking operate independently, outages last longer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat identity as a &lt;strong&gt;shared dependency&lt;/strong&gt;, not a handoff&lt;/li&gt;
&lt;li&gt;Design hybrid states explicitly — document them&lt;/li&gt;
&lt;li&gt;Assume networking owns the outage, then design to help them&lt;/li&gt;
&lt;li&gt;Invest in diagnostics before optimisation&lt;/li&gt;
&lt;li&gt;Resist the urge to “finish” the migration too early&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Identity‑driven routing doesn’t change who gets paged — it changes how quickly they understand the problem.&lt;br&gt;
If your networking team isn’t fluent in the identity model, you haven’t simplified anything.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/global-secure-access/overview-what-is-global-secure-access" target="_blank" rel="noopener"
&gt;Global Secure Access overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/security/zero-trust/" target="_blank" rel="noopener"
&gt;Zero Trust identity principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/hybrid/hybrid-start-here" target="_blank" rel="noopener"
&gt;Hybrid access and remote user connectivity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Global Secure Access vs VPNs, Private Endpoints, and ExpressRoute</title><link>https://blog.brewedinthecloud.com/p/gsa-vs-vpn-pe-er/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/gsa-vs-vpn-pe-er/</guid><description>&lt;p&gt;Every few years, user access gets “simplified”.&lt;/p&gt;
&lt;p&gt;First it was VPN consolidation.&lt;br&gt;
Then it was Private Endpoints everywhere.&lt;br&gt;
Now it’s Global Secure Access (GSA).&lt;/p&gt;
&lt;p&gt;The pitch changes, but the mistake stays the same: treating all user access technologies as if they compete in the same layer.&lt;/p&gt;
&lt;p&gt;They don’t.&lt;/p&gt;
&lt;p&gt;This post is about &lt;strong&gt;why GSA doesn’t replace VPNs, Private Endpoints, or ExpressRoute and why trying to make it do so usually weakens your architecture&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;h3 id="the-common-assumption"&gt;The common assumption
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Global Secure Access is the modern answer to user connectivity. Over time, everything should move to it.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="why-this-breaks"&gt;Why this breaks
&lt;/h3&gt;&lt;p&gt;That assumption collapses &lt;strong&gt;trust&lt;/strong&gt;, &lt;strong&gt;transport&lt;/strong&gt;, and &lt;strong&gt;control&lt;/strong&gt; into a single decision.&lt;/p&gt;
&lt;p&gt;In reality:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPNs trust &lt;strong&gt;reachability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Private Endpoints trust &lt;strong&gt;network placement&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;ExpressRoute trusts &lt;strong&gt;physical transport&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Global Secure Access trusts &lt;strong&gt;identity context&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you blur those boundaries, you stop designing access, you start accumulating risk.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;The cleanest way to compare these technologies isn’t features.&lt;br&gt;
It’s &lt;strong&gt;where decisions are made&lt;/strong&gt; and &lt;strong&gt;what must be trusted to make them&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="global-secure-access-gsa"&gt;Global Secure Access (GSA)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control plane:&lt;/strong&gt; Microsoft Entra ID (identity, device, session context)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data plane:&lt;/strong&gt; Microsoft‑managed global edge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforcement point:&lt;/strong&gt; Per‑user, per‑session, per‑application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GSA makes a deliberate trade‑off:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You gain fine‑grained, identity‑driven access&lt;/li&gt;
&lt;li&gt;You accept a hard dependency on the identity control plane&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That trade‑off is powerful and non‑negotiable.&lt;/p&gt;
&lt;h3 id="vpn-client--pointtosite"&gt;VPN (Client / Point‑to‑Site)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control plane:&lt;/strong&gt; Network authentication (certs, tokens, sometimes Entra ID)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data plane:&lt;/strong&gt; Encrypted tunnel into a network&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforcement point:&lt;/strong&gt; Subnets, routes, firewalls&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VPNs don’t understand applications.&lt;br&gt;
They grant &lt;strong&gt;presence&lt;/strong&gt;, then rely on network controls to contain it.&lt;/p&gt;
&lt;p&gt;This is a blunt tool but sometimes blunt is exactly what you want.&lt;/p&gt;
&lt;h3 id="private-endpoints"&gt;Private Endpoints
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control plane:&lt;/strong&gt; Azure Resource Manager&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data plane:&lt;/strong&gt; Private IP inside a VNet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforcement point:&lt;/strong&gt; Network isolation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Private Endpoints don’t solve user access at all.&lt;br&gt;
They solve &lt;strong&gt;service exposure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;They assume:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Whatever reaches this VNet is already trusted enough.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;How that trust is established is someone else’s problem.&lt;/p&gt;
&lt;h3 id="expressroute"&gt;ExpressRoute
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control plane:&lt;/strong&gt; Circuit provisioning and Azure configuration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data plane:&lt;/strong&gt; Private, predictable transport&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforcement point:&lt;/strong&gt; Network boundaries and upstream controls&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ExpressRoute optimises &lt;strong&gt;how traffic moves&lt;/strong&gt;, not &lt;strong&gt;who should be allowed&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Treating it as a Zero Trust mechanism is a category error and a common one.&lt;/p&gt;
&lt;h3 id="same-user-four-trust-anchors"&gt;Same user, four trust anchors
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
User --&gt;|Identity &amp; Session| GSA[Global Secure Access Edge]
GSA --&gt; SaaS[SaaS / Entra Apps]
GSA --&gt; PrivateApp[Private App Connector]
User --&gt;|Encrypted Tunnel| VPN[VPN Gateway]
VPN --&gt; VNet[VNet Resources]
VNet --&gt; PE[Private Endpoint]
OnPrem --&gt; ER[ExpressRoute]
ER --&gt; VNet
&lt;/div&gt;
&lt;p&gt;Nothing here replaces anything else.&lt;br&gt;
Each path exists because &lt;strong&gt;a different thing is being trusted&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="design-decisions"&gt;Design decisions
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;GSA is excellent for &lt;strong&gt;user‑to‑app access&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;VPNs remain necessary for &lt;strong&gt;operator and infrastructure access&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Private Endpoints harden &lt;strong&gt;services&lt;/strong&gt;, not users&lt;/li&gt;
&lt;li&gt;ExpressRoute belongs in &lt;strong&gt;transport conversations&lt;/strong&gt;, not access debates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Trying to standardise on one tool across all four roles is how complexity leaks.&lt;/p&gt;
&lt;h3 id="operational-reality-day2"&gt;Operational reality (Day‑2)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;GSA inherits Entra ID’s availability and failure modes&lt;/li&gt;
&lt;li&gt;VPN access can be deliberately isolated from identity outages&lt;/li&gt;
&lt;li&gt;Private Endpoint sprawl becomes a DNS and lifecycle problem&lt;/li&gt;
&lt;li&gt;ExpressRoute incidents are rare, and brutally visible when they happen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These aren’t theoretical differences.&lt;br&gt;
They show up during incidents and audits.&lt;/p&gt;
&lt;h2 id="two-scenarios-where-gsa-should-not-be-the-primary-control"&gt;Two Scenarios Where GSA Should &lt;em&gt;Not&lt;/em&gt; Be the Primary Control
&lt;/h2&gt;&lt;h3 id="1-privileged-and-emergency-operator-access"&gt;1. Privileged and Emergency Operator Access
&lt;/h3&gt;&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Break‑glass access to IaaS hosts&lt;/li&gt;
&lt;li&gt;Network appliance management planes&lt;/li&gt;
&lt;li&gt;Recovery access during identity incidents&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GSA assumes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entra ID is healthy&lt;/li&gt;
&lt;li&gt;Policy evaluation is reachable&lt;/li&gt;
&lt;li&gt;Microsoft’s edge is available&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For &lt;strong&gt;operator access&lt;/strong&gt;, those assumptions are unacceptable.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Human operators managing infrastructure should not depend on the same identity edge that protects end‑user applications.&lt;/p&gt;
&lt;p&gt;This is where a tightly scoped admin VPN isn’t legacy, it’s deliberate risk separation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="2-environments-with-hard-regulatory-or-sovereignty-constraints"&gt;2. Environments With Hard Regulatory or Sovereignty Constraints
&lt;/h3&gt;&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Defence or restricted government workloads&lt;/li&gt;
&lt;li&gt;Sovereign environments with constrained control planes&lt;/li&gt;
&lt;li&gt;Architectures where identity plane dependency must be minimised&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GSA requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Continuous Entra ID control plane access&lt;/li&gt;
&lt;li&gt;Microsoft‑managed enforcement infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In some environments, that alone disqualifies it.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If the identity control plane cannot be assumed available or permissible, identity‑centric access cannot be the edge.
No amount of policy elegance compensates for a violated assumption.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;GSA does &lt;strong&gt;not&lt;/strong&gt; eliminate the need for Private Endpoints&lt;/li&gt;
&lt;li&gt;Identity outages become access outages if you over‑centralise&lt;/li&gt;
&lt;li&gt;ExpressRoute is often misused as a security boundary, it isn’t one&lt;/li&gt;
&lt;li&gt;DNS design becomes more critical as access models diverge&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Misunderstanding these boundaries is how architectures become fragile.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Start every access discussion by naming &lt;strong&gt;what is being trusted&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Use GSA where identity context genuinely adds value&lt;/li&gt;
&lt;li&gt;Keep operator access isolated from user access paths&lt;/li&gt;
&lt;li&gt;Treat Private Endpoints as service hardening, not authorisation&lt;/li&gt;
&lt;li&gt;Evaluate ExpressRoute on transport requirements alone&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Coexistence is not compromise.&lt;br&gt;
It’s architectural clarity.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Global Secure Access doesn’t replace your network.&lt;br&gt;
It replaces your default assumption that users must join it, and nothing more.&lt;/p&gt;
&lt;p&gt;Knowing where that boundary ends is what separates mature designs from fashionable ones.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/global-secure-access/overview-what-is-global-secure-access" target="_blank" rel="noopener"
&gt;Global Secure Access overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-about-vpngateways" target="_blank" rel="noopener"
&gt;Azure VPN Gateway overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview" target="_blank" rel="noopener"
&gt;Private Endpoint fundamentals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/expressroute/expressroute-introduction" target="_blank" rel="noopener"
&gt;ExpressRoute introduction&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>What Global Secure Access Actually Is (and What It Is Not)</title><link>https://blog.brewedinthecloud.com/p/gsa-whatis-whatnot/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/gsa-whatis-whatnot/</guid><description>&lt;p&gt;Most engineers approach Global Secure Access (GSA) the same way they approached VPNs.&lt;/p&gt;
&lt;p&gt;They look for the tunnel.&lt;br&gt;
They look for the IP range.&lt;br&gt;
They ask where the packets go.&lt;/p&gt;
&lt;p&gt;That instinct isn’t wrong, it’s just anchored to the wrong problem.&lt;/p&gt;
&lt;p&gt;Global Secure Access isn’t trying to improve &lt;em&gt;connectivity&lt;/em&gt;.&lt;br&gt;
It’s trying to reduce the &lt;strong&gt;risk created by long‑lived trust decisions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Once you see that, the rest of the architecture snaps into focus.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;h3 id="the-common-assumption"&gt;The common assumption
&lt;/h3&gt;&lt;p&gt;The prevailing assumption is that GSA is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A cloud‑hosted VPN replacement&lt;/li&gt;
&lt;li&gt;A proxy with identity layered on&lt;/li&gt;
&lt;li&gt;Another option for getting users “inside” the environment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even well‑run VPNs reinforce this idea: authenticate strongly up front, then rely on the network to carry trust forward.&lt;/p&gt;
&lt;h3 id="why-this-breaks-down"&gt;Why this breaks down
&lt;/h3&gt;&lt;p&gt;VPNs, even modern ones with MFA, make a &lt;strong&gt;single, high‑impact decision&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“This user and device are trusted. Keep them connected.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What they’re bad at is &lt;strong&gt;withdrawing that trust&lt;/strong&gt; when conditions change.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Device posture degrades&lt;/li&gt;
&lt;li&gt;Risk signals increase&lt;/li&gt;
&lt;li&gt;Credentials are abused mid‑session&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The network stays up anyway.&lt;/p&gt;
&lt;p&gt;GSA exists to collapse that decision latency.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;At its core, Global Secure Access is an &lt;strong&gt;identity‑centric access broker&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Its primary job is not to move traffic efficiently, but to &lt;strong&gt;continuously evaluate whether a session should still exist&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That evaluation is driven by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identity&lt;/strong&gt; — Entra ID users, groups, and claims&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session context&lt;/strong&gt; — device compliance, location, risk signals&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy&lt;/strong&gt; — Conditional Access and security profiles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If and only if, policy allows, GSA facilitates connectivity via Microsoft’s global edge.&lt;/p&gt;
&lt;p&gt;Transport happens, but it’s not the point.&lt;/p&gt;
&lt;h3 id="access-brokering-vs-network-transport"&gt;Access brokering vs network transport
&lt;/h3&gt;&lt;p&gt;This distinction is where most designs go wrong.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it actually owns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identity &amp;amp; Signals&lt;/td&gt;
&lt;td&gt;Entra ID, device state, risk engines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access Decisions&lt;/td&gt;
&lt;td&gt;Global Secure Access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;Microsoft global edge + existing paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application Trust&lt;/td&gt;
&lt;td&gt;App‑level auth and authorisation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;GSA &lt;strong&gt;does not&lt;/strong&gt; replace:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application authentication&lt;/li&gt;
&lt;li&gt;Network routing design&lt;/li&gt;
&lt;li&gt;Your underlying connectivity primitives&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It replaces the assumption that &lt;em&gt;connectivity equals trust&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="the-business-risk-it-actually-reduces"&gt;The business risk it actually reduces
&lt;/h3&gt;&lt;p&gt;Even a “good” VPN leaves one major risk intact:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A compromised user session remains powerful for too long.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once connected, VPN users often gain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Broad network reachability&lt;/li&gt;
&lt;li&gt;Stable access that outlives changing risk conditions&lt;/li&gt;
&lt;li&gt;Trust that is hard to revoke without full disconnection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GSA changes this by making access:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explicit&lt;/strong&gt; — scoped to apps, not networks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session‑aware&lt;/strong&gt; — continuously evaluated&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Revocable&lt;/strong&gt; — policy changes take effect mid‑flight&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This reduces blast radius and shortens the window between &lt;em&gt;something becoming unsafe&lt;/em&gt; and &lt;em&gt;access being removed&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="how-this-changes-what-you-design-and-operate"&gt;How this changes what you design and operate
&lt;/h3&gt;&lt;p&gt;You stop designing around “who gets on the network” and start designing around:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which sessions are allowed right now&lt;/li&gt;
&lt;li&gt;Under what conditions access should terminate&lt;/li&gt;
&lt;li&gt;How quickly policy reacts to signal changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Operationally, day‑2 effort shifts from network stability to &lt;strong&gt;decision quality&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;GSA configuration is anchored in &lt;strong&gt;identity and policy&lt;/strong&gt;, not routing tables.&lt;/p&gt;
&lt;h3 id="conceptual-access-flow"&gt;Conceptual access flow
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
User[User Device]
Edge[Microsoft Global Edge]
GSA[Global Secure Access]
Entra[Entra ID + Signals]
App[Target Resource]
User --&gt; Edge
Edge --&gt; GSA
GSA --&gt; Entra
Entra --&gt;|Decision| GSA
GSA --&gt;|If allowed| App
&lt;/div&gt;
&lt;p&gt;The key observation:&lt;br&gt;
&lt;strong&gt;The decision loop is short, and it repeats.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="policy-as-a-control-surface-illustrative"&gt;Policy as a control surface (illustrative)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;conditions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;users&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;includeGroups&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Engineering&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;signInRiskLevels&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;low&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;devices&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;filter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;device.isCompliant -eq true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;grantControls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;operator&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AND&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;builtInControls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;compliantDevice&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This isn’t special because it’s Conditional Access.&lt;br&gt;
It’s important because &lt;strong&gt;GSA enforces these decisions continuously&lt;/strong&gt;, not just at sign‑in.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GSA will not save a weak identity posture&lt;/strong&gt;&lt;br&gt;
Poor device compliance or noisy risk signals will cause real outages, fast.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocols that assume broad network reach struggle&lt;/strong&gt;&lt;br&gt;
GSA rewards explicit app exposure, not ambient access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mis‑scoped policy fails hard&lt;/strong&gt;&lt;br&gt;
Identity‑driven systems don’t degrade gracefully; they deny decisively.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preview behaviour matters&lt;/strong&gt;&lt;br&gt;
GSA is still evolving, assumptions must be validated against current service behaviour.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat GSA as a &lt;strong&gt;control plane&lt;/strong&gt;, not a data plane&lt;/li&gt;
&lt;li&gt;Design policies around &lt;strong&gt;revocation speed&lt;/strong&gt;, not just access grants&lt;/li&gt;
&lt;li&gt;Keep access scopes narrow and explicit&lt;/li&gt;
&lt;li&gt;Assume sessions will be re‑evaluated and interrupted&lt;/li&gt;
&lt;li&gt;Instrument and review access decisions as a security signal&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; A VPN asks, “Can this user connect?” Global Secure Access keeps asking, “Should this session still exist?”
That difference isn’t networking, it’s risk management.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/global-secure-access/overview-what-is-global-secure-access" target="_blank" rel="noopener"
&gt;Global Secure Access Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/overview" target="_blank" rel="noopener"
&gt;Conditional Access Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/zero-trust-overview" target="_blank" rel="noopener"
&gt;Zero Trust Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Why the Traditional Network Perimeter is Disappearing</title><link>https://blog.brewedinthecloud.com/p/gsa-disappearing-network-perimeter/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/gsa-disappearing-network-perimeter/</guid><description>&lt;p&gt;The traditional network perimeter didn’t fail overnight.&lt;/p&gt;
&lt;p&gt;It faded, quietly, as organisations kept asking it to do jobs it was never designed for.&lt;br&gt;
Not because security teams were wrong, but because the environment changed faster than the trust model.&lt;/p&gt;
&lt;p&gt;Most enterprises still &lt;em&gt;have&lt;/em&gt; a perimeter.&lt;br&gt;
The problem is that many still treat it as &lt;strong&gt;authoritative&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;h3 id="the-common-assumption"&gt;The common assumption
&lt;/h3&gt;&lt;p&gt;The long‑standing assumption goes something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If a user is on the corporate network, we can trust them more.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That assumption underpins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPN‑centric access models&lt;/li&gt;
&lt;li&gt;“Internal” vs “external” application classifications&lt;/li&gt;
&lt;li&gt;Firewall rules as primary user controls&lt;/li&gt;
&lt;li&gt;Security reviews anchored on ingress paths&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s not reckless. It’s conservative.&lt;br&gt;
And increasingly, it’s misleading.&lt;/p&gt;
&lt;h3 id="why-it-breaks"&gt;Why it breaks
&lt;/h3&gt;&lt;p&gt;This model assumes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Network location is a stable signal&lt;/li&gt;
&lt;li&gt;Users reliably traverse centralised controls&lt;/li&gt;
&lt;li&gt;IP addresses approximate identity&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In modern enterprises, none of these hold consistently, especially under change.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;The perimeter didn’t move to the cloud.&lt;/p&gt;
&lt;p&gt;It &lt;strong&gt;lost its authority&lt;/strong&gt; as the default trust boundary for users.&lt;/p&gt;
&lt;h3 id="saas-dissolved-application-ownership"&gt;SaaS dissolved application ownership
&lt;/h3&gt;&lt;p&gt;Most critical applications are no longer behind your firewall:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft 365&lt;/li&gt;
&lt;li&gt;Salesforce&lt;/li&gt;
&lt;li&gt;ServiceNow&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You don’t own their networks. You don’t control their ingress paths.&lt;br&gt;
Routing users “inside” first doesn’t increase trust, it just adds friction.&lt;/p&gt;
&lt;p&gt;The applications that matter most are now outside the perimeter by design.&lt;/p&gt;
&lt;h3 id="remote-work-normalised-untrusted-networks"&gt;Remote work normalised untrusted networks
&lt;/h3&gt;&lt;p&gt;Users now work from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Home broadband&lt;/li&gt;
&lt;li&gt;Shared Wi‑Fi&lt;/li&gt;
&lt;li&gt;Mobile networks&lt;/li&gt;
&lt;li&gt;Client environments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each introduces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP churn&lt;/li&gt;
&lt;li&gt;Carrier‑grade NAT&lt;/li&gt;
&lt;li&gt;Shared address space&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Network location stopped being a reliable indicator of &lt;em&gt;who&lt;/em&gt; a user is or &lt;em&gt;how&lt;/em&gt; they’re working.&lt;/p&gt;
&lt;h3 id="cloud-platforms-removed-static-boundaries"&gt;Cloud platforms removed static boundaries
&lt;/h3&gt;&lt;p&gt;In Azure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPs are ephemeral&lt;/li&gt;
&lt;li&gt;Services scale dynamically&lt;/li&gt;
&lt;li&gt;Platform traffic often bypasses traditional inspection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can still draw boundaries, but they don’t stay still, and they don’t answer identity questions.&lt;/p&gt;
&lt;h3 id="the-real-shift"&gt;The real shift
&lt;/h3&gt;&lt;p&gt;The perimeter still exists.&lt;/p&gt;
&lt;p&gt;What’s changed is that &lt;strong&gt;it no longer answers the most important question&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Should this user be allowed to do this right now?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="visualising-the-shift"&gt;Visualising the Shift
&lt;/h2&gt;&lt;p&gt;This is the practical change most architectures are grappling with.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
User[User]
Device[Endpoint]
Network[Network Location]
Identity[Identity &amp; Context]
App[SaaS / Cloud App]
User --&gt; Device
Device --&gt; Network
Device --&gt; Identity
Network -. signal .-&gt; Identity
Identity --&gt; App
&lt;/div&gt;
&lt;p&gt;The network hasn’t disappeared, it’s been demoted.&lt;/p&gt;
&lt;p&gt;It’s now &lt;strong&gt;a signal&lt;/strong&gt;, not the decision point.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;The most damaging failures of the perimeter model aren’t breaches.&lt;/p&gt;
&lt;p&gt;They’re &lt;strong&gt;operational&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="change-becomes-the-primary-failure-mode"&gt;Change becomes the primary failure mode
&lt;/h3&gt;&lt;p&gt;IP‑based trust struggles with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New SaaS onboarding&lt;/li&gt;
&lt;li&gt;Remote worker growth&lt;/li&gt;
&lt;li&gt;Mergers and divestments&lt;/li&gt;
&lt;li&gt;Incident‑driven access changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Under pressure, teams respond predictably:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Broaden firewall rules&lt;/li&gt;
&lt;li&gt;Extend VPN scopes&lt;/li&gt;
&lt;li&gt;Add “temporary” exceptions&lt;/li&gt;
&lt;li&gt;Defer clean‑up indefinitely&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Security erodes not through attack, but through accommodation.&lt;/p&gt;
&lt;h3 id="defence-in-depth-becomes-defence-by-inertia"&gt;Defence in depth becomes defence by inertia
&lt;/h3&gt;&lt;p&gt;Layers remain in place because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Removing them feels risky&lt;/li&gt;
&lt;li&gt;Ownership is unclear&lt;/li&gt;
&lt;li&gt;No single control is obviously broken&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Over time, controls exist less to reduce risk and more to avoid uncomfortable conversations.&lt;/p&gt;
&lt;h3 id="users-route-around-centralisation"&gt;Users route around centralisation
&lt;/h3&gt;&lt;p&gt;When access paths are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slow&lt;/li&gt;
&lt;li&gt;Fragile&lt;/li&gt;
&lt;li&gt;Incompatible with how people work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Users find alternatives.&lt;/p&gt;
&lt;p&gt;Architectures that assume compliance instead of expecting bypass age badly.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Intentionally omitted.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This post focuses on &lt;em&gt;why&lt;/em&gt; the perimeter has lost authority, not &lt;em&gt;how&lt;/em&gt; to replace it.&lt;br&gt;
Specific Azure controls, policies, and access patterns are covered later in this series once the trust model is clear.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The perimeter still matters for workloads&lt;/strong&gt;&lt;br&gt;
East‑west traffic, data residency, and regulatory boundaries don’t disappear. This post is about &lt;strong&gt;user access&lt;/strong&gt;, not service‑to‑service isolation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Choosing a perimeter‑centric model isn’t negligent&lt;/strong&gt;&lt;br&gt;
It can be a valid business decision, but it must be treated as a conscious risk, not a safe default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Legacy applications complicate everything&lt;/strong&gt;&lt;br&gt;
They don’t invalidate the shift; they increase the cost of ignoring it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices-design-consequences"&gt;Best Practices (Design Consequences)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat network location as &lt;strong&gt;context&lt;/strong&gt;, not authority&lt;/li&gt;
&lt;li&gt;Assume users will access applications from &lt;strong&gt;outside your ideal path&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Expect exceptions to accumulate under change, and design accordingly&lt;/li&gt;
&lt;li&gt;If “being on the network” is still your primary trust signal, make the &lt;strong&gt;risk explicit&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; The perimeter didn’t disappear it lost the right to decide. Architects don’t have to abandon it, but they do have to stop pretending it’s neutral.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/security/zero-trust/" target="_blank" rel="noopener"
&gt;Microsoft Learn — Zero Trust principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/guide/security/" target="_blank" rel="noopener"
&gt;Azure Architecture Center — Identity as the control plane&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Turning Migration Data into Ongoing Operational Insight</title><link>https://blog.brewedinthecloud.com/p/azure-migration-migrating-into-ops/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migration-migrating-into-ops/</guid><description>&lt;p&gt;Most migration programmes end the same way.&lt;/p&gt;
&lt;p&gt;The workloads are live, the cutover checklist is green, the war room dissolves and someone asks, &lt;em&gt;“Do we still need the migration tooling?”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What usually follows isn’t a decision, it’s entropy. Access gets removed. Discovery exports get archived “somewhere”. The migration subscription is locked down or deleted. Six months later, operations teams are running production systems with less architectural context than the migration team had before the first move group.&lt;/p&gt;
&lt;p&gt;That’s not an Azure problem. It’s a thinking problem.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
Migration data is temporary scaffolding useful only until workloads are running in Azure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Migration data captures something you almost never get in steady‑state operations: a deliberately curated view of &lt;em&gt;what exists, why it exists, and what risks were accepted to get it there&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Once migration ends, that context does not get recreated by ops tooling. In most organisations, it degrades immediately.&lt;/p&gt;
&lt;p&gt;Migration data isn’t scaffolding. It’s the &lt;strong&gt;baseline system of record&lt;/strong&gt; for your cloud estate.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;During migration, teams assemble structured information almost as a side effect of delivery pressure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application and workload inventories&lt;/li&gt;
&lt;li&gt;Dependency and blast‑radius assumptions&lt;/li&gt;
&lt;li&gt;Business criticality and recovery expectations&lt;/li&gt;
&lt;li&gt;Security classifications and compliance scope&lt;/li&gt;
&lt;li&gt;Known risks, exceptions, and waivers&lt;/li&gt;
&lt;li&gt;Sizing and cost assumptions at time of move&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This data is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reviewed by humans&lt;/li&gt;
&lt;li&gt;Signed off by stakeholders&lt;/li&gt;
&lt;li&gt;Anchored to a known decision point&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That combination is rare after go‑live. Post‑migration, most systems know &lt;em&gt;what is running&lt;/em&gt;, but not &lt;em&gt;why it was allowed to run that way&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you delete migration data, you don’t lose history you lose &lt;strong&gt;decision context&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="migration-data-as-a-system-of-record"&gt;Migration Data as a System of Record
&lt;/h2&gt;&lt;p&gt;Calling this a “system of record” is a strong claim, so let’s be precise.&lt;/p&gt;
&lt;p&gt;Migration data should be authoritative for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Workload identity&lt;/strong&gt; (what this thing is, not how it’s implemented)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business intent&lt;/strong&gt; (criticality, environment classification)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accepted risk at time of migration&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Original architectural assumptions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It should &lt;em&gt;not&lt;/em&gt; try to replace:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CMDBs&lt;/li&gt;
&lt;li&gt;Live configuration state&lt;/li&gt;
&lt;li&gt;Observability or monitoring platforms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those systems answer &lt;em&gt;what is happening now&lt;/em&gt;. Migration data answers &lt;em&gt;why this was allowed to exist in the first place&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That distinction matters operationally.&lt;/p&gt;
&lt;h2 id="realworld-impact-where-this-actually-bites"&gt;Real‑World Impact (Where This Actually Bites)
&lt;/h2&gt;&lt;p&gt;Discarding migration data has predictable consequences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Change impact becomes guesswork&lt;/strong&gt;&lt;br&gt;
Platform updates, network changes, or security hardening exercises lack reliable blast‑radius context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risk gets rediscovered, not managed&lt;/strong&gt;&lt;br&gt;
Previously accepted exceptions resurface during audits or incidents with no evidence trail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance scope drifts&lt;/strong&gt;&lt;br&gt;
Teams argue about what’s in scope because original classifications are gone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost optimisation loses its baseline&lt;/strong&gt;&lt;br&gt;
You can see spend, but not whether it deviated from original intent or assumptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This directly changes how you design handover from migration to operations. If the data isn’t preserved, ops teams inherit systems without the authority to explain or defend them.&lt;/p&gt;
&lt;h2 id="closing-the-loop-migration-to-steady-state"&gt;Closing the Loop: Migration to Steady State
&lt;/h2&gt;&lt;p&gt;The practical shift is simple, even if organisations struggle with it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Migration programmes must produce an operational artefact, not just running workloads.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Migration data persists beyond the project&lt;/li&gt;
&lt;li&gt;It is discoverable by ops, security, and governance teams&lt;/li&gt;
&lt;li&gt;It is updated when &lt;em&gt;material architectural changes&lt;/em&gt; occur not continuously, not never&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think of migration as the &lt;strong&gt;first commit&lt;/strong&gt; to your operational knowledge base. Deleting it is the equivalent of force‑pushing main to empty.&lt;/p&gt;
&lt;h2 id="ownership-is-not-optional"&gt;Ownership Is Not Optional
&lt;/h2&gt;&lt;p&gt;If ownership of migration data is undefined, the outcome is guaranteed: it rots or disappears.&lt;/p&gt;
&lt;p&gt;In practice, ownership should sit with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloud platform teams, or&lt;/li&gt;
&lt;li&gt;Cloud enablement / landing zone owners&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not the migration factory. Not individual app teams.&lt;/p&gt;
&lt;p&gt;Why? Because this data exists to support &lt;strong&gt;cross‑cutting decisions&lt;/strong&gt; platform change, governance enforcement, risk acceptance, not day‑to‑day app operations.&lt;/p&gt;
&lt;p&gt;If no team is accountable for keeping this context alive, the organisation will relearn the same lessons during every audit, incident, or major platform change.&lt;/p&gt;
&lt;h2 id="conceptual-architecture"&gt;Conceptual Architecture
&lt;/h2&gt;&lt;p&gt;The mechanics are deliberately boring. The behaviour is what matters.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Migration Discovery &amp; Assessment] --&gt; B[Curated Migration Dataset]
B --&gt; C[Platform &amp; Ops Decisions]
B --&gt; D[Risk &amp; Compliance Processes]
B --&gt; E[Architecture &amp; Change Reviews]
E --&gt;|Material change| B
&lt;/div&gt;
&lt;p&gt;This is not about real‑time accuracy. It’s about ensuring that &lt;em&gt;decisions&lt;/em&gt; always have access to original intent and accepted risk.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Implementation artefacts are intentionally omitted.&lt;/strong&gt;&lt;br&gt;
This is a business and operating‑model decision, not a technical one. The failure mode is not poor tooling, it’s deleting or ignoring the data entirely.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="gotchas--failure-modes"&gt;Gotchas &amp;amp; Failure Modes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stale data is not the enemy&lt;/strong&gt;&lt;br&gt;
Silent deletion is. Old context with known age is still valuable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Over‑precision kills adoption&lt;/strong&gt;&lt;br&gt;
Migration assessments are directional. Treat them as baselines, not forensic truth.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access control is often overlooked&lt;/strong&gt;&lt;br&gt;
Migration datasets contain sensitive architectural detail. Secure them like production metadata.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“We’ll rebuild it later” never happens&lt;/strong&gt;&lt;br&gt;
If you don’t preserve it at migration time, you won’t recreate it accurately.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices-that-actually-change-behaviour"&gt;Best Practices That Actually Change Behaviour
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Declare migration data an &lt;strong&gt;operational artefact&lt;/strong&gt; at programme inception&lt;/li&gt;
&lt;li&gt;Assign a named owning team &lt;em&gt;before&lt;/em&gt; cutover&lt;/li&gt;
&lt;li&gt;Preserve decisions, assumptions, and accepted risks not just inventories&lt;/li&gt;
&lt;li&gt;Require updates only when architectural intent changes&lt;/li&gt;
&lt;li&gt;Make the dataset easy to find, or it effectively doesn’t exist&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Most organisations don’t lose architectural knowledge because people leave. They lose it because projects end. Migration data is how you stop your cloud estate from developing convenient amnesia.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Cloud Adoption Framework – Migrate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/governance/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Governance Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/framework?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Well-Architected Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Migrating Databases and Applications with Minimal Disruption</title><link>https://blog.brewedinthecloud.com/p/azure-migration-minimal-disruption/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migration-minimal-disruption/</guid><description>&lt;p&gt;Most migration failures don’t come from bad architecture.&lt;br&gt;
They come from bad timing.&lt;/p&gt;
&lt;p&gt;Not &lt;em&gt;clock time&lt;/em&gt;, but &lt;strong&gt;execution order&lt;/strong&gt;, &lt;strong&gt;cutover mechanics&lt;/strong&gt;, and &lt;strong&gt;operational readiness&lt;/strong&gt;. The plan looked solid. The landing zone was built. The data copied cleanly. Then production traffic hit a dependency you moved in the wrong order, or a rollback path that only worked in the slide deck.&lt;/p&gt;
&lt;p&gt;This post is about that messy middle: the moment where applications and databases actually move, users are watching, and mistakes are no longer abstract.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
“If we minimise downtime, we’ve minimised risk.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Downtime is just the most visible failure mode. The more dangerous ones arrive later: silent data divergence, background jobs writing to the wrong place, partial cutovers that only fail under load, or rollbacks that reintroduce stale state.&lt;/p&gt;
&lt;p&gt;Minimal disruption is not about speed.&lt;br&gt;
It’s about &lt;strong&gt;controlled state change under pressure&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;At execution time, migrations are dominated by three forces:&lt;/p&gt;
&lt;h3 id="1-stateful-gravity"&gt;1. Stateful gravity
&lt;/h3&gt;&lt;p&gt;Databases, message queues, caches, and file stores resist movement. The more writers they have, and the less you understand those writers the harder they are to move safely.&lt;/p&gt;
&lt;h3 id="2-hidden-dependencies"&gt;2. Hidden dependencies
&lt;/h3&gt;&lt;p&gt;Applications rarely depend on “a database”. They depend on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;connection strings baked into background services&lt;/li&gt;
&lt;li&gt;scheduled jobs that wake up at inconvenient times&lt;/li&gt;
&lt;li&gt;integration endpoints with implicit ordering&lt;/li&gt;
&lt;li&gt;identity, secrets, and token lifetimes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are usually discovered &lt;strong&gt;during&lt;/strong&gt; cutover, not before it.&lt;/p&gt;
&lt;h3 id="3-operational-coupling"&gt;3. Operational coupling
&lt;/h3&gt;&lt;p&gt;Monitoring, alerting, backups, access paths, and runbooks are often tightly bound to the &lt;em&gt;old&lt;/em&gt; environment. After cutover, they don’t fail loudly, they just stop protecting you.&lt;/p&gt;
&lt;p&gt;Tooling can’t compensate for misunderstanding these forces. Sequencing and operational discipline decide the outcome.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Execution choices directly shape:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Availability&lt;/strong&gt; – partial cutovers tend to produce intermittent, credibility‑destroying failures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data integrity&lt;/strong&gt; – dual‑write and sync windows introduce divergence risk that grows with time and load.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reversibility&lt;/strong&gt; – fast cutovers without a clean rollback path are one‑way doors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational load&lt;/strong&gt; – underprepared ops teams become the bottleneck exactly when time pressure is highest.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where migrations stop being engineering exercises and become risk acceptance decisions.&lt;/p&gt;
&lt;h2 id="dependencyaware-sequencing"&gt;Dependency‑Aware Sequencing
&lt;/h2&gt;&lt;p&gt;A reliable rule of thumb is to migrate &lt;strong&gt;from least to most stateful&lt;/strong&gt;, not from “simple to complex”.&lt;/p&gt;
&lt;p&gt;A safer execution order usually looks like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Supporting infrastructure&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity integrations&lt;/li&gt;
&lt;li&gt;Secrets and configuration sources&lt;/li&gt;
&lt;li&gt;Monitoring and logging pipelines&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Read‑only or replayable components&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reporting workloads&lt;/li&gt;
&lt;li&gt;Background processors with idempotency or reprocessing capability&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Databases&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replicas or continuous sync first&lt;/li&gt;
&lt;li&gt;Promotion only when confidence is earned&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Primary application entry points&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;APIs, front ends, ingress paths&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This sequencing limits blast radius and preserves optionality when things get uncomfortable, which they will.&lt;/p&gt;
&lt;h3 id="visualising-a-controlled-cutover"&gt;Visualising a Controlled Cutover
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
Users --&gt; FrontEnd_Old
FrontEnd_Old --&gt; DB_Old
DB_Old --&gt;|Continuous Sync| DB_New
FrontEnd_New --&gt; DB_New
FrontEnd_Old -.-&gt;|Traffic Shift| FrontEnd_New
&lt;/div&gt;
&lt;p&gt;The overlap here is intentional. Accidental overlap is where migrations fail quietly.&lt;/p&gt;
&lt;h2 id="cutover-patterns-and-their-tradeoffs"&gt;Cutover Patterns and Their Trade‑offs
&lt;/h2&gt;&lt;h3 id="shadow-write-single-read"&gt;Shadow Write, Single Read
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Writes go to old and new&lt;/li&gt;
&lt;li&gt;Reads stay on the old system&lt;/li&gt;
&lt;li&gt;Short, tightly controlled promotion window&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use when:&lt;/strong&gt; data correctness matters more than simplicity.&lt;br&gt;
&lt;strong&gt;Be wary:&lt;/strong&gt; every additional hour increases divergence and rollback complexity.&lt;/p&gt;
&lt;h3 id="replica-promotion"&gt;Replica Promotion
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Managed replicas kept in sync&lt;/li&gt;
&lt;li&gt;Connection strings flipped at cutover&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use when:&lt;/strong&gt; replication health is observable and trusted.&lt;br&gt;
&lt;strong&gt;Be wary:&lt;/strong&gt; promotion confidence often exceeds replication reality.&lt;/p&gt;
&lt;h3 id="ingress-switch"&gt;Ingress Switch
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;DNS, Front Door, or Application Gateway redirects traffic&lt;/li&gt;
&lt;li&gt;Backends are already warm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use when:&lt;/strong&gt; tiers are genuinely stateless.&lt;br&gt;
&lt;strong&gt;Be wary:&lt;/strong&gt; using this pattern to “hide” database uncertainty is a common mistake.&lt;/p&gt;
&lt;p&gt;There is no universal best pattern, but there are patterns that are routinely misapplied under time pressure.&lt;/p&gt;
&lt;h2 id="operational-readiness-is-part-of-execution"&gt;Operational Readiness Is Part of Execution
&lt;/h2&gt;&lt;p&gt;Before cutover, the following should already be true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alerts fire from the &lt;em&gt;new&lt;/em&gt; environment&lt;/li&gt;
&lt;li&gt;Backups are running and restorable&lt;/li&gt;
&lt;li&gt;Break‑glass access works&lt;/li&gt;
&lt;li&gt;On‑call teams know what “normal” looks like after the switch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of these are deferred until “after go‑live”, the migration isn’t ready it’s just optimistic.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This post intentionally avoids low‑level implementation examples. At this stage, migrations fail far more often due to sequencing errors and untested operational assumptions than missing commands or misconfigured flags.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Background jobs often reconnect faster than front ends and start writing early.&lt;/li&gt;
&lt;li&gt;DNS caching undermines carefully planned traffic shifts.&lt;/li&gt;
&lt;li&gt;Clock skew between environments breaks token validation at the worst possible time.&lt;/li&gt;
&lt;li&gt;Rollback data is only useful if it’s consistent &lt;em&gt;and&lt;/em&gt; recent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These aren’t rare edge cases. They’re recurring patterns.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Optimise for &lt;strong&gt;reversibility first&lt;/strong&gt;, speed second.&lt;/li&gt;
&lt;li&gt;Treat cutover as a &lt;strong&gt;state transition&lt;/strong&gt;, not a deployment.&lt;/li&gt;
&lt;li&gt;Freeze schema changes during migration windows.&lt;/li&gt;
&lt;li&gt;Prefer fewer, well‑planned cutovers over many “small” ones.&lt;/li&gt;
&lt;li&gt;Practice cutover timing in non‑prod using real‑world latency and load, not ideal conditions.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If you wouldn’t accept this level of uncertainty during a DR failover, you shouldn’t accept it during a migration.
Cutover is not a delivery milestone it’s an operational risk decision you’re accountable for long after the project ends.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Migration guidance – Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-sql/database/replication-to-sql-database?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure SQL replication and failover&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/well-architected/reliability?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Well‑Architected Framework – Reliability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Aligning Azure Landing Zones with Migration Factories</title><link>https://blog.brewedinthecloud.com/p/azure-migration-lz-migration-factories/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migration-lz-migration-factories/</guid><description>&lt;p&gt;Most Azure migration programmes don’t fail because Azure is hard.&lt;br&gt;
They fail because two teams are optimising for different survival instincts.&lt;/p&gt;
&lt;p&gt;The landing zone team is incentivised to reduce future risk.&lt;br&gt;
The migration factory is incentivised to move workloads &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Both are rational.&lt;br&gt;
Together, they create predictable friction.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
“If the landing zone is ready, migration can start.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
A landing zone is not a finish line. It’s a &lt;em&gt;capability backlog&lt;/em&gt;.&lt;br&gt;
Migration factories don’t wait for backlog completion, they run on waves, throughput, and external deadlines.&lt;/p&gt;
&lt;p&gt;Treating platform readiness as a binary state forces one of two bad outcomes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;migrations stall waiting for “one last thing”, or&lt;/li&gt;
&lt;li&gt;migrations proceed by bypassing the platform entirely.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Neither is accidental. Both are structural.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Landing zones and migration factories are &lt;strong&gt;operating models&lt;/strong&gt;, not deliverables.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The landing zone defines what behaviours the platform &lt;em&gt;permits&lt;/em&gt; at a point in time.&lt;/li&gt;
&lt;li&gt;The migration factory defines how quickly new behaviours are &lt;em&gt;introduced&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When these models aren’t deliberately aligned, the faster one wins.&lt;br&gt;
In practice, that’s almost always the migration factory.&lt;/p&gt;
&lt;p&gt;At that point, the landing zone stops being a control surface and becomes a clean‑up exercise.&lt;/p&gt;
&lt;h2 id="realworld-impact-where-this-gets-expensive"&gt;Real‑World Impact (Where This Gets Expensive)
&lt;/h2&gt;&lt;p&gt;Misalignment doesn’t just “cause issues”. It creates moments that are hard to unwind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;First production workload without central logging.&lt;/strong&gt;&lt;br&gt;
You never fully regain observability parity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;First identity exception for speed.&lt;/strong&gt;&lt;br&gt;
Every subsequent wave expects the same treatment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;First subscription built outside agreed patterns.&lt;/strong&gt;&lt;br&gt;
Retrofitting guardrails becomes a political negotiation, not a technical one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not theoretical risks. They are &lt;em&gt;irreversible decisions made under time pressure&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="migration-factories-are-not-tools"&gt;Migration Factories Are Not Tools
&lt;/h2&gt;&lt;p&gt;A migration factory is often reduced to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Migrate&lt;/li&gt;
&lt;li&gt;A set of pipelines&lt;/li&gt;
&lt;li&gt;A spreadsheet with wave numbers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That misses the point.&lt;/p&gt;
&lt;p&gt;A migration factory is an &lt;strong&gt;operating rhythm&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;defined waves and entry criteria&lt;/li&gt;
&lt;li&gt;repeatable architectural decisions&lt;/li&gt;
&lt;li&gt;explicit exception handling&lt;/li&gt;
&lt;li&gt;a feedback loop into platform design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the landing zone can’t operate at that rhythm, the factory will route around it quietly at first, then systematically.&lt;/p&gt;
&lt;h2 id="sequencing-capabilities-against-migration-waves"&gt;Sequencing Capabilities Against Migration Waves
&lt;/h2&gt;&lt;p&gt;The alignment move that matters is sequencing &lt;strong&gt;platform capabilities against migration waves&lt;/strong&gt;, not against a theoretical “target state”.&lt;/p&gt;
&lt;h3 id="what-this-looks-like-in-practice"&gt;What this looks like in practice
&lt;/h3&gt;&lt;div class="mermaid"&gt;timeline
title Landing Zone Capabilities vs Migration Waves
section Platform Capabilities
Identity &amp; RBAC Baseline : done
Network Hub &amp; DNS : done
Central Logging : done
Backup &amp; DR Patterns : active
PaaS Guardrails : planned
section Migration Factory
Wave 1 – Low Risk IaaS : done
Wave 2 – Line of Business Apps : active
Wave 3 – Regulated Workloads : planned
&lt;/div&gt;
&lt;p&gt;Wave 1 does &lt;strong&gt;not&lt;/strong&gt; need everything.&lt;br&gt;
But it &lt;em&gt;does&lt;/em&gt; need a small set of non‑negotiables.&lt;/p&gt;
&lt;h3 id="a-hard-line-worth-drawing"&gt;A hard line worth drawing
&lt;/h3&gt;&lt;p&gt;In most environments, &lt;strong&gt;central identity and logging&lt;/strong&gt; should exist before &lt;em&gt;any&lt;/em&gt; workload migrates.&lt;br&gt;
If you skip those to gain speed, you’re not accelerating you’re borrowing against future outages and audits.&lt;/p&gt;
&lt;h2 id="contract-boundaries-that-actually-hold-under-pressure"&gt;Contract Boundaries That Actually Hold Under Pressure
&lt;/h2&gt;&lt;p&gt;High‑throughput programmes define explicit contracts and enforce them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Landing zone team commits to:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dates when specific capabilities become usable&lt;/li&gt;
&lt;li&gt;supported and unsupported patterns (clearly)&lt;/li&gt;
&lt;li&gt;stability guarantees during migration waves&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Migration factory commits to:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;using only supported patterns by default&lt;/li&gt;
&lt;li&gt;declaring upcoming needs &lt;em&gt;before&lt;/em&gt; waves begin&lt;/li&gt;
&lt;li&gt;quantifying the business impact of missing capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anything outside the contract is an &lt;strong&gt;exception&lt;/strong&gt;, with an owner, an expiry date, and a remediation path.&lt;/p&gt;
&lt;p&gt;If you can’t say no cleanly, you don’t have a contract, you have a hope.&lt;/p&gt;
&lt;h2 id="gotchas--failure-modes"&gt;Gotchas &amp;amp; Failure Modes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Temporary exceptions fossilise.&lt;/strong&gt;&lt;br&gt;
If they aren’t time‑boxed, they become precedent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform teams optimise for completeness.&lt;/strong&gt;&lt;br&gt;
Migration teams optimise for predictability. Confusing the two creates tension.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security aligns to the wrong wave.&lt;/strong&gt;&lt;br&gt;
When controls arrive late, they’re perceived as blockers rather than enablers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are behavioural problems with technical consequences.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat the landing zone as a &lt;strong&gt;product roadmap&lt;/strong&gt;, not a one‑off build&lt;/li&gt;
&lt;li&gt;Define non‑negotiable capabilities for Wave 1 and defend them&lt;/li&gt;
&lt;li&gt;Align capability delivery explicitly to migration waves&lt;/li&gt;
&lt;li&gt;Design exception paths deliberately and measure how often they’re used&lt;/li&gt;
&lt;li&gt;Re‑negotiate contracts after every major wave, not at programme end&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If your migration factory is faster than your landing zone, it will build its own platform.&lt;br&gt;
You’ll inherit it later, with interest.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Learn – Cloud Adoption Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zones overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Network and Identity Dependencies That Break Migrations</title><link>https://blog.brewedinthecloud.com/p/azure-migration-network-identity-dependencies/</link><pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migration-network-identity-dependencies/</guid><description>&lt;p&gt;Most migrations don’t fail because Azure can’t do the thing.&lt;/p&gt;
&lt;p&gt;They fail because &lt;em&gt;something&lt;/em&gt; still expects to talk to &lt;em&gt;something else&lt;/em&gt; over a path, under an identity, via a trust relationship nobody explicitly designed and that assumption survives right up until cutover.&lt;/p&gt;
&lt;p&gt;At that point, the migration plan stops being an execution document and starts being an incident report.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
“If it works today, and we move it carefully, the dependencies will come along for the ride.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it’s wrong:&lt;/strong&gt;&lt;br&gt;
Network and identity dependencies aren’t portable assets. They’re &lt;em&gt;emergent properties&lt;/em&gt; of an environment that’s been evolving for years, sometimes decades, without strong boundaries.&lt;/p&gt;
&lt;p&gt;On‑prem, those dependencies are tolerated because the environment is permissive by default.&lt;br&gt;
In Azure, boundaries are explicit, evaluated continuously, and enforced whether you meant them to be or not.&lt;/p&gt;
&lt;p&gt;Migration doesn’t create these problems. It exposes them.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Most estates operate with three overlapping dependency layers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Declared dependencies&lt;/strong&gt;&lt;br&gt;
Firewall rules, documented service accounts, known trusts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inherited dependencies&lt;/strong&gt;&lt;br&gt;
Transitive network access, group‑based permissions, domain‑wide assumptions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accidental dependencies&lt;/strong&gt;&lt;br&gt;
Scripts, scanners, batch jobs, agents, and “temporary” access that outlived the person who added it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only the first layer ever makes it into migration planning.&lt;/p&gt;
&lt;p&gt;The other two are discovered late, usually under load, usually in production.&lt;/p&gt;
&lt;h3 id="what-this-looks-like-in-practice"&gt;What This Looks Like in Practice
&lt;/h3&gt;&lt;div class="mermaid"&gt;graph TD
A[Line-of-Business App] --&gt;|SQL| B[Shared Database]
A --&gt;|LDAP / Kerberos| C[On-Prem AD]
D[Security Scanner] --&gt;|SMB / WMI| A
E[Batch Job] --&gt;|Integrated Auth| B
subgraph "Rarely Documented"
D
E
end
&lt;/div&gt;
&lt;p&gt;The migration plan covers &lt;strong&gt;A → B&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The outage is caused by everything else.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="1-reachability-is-a-chain-not-a-switch"&gt;1. Reachability Is a Chain, Not a Switch
&lt;/h3&gt;&lt;p&gt;In Azure, “can it talk?” depends on &lt;em&gt;all&lt;/em&gt; of the following being true at the same time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A valid route exists&lt;/li&gt;
&lt;li&gt;NSGs allow the flow&lt;/li&gt;
&lt;li&gt;Firewalls allow the flow&lt;/li&gt;
&lt;li&gt;Private endpoints / service endpoints resolve correctly&lt;/li&gt;
&lt;li&gt;The identity is authorised at the destination&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A failure anywhere in that chain produces the same symptom: timeout.&lt;/p&gt;
&lt;p&gt;If your migration validation only checks &lt;em&gt;one&lt;/em&gt; layer, you’re not validating you’re effectively guessing.&lt;/p&gt;
&lt;h3 id="2-identity-coupling-is-usually-the-hard-stop"&gt;2. Identity Coupling Is Usually the Hard Stop
&lt;/h3&gt;&lt;p&gt;In real environments, identity is often coupled to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Machines instead of workloads&lt;/strong&gt;&lt;br&gt;
Apps authenticating as computer accounts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Directories instead of scopes&lt;/strong&gt;&lt;br&gt;
Domain‑wide permissions where resource‑level access was intended.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Humans and systems sharing identities&lt;/strong&gt;&lt;br&gt;
Service accounts used interactively “just this once”.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These patterns don’t degrade gracefully.&lt;br&gt;
They fail the moment you introduce isolation.&lt;/p&gt;
&lt;p&gt;If you haven’t mapped identity flows explicitly, your migration risk is undefined. That’s not a technical issue; it’s a governance one.&lt;/p&gt;
&lt;h3 id="3-regulated-and-hybrid-environments-amplify-the-damage"&gt;3. Regulated and Hybrid Environments Amplify the Damage
&lt;/h3&gt;&lt;p&gt;In regulated estates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Network paths are deliberately constrained&lt;/li&gt;
&lt;li&gt;Identity permissions are layered and inherited&lt;/li&gt;
&lt;li&gt;Security tooling relies on privileged, out‑of‑band access&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This creates two compounding problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Automated discovery misses critical paths&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Teams trust the output anyway&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That false confidence is worse than ignorance. It locks timelines around assumptions that won’t survive first contact with reality.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="proving-network-dependencies-with-virtual-network-flow-logs"&gt;Proving Network Dependencies with Virtual Network Flow Logs
&lt;/h3&gt;&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
NSG Flow Logs are being retired (end of support June 30), and Azure’s direction is clear:&lt;br&gt;
&lt;strong&gt;Virtual Network Flow Logs (VNet Flow Logs)&lt;/strong&gt; are now the supported way to observe traffic patterns at the network boundary.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;p&gt;This matters operationally, not just administratively.&lt;/p&gt;
&lt;p&gt;VNet Flow Logs shift the question from &lt;em&gt;“did the NSG allow it?”&lt;/em&gt; to &lt;em&gt;“what traffic actually traversed the virtual network?”&lt;/em&gt; which is exactly what you need during a migration.&lt;/p&gt;
&lt;p&gt;Example: enabling VNet Flow Logs at the virtual network level.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Storage/storageAccounts@2021-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;savnetflowlogs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnet-production-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkWatcher&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkWatchers@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;NetworkWatcher&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetFlowLogs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkWatchers/flowLogs@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkWatcher&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnetflowlogs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetResourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;JSON&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;What this changes in practice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You observe &lt;strong&gt;real traffic paths&lt;/strong&gt;, not just rule evaluation&lt;/li&gt;
&lt;li&gt;Cross‑subnet and transitive flows become visible&lt;/li&gt;
&lt;li&gt;Infrequent or “forgotten” dependencies show up over time&lt;/li&gt;
&lt;li&gt;Migration validation shifts from intent to evidence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is particularly valuable in hybrid environments, where traffic often enters the VNet in ways no one diagrammed.&lt;/p&gt;
&lt;h3 id="identity-reality-check-application-permissions"&gt;Identity Reality Check: Application Permissions
&lt;/h3&gt;&lt;p&gt;Many migration blockers aren’t bugs, they’re permissions that were never questioned.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az ad app permission list &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --id &amp;lt;app-registration-id&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Look for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Directory‑wide permissions granted “temporarily”&lt;/li&gt;
&lt;li&gt;Legacy APIs still in use&lt;/li&gt;
&lt;li&gt;Permissions that only function because of on‑prem trust paths&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If removing a permission scares the team, you’ve found a migration risk, not a feature.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transitive trust assumptions&lt;/strong&gt;&lt;br&gt;
Visibility ≠ authorisation. Azure will enforce the difference.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hard‑coded allowlists&lt;/strong&gt;&lt;br&gt;
Often embedded in third‑party services and forgotten until traffic shifts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Infrequent jobs&lt;/strong&gt;&lt;br&gt;
Monthly or quarterly processes that fail long after go‑live.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Flow log misinterpretation&lt;/strong&gt;&lt;br&gt;
Logs show &lt;em&gt;that&lt;/em&gt; traffic flowed, not &lt;em&gt;why&lt;/em&gt; it was allowed. Context still matters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Discovery tooling bias&lt;/strong&gt;&lt;br&gt;
Encrypted traffic, conditional access, and just‑in‑time permissions routinely evade automated mapping.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices-hard-rules"&gt;Best Practices (Hard Rules)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;If a dependency can’t be explained, treat it as &lt;strong&gt;high risk&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;If identity flows aren’t diagrammed, the workload isn’t ready to move&lt;/li&gt;
&lt;li&gt;Validate under &lt;strong&gt;restricted network conditions&lt;/strong&gt;, not permissive ones&lt;/li&gt;
&lt;li&gt;Assume discovery tools are incomplete, design reviews must compensate&lt;/li&gt;
&lt;li&gt;Delay migrations when identity uncertainty is high; rework costs more later&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Migration isn’t about moving systems, it’s about forcing your environment to tell the truth.&lt;br&gt;
Network and identity dependencies are where it usually lies the most.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/network-watcher/vnet-flow-logs-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Virtual Network Flow Logs overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/network-watcher-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Network Watcher overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/active-directory/reports-monitoring/concept-sign-ins?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure AD sign‑in logs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Discovering and Assessing at Scale with Azure Migrate</title><link>https://blog.brewedinthecloud.com/p/azure-migration-discovering-assessing/</link><pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migration-discovering-assessing/</guid><description>&lt;p&gt;Large‑estate discovery usually starts with good intent and ends with a SharePoint folder no one wants to open.&lt;/p&gt;
&lt;p&gt;Thousands of VMs. Hundreds of charts. Confidence scores everywhere.&lt;br&gt;
And yet, no clearer answer to &lt;em&gt;what should we migrate next&lt;/em&gt; or &lt;em&gt;what’s safe to commit to&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Azure Migrate doesn’t struggle with scale because it can’t see enough.&lt;br&gt;
It struggles because teams ask it to answer questions it was never designed to decide.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If we discover everything thoroughly enough, the migration plan will reveal itself.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Discovery creates &lt;strong&gt;evidence&lt;/strong&gt;, not decisions. Azure Migrate describes the estate you pointed it at, faithfully and at volume, but it has no understanding of ownership, risk tolerance, political constraints, or deadlines.&lt;/p&gt;
&lt;p&gt;At scale, more data without sharper intent doesn’t increase confidence.&lt;br&gt;
It delays commitment.&lt;/p&gt;
&lt;p&gt;The real skill is not discovering &lt;em&gt;more&lt;/em&gt;.&lt;br&gt;
It’s discovering &lt;em&gt;just enough to make the next irreversible decision&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure Migrate is best thought of as a &lt;strong&gt;distributed observation system with an opinionated reporting layer&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Appliances observe compute, storage, and performance signals&lt;/li&gt;
&lt;li&gt;That data is normalised into Azure’s internal inventory model&lt;/li&gt;
&lt;li&gt;Assessments apply assumptions to project Azure targets and costs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those last two words matter: &lt;strong&gt;apply assumptions&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[On‑prem / Other Clouds] --&gt; B[Azure Migrate Appliances]
B --&gt; C[Observed Signals]
C --&gt; D[Assessment Assumptions]
D --&gt; E[Reports &amp; Recommendations]
&lt;/div&gt;
&lt;p&gt;What Azure Migrate produces is not truth, it’s a &lt;em&gt;scenario&lt;/em&gt;.&lt;br&gt;
And scenarios are only as good as the questions they were built to answer.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="design"&gt;Design
&lt;/h3&gt;&lt;p&gt;Large, undifferentiated assessments push architects toward “average‑based” designs.&lt;br&gt;
Averages erase the very workloads that drive platform decisions: spiky usage, licence‑bound systems, and business‑critical outliers.&lt;/p&gt;
&lt;p&gt;If everything is assessed together, everything gets designed the same.&lt;/p&gt;
&lt;h3 id="reliability"&gt;Reliability
&lt;/h3&gt;&lt;p&gt;Short or patchy performance histories create a dangerous illusion: high confidence with low representativeness. Month‑end, seasonal, and failure‑mode behaviour is routinely absent and rarely noticed until production.&lt;/p&gt;
&lt;h3 id="cost"&gt;Cost
&lt;/h3&gt;&lt;p&gt;The most over‑trusted output in Azure Migrate is &lt;strong&gt;right‑sized VM recommendations&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;They are not wrong, they are conditional. Treating them as commitments rather than lower‑bound scenarios is how migration business cases quietly fall apart six months later.&lt;/p&gt;
&lt;h3 id="security"&gt;Security
&lt;/h3&gt;&lt;p&gt;Discovery almost always surfaces forgotten systems.&lt;br&gt;
That’s not just migration debt, it’s an exposure report you didn’t know you were running.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="1-scope-discovery-to-force-thinking"&gt;1. Scope Discovery to Force Thinking
&lt;/h3&gt;&lt;p&gt;Discovery boundaries should reflect &lt;strong&gt;decision boundaries&lt;/strong&gt;, not network convenience.&lt;/p&gt;
&lt;p&gt;Common scoping dimensions that actually matter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Business domain or cost centre&lt;/li&gt;
&lt;li&gt;Environment class (prod vs non‑prod)&lt;/li&gt;
&lt;li&gt;Regulatory or data sensitivity zones&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Creating multiple Azure Migrate projects is not overhead it prevents cross‑contamination of assumptions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az migrate project create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-migrate-finance &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name finance-migrate &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --location australiaeast
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If a group can’t explain &lt;em&gt;why&lt;/em&gt; it shares a project, it probably shouldn’t share an assessment.&lt;/p&gt;
&lt;h3 id="2-use-assessments-as-explicit-scenarios"&gt;2. Use Assessments as Explicit Scenarios
&lt;/h3&gt;&lt;p&gt;Every assessment should answer a single, named question.&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“What’s the cost floor if we lift‑and‑shift Finance prod with no licence benefits?”&lt;/li&gt;
&lt;li&gt;“What breaks if we assume 30% performance headroom instead of 50%?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Encode those assumptions directly in assessment naming. Treat them as disposable models, not artefacts to defend.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If an assessment can’t be deleted without an argument, you’ve already over‑invested.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="3-translate-assets-into-decisionready-groups"&gt;3. Translate Assets into Decision‑Ready Groups
&lt;/h3&gt;&lt;p&gt;Azure Migrate discovers &lt;strong&gt;assets&lt;/strong&gt;. Migration requires &lt;strong&gt;cohorts&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The translation step is where most programmes stall because it’s organisational, not technical.&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
A[Discovered Inventory] --&gt; B[Technical Filters]
B --&gt; C[Ownership &amp; Risk Context]
C --&gt; D[Migration Cohorts]
&lt;/div&gt;
&lt;p&gt;Cohorts exist to enable decisions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can this move independently?&lt;/li&gt;
&lt;li&gt;Who signs off the risk?&lt;/li&gt;
&lt;li&gt;What failure is acceptable?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If those answers aren’t obvious, the grouping is wrong.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Discovery without ownership&lt;/strong&gt; leads to politically unusable data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;lt;30 days of history&lt;/strong&gt; systematically under‑represents risk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disconnected networks&lt;/strong&gt; fail silently, missing systems look like “clean estates”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assessment confidence scores&lt;/strong&gt; measure data completeness, not decision safety.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Define the next decision &lt;em&gt;before&lt;/em&gt; deploying an appliance.&lt;/li&gt;
&lt;li&gt;Stop discovery once that decision can be made, even if coverage isn’t “perfect”.&lt;/li&gt;
&lt;li&gt;Treat right‑sizing outputs as a floor, not a promise.&lt;/li&gt;
&lt;li&gt;Use missing or inconsistent data as a risk signal, not something to smooth over.&lt;/li&gt;
&lt;li&gt;Delete assessments aggressively; keep only those tied to active decisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Azure Migrate is excellent at telling you what you pointed it at.&lt;br&gt;
The real architecture work is deciding &lt;em&gt;when you’ve seen enough to move&lt;/em&gt; and having the discipline to stop looking.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/migrate/migrate-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Migrate overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/migrate/concepts-assessment-calculation?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Assessment calculation concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/migrate/migrate-appliance-architecture?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Migrate appliance architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Why Enterprise Migrations Still Fail Before the First Cutover</title><link>https://blog.brewedinthecloud.com/p/azure-migration-fails-before-cutover/</link><pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migration-fails-before-cutover/</guid><description>&lt;p&gt;Most enterprise cloud migrations don’t fail during cutover.&lt;/p&gt;
&lt;p&gt;They fail quietly months earlier in planning workshops, governance meetings, and PowerPoint roadmaps, while everyone still believes progress is being made.&lt;/p&gt;
&lt;p&gt;By the time the first workload is scheduled to move, the migration plan isn’t risky or immature. It’s &lt;strong&gt;structurally unexecutable&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That’s the uncomfortable truth most migration projects only realise after momentum is already gone.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If we invest enough effort up front, execution will be straightforward.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This assumption feels responsible. It’s also the root cause of many failures.&lt;/p&gt;
&lt;p&gt;Enterprise migration planning treats early decisions as &lt;em&gt;temporary scaffolding&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Discovery will improve later&lt;/li&gt;
&lt;li&gt;Governance can be tuned post‑pilot&lt;/li&gt;
&lt;li&gt;Delivery teams will adapt once constraints are clear&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In practice, early decisions behave like &lt;strong&gt;hard architectural commitments&lt;/strong&gt;. They constrain everything that follows, often before the organisation understands what it has committed to.&lt;/p&gt;
&lt;p&gt;Planning doesn’t precede architecture.&lt;br&gt;
Planning &lt;em&gt;is&lt;/em&gt; architecture.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Migrations fail early because &lt;strong&gt;intent is designed without accountability for execution&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Planning artefacts are optimised for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Portfolio visibility&lt;/li&gt;
&lt;li&gt;Cost forecasting&lt;/li&gt;
&lt;li&gt;Executive sequencing&lt;/li&gt;
&lt;li&gt;Partner acceleration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Execution is constrained by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity boundaries and trust models&lt;/li&gt;
&lt;li&gt;Network topology and egress paths&lt;/li&gt;
&lt;li&gt;Security control enforcement&lt;/li&gt;
&lt;li&gt;CI/CD ownership and permissions&lt;/li&gt;
&lt;li&gt;Who is allowed to deploy what, where, and how&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When those systems don’t align, the migration doesn’t “slow down”.&lt;br&gt;
It becomes impossible to deliver without exceptions,, and exception‑driven delivery does not scale.&lt;/p&gt;
&lt;h2 id="structural-failure-modes-locked-in-before-cutover"&gt;Structural Failure Modes (Locked In Before Cutover)
&lt;/h2&gt;&lt;h3 id="1-discovery-fails-by-design-not-by-accident"&gt;1. Discovery Fails by Design, Not by Accident
&lt;/h3&gt;&lt;p&gt;The problem isn’t that discovery is incomplete.&lt;br&gt;
The problem is that &lt;strong&gt;enterprise discovery is structurally incentivised to be incomplete&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Discovery phases are usually:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Time‑boxed&lt;/li&gt;
&lt;li&gt;Optimised for classification, not behaviour&lt;/li&gt;
&lt;li&gt;Owned by teams without operational accountability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So critical realities surface late:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Authentication paths that double as integration hubs&lt;/li&gt;
&lt;li&gt;“Low‑risk” apps that terminate shared identity&lt;/li&gt;
&lt;li&gt;Data dependencies that cross assumed trust boundaries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These aren’t edge cases. They’re normal outcomes of shallow discovery operating under schedule pressure.&lt;/p&gt;
&lt;p&gt;When discovery is optimistic, migration plans don’t degrade they collapse.&lt;/p&gt;
&lt;h3 id="2-organisational-boundaries-become-hard-technical-constraints"&gt;2. Organisational Boundaries Become Hard Technical Constraints
&lt;/h3&gt;&lt;p&gt;Infrastructure, security, and application teams often agree on outcomes but not on &lt;strong&gt;control&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;What actually happens:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security defines mandatory controls without owning delivery paths&lt;/li&gt;
&lt;li&gt;Platform teams build landing zones without workload context&lt;/li&gt;
&lt;li&gt;Application teams assume exemptions will be negotiable later&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This doesn’t create tension, it creates deadlock.&lt;/p&gt;
&lt;p&gt;Once those boundaries are encoded into Azure constructs (management groups, policies, network segmentation), the organisation’s silos become &lt;strong&gt;enforced by the platform itself&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;At that point, delivery friction isn’t cultural. It’s architectural.&lt;/p&gt;
&lt;h3 id="3-early-governance-decisions-are-the-most-dangerous-ones"&gt;3. Early Governance Decisions Are the Most Dangerous Ones
&lt;/h3&gt;&lt;p&gt;The most damaging migration decisions are often made early because they feel abstract:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Management group hierarchy&lt;/li&gt;
&lt;li&gt;Subscription strategy&lt;/li&gt;
&lt;li&gt;Policy inheritance models&lt;/li&gt;
&lt;li&gt;Network segmentation patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These choices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define who can deploy&lt;/li&gt;
&lt;li&gt;Shape every pipeline&lt;/li&gt;
&lt;li&gt;Determine how quickly teams can change&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Changing them later is expensive because &lt;em&gt;everything&lt;/em&gt; depends on them.&lt;/p&gt;
&lt;p&gt;Technical mistakes can be refactored.&lt;br&gt;
Governance mistakes propagate.&lt;/p&gt;
&lt;h3 id="4-planning-delivery-as-a-phase-guarantees-failure"&gt;4. Planning Delivery as a Phase Guarantees Failure
&lt;/h3&gt;&lt;p&gt;A reliable predictor of migration failure is this sentence:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We’ll build the platform first, then enable delivery.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That creates a gap between:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What the platform allows&lt;/li&gt;
&lt;li&gt;What workloads require&lt;/li&gt;
&lt;li&gt;What teams are authorised and able to deploy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a real workload cannot be deployed safely, repeatedly, and without special approvals in the first few weeks, the migration will devolve into exception management.&lt;/p&gt;
&lt;p&gt;And exception‑driven migrations don’t finish.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;When these issues exist before cutover, the symptoms are consistent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Landing zones that look compliant but host nothing real&lt;/li&gt;
&lt;li&gt;Security reviews blocking “low‑risk” workloads&lt;/li&gt;
&lt;li&gt;CI/CD pipelines that can’t pass policy enforcement&lt;/li&gt;
&lt;li&gt;Migration waves that exist only in planning artefacts&lt;/li&gt;
&lt;li&gt;Growing distrust between platform and application teams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By the time cutover is discussed, confidence is already gone.&lt;/p&gt;
&lt;h2 id="visualising-the-failure-pattern"&gt;Visualising the Failure Pattern
&lt;/h2&gt;&lt;p&gt;Most failed migrations follow this shape:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Migration Intent] --&gt; B[Portfolio Plan]
B --&gt; C[Early Governance Commitments]
C --&gt; D[Platform &amp; Landing Zones]
D --&gt; E[Actual Workload Behaviour]
E --&gt;|Mismatch| F[Exceptions &amp; Rework]
F --&gt;|Accumulation| G[Delivery Paralysis]
&lt;/div&gt;
&lt;p&gt;The break doesn’t occur at cutover.&lt;br&gt;
It occurs when real workloads first touch governance.&lt;/p&gt;
&lt;h2 id="example-when-governance-becomes-a-delivery-blocker"&gt;Example: When Governance Becomes a Delivery Blocker
&lt;/h2&gt;&lt;p&gt;A common early move is enforcing strict network and exposure controls before workloads exist.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denyPublicIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policyDefinitions@2021-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;deny-public-ip&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Custom&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;All&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny Public IPs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyRule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;if&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses/ipAddress&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;then&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The policy itself isn’t wrong.&lt;/p&gt;
&lt;p&gt;The failure occurs when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity flows weren’t designed&lt;/li&gt;
&lt;li&gt;Egress requirements weren’t validated&lt;/li&gt;
&lt;li&gt;CI/CD pipelines don’t have a compliant deployment path&lt;/li&gt;
&lt;li&gt;Ownership of exemptions is unclear&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, the organisation learns a hard lesson:&lt;br&gt;
&lt;strong&gt;governance without executable delivery paths doesn’t improve security it simply halts change&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pilots harden into standards&lt;/strong&gt;&lt;br&gt;
Early “temporary” designs become permanent reference architectures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exception processes create shadow platforms&lt;/strong&gt;&lt;br&gt;
Teams will bypass blocked paths rather than wait indefinitely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accelerators amplify structural flaws&lt;/strong&gt;&lt;br&gt;
They increase speed, not correctness.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices-that-actually-matter"&gt;Best Practices That Actually Matter
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat discovery as behavioural analysis, not inventory&lt;/li&gt;
&lt;li&gt;Design governance with delivery teams in the room&lt;/li&gt;
&lt;li&gt;Make at least one real workload deployable immediately&lt;/li&gt;
&lt;li&gt;Delay irreversible decisions until constraints are visible&lt;/li&gt;
&lt;li&gt;Measure success by repeatability, not policy coverage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or more bluntly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If your platform can’t host a real workload early, your migration plan is fiction.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;The single decision that most reliably guarantees migration failure is &lt;strong&gt;locking in governance before proving delivery&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Enterprises keep making it because governance feels safe, visible, and decisive while executable delivery feels messy and unfinished.&lt;/p&gt;
&lt;p&gt;But cloud doesn’t forgive that inversion.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/govern/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Cloud Adoption Framework — Governance discipline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zones design principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/framework/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Enterprise-scale architecture considerations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Designing Observable, Programmable Azure Networks for the Future</title><link>https://blog.brewedinthecloud.com/p/azure-sdnetworking-observable-programmable-future/</link><pubDate>Thu, 12 Feb 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-sdnetworking-observable-programmable-future/</guid><description>&lt;p&gt;Azure networks rarely fall over outright.&lt;br&gt;
They drift.&lt;/p&gt;
&lt;p&gt;Latency stretches just enough to trip timeouts. SNAT usage inches upward until one busy afternoon tips it over. Traffic takes a longer path than it did last week, and nobody notices until customers do.&lt;/p&gt;
&lt;p&gt;If your networking strategy only detects outages, you’re designing for yesterday’s problems.&lt;/p&gt;
&lt;p&gt;This post makes a deliberate argument: &lt;strong&gt;programmable Azure networks depend on observability first&lt;/strong&gt;, and not the dashboard‑heavy kind. The kind that tells you when behaviour changes, not just when things break.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The common assumption&lt;/strong&gt;&lt;br&gt;
“If the network is up and packets are flowing, it’s fine.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks&lt;/strong&gt;&lt;br&gt;
Azure networking is a distributed software system. Paths change, capacity shifts, policies evolve, and platform behaviour is opaque by default. Most failures are gradual and cumulative, not binary.&lt;/p&gt;
&lt;p&gt;An observable network doesn’t ask:
“Is it reachable?”&lt;/p&gt;
&lt;p&gt;It asks:
“Is it behaving the same way it did yesterday, and if not, do I know why?”&lt;/p&gt;
&lt;p&gt;That shift matters because automation amplifies whatever assumptions you bake in. Automating a blind network just helps you fail faster.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure already emits an enormous amount of network telemetry. The problem isn’t access — it’s signal selection.&lt;/p&gt;
&lt;p&gt;At a practical level, network observability in Azure comes from four places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Metrics that show &lt;strong&gt;pressure&lt;/strong&gt; (latency, SNAT ports, throughput)&lt;/li&gt;
&lt;li&gt;Logs that show &lt;strong&gt;decisions&lt;/strong&gt; (NSG allows/denies, firewall policy matches)&lt;/li&gt;
&lt;li&gt;Topology state that shows &lt;strong&gt;intent vs reality&lt;/strong&gt; (effective routes, effective rules)&lt;/li&gt;
&lt;li&gt;Platform events that show &lt;strong&gt;change&lt;/strong&gt; (maintenance, scaling, backend movement)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Treating all of these as equal is a mistake. Observable design is about choosing &lt;strong&gt;behavioural signals&lt;/strong&gt; that map to outcomes you actually care about.&lt;/p&gt;
&lt;p&gt;If everything is a signal, nothing is.&lt;/p&gt;
&lt;h2 id="the-control-loop-not-a-pipeline"&gt;The Control Loop (Not a Pipeline)
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
A[Azure Network Data Plane] --&gt; B[Selected Telemetry Signals]
B --&gt; C[Central Analysis Layer]
C --&gt; D[Behavioural Baselines]
D --&gt;|Deviation| E[Decision Point]
E --&gt; F[Human or Automated Action]
F --&gt; A
&lt;/div&gt;
&lt;p&gt;This is a control loop, not a deployment pipeline.&lt;/p&gt;
&lt;p&gt;The important design decision is the &lt;strong&gt;decision point&lt;/strong&gt;. That’s where you choose whether a human, a runbook, or a policy engine gets involved — and under what conditions.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Designing for observability changes concrete engineering decisions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;br&gt;
You detect partial failure before it becomes customer‑visible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;br&gt;
You notice traffic patterns changing, not just packets being blocked.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;br&gt;
You see pressure building (egress, SNAT, firewall throughput) before it becomes an incident or a bill shock.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Change safety&lt;/strong&gt;&lt;br&gt;
You can observe blast radius instead of relying on change success messages.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most importantly, it lets you automate &lt;em&gt;safely&lt;/em&gt;. You’re no longer reacting to symptoms — you’re responding to trends.&lt;/p&gt;
&lt;h2 id="what-signals-are-actually-worth-keeping"&gt;What Signals Are Actually Worth Keeping
&lt;/h2&gt;&lt;p&gt;If you had to delete half your network telemetry tomorrow, these are the signals worth defending in Azure designs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SNAT port utilisation&lt;/strong&gt; on NAT Gateway or Load Balancer&lt;br&gt;
Because exhaustion is silent until it isn’t.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NSG or Firewall deny rate trends&lt;/strong&gt;, not individual denies&lt;br&gt;
Because behaviour shifts matter more than single events.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Path length or next‑hop changes&lt;/strong&gt; via effective routes&lt;br&gt;
Because unexpected hair‑pinning kills latency and trust.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything else is secondary until you’ve made these observable and explainable.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="baseline-signal-emission-portal"&gt;Baseline Signal Emission (Portal)
&lt;/h3&gt;&lt;p&gt;For production Azure networks, this should be non‑negotiable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NSG Flow Logs v2 enabled&lt;/li&gt;
&lt;li&gt;Firewall logs sent to Log Analytics (if used)&lt;/li&gt;
&lt;li&gt;Load Balancer and NAT Gateway metrics enabled&lt;/li&gt;
&lt;li&gt;Diagnostics standardised across environments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn’t about dashboards. It’s about ensuring signals exist when you need to ask hard questions.&lt;/p&gt;
&lt;h3 id="declarative-observability-with-bicep"&gt;Declarative Observability with Bicep
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nsg-app-prod&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;diag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/diagnosticSettings@2021-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nsg-observability&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nsg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;NetworkSecurityGroupFlowEvent&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllMetrics&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This snippet is intentionally boring.&lt;br&gt;
Observable networks are built from &lt;strong&gt;consistency&lt;/strong&gt;, not cleverness.&lt;/p&gt;
&lt;p&gt;Programmability comes later, once the signals are trustworthy.&lt;/p&gt;
&lt;h2 id="closing-the-loop-without-hurting-yourself"&gt;Closing the Loop Without Hurting Yourself
&lt;/h2&gt;&lt;p&gt;Not every signal should trigger automation. In fact, most shouldn’t.&lt;/p&gt;
&lt;p&gt;Good automation candidates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scaling NAT Gateway based on sustained SNAT pressure&lt;/li&gt;
&lt;li&gt;Flagging unexpected route changes for review&lt;/li&gt;
&lt;li&gt;Opening incidents with topology context attached&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bad automation candidates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reacting automatically to transient route updates&lt;/li&gt;
&lt;li&gt;Blocking traffic based on short‑lived anomaly spikes&lt;/li&gt;
&lt;li&gt;Remediating without understanding blast radius&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rule of thumb is simple:&lt;br&gt;
&lt;strong&gt;If you wouldn’t trust the signal to wake you at 3am, don’t let it reconfigure your network.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Control‑plane state often lags data‑plane reality&lt;/li&gt;
&lt;li&gt;Azure platform changes can shift “normal” behaviour overnight&lt;/li&gt;
&lt;li&gt;High‑cardinality logs can drown out the signals you care about&lt;/li&gt;
&lt;li&gt;Observability costs money — design deliberately&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Day‑2 networking failures are usually design omissions, not platform bugs.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat observability as a first‑class requirement, not an add‑on&lt;/li&gt;
&lt;li&gt;Design signals around outcomes, not resource types&lt;/li&gt;
&lt;li&gt;Separate telemetry, interpretation, and action&lt;/li&gt;
&lt;li&gt;Baseline behaviour before you automate anything&lt;/li&gt;
&lt;li&gt;Revisit observability whenever traffic patterns change&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Automation doesn’t make networks safer — &lt;strong&gt;understood networks do&lt;/strong&gt;.&lt;br&gt;
Observability isn’t about seeing more, it’s about knowing what matters.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/networking/monitor-network" target="_blank" rel="noopener"
&gt;Azure Monitor for Networks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/network-watcher-nsg-flow-logging-overview" target="_blank" rel="noopener"
&gt;NSG Flow Logs overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/" target="_blank" rel="noopener"
&gt;Azure Monitor metrics and logs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/framework/reliability" target="_blank" rel="noopener"
&gt;Azure reliability design principles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Automating Network Deployments with Pipelines and APIs</title><link>https://blog.brewedinthecloud.com/p/azure-sdnetworking-automating-networks/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-sdnetworking-automating-networks/</guid><description>&lt;p&gt;Click‑ops feels safe. You can see the blades, double‑check the settings, and convince yourself that careful hands mean lower risk.&lt;/p&gt;
&lt;p&gt;That illusion holds right up until the day you need to reproduce the same network in another environment, explain a change to an auditor, or roll back a broken update at 2am. At that point, the Portal stops feeling like control and starts feeling like guesswork.&lt;/p&gt;
&lt;p&gt;Azure networking isn’t fragile infrastructure that needs to be protected from change. It’s software that &lt;strong&gt;expects&lt;/strong&gt; change. Treating it otherwise is where most teams get burned.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The common assumption&lt;/strong&gt;&lt;br&gt;
“Networks are too critical to automate. We should change them manually to reduce risk.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks&lt;/strong&gt;&lt;br&gt;
In Azure, every network object is an API‑managed resource with a lifecycle. Manual changes don’t reduce risk; they just move it into places you can’t see, review, or reliably undo.&lt;/p&gt;
&lt;p&gt;The first things that fail aren’t packets or routes. They’re:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Environment consistency&lt;/li&gt;
&lt;li&gt;Change traceability&lt;/li&gt;
&lt;li&gt;Incident recovery&lt;/li&gt;
&lt;li&gt;Organisational trust in the platform&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Click‑ops doesn’t fail loudly. It fails slowly, then all at once.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure networking lives entirely behind the Azure Resource Manager control plane. The Portal, CLI, PowerShell, SDKs, and pipelines all call the same APIs. There is no privileged path.&lt;/p&gt;
&lt;p&gt;That leads to a few uncomfortable truths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manual and automated changes are technically identical&lt;/li&gt;
&lt;li&gt;The Portal offers convenience, not safety&lt;/li&gt;
&lt;li&gt;Desired state is something you must define explicitly&lt;/li&gt;
&lt;li&gt;Repeatability is a design choice, not a default&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you accept that, automation stops being an optimisation and becomes the baseline operating model.&lt;/p&gt;
&lt;h2 id="idempotency-is-not-we-use-templates"&gt;Idempotency Is Not “We Use Templates”
&lt;/h2&gt;&lt;p&gt;Idempotency is often claimed and rarely achieved.&lt;/p&gt;
&lt;p&gt;Real idempotency means you can apply the same deployment repeatedly and always land in the same state, regardless of what happened before. In practice, many teams have templates but still allow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manual subnet edits “just this once”&lt;/li&gt;
&lt;li&gt;Emergency NSG rules added in the Portal&lt;/li&gt;
&lt;li&gt;Partial deployments scoped too broadly or too narrowly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s not idempotent. That’s &lt;strong&gt;false confidence&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Automation only works when templates are the source of truth and drift is treated as a fault, not a convenience.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This mindset changes how you operate networks day to day.&lt;/p&gt;
&lt;p&gt;Design shifts from “build it carefully” to “make it reproducible”. Deployments move from one‑off events to routine, reviewable changes. Rollbacks become redeployments, not memory tests. Audits become queries against Git history instead of archaeology through Activity Logs.&lt;/p&gt;
&lt;p&gt;Most importantly, networks stop being special. They become part of the same delivery system as everything else.&lt;/p&gt;
&lt;p&gt;That’s usually the moment teams realise where their real bottleneck was.&lt;/p&gt;
&lt;h2 id="automation-flow-deliberately-boring"&gt;Automation Flow (Deliberately Boring)
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
Commit[Engineer commit] --&gt; Repo[Git repository]
Repo --&gt; Pipeline[Deployment pipeline]
Pipeline --&gt; ARM[Azure Resource Manager API]
ARM --&gt; Network[Azure network resources]
&lt;/div&gt;
&lt;p&gt;This diagram is intentionally dull. If your network delivery relies on anything more exotic than controlled API calls with identity, review, and logging, you’re adding risk, not reducing it.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="declarative-network-definition-with-bicep"&gt;Declarative Network Definition with Bicep
&lt;/h3&gt;&lt;p&gt;This example is simple by design. The value is in what it enables, not in how clever it is.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;workload&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Applied repeatedly, this deployment converges the environment back to the declared state. That’s the foundation for safe change.&lt;/p&gt;
&lt;h3 id="pipelinedriven-deployment"&gt;Pipeline‑Driven Deployment
&lt;/h3&gt;&lt;p&gt;In a pipeline, network changes should be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reviewed like application code&lt;/li&gt;
&lt;li&gt;Deployed using managed identities&lt;/li&gt;
&lt;li&gt;Logged automatically&lt;/li&gt;
&lt;li&gt;Reproducible on demand&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A minimal example using Azure CLI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-network-prod &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file main.bicep &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --parameters &lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vnet-prod-core
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Same command, every environment. Parameters change. Behaviour doesn’t.&lt;/p&gt;
&lt;h2 id="safe-rollout-and-rollback-what-actually-works"&gt;Safe Rollout and Rollback (What Actually Works)
&lt;/h2&gt;&lt;p&gt;Rollback plans that involve “log into the Portal and fix it” are not plans. They’re optimism.&lt;/p&gt;
&lt;p&gt;Effective strategies include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using what‑if to understand blast radius before deployment&lt;/li&gt;
&lt;li&gt;Scoping deployments narrowly to reduce unintended impact&lt;/li&gt;
&lt;li&gt;Versioning network code alongside application releases&lt;/li&gt;
&lt;li&gt;Rolling back by redeploying the last known‑good commit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rollback is not reversing actions. It’s &lt;strong&gt;reasserting state&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Some network changes are inherently disruptive and automation won’t make them safe&lt;/li&gt;
&lt;li&gt;Long‑standing manual drift will eventually collide with templates&lt;/li&gt;
&lt;li&gt;Dependency ordering still matters, especially with private endpoints&lt;/li&gt;
&lt;li&gt;Preview API versions can change behaviour unexpectedly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Automation forces these realities into the open. That’s a feature, not a flaw.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat network definitions as product code&lt;/li&gt;
&lt;li&gt;Enforce version control and pull‑request reviews&lt;/li&gt;
&lt;li&gt;Make pipelines the only supported change path&lt;/li&gt;
&lt;li&gt;Use incremental deployments with explicit scope&lt;/li&gt;
&lt;li&gt;Assume drift will happen and design to correct it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the Portal is your backup plan, it’s already your primary risk.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If a team says they “use Bicep” but still rely on the Portal for urgent fixes, the problem isn’t tooling. It’s that their deployment model and engineering culture are out of alignment.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-resource-manager/management/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Resource Manager overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-resource-manager/bicep/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-resource-manager/templates/deploy-what-if?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure deployment what‑if&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/training/paths/bicep-deploy/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Infrastructure as Code on Azure (Microsoft Learn)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Routing as Code with Azure Route Server and Policy‑Based Routing</title><link>https://blog.brewedinthecloud.com/p/azure-sdnetworking-routing-as-code-route-server-pbr/</link><pubDate>Thu, 05 Feb 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-sdnetworking-routing-as-code-route-server-pbr/</guid><description>&lt;p&gt;Most routing incidents aren’t caused by bad math or broken protocols.&lt;br&gt;
They’re caused by &lt;em&gt;unclear intent&lt;/em&gt; — nobody can confidently answer why traffic takes a particular path &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In Azure, routing is no longer a background configuration you “set once and forget”. It’s an evolving control surface, shaped by software, scale events, and failure domains. If you’re still treating routing like static infrastructure, you’re designing blind.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;h3 id="the-common-assumption"&gt;The common assumption
&lt;/h3&gt;&lt;p&gt;Routing is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A deterministic outcome of prefixes&lt;/li&gt;
&lt;li&gt;Mostly static&lt;/li&gt;
&lt;li&gt;Something you “finish” early in a design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once the tables look right, you move on.&lt;/p&gt;
&lt;h3 id="why-this-breaks"&gt;Why this breaks
&lt;/h3&gt;&lt;p&gt;Azure networks are &lt;em&gt;living systems&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Routes appear and disappear dynamically&lt;/li&gt;
&lt;li&gt;Control planes make decisions faster than humans can react&lt;/li&gt;
&lt;li&gt;Multiple teams influence traffic paths, often unintentionally&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result is fragile certainty — everything looks fine until a route is withdrawn, a UDR is reused, or a firewall scales differently than expected.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Think of Azure routing as two distinct software responsibilities:&lt;/p&gt;
&lt;h3 id="1-reachability-dynamic"&gt;1. &lt;strong&gt;Reachability (dynamic)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;This is decided by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System routes&lt;/li&gt;
&lt;li&gt;BGP‑learned routes from ExpressRoute, VPN, or &lt;strong&gt;Azure Route Server&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure Route Server doesn’t “optimise” traffic. It &lt;strong&gt;injects and withdraws reachability information&lt;/strong&gt; into the VNet routing plane, based on what its BGP peers advertise. When a peer stops advertising a prefix, Azure stops believing that path exists.&lt;/p&gt;
&lt;p&gt;That behaviour matters during failure — not during steady state.&lt;/p&gt;
&lt;h3 id="2-intent-static-but-explicit"&gt;2. &lt;strong&gt;Intent (static, but explicit)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;This is enforced using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User Defined Routes (UDRs)&lt;/li&gt;
&lt;li&gt;Subnet‑level scoping&lt;/li&gt;
&lt;li&gt;Next‑hop selection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;UDRs don’t care &lt;em&gt;why&lt;/em&gt; a destination exists. They simply say: &lt;em&gt;if traffic is headed here, it must go that way&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The key insight:&lt;br&gt;
&lt;strong&gt;BGP answers “where can I go?”&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;UDRs answer “where am I allowed to go?”&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="architecture-overview"&gt;Architecture Overview
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
AppSubnet[App Subnet]
Firewall[NVA / Firewall]
RouteServer[Azure Route Server]
ER[ExpressRoute / VPN]
Internet[Internet]
AppSubnet --&gt;|UDR: default route| Firewall
Firewall --&gt; RouteServer
RouteServer --&gt;|BGP learned prefixes| Firewall
Firewall --&gt; ER
Firewall --&gt; Internet
&lt;/div&gt;
&lt;p&gt;This isn’t about elegance. It’s about &lt;strong&gt;predictability under change&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Designing routing this way changes how you operate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Failure is signalled, not hidden&lt;/strong&gt;&lt;br&gt;
When an NVA or SD‑WAN appliance stops advertising routes, Azure adapts immediately. There’s no stale static route pretending everything is fine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Blast radius becomes intentional&lt;/strong&gt;&lt;br&gt;
Small, scoped route tables mean one bad decision doesn’t rewrite half the VNet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Routing changes become reviewable&lt;/strong&gt;&lt;br&gt;
When UDRs and BGP configuration are defined as artefacts, you can reason about diffs, intent, and rollback — not just outcomes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Incident response gets faster&lt;/strong&gt;&lt;br&gt;
Engineers debug effective routes, not portal click history.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal--where-this-actually-bites"&gt;Azure Portal – Where This Actually Bites
&lt;/h3&gt;&lt;p&gt;Operationally important checks (often missed):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is route propagation enabled where you &lt;em&gt;expect&lt;/em&gt; dynamic routes?&lt;/li&gt;
&lt;li&gt;Are UDRs unintentionally overriding critical BGP paths?&lt;/li&gt;
&lt;li&gt;Do effective routes differ between subnets that “should” be identical?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most production routing issues show up here — not during deployment.&lt;/p&gt;
&lt;h3 id="bicep--making-routing-intent-explicit"&gt;Bicep – Making Routing Intent Explicit
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/routeTables@2022-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;rt-app-egress&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;disableBgpRoutePropagation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;force-egress-firewall&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0.0.0.0/0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualAppliance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopIpAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.0.4&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The value here isn’t the route itself — it’s that &lt;strong&gt;intent is now inspectable&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why all egress?&lt;/li&gt;
&lt;li&gt;Why this next hop?&lt;/li&gt;
&lt;li&gt;What breaks if it’s removed?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That conversation is the win.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases-where-designs-usually-fail"&gt;Gotchas &amp;amp; Edge Cases (Where Designs Usually Fail)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UDRs override BGP — always&lt;/strong&gt;&lt;br&gt;
If a UDR points to a dead next hop, Azure will happily black‑hole traffic. Dynamic routing will not save you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Asymmetric routing isn’t theoretical&lt;/strong&gt;&lt;br&gt;
It happens the moment inbound and outbound paths are controlled by different teams or constructs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shared route tables amplify mistakes&lt;/strong&gt;&lt;br&gt;
Reuse feels efficient until one “small change” alters traffic for dozens of subnets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Route Server adds complexity you must own&lt;/strong&gt;&lt;br&gt;
If you don’t actively test route withdrawal scenarios, you’re just hoping it works.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use Azure Route Server &lt;strong&gt;only&lt;/strong&gt; when dynamic reachability actually matters&lt;/li&gt;
&lt;li&gt;Keep UDRs small, scoped, and boring&lt;/li&gt;
&lt;li&gt;Test failures by withdrawing BGP routes — deliberately&lt;/li&gt;
&lt;li&gt;Treat effective routes as a first‑class debugging tool&lt;/li&gt;
&lt;li&gt;Document &lt;em&gt;why&lt;/em&gt; a routing decision exists, not just the prefix&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If your routing design only works when nothing changes, it’s not a design — it’s a coincidence.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/route-server/overview" target="_blank" rel="noopener"
&gt;Azure Route Server overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;User Defined Routes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/expressroute/expressroute-routing" target="_blank" rel="noopener"
&gt;BGP with ExpressRoute and VPN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Intent Is the New Topology: Azure Virtual Network Manager in Practice</title><link>https://blog.brewedinthecloud.com/p/azure-sdnetworking-intent-based-networking/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-sdnetworking-intent-based-networking/</guid><description>&lt;p&gt;Most Azure networks don’t fail loudly. They drift.&lt;/p&gt;
&lt;p&gt;Not because engineers are careless, but because &lt;strong&gt;intent lives in people’s heads&lt;/strong&gt;, while configuration lives in dozens of VNets, spread across subscriptions, regions, and teams.&lt;/p&gt;
&lt;p&gt;Azure Virtual Network Manager (AVNM) exists for one reason:&lt;br&gt;
to close that gap.&lt;/p&gt;
&lt;p&gt;This post argues a clear position:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Once your Azure network spans multiple teams or subscriptions, &lt;strong&gt;per‑VNet configuration becomes an operational liability&lt;/strong&gt;, and intent‑based networking stops being a “nice to have”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="the-mental-model-from-ownership-to-obligation"&gt;The Mental Model: From Ownership to Obligation
&lt;/h2&gt;&lt;h3 id="the-assumption-we-need-to-kill"&gt;The assumption we need to kill
&lt;/h3&gt;&lt;p&gt;If you squint, most Azure networks are still designed like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VNets own their peerings&lt;/li&gt;
&lt;li&gt;Subnets own their NSGs&lt;/li&gt;
&lt;li&gt;Teams own “their” part of the network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Automation helps, but the &lt;strong&gt;unit of control is still the VNet&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="why-this-fails-in-real-organisations"&gt;Why this fails in real organisations
&lt;/h3&gt;&lt;p&gt;At scale, networks aren’t owned they’re &lt;em&gt;shared&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platform teams define guardrails&lt;/li&gt;
&lt;li&gt;Application teams create VNets&lt;/li&gt;
&lt;li&gt;Security teams care about rules, not topology&lt;/li&gt;
&lt;li&gt;Nobody owns the &lt;em&gt;relationships&lt;/em&gt; between VNets end‑to‑end&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result is predictable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inconsistent connectivity&lt;/li&gt;
&lt;li&gt;Security drift&lt;/li&gt;
&lt;li&gt;Manual exceptions that never get undone&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AVNM exists to move networking from &lt;strong&gt;ownership&lt;/strong&gt; to &lt;strong&gt;obligation&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="how-avnm-actually-changes-the-game"&gt;How AVNM Actually Changes the Game
&lt;/h2&gt;&lt;p&gt;This is the critical shift:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With AVNM, VNets no longer decide how they connect.&lt;br&gt;
&lt;strong&gt;The platform decides, and VNets comply.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;AVNM introduces a control plane where you declare:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which VNets belong to the same &lt;em&gt;connectivity domain&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Which security rules are &lt;em&gt;non‑negotiable&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Where that intent is allowed to apply&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VNets opt in by identity (tags, scope), not by bespoke wiring.&lt;/p&gt;
&lt;p&gt;That’s not convenience.&lt;br&gt;
That’s enforceable architecture.&lt;/p&gt;
&lt;h2 id="control-plane-vs-data-plane-why-this-isnt-magic"&gt;Control Plane vs Data Plane (Why This Isn’t Magic)
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
AVNM[Azure Virtual Network Manager&lt;br/&gt;Control Plane]
NG[Network Groups]
CFG[Connectivity &amp; Security Intent]
subgraph DataPlane["Azure VNets (Data Plane)"]
Hub[VNet - Hub]
Spoke1[VNet - Spoke]
Spoke2[VNet - Spoke]
end
AVNM --&gt; NG
NG --&gt; CFG
CFG --&gt; Hub
CFG --&gt; Spoke1
CFG --&gt; Spoke2
&lt;/div&gt;
&lt;p&gt;A few truths worth stating plainly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AVNM does &lt;strong&gt;not&lt;/strong&gt; carry traffic&lt;/li&gt;
&lt;li&gt;It does &lt;strong&gt;not&lt;/strong&gt; dynamically react to failures&lt;/li&gt;
&lt;li&gt;Nothing happens until you &lt;strong&gt;deploy&lt;/strong&gt; a configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That explicit deployment step is the point.&lt;br&gt;
It’s where intent becomes a controlled change, not background magic.&lt;/p&gt;
&lt;h2 id="scoping-is-a-power-tool-and-a-loaded-one"&gt;Scoping Is a Power Tool (And a Loaded One)
&lt;/h2&gt;&lt;p&gt;AVNM is scoped to a &lt;strong&gt;management group or subscription&lt;/strong&gt;.&lt;br&gt;
That scope defines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which VNets can be grouped&lt;/li&gt;
&lt;li&gt;Where intent can be enforced&lt;/li&gt;
&lt;li&gt;Your maximum blast radius&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s the uncomfortable reality:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A mis‑scoped AVNM can break &lt;em&gt;every&lt;/em&gt; VNet it governs correctly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Examples I’ve seen in the wild:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A connectivity config deployed at the wrong management group, flattening carefully segmented landing zones&lt;/li&gt;
&lt;li&gt;Security Admin Rules unintentionally overriding workload‑specific NSGs across dozens of subscriptions&lt;/li&gt;
&lt;li&gt;Platform teams granting AVNM access “temporarily” and never revoking it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AVNM should be treated like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Policy assignments&lt;/li&gt;
&lt;li&gt;RBAC at management group scope&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rare, deliberate, and boring, by design.&lt;/p&gt;
&lt;h2 id="connectivity-across-subscriptions-where-avnm-becomes-mandatory"&gt;Connectivity Across Subscriptions: Where AVNM Becomes Mandatory
&lt;/h2&gt;&lt;p&gt;This is the point where AVNM stops being optional.&lt;/p&gt;
&lt;h3 id="without-avnm"&gt;Without AVNM
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Cross‑subscription peering requires coordination and trust&lt;/li&gt;
&lt;li&gt;Consistency relies on documentation and hope&lt;/li&gt;
&lt;li&gt;New VNets are snowflakes until someone remembers to wire them in&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="with-avnm"&gt;With AVNM
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Network Groups span subscriptions&lt;/li&gt;
&lt;li&gt;Connectivity intent applies uniformly&lt;/li&gt;
&lt;li&gt;New VNets inherit behaviour automatically&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key change isn’t technical, it’s organisational:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Application teams no longer need permission to &lt;em&gt;design&lt;/em&gt; the network.&lt;br&gt;
They only need permission to &lt;em&gt;join&lt;/em&gt; it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That reduces friction &lt;em&gt;and&lt;/em&gt; risk, which is a rare combination.&lt;/p&gt;
&lt;h2 id="implementation-example-optin-by-identity-not-wiring"&gt;Implementation Example: Opt‑In by Identity, Not Wiring
&lt;/h2&gt;&lt;p&gt;This example isn’t about syntax it’s about behaviour.&lt;/p&gt;
&lt;h3 id="define-avnm-at-platform-scope"&gt;Define AVNM at platform scope
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers@2023-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;corp-avnm&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopeAccesses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Connectivity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SecurityAdmin&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;managementGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/providers/Microsoft.Management/managementGroups/corp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This establishes &lt;strong&gt;who is allowed to define intent&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="define-a-network-group-using-tags"&gt;Define a Network Group using tags
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups@2023-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;spokes&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;memberType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualNetwork&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;membershipCriteria&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;criterionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Tag&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tagName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;NetworkRole&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tagValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Spoke&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Equals&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The important outcome:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;App teams create VNets&lt;/li&gt;
&lt;li&gt;They apply a tag&lt;/li&gt;
&lt;li&gt;The platform enforces connectivity and security&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No tickets.&lt;br&gt;
No peering spreadsheets.&lt;br&gt;
No “did you remember to…”.&lt;/p&gt;
&lt;h2 id="day2-reality-what-actually-changes"&gt;Day‑2 Reality: What Actually Changes
&lt;/h2&gt;&lt;h3 id="design"&gt;Design
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;You design &lt;strong&gt;connectivity domains&lt;/strong&gt;, not diagrams&lt;/li&gt;
&lt;li&gt;Architecture reviews focus on intent, not implementation detail&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="operations"&gt;Operations
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Drift is corrected by redeploying intent&lt;/li&gt;
&lt;li&gt;Network changes become auditable events&lt;/li&gt;
&lt;li&gt;Rollback is a config redeploy, not a forensic exercise&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="failure-modes"&gt;Failure modes
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Bad intent propagates fast&lt;/li&gt;
&lt;li&gt;Good intent scales effortlessly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AVNM amplifies whatever maturity you already have.&lt;/p&gt;
&lt;h2 id="gotchas-that-actually-matter"&gt;Gotchas That Actually Matter
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;AVNM configurations deploy &lt;strong&gt;per region&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Security Admin Rules always override NSGs&lt;/li&gt;
&lt;li&gt;Dynamic groups live or die by tag hygiene&lt;/li&gt;
&lt;li&gt;Existing peerings don’t disappear unless intent says so&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The biggest risk isn’t technical.&lt;/p&gt;
&lt;p&gt;It’s &lt;strong&gt;treating AVNM like a convenience feature instead of a governance boundary&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="best-practices-hardwon-not-theoretical"&gt;Best Practices (Hard‑Won, Not Theoretical)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Start with connectivity, not security&lt;/li&gt;
&lt;li&gt;Scope narrowly, expand reluctantly&lt;/li&gt;
&lt;li&gt;Treat tags as API contracts&lt;/li&gt;
&lt;li&gt;Lock down who can deploy configurations&lt;/li&gt;
&lt;li&gt;Document intent like you would policy&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If your Azure network spans more teams than you can name, &lt;strong&gt;AVNM isn’t an optimisation it’s damage control&lt;/strong&gt;.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network-manager/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Virtual Network Manager overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network-manager/concept-network-groups?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Network Groups and membership&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network-manager/concept-connectivity-configuration?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Connectivity configurations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Control Plane vs Data Plane: How Azure Really Moves Traffic</title><link>https://blog.brewedinthecloud.com/p/azure-sdnetworking-control-plane-vs-data-plane/</link><pubDate>Thu, 29 Jan 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-sdnetworking-control-plane-vs-data-plane/</guid><description>&lt;p&gt;Most Azure networking conversations eventually end up here:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“So where does the packet actually go?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s a reasonable question and the wrong one.&lt;/p&gt;
&lt;p&gt;In Azure, &lt;strong&gt;you don’t operate a network that forwards packets&lt;/strong&gt;.&lt;br&gt;
You operate a &lt;strong&gt;system that decides how packets &lt;em&gt;should&lt;/em&gt; be forwarded&lt;/strong&gt;, and Azure executes that decision on your behalf.&lt;/p&gt;
&lt;p&gt;If that distinction feels subtle, it’s the root cause of a huge amount of confusion, bad designs, and painful troubleshooting.&lt;/p&gt;
&lt;h2 id="the-mental-model-that-needs-replacing"&gt;The Mental Model That Needs Replacing
&lt;/h2&gt;&lt;h3 id="the-inherited-assumption"&gt;The inherited assumption
&lt;/h3&gt;&lt;p&gt;Even experienced cloud engineers often carry this implicit model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Control plane = management APIs&lt;/li&gt;
&lt;li&gt;Data plane = packets moving through virtual appliances&lt;/li&gt;
&lt;li&gt;If traffic breaks, follow the packet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That model comes from environments where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You owned the switches&lt;/li&gt;
&lt;li&gt;You controlled the routing tables&lt;/li&gt;
&lt;li&gt;The data plane was visible and inspectable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure looks similar, until it doesn’t.&lt;/p&gt;
&lt;h3 id="why-this-breaks-down-in-azure"&gt;Why this breaks down in Azure
&lt;/h3&gt;&lt;p&gt;In Azure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;do not&lt;/strong&gt; control the forwarding devices&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;cannot&lt;/strong&gt; observe the real data plane&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;never&lt;/strong&gt; program routing directly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Routing &lt;em&gt;is&lt;/em&gt; deterministic but it’s not operator‑visible or operator‑programmable in the traditional sense.&lt;/p&gt;
&lt;p&gt;You declare &lt;em&gt;intent&lt;/em&gt;.&lt;br&gt;
Azure compiles that intent into behaviour.&lt;/p&gt;
&lt;p&gt;Once you accept that, a lot of “mysteries” stop being mysterious.&lt;/p&gt;
&lt;h2 id="the-real-split-decision-vs-execution"&gt;The Real Split: Decision vs Execution
&lt;/h2&gt;&lt;p&gt;Here’s the framing that actually works:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Control plane&lt;/strong&gt; decides &lt;em&gt;what should happen&lt;/em&gt;.&lt;br&gt;
&lt;strong&gt;Data plane&lt;/strong&gt; executes that decision at scale.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="mermaid"&gt;flowchart LR
CP[Azure Control Plane&lt;br/&gt;APIs, ARM, Policy]
INTENT[Compiled Intent&lt;br/&gt;Routes, NSGs, LB rules]
DP[Azure Data Plane&lt;br/&gt;Provider-managed fabric]
CP --&gt; INTENT
INTENT --&gt; DP
&lt;/div&gt;
&lt;p&gt;You interact almost exclusively with the &lt;strong&gt;control plane&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Resource Manager (ARM)&lt;/li&gt;
&lt;li&gt;Networking APIs&lt;/li&gt;
&lt;li&gt;Policy and higher‑level abstractions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure owns the &lt;strong&gt;data plane&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The actual forwarding paths&lt;/li&gt;
&lt;li&gt;The real routing state&lt;/li&gt;
&lt;li&gt;The physical and virtual infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That data plane is intentionally opaque.&lt;/p&gt;
&lt;h2 id="what-azure-abstracts-away-deliberately"&gt;What Azure Abstracts Away (Deliberately)
&lt;/h2&gt;&lt;p&gt;Azure hides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Physical topology&lt;/li&gt;
&lt;li&gt;Hop‑by‑hop routing&lt;/li&gt;
&lt;li&gt;Device‑level failure handling&lt;/li&gt;
&lt;li&gt;Real packet paths&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn’t a limitation.&lt;br&gt;
It’s what enables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Massive scale&lt;/li&gt;
&lt;li&gt;Fast, global reconfiguration&lt;/li&gt;
&lt;li&gt;Provider‑managed resilience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yes, Azure exposes &lt;em&gt;signals&lt;/em&gt; effective routes, flow logs, metrics.&lt;br&gt;
But those are &lt;strong&gt;diagnostics of intent&lt;/strong&gt;, not windows into the fabric.&lt;/p&gt;
&lt;p&gt;Trying to reason about Azure like a visible network is like debugging Kubernetes by SSHing into nodes. You might learn something, but you’re fighting the platform.&lt;/p&gt;
&lt;h2 id="what-you-can-still-influence"&gt;What You &lt;em&gt;Can&lt;/em&gt; Still Influence
&lt;/h2&gt;&lt;p&gt;Abstraction doesn’t mean loss of control.&lt;br&gt;
It means &lt;strong&gt;control moves up a level&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You influence behaviour through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Addressing and VNet boundaries&lt;/li&gt;
&lt;li&gt;User‑defined routes (as intent, not tables)&lt;/li&gt;
&lt;li&gt;Network Security Groups (policy, not firewalls)&lt;/li&gt;
&lt;li&gt;Load balancer rules (outcomes, not flows)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You are shaping &lt;strong&gt;constraints&lt;/strong&gt;, not paths.&lt;/p&gt;
&lt;p&gt;This is why Azure networking feels declarative even when you’re not using explicit policy services.&lt;/p&gt;
&lt;h2 id="where-decisions-are-actually-made"&gt;Where Decisions Are Actually Made
&lt;/h2&gt;&lt;p&gt;Let’s be clear about responsibility boundaries.&lt;/p&gt;
&lt;h3 id="routing"&gt;Routing
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;You define &lt;em&gt;desired next hops&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Azure determines the actual forwarding implementation&lt;/li&gt;
&lt;li&gt;“Effective routes” show outcomes, not live tables&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="firewalling"&gt;Firewalling
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;NSGs are evaluated by the platform&lt;/li&gt;
&lt;li&gt;You never touch the enforcement engine&lt;/li&gt;
&lt;li&gt;Rule ordering is contractual, not procedural&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="load-balancing"&gt;Load balancing
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;You define distribution rules&lt;/li&gt;
&lt;li&gt;Azure selects instances dynamically&lt;/li&gt;
&lt;li&gt;Health probes influence decisions you don’t directly observe&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In every case:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You declare &lt;strong&gt;what must be true&lt;/strong&gt;, not &lt;strong&gt;how it’s achieved&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="why-packetlevel-reasoning-fails"&gt;Why Packet‑Level Reasoning Fails
&lt;/h2&gt;&lt;p&gt;This is where experienced engineers often get stuck.&lt;/p&gt;
&lt;p&gt;Common instincts that don’t translate well to Azure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Which hop is dropping the packet?”&lt;/li&gt;
&lt;li&gt;“What does the routing table look like right now?”&lt;/li&gt;
&lt;li&gt;“Let’s capture traffic at the firewall interface.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These assume:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A stable, inspectable data plane&lt;/li&gt;
&lt;li&gt;Deterministic, operator‑visible paths&lt;/li&gt;
&lt;li&gt;Devices you can interrogate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure intentionally violates those assumptions.&lt;/p&gt;
&lt;p&gt;When traffic fails, the cause is almost always:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conflicting intent&lt;/li&gt;
&lt;li&gt;Missing intent&lt;/li&gt;
&lt;li&gt;Scope mismatch&lt;/li&gt;
&lt;li&gt;Platform‑level precedence overriding expectation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not a mysterious dropped packet in the fabric.&lt;/p&gt;
&lt;h2 id="a-concrete-failure-pattern-seen-too-often"&gt;A Concrete Failure Pattern (Seen Too Often)
&lt;/h2&gt;&lt;p&gt;A common real‑world outage pattern:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A platform team introduces a broad NSG change at a shared scope&lt;/li&gt;
&lt;li&gt;The rule is valid, tested, and correctly ordered&lt;/li&gt;
&lt;li&gt;It unintentionally overrides workload‑specific assumptions in multiple VNets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From the workload perspective, “the network broke instantly.”&lt;/p&gt;
&lt;p&gt;From Azure’s perspective, it did exactly what it was told.&lt;/p&gt;
&lt;p&gt;This is a &lt;strong&gt;control plane failure&lt;/strong&gt;, not a data plane one and packet tracing won’t save you.&lt;/p&gt;
&lt;h2 id="operational-consequences-day2-reality"&gt;Operational Consequences (Day‑2 Reality)
&lt;/h2&gt;&lt;p&gt;Once you internalise the split, operations change.&lt;/p&gt;
&lt;h3 id="design-reviews"&gt;Design reviews
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Look for &lt;strong&gt;intent collisions&lt;/strong&gt;, not topology flaws&lt;/li&gt;
&lt;li&gt;Ask “what enforces this?” before “where does this live?”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="incident-response"&gt;Incident response
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Start with control plane state and recent changes&lt;/li&gt;
&lt;li&gt;Validate &lt;em&gt;effective&lt;/em&gt; configuration&lt;/li&gt;
&lt;li&gt;Assume the data plane is faithfully executing declared intent&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="change-management"&gt;Change management
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Small control plane changes can have massive impact&lt;/li&gt;
&lt;li&gt;Rollback means restoring previous intent, not fixing devices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why Azure networking incidents often look &lt;em&gt;instant&lt;/em&gt; and &lt;em&gt;wide‑reaching&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;They are.&lt;/p&gt;
&lt;h2 id="what-this-post-is-not-about"&gt;What This Post Is &lt;em&gt;Not&lt;/em&gt; About
&lt;/h2&gt;&lt;p&gt;To be explicit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is &lt;strong&gt;not&lt;/strong&gt; about intent‑based policy design&lt;/li&gt;
&lt;li&gt;This is &lt;strong&gt;not&lt;/strong&gt; about automation pipelines&lt;/li&gt;
&lt;li&gt;This is &lt;strong&gt;not&lt;/strong&gt; a breakdown of specific routing services as code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This post is about &lt;strong&gt;thinking correctly&lt;/strong&gt; before you design or debug anything.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;If you’re still asking where the packet went, you’re debugging the wrong system.&lt;/p&gt;
&lt;p&gt;In Azure, &lt;strong&gt;the control plane &lt;em&gt;is&lt;/em&gt; the system&lt;/strong&gt;. The data plane is just the executor.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/networking/fundamentals/networking-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure networking architecture overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-resource-manager/management/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Resource Manager overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-network-troubleshoot-connectivity-problems?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Troubleshooting Azure virtual network traffic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Networking Is Software‑Defined — Once You Design for That, Everything Changes</title><link>https://blog.brewedinthecloud.com/p/azure-sdnetworking-mindset/</link><pubDate>Tue, 27 Jan 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-sdnetworking-mindset/</guid><description>&lt;p&gt;Most Azure networking designs don’t fail outright, they just slowly become harder to reason about.
Changes feel risky. Costs creep up. Incidents are harder to explain after the fact.&lt;/p&gt;
&lt;p&gt;In practice, that usually isn’t a tooling problem or a skills gap.&lt;br&gt;
It’s a &lt;strong&gt;mental‑model mismatch&lt;/strong&gt;: designing Azure networking as if it were virtual hardware, when it behaves like a distributed software system.&lt;/p&gt;
&lt;p&gt;Once you design with that in mind, a lot of complexity simply stops being necessary.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;h3 id="the-common-assumption"&gt;The common assumption
&lt;/h3&gt;&lt;p&gt;Azure networking is often treated as on‑prem networking, abstracted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VNets behave like virtual LANs&lt;/li&gt;
&lt;li&gt;Subnets define stable trust zones&lt;/li&gt;
&lt;li&gt;Routes map to predictable forwarding paths&lt;/li&gt;
&lt;li&gt;Firewalls act as network choke points&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Get the topology right, and the system behaves.&lt;/p&gt;
&lt;h3 id="why-this-misleads"&gt;Why this misleads
&lt;/h3&gt;&lt;p&gt;Azure doesn’t provide a static network fabric you configure and operate.&lt;br&gt;
It provides a &lt;strong&gt;control plane&lt;/strong&gt; where you declare intent, and the platform continuously reconciles that intent into runtime behaviour.&lt;/p&gt;
&lt;p&gt;The gap between those two concepts &lt;em&gt;intent vs implementation&lt;/em&gt; is where many designs quietly struggle.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure networking is software‑defined networking (SDN) in a very literal sense:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configuration is expressed entirely through APIs (Azure Resource Manager and provider services)&lt;/li&gt;
&lt;li&gt;Enforcement happens across a distributed, platform‑owned data plane&lt;/li&gt;
&lt;li&gt;Policy shapes behaviour more than topology&lt;/li&gt;
&lt;li&gt;State is constantly re‑evaluated, converged, and corrected&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You don’t manage links, switches, or tables.&lt;br&gt;
You manage &lt;strong&gt;desired behaviour&lt;/strong&gt;, and Azure decides how to make that true, today and tomorrow.&lt;/p&gt;
&lt;p&gt;This is less like wiring a network and more like operating a distributed system.&lt;/p&gt;
&lt;h2 id="a-more-useful-way-to-visualise-it"&gt;A More Useful Way to Visualise It
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
A[Declared Intent&lt;br/&gt;Bicep / ARM / Portal]
B[Azure Networking Control Plane]
C[Platform Data Plane]
D[Observed Behaviour]
A --&gt; B
B --&gt; C
C --&gt; D
B -. continuously reconciles .-&gt; C
&lt;/div&gt;
&lt;p&gt;You can’t touch the data plane directly.&lt;br&gt;
You can only change behaviour by adjusting intent.&lt;/p&gt;
&lt;p&gt;That distinction explains a lot of “unexpected” Azure networking behaviour.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This mental shift has real consequences for how you design and operate systems.&lt;/p&gt;
&lt;h3 id="design"&gt;Design
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Focus on &lt;strong&gt;outcomes&lt;/strong&gt; (reachability, isolation, inspection), not clean diagrams&lt;/li&gt;
&lt;li&gt;Subnets are constraints, not trust boundaries by default&lt;/li&gt;
&lt;li&gt;Fewer bespoke routes and network tricks are usually better&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reliability"&gt;Reliability
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Change is convergent, not atomic&lt;/li&gt;
&lt;li&gt;Temporary inconsistency is normal during updates&lt;/li&gt;
&lt;li&gt;Understanding control‑plane timing matters as much as packet flow&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="security"&gt;Security
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Security posture is the sum of overlapping policies&lt;/li&gt;
&lt;li&gt;Platform defaults can matter more than explicit rules&lt;/li&gt;
&lt;li&gt;Over‑segmentation often gives a false sense of control&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cost"&gt;Cost
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Complex topology doesn’t buy resilience&lt;/li&gt;
&lt;li&gt;The platform already provides redundancy duplicating it costs money without adding value&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;This directly affects how much you deploy, how often you touch it, and how confident you feel changing it later.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="implementation-example-declaring-behaviour-not-plumbing"&gt;Implementation Example: Declaring Behaviour, Not Plumbing
&lt;/h2&gt;&lt;p&gt;A simple VNet declaration illustrates the contract you’re working with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;prod-core-vnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;workload&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateEndpointNetworkPolicies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Disabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This code doesn’t:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allocate interfaces&lt;/li&gt;
&lt;li&gt;Fix forwarding paths&lt;/li&gt;
&lt;li&gt;Guarantee traffic flow ordering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It declares &lt;strong&gt;constraints and intent&lt;/strong&gt;. Azure continuously ensures runtime behaviour aligns with that intent, even as the underlying platform evolves.&lt;/p&gt;
&lt;p&gt;That’s the SDN contract you design against.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Behaviour can change over time without configuration drift&lt;/li&gt;
&lt;li&gt;Implicit defaults often matter more than explicit settings&lt;/li&gt;
&lt;li&gt;Multiple services can project policy onto the same data plane&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If something feels “non‑intuitive,” it’s often because the design assumes stable internals that don’t exist.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Design for behaviour, not topology&lt;/li&gt;
&lt;li&gt;Keep networking intent simple and explicit&lt;/li&gt;
&lt;li&gt;Assume convergence, not instant change&lt;/li&gt;
&lt;li&gt;Validate behaviour continuously, not just at deployment&lt;/li&gt;
&lt;li&gt;Let the platform do what it’s already good at&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your design needs deep knowledge of hidden mechanics to remain safe, it’s probably too fragile.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Once you treat Azure networking like a software system you &lt;em&gt;declare&lt;/em&gt;, rather than infrastructure you &lt;em&gt;build&lt;/em&gt;, your designs get simpler and your day‑2 operations get much calmer.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/networking/fundamentals/networking-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure networking overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-resource-manager/management/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Resource Manager overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/patterns?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Cloud design patterns - distributed systems thinking&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Wrapping Up 2025 – A Year Well Brewed</title><link>https://blog.brewedinthecloud.com/p/brewed-in-the-cloud-2025-wrap-up/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/brewed-in-the-cloud-2025-wrap-up/</guid><description>&lt;p&gt;Another year down, another cup of coffee emptied and what a year this one has been.&lt;/p&gt;
&lt;p&gt;This year has easily been one of the biggest for &lt;em&gt;Brewed in the Cloud&lt;/em&gt;. I’ve written &lt;strong&gt;16 series&lt;/strong&gt; totalling &lt;strong&gt;82 individual posts&lt;/strong&gt;, each one fuelled by equal parts curiosity and caffeine. On top of that, I joined my first public event with &lt;strong&gt;&lt;a class="link" href="https://azurebacktoschool.com/" target="_blank" rel="noopener"
&gt;Azure Back to School&lt;/a&gt;&lt;/strong&gt;, was invited onto the &lt;strong&gt;&lt;a class="link" href="https://www.youtube.com/@iamitgeek" target="_blank" rel="noopener"
&gt;I Am IT Geek YouTube Channel&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a class="link" href="https://open.spotify.com/show/58GrpJpgCOxSUxs1TUodzi" target="_blank" rel="noopener"
&gt;PoV: You’re in Tech Podcast&lt;/a&gt;&lt;/strong&gt; and, to top it all off, was honoured to receive my &lt;strong&gt;Microsoft Most Valuable Professional (MVP)&lt;/strong&gt; award.&lt;/p&gt;
&lt;p&gt;It’s been a year of writing, talking, and sharing all things Microsoft Azure — and one of immense personal and professional growth.&lt;/p&gt;
&lt;h2 id="balancing-consulting-and-creativity"&gt;Balancing Consulting and Creativity
&lt;/h2&gt;&lt;p&gt;Balancing a full‑time consulting role while producing this content was no small feat. It’s always difficult to meet the demands of customer projects while wanting to give back to the community, but I’m incredibly fortunate to have the support of the &lt;strong&gt;&lt;a class="link" href="https://cubesys.com.au" target="_blank" rel="noopener"
&gt;cubesys&lt;/a&gt;&lt;/strong&gt; team encouraging me along the way.&lt;/p&gt;
&lt;p&gt;Making time for your creative craft is essential but equally, it should never feel like a chore. If it does, both your enjoyment and the community’s experience suffer. The goal is to &lt;em&gt;share out of passion, not obligation&lt;/em&gt;, and to keep the process energising rather than draining.&lt;/p&gt;
&lt;h2 id="a-major-milestone--becoming-a-microsoft-mvp"&gt;A Major Milestone – Becoming a Microsoft MVP
&lt;/h2&gt;&lt;p&gt;One of the biggest highlights of the year was being recognised as a &lt;strong&gt;Microsoft Most Valuable Professional (MVP)&lt;/strong&gt;. It’s an incredible honour and something I’ve aspired to since starting &lt;em&gt;Brewed in the Cloud&lt;/em&gt;. This recognition represents not just the content I’ve written, but the collaboration, conversations, and mutual learning we share across the Azure community every day. It’s a reminder that genuine knowledge sharing really does make an impact.&lt;/p&gt;
&lt;h2 id="by-the-numbers"&gt;By the Numbers
&lt;/h2&gt;&lt;p&gt;This year, around &lt;strong&gt;4600 unique users&lt;/strong&gt; visited the site with just under &lt;strong&gt;9000 page views&lt;/strong&gt;, according to Google Analytics. Those numbers are far beyond what I expected when I first started this journey and it’s all thanks to those who stop by, read, comment, or reach out. Every click and message provides motivation to keep learning and sharing.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;a class="link" href="https://cubesys.com.au" target="_blank" rel="noopener"
&gt;cubesys&lt;/a&gt;&lt;/strong&gt; team also had a massive year, being recognised as a &lt;strong&gt;Global Finalist for Community Impact&lt;/strong&gt; at &lt;em&gt;Microsoft Ignite 2025&lt;/em&gt;, and locally as a &lt;strong&gt;Cloud Finalist&lt;/strong&gt; at the &lt;em&gt;ARN Innovation Awards&lt;/em&gt;. To be part of a team delivering that level of community impact has been an absolute privilege.&lt;/p&gt;
&lt;h2 id="highlights-from-the-blog"&gt;Highlights from the Blog
&lt;/h2&gt;&lt;p&gt;A few series really stood out for me this year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/tags/vdi-e8-ml2/" target="_blank" rel="noopener"
&gt;Essential 8 ML2 in Microsoft Cloud VDI&lt;/a&gt;:&lt;/strong&gt;&lt;br&gt;
This series was well outside my comfort zone, but by implementing and testing a lot of theory, I proved to myself that I can learn, adapt, and teach especially in moments when I might be hitting a creative block.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/tags/dns/" target="_blank" rel="noopener"
&gt;Mastering Azure DNS Solutions&lt;/a&gt;:&lt;/strong&gt;&lt;br&gt;
This one filled what I felt was a real gap in the community: explaining the range of Azure DNS options and how they apply in real‑world solutions. It connected with a lot of readers and reinforced how powerful clear, practical education can be.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="looking-ahead-to-2026"&gt;Looking Ahead to 2026
&lt;/h2&gt;&lt;p&gt;Next year, I want to continue writing but start branching out into new mediums as well expect to see more &lt;strong&gt;video content&lt;/strong&gt; and &lt;strong&gt;podcast‑style discussions&lt;/strong&gt;, expanding how &lt;em&gt;Brewed in the Cloud&lt;/em&gt; shares knowledge with the Azure community.&lt;/p&gt;
&lt;p&gt;It’s time to brew up the next format and see where it takes us.&lt;/p&gt;
&lt;h2 id="a-seasonal-note"&gt;A Seasonal Note
&lt;/h2&gt;&lt;p&gt;As we close out 2025, I want to thank everyone who’s taken the time to read, share, or drop a comment through the year. Your support fuels this project more than you probably realise.&lt;/p&gt;
&lt;p&gt;Have a &lt;strong&gt;safe and joyful holiday season&lt;/strong&gt; and a great start to the new year I’ll be back in &lt;strong&gt;late January 2026&lt;/strong&gt; to kick things off again.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; The community grows strongest when you create because you love it not because you have to. Keep your cup full, your curiosity alive, and the rest will take care of itself.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;p&gt;&lt;strong&gt;Thanks again for being part of this journey. Here’s to another well‑brewed year ahead.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – Lessons from the Brew Bench</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-lessons-learned/</link><pubDate>Thu, 11 Dec 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-lessons-learned/</guid><description>&lt;p&gt;If the Azure Landing Zone (ALZ) journey is like brewing the perfect coffee, this post is that honest chat after you’ve over‑extracted a few cups. In real‑world deployments, organisations have to continuously juggle &lt;strong&gt;control vs agility&lt;/strong&gt;, &lt;strong&gt;security vs delivery speed&lt;/strong&gt;, and &lt;strong&gt;innovation vs governance&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;After guiding multiple customers through the latest &lt;strong&gt;Enterprise‑Scale Landing Zone (ESLZ)&lt;/strong&gt; and &lt;strong&gt;Microsoft Sovereign Landing Zone (SLZ)&lt;/strong&gt; frameworks, common lessons have emerged. This post distils those takeaways — including a clearer approach to management group design and naming. Specifically, we’ll move away from calling a management group &lt;em&gt;LandingZones&lt;/em&gt; and instead use &lt;strong&gt;Workloads&lt;/strong&gt; to remove ambiguity in both design and conversation.&lt;/p&gt;
&lt;h2 id="what-are-we-talking-about"&gt;What Are We Talking About?
&lt;/h2&gt;&lt;p&gt;A &lt;strong&gt;Landing Zone&lt;/strong&gt; in Azure is the &lt;em&gt;blueprint&lt;/em&gt; for secure, scalable, and compliant cloud adoption. It’s not a single deployment but a &lt;strong&gt;framework&lt;/strong&gt; built on key &lt;strong&gt;Cloud Adoption Framework (CAF)&lt;/strong&gt; design areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity and access management&lt;/li&gt;
&lt;li&gt;Network topology and connectivity&lt;/li&gt;
&lt;li&gt;Resource organisation and governance&lt;/li&gt;
&lt;li&gt;Security and compliance&lt;/li&gt;
&lt;li&gt;Operations and monitoring&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Landing Zone defines &lt;em&gt;how&lt;/em&gt; your cloud environment behaves — from management groups and policies to identity and network boundaries.&lt;/p&gt;
&lt;h3 id="traditional-vs-sovereign-landing-zones"&gt;Traditional vs Sovereign Landing Zones
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Traditional (Enterprise‑Scale) Landing Zone:&lt;/strong&gt;&lt;br&gt;
Focused on enablement and agility. Suitable for enterprises operating in standard Azure regions, balancing control with speed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sovereign Landing Zone (SLZ):&lt;/strong&gt;&lt;br&gt;
Brings in region‑specific compliance, isolation, and regulatory enforcement — designed for governments or regulated industries where &lt;strong&gt;data residency, evidence‑based compliance,&lt;/strong&gt; and &lt;strong&gt;jurisdiction control&lt;/strong&gt; are mandatory.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While the architectural philosophies overlap, their priorities differ: ALZ optimises for &lt;em&gt;velocity&lt;/em&gt;, SLZ for &lt;em&gt;assurance&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;h3 id="traditional-azure-landing-zone"&gt;Traditional Azure Landing Zone
&lt;/h3&gt;&lt;p&gt;A traditional ALZ uses modular design and automation-first governance, enabling global scaling across multiple regions and tenants.&lt;/p&gt;
&lt;p&gt;Key building blocks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Management group hierarchy aligned to business or environment structure&lt;/li&gt;
&lt;li&gt;Centrally applied policies and RBAC for consistency&lt;/li&gt;
&lt;li&gt;Shared platform services (network, monitoring, identity) in separate subscriptions&lt;/li&gt;
&lt;li&gt;Continuous delivery pipelines or Infrastructure‑as‑Code via Bicep or Terraform&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sovereign-landing-zone"&gt;Sovereign Landing Zone
&lt;/h3&gt;&lt;p&gt;Building on the same logic, an SLZ adds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data residency enforcement and regional isolation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restricted service sets and endpoints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predefined compliance mappings&lt;/strong&gt; (e.g. IRAP, PSPF, GDPR)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced auditing and evidence collection&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sovereign doesn’t replace ALZ — it’s a focused flavour built to satisfy regulatory obligations while maintaining enterprise governance principles.&lt;/p&gt;
&lt;h2 id="comparing-sovereign-and-traditional-landing-zones"&gt;Comparing Sovereign and Traditional Landing Zones
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Business Requirement&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Traditional Azure Landing Zone (ALZ)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Sovereign Landing Zone (SLZ)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Global scalability and flexibility&lt;/td&gt;
&lt;td&gt;✅ Designed for global access across Azure regions&lt;/td&gt;
&lt;td&gt;⚠️ Region‑restricted to authorised sovereign zones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Common compliance (ISO 27001, SOC2)&lt;/td&gt;
&lt;td&gt;✅ Standard CAF policy packs with Defender for Cloud integration&lt;/td&gt;
&lt;td&gt;✅ Adds regulated‑industry control sets and compliance mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data residency and jurisdiction control&lt;/td&gt;
&lt;td&gt;⚠️ Achievable by region choice and resource policies&lt;/td&gt;
&lt;td&gt;✅ Enforced at tenant, policy, and network boundary levels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational speed and developer agility&lt;/td&gt;
&lt;td&gt;✅ High, supports rapid release and CI/CD&lt;/td&gt;
&lt;td&gt;⚠️ Controlled workflows and stricter approval gates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence‑based auditing&lt;/td&gt;
&lt;td&gt;⚠️ Manual or pipeline‑based evidence collection&lt;/td&gt;
&lt;td&gt;✅ Pre‑mapped controls for audit frameworks, automatable evidence outputs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service availability and integrations&lt;/td&gt;
&lt;td&gt;✅ Full Azure catalogue available&lt;/td&gt;
&lt;td&gt;⚠️ Restricted to approved sovereign service subset&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="example-scenarios"&gt;Example Scenarios
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Example 1 – Retail Expansion Across APAC&lt;/strong&gt;&lt;br&gt;
A multinational retailer needs consistent governance, global scalability, and moderate compliance.&lt;br&gt;
➡️ &lt;strong&gt;Recommendation:&lt;/strong&gt; Traditional ALZ with region‑specific policy tailoring. This supports rapid feature delivery while maintaining cost and security visibility.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 2 – Government Health Department&lt;/strong&gt;&lt;br&gt;
A state health agency must keep sensitive citizen data within national borders under IRAP and PSPF compliance frameworks.&lt;br&gt;
➡️ &lt;strong&gt;Recommendation:&lt;/strong&gt; Sovereign Landing Zone using &lt;strong&gt;Microsoft Cloud for Sovereignty&lt;/strong&gt;. Isolated policy sets and private connectivity ensure data jurisdiction and audit readiness.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Choosing between traditional and sovereign landing zones reshapes how platform, network, and security teams collaborate.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deployment velocity:&lt;/strong&gt; Sovereign adds rigor; traditional prioritises speed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform ownership:&lt;/strong&gt; Workload separation becomes critical so different teams can innovate without jeopardising compliance boundaries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maturity evolution:&lt;/strong&gt; Organisations often start with a traditional landing zone, introducing sovereign constructs later as regulatory scope widens.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The most successful teams don’t treat these as opposites — they view sovereign controls as extensions of a mature governance posture.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal--management-group-structure"&gt;Azure Portal – Management Group Structure
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define Your Management Group Hierarchy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Recommended baseline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Root
&lt;ul&gt;
&lt;li&gt;Platform &lt;em&gt;(identity, connectivity, security, management)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Workloads &lt;em&gt;(clearer term replacing “LandingZones”)&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Corp&lt;/li&gt;
&lt;li&gt;Online&lt;/li&gt;
&lt;li&gt;Sandbox&lt;/li&gt;
&lt;li&gt;Sovereign &lt;em&gt;(for regulated or region‑restricted environments)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why “Workloads”?&lt;/strong&gt;&lt;br&gt;
Using &lt;em&gt;LandingZones&lt;/em&gt; as a management group name often confuses teams, because it overlaps with the conceptual ALZ itself.&lt;br&gt;
“Workloads” better describes the environments (applications, services, data systems) &lt;em&gt;running on the platform&lt;/em&gt; — giving clean separation between the &lt;strong&gt;Platform&lt;/strong&gt; providing governance and the &lt;strong&gt;Workloads&lt;/strong&gt; consuming it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy Your ALZ or SLZ Baseline&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Traditional ALZ setup from the &lt;a class="link" href="https://github.com/Azure/Enterprise-Scale" target="_blank" rel="noopener"
&gt;Azure/Enterprise-Scale GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;SLZ variants from the &lt;a class="link" href="https://github.com/Azure/sovereign-landing-zone" target="_blank" rel="noopener"
&gt;Microsoft Sovereign Landing Zone repo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assign and Scope Policies Appropriately&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platform MG → Core policies (Defender, diagnostics, RBAC).&lt;/li&gt;
&lt;li&gt;Workloads MG → Application/Environment controls or sovereign compliance packs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="management-group-hierarchy--platform-and-workloads-view"&gt;Management Group Hierarchy – Platform and Workloads View
&lt;/h3&gt;&lt;div class="mermaid"&gt;graph TD
A[Root MG] --&gt; B[Platform]
B --&gt; B1[Identity]
B --&gt; B2[Connectivity]
B --&gt; B3[Security &amp; Management]
A --&gt; C[Workloads]
C --&gt; D["Corp (Traditional)"]
C --&gt; E[Online]
C --&gt; F[Sandbox]
C --&gt; G[Sovereign]
G --&gt; H[Protected Data Workloads]
G --&gt; I[Gov Cloud Services]
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Design takeaway:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Landing Zone&lt;/strong&gt; = architectural framework and governance design.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workloads&lt;/strong&gt; = operational environments where real applications are deployed.&lt;br&gt;
This naming keeps responsibilities, policies, and discussions clear between teams.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Feature availability:&lt;/strong&gt; Sovereign clouds lag slightly behind global Azure in service parity. Validate service lists before deployment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identity boundaries:&lt;/strong&gt; Dedicated Azure AD tenants for sovereign clouds may require federated or external B2B setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy drift:&lt;/strong&gt; Copying policies manually instead of version‑controlling changes disrupts ALZ upgrade paths.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscription sprawl:&lt;/strong&gt; Workload owners often over‑provision subscriptions. Address this through CAF‑aligned naming and tagging standards.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Define business drivers first:&lt;/strong&gt; Is data residency regulatory or preference? That decides ALZ vs SLZ path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automate compliance:&lt;/strong&gt; Policies and governance artefacts should produce evidence directly usable by auditors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Workloads as the separator:&lt;/strong&gt; Platform = guardrails. Workloads = delivery spaces. Keep boundaries firm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parameterise everything:&lt;/strong&gt; Build one template to deploy both ALZ and SLZ variants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrate culture with architecture:&lt;/strong&gt; Platform and security teams must agree on the definition of &amp;ldquo;secure enough&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version control your baselines:&lt;/strong&gt; Store every policy set and blueprint like software releases.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Changing “LandingZones” to “Workloads” isn’t just semantics — it’s a clarity upgrade. Teams design and talk more effectively when they can distinguish the &lt;strong&gt;framework that governs&lt;/strong&gt; from the &lt;strong&gt;spaces that consume&lt;/strong&gt;. Whether sovereign or traditional, a well‑structured landing zone is like a good roast profile: consistent, intentional, and adaptable to taste.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Cloud Adoption Framework – Landing Zone Design Areas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Azure/Enterprise-Scale?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Enterprise‑Scale Landing Zone Reference Implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/governance/policy/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Policy Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – Cost, Scale, and Landing Zone Optimisation</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-cost-optimisation/</link><pubDate>Tue, 09 Dec 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-cost-optimisation/</guid><description>&lt;p&gt;Every cloud architect eventually faces a moment when they realise their Azure footprint is growing faster than their governance can keep up. Think of it as your data centre turning into an over‑caffeinated espresso machine — powerful, but prone to overflow without a well‑placed drip tray.&lt;/p&gt;
&lt;p&gt;Landing Zones, both enterprise and sovereign flavours, must do more than deploy infrastructure at scale — they need to manage &lt;em&gt;cost velocity&lt;/em&gt; with intent. This post focuses on how to keep your Azure Landing Zone (ALZ or SLZ) well‑tuned, ensuring growth without runaway spend or unnecessary complexity.&lt;/p&gt;
&lt;h2 id="-what-is-cost-and-scale-optimisation-in-landing-zones"&gt;🔍 What is Cost and Scale Optimisation in Landing Zones?
&lt;/h2&gt;&lt;p&gt;At its core, cost and scale optimisation within an Azure Landing Zone is about &lt;strong&gt;controlling expansion without constraining capability&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The Azure Cloud Adoption Framework (CAF) divides design into several areas — management, governance, security, and platform operations — each with a cost impact.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Optimisation&lt;/strong&gt; ensures your resource hierarchy (management groups, subscriptions, resource groups) aligns with your financial governance model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scaling responsibly&lt;/strong&gt; means creating clear subscription boundaries for workloads, environments (dev/test/prod), or compliance zones.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Sovereign Landing Zones (SLZ)&lt;/strong&gt;, optimisation frameworks extend into jurisdictional controls, where cost transparency must be aligned with data residency or sovereignty constraints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By embedding &lt;strong&gt;FinOps principles&lt;/strong&gt; and &lt;strong&gt;Azure Cost Management&lt;/strong&gt; early in design, you turn reactive cost clean‑ups into proactive, measurable efficiency.&lt;/p&gt;
&lt;h2 id="-how-it-works"&gt;⚙️ How It Works
&lt;/h2&gt;&lt;h3 id="1-subscription-growth-and-split-patterns"&gt;1. Subscription Growth and Split Patterns
&lt;/h3&gt;&lt;p&gt;Landing Zones typically adopt a &lt;strong&gt;subscription vending model&lt;/strong&gt; — providing repeatable units that developers or ops teams can deploy within policy boundaries. The growth management model should consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Horizontal Scale:&lt;/strong&gt; One subscription per workload or environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vertical Scale:&lt;/strong&gt; Dedicated subscriptions for shared services, monitoring, or networking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Controlled Growth:&lt;/strong&gt; Use &lt;strong&gt;Azure Policy&lt;/strong&gt; or &lt;strong&gt;Blueprints&lt;/strong&gt; to limit unauthorised subscription creation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In enterprise environments, scaling is normally orchestrated through &lt;strong&gt;ALZ Accelerator templates&lt;/strong&gt; or &lt;strong&gt;Terraform/Bicep pipelines&lt;/strong&gt; that integrate subscriptions into governance structures automatically.&lt;/p&gt;
&lt;h3 id="2-management-group-cost-governance"&gt;2. Management Group Cost Governance
&lt;/h3&gt;&lt;p&gt;Management groups enable aggregated &lt;strong&gt;cost insights&lt;/strong&gt; and allow charge‑back/show‑back reporting across organisational units. Assign &lt;strong&gt;budgets&lt;/strong&gt;, &lt;strong&gt;cost alerts&lt;/strong&gt;, and &lt;strong&gt;policies&lt;/strong&gt; at these layers for enterprise visibility.&lt;/p&gt;
&lt;p&gt;Diagrammatically:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
A[Root Management Group] --&gt; B[Platform]
A --&gt; C[Landing Zones]
B --&gt; D[Shared Services Subscription]
B --&gt; E[Connectivity Subscription]
C --&gt; F[Workload Subscription 1]
C --&gt; G[Workload Subscription 2]
A --&gt; H[Management Group Policies: Cost, Budget, Tag Enforce]
&lt;/div&gt;
&lt;p&gt;Here, budget and tagging policies flow from the Root or Platform layers down to each subscription, maintaining consistency while allowing scale.&lt;/p&gt;
&lt;h3 id="3-tagging-budgets-and-finops-integration"&gt;3. Tagging, Budgets, and FinOps Integration
&lt;/h3&gt;&lt;p&gt;Tags like &lt;code&gt;Environment&lt;/code&gt;, &lt;code&gt;BusinessUnit&lt;/code&gt;, and &lt;code&gt;CostCentre&lt;/code&gt; drive accountability. Combine these with &lt;strong&gt;Azure Policy&lt;/strong&gt; for mandatory tagging and integrate with &lt;strong&gt;Azure Cost Management + Billing&lt;/strong&gt; APIs for financial automation.&lt;/p&gt;
&lt;p&gt;Consider using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Monitor Workbooks&lt;/strong&gt; for cost visualisation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Power BI with Cost Management connector&lt;/strong&gt; for cross‑subscription analysis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FinOps Open Cost and Usage Specification (FOCUS)&lt;/strong&gt; export formats for interoperability with other FinOps tooling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For Sovereign Landing Zones, tagging can be extended with jurisdictional flags such as &lt;code&gt;DataResidency=AU&lt;/code&gt; or &lt;code&gt;ComplianceRegime=ACSC&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="4-aligning-with-sovereign-controls"&gt;4. Aligning with Sovereign Controls
&lt;/h3&gt;&lt;p&gt;When operating under &lt;strong&gt;sovereign cloud models&lt;/strong&gt; — such as Azure Australia Central or government‑restricted environments — ensure &lt;strong&gt;all cost and telemetry exports&lt;/strong&gt; remain within the sovereign boundary.&lt;br&gt;
Use region‑specific APIs, endpoints, and compliance‑approved tooling for cost analysis and monitoring. This ensures financial data sovereignty aligns with jurisdictional regulations without compromising insight or automation efficiency.&lt;/p&gt;
&lt;h2 id="-realworld-impact"&gt;🌏 Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Let’s say you’re operating a multi‑region landing zone spanning public sector workloads in Australia and New Zealand. Without enforcing subscription separation or tagging, shared resource costs start blending across compliance boundaries.&lt;/p&gt;
&lt;p&gt;By introducing structured hierarchy and budget controls:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visibility improves — you can now break down cost by agency, workload, or data jurisdiction.&lt;/li&gt;
&lt;li&gt;Forecasting accuracy increases — line‑of‑business teams own their consumption.&lt;/li&gt;
&lt;li&gt;SLZ frameworks seamlessly align policy enforcement with local regulatory reporting, helping meet sovereign requirements without sacrificing agility.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This balance between decentralised empowerment and central oversight is the hallmark of a mature Azure Landing Zone.&lt;/p&gt;
&lt;h2 id="-implementation-examples"&gt;🧩 Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal-walkthrough"&gt;&lt;strong&gt;Azure Portal Walkthrough&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Cost Management + Billing → Cost Alerts → + Add&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;budget&lt;/strong&gt; scoped to your management group or subscription&lt;/li&gt;
&lt;li&gt;Assign an &lt;strong&gt;action group&lt;/strong&gt; to notify or trigger automation (e.g. Logic App for tagging enforcement)&lt;/li&gt;
&lt;li&gt;Validate budget alignment within &lt;strong&gt;Azure Policy Compliance&lt;/strong&gt; view&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example--cost-governance"&gt;&lt;strong&gt;Bicep Example – Cost Governance&lt;/strong&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;managementGroupId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;costThreshold&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;float&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;emailAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;budget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Consumption/budgets@2021-10-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;managementGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;managementGroupId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mg-budget&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Cost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;costThreshold&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeGrain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Monthly&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timePeriod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;2025-01-01T00:00:00Z&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;2025-12-31T23:59:59Z&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;notifications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;alertWhenOver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;GreaterThan&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;90&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;contactEmails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;emailAddress&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This script deploys a management group‑scoped budget with alerting, ideal for ALZ cost governance automation.&lt;/p&gt;
&lt;h2 id="-gotchas--edge-cases"&gt;🧱 Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tag sprawl&lt;/strong&gt; can become a problem — align mandatory tags to a central schema stored in a repo or CMDB.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MFA/Privileged Access&lt;/strong&gt; blocks automation — ensure service principals used for budget or policy deployment have least‑privilege roles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sovereign clouds&lt;/strong&gt; may have &lt;strong&gt;feature gaps&lt;/strong&gt; in cost export or telemetry capabilities. Validate region‑specific limitations before implementing FinOps pipelines.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-best-practices"&gt;✅ Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Enforce &lt;strong&gt;mandatory tags&lt;/strong&gt; through policy at the Platform or Corp MG level.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;budgets and alerts at management groups&lt;/strong&gt; — not just subscriptions.&lt;/li&gt;
&lt;li&gt;Integrate &lt;strong&gt;deployment pipelines with cost tracking&lt;/strong&gt; for transparency.&lt;/li&gt;
&lt;li&gt;Leverage &lt;strong&gt;Azure Policy exemptions&lt;/strong&gt; sparingly to maintain consistent governance.&lt;/li&gt;
&lt;li&gt;Adopt &lt;strong&gt;CAF Cost Management design considerations&lt;/strong&gt; early in Landing Zone evolution.&lt;/li&gt;
&lt;li&gt;For SLZ, map cost objects to &lt;strong&gt;data sovereignty boundaries&lt;/strong&gt; to simplify audit readiness.&lt;/li&gt;
&lt;li&gt;Ensure &lt;strong&gt;cost data exports stay within sovereign boundaries&lt;/strong&gt; when required by regulation.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; A strong cloud strategy isn’t just about speed — it’s about sustainability.&lt;br&gt;
Like a well‑balanced brew, your Landing Zone should scale smoothly, with no bitter aftertaste of surprise invoices.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="-learn-more"&gt;📚 Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zones – Microsoft Cloud Adoption Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/cloud-computing/finops/framework/finops-framework?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;FinOps Framework Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cost-management-billing/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Cost Management + Billing documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Azure/azure-quickstart-templates?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Budget and Alert ARM/Bicep Samples on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – Extending to Hybrid and Multicloud</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-hybrid-extension/</link><pubDate>Thu, 04 Dec 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-hybrid-extension/</guid><description>&lt;p&gt;If an Azure Landing Zone is your perfectly dialled-in espresso shot, then extending it to hybrid and multicloud environments is like adding a splash of milk and foam—smooth integration, but balance is everything.&lt;br&gt;
Enterprises rarely live in a single-cloud world anymore, and Microsoft’s Azure Landing Zone (ALZ) blueprint is evolving to embrace this complexity with hybrid and multicloud patterns.&lt;/p&gt;
&lt;p&gt;As cloud estates span data centres, AWS, and private clusters, it’s no longer enough for ALZ design areas to stop at the Azure boundary. In this post, we’ll unpack how to seamlessly extend the ALZ approach beyond Azure—while keeping consistent governance, security, and observability in the mix, and respecting the special conditions of Sovereign Landing Zones (SLZs).&lt;/p&gt;
&lt;h2 id="what-is-hybrid-and-multicloud-extension-of-an-alz"&gt;What is Hybrid and Multicloud Extension of an ALZ?
&lt;/h2&gt;&lt;p&gt;Hybrid and multicloud extension refers to applying &lt;strong&gt;Azure Landing Zone design principles and controls&lt;/strong&gt; to resources that sit outside Azure, such as on-premises servers or workloads hosted in AWS or Google Cloud.&lt;/p&gt;
&lt;p&gt;The Azure Landing Zone concept—rooted in the &lt;strong&gt;Cloud Adoption Framework (CAF)&lt;/strong&gt;—includes governance, operations, networking, and identity. Extending these patterns ensures non‑Azure resources are equally governed, monitored, and secured under a unified control plane.&lt;/p&gt;
&lt;p&gt;Microsoft achieves this through services such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Arc&lt;/strong&gt; – Extends Azure Resource Manager (ARM) to physical or virtual resources hosted anywhere.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Defender for Cloud connectors&lt;/strong&gt; – Bring AWS and GCP accounts under unified security posture management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra ID&lt;/strong&gt; – Provides consistent identity and Conditional Access across platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation &amp;amp; DevOps Pipelines&lt;/strong&gt; – Landing Zone accelerators built with Bicep or Terraform can enforce governance continuously.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sovereign Landing Zones (SLZs)&lt;/strong&gt; – Variants of ALZ optimised for compliance, regulatory restrictions, and regional data sovereignty, particularly relevant for defence and public organisations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;Extending ALZ beyond Azure involves connecting external resources to the Azure control plane via &lt;strong&gt;Azure Arc&lt;/strong&gt;, applying existing management groups, policies, and role assignments to them, and orchestrating deployments through automation pipelines.&lt;/p&gt;
&lt;h3 id="architecture-overview"&gt;Architecture Overview
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart TD
subgraph Azure
A[Management Group Hierarchy]
B["Policy &amp; RBAC via Entra ID / PIM"]
C["Azure Monitor / Log Analytics / Sentinel"]
G["Landing Zone Automation - Bicep Pipelines"]
end
subgraph External
D["Azure Arc-enabled Servers &amp; Clusters"]
E["AWS &amp; GCP Accounts via Defender for Cloud Connectors"]
F["On-premises Network Fabric"]
end
A --&gt; B --&gt; C
A --&gt; D
A --&gt; E
D --&gt; F
G --&gt; A
C --&gt;|"Unified Logs &amp; Metrics"| F
&lt;/div&gt;
&lt;h3 id="design-area-alignment"&gt;Design Area Alignment
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Design Area&lt;/th&gt;
&lt;th&gt;Hybrid Extension Pattern&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identity &amp;amp; Access Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Entra ID federation and PIM extend RBAC. Hybrid staff identities reside in a single tenant or trusted forests.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource Organisation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hybrid assets appear under existing management groups such as &lt;code&gt;/providers/Microsoft.Management/managementGroups/Contoso-Hybrid&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use Azure Network Manager to link ExpressRoute, VPN, and multicloud peering. Ensure DNS and firewalls support name resolution for Arc and Defender endpoints.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security &amp;amp; Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Policies and Defender for Cloud baselines enforced across connected cloud providers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Azure Monitor and Log Analytics centralise observability; Arc collects guest and container telemetry.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automation &amp;amp; DevOps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ALZ Accelerator Bicep modules or Terraform templates manage deployments uniformly across environments.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;For most enterprise environments, hybrid isn’t a transition—it’s the new default.&lt;/p&gt;
&lt;p&gt;Take a state government agency required to meet local data residency and IRAP compliance. They operate on Azure Australia Central, host sensitive datasets on an on‑premises secure enclave, and leverage AWS for public‑facing digital services.&lt;br&gt;
By enabling Azure Arc, Defender multicloud connectors, and unified Entra ID, the agency enforces consistent governance through a single ALZ hierarchy while maintaining jurisdictional controls per SLZ mandates.&lt;/p&gt;
&lt;p&gt;Their compliance posture—aligned with Australian Government ISM and DTA Hosting Certification—is visible in one place, enabling continuous compliance without separate operational silos.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal-high-level-steps"&gt;Azure Portal: High-Level Steps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;Azure Portal&lt;/strong&gt;, go to &lt;strong&gt;Azure Arc → Servers → Add&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Download and install the Arc agent on any non‑Azure machine.&lt;/li&gt;
&lt;li&gt;The resource appears in your subscription under the correct management group.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Defender for Servers&lt;/strong&gt; or &lt;strong&gt;Defender for Containers&lt;/strong&gt; for extended protection.&lt;/li&gt;
&lt;li&gt;Apply &lt;strong&gt;Azure Policy&lt;/strong&gt; guest configuration for ongoing compliance.&lt;/li&gt;
&lt;li&gt;Deploy &lt;strong&gt;automation pipelines&lt;/strong&gt; (e.g., Bicep via GitHub Actions) to enforce governance continuously.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example"&gt;Bicep Example
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;arcServerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyAssignmentName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyScope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;arcServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.HybridCompute/machines@2022-08-11&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;arcServerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Linux&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Ubuntu20.04&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policyAssignments@2022-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyAssignmentName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Arc Server Security Baseline&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyScope&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;platformAutomation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;../modules/alz-pipelines.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;deploy-pipelines&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgScope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This sample ties Arc registration and policy assignment together, then references a reusable ALZ automation module for deployment pipelines.&lt;/p&gt;
&lt;h3 id="sovereign-cloud-integration-examples"&gt;Sovereign Cloud Integration Examples
&lt;/h3&gt;&lt;p&gt;For &lt;strong&gt;Sovereign Landing Zones&lt;/strong&gt;, especially in &lt;strong&gt;Azure Australia Central&lt;/strong&gt;, &lt;strong&gt;Azure Government&lt;/strong&gt;, or &lt;strong&gt;Azure China&lt;/strong&gt;, there are additional steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;private or restricted connectivity&lt;/strong&gt; for all Arc agent communications—via Private Link or approved egress proxies.&lt;/li&gt;
&lt;li&gt;Deploy monitoring and Defender instances &lt;strong&gt;within each sovereign region&lt;/strong&gt; to maintain data residency.&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;regional Log Analytics workspaces&lt;/strong&gt; and &lt;strong&gt;local Sentinel&lt;/strong&gt; instances to avoid telemetry export breaches.&lt;/li&gt;
&lt;li&gt;Align resource tagging and policy definitions with your compliance framework—e.g., &lt;strong&gt;IRAP&lt;/strong&gt;, &lt;strong&gt;ISO 27001&lt;/strong&gt;, or &lt;strong&gt;Essential Eight&lt;/strong&gt; maturity goals.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Latency and agent dependencies:&lt;/strong&gt; Arc‑enabled servers need outbound connectivity to regional Azure endpoints—tricky in sovereign or air‑gapped environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RBAC and PIM gaps:&lt;/strong&gt; Temporary elevation or mismatched role definitions can break automation. Sync identity definitions and enforce PIM controls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disconnected or restricted SLZs:&lt;/strong&gt; Some configuration scripts assume public Azure endpoints; pre‑validate management URLs for sovereign clouds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy drift:&lt;/strong&gt; Multicloud connectors may introduce lag in policy or Defender posture reporting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation scope:&lt;/strong&gt; When deploying landing zones via pipelines, ensure identity permissions span hybrid management groups and subscriptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Centralise policy at management group level&lt;/strong&gt; – Create a &lt;code&gt;contoso-hybrid&lt;/code&gt; node under your ALZ hierarchy for hybrid assets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforce least privilege through Entra ID and PIM&lt;/strong&gt;, including workload identities for automation accounts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Arc for Servers, Kubernetes, and SQL&lt;/strong&gt; to maximise telemetry and control plane reach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy landing zone accelerators via CI/CD pipelines&lt;/strong&gt;, using the official ALZ Bicep modules or Terraform equivalents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Segment sovereign workloads&lt;/strong&gt; into their own subscriptions, mapped to regional constraints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operate monitoring regionally&lt;/strong&gt; – Keep logs and data within sovereign or regulated regions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuously review Defender connectors&lt;/strong&gt; and APIs to align with provider updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; A great flat white is all about balance—so is hybrid governance.&lt;br&gt;
When you extend Azure Landing Zones into hybrid and sovereign clouds, think of it less as expanding control and more as achieving operational harmony: consistent identity, policy, and assurance everywhere your workloads live.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zone architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-arc/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Arc overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/plan-multicloud-security-get-started?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Defender for Cloud multicloud connectors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/governance/policy/concepts/guest-configuration?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Policy Guest Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Azure/ALZ-Bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;ALZ Bicep Accelerator GitHub repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-australia/australia-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Australia Central regions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/microsoft-365/compliance/offering-home?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Compliance offerings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>From Zero to Hero: The Journey to Microsoft MVP</title><link>https://blog.brewedinthecloud.com/p/from-zero-to-hero-microsoft-mvp-journey/</link><pubDate>Wed, 03 Dec 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/from-zero-to-hero-microsoft-mvp-journey/</guid><description>&lt;h3 id="one-month-later"&gt;One Month Later
&lt;/h3&gt;&lt;p&gt;It’s been a month since that email landed — the one that made every late night, every draft blog, and every community chat feel worthwhile. I’d officially joined the ranks of the Microsoft MVPs.&lt;/p&gt;
&lt;p&gt;For nearly two years, that goal hovered quietly in the background. Not as a badge of validation, but as a symbol of growth, proof that passion and persistence in the community could translate into meaningful impact.&lt;/p&gt;
&lt;h3 id="inspiration-close-to-home"&gt;Inspiration Close to Home
&lt;/h3&gt;&lt;p&gt;My motivation came from seeing others do what I aspired to do. Working alongside Australian MVPs and local content creators showed me what genuine community engagement looked like it&amp;rsquo;s collaboration over competition, learning over ego.&lt;/p&gt;
&lt;p&gt;They weren’t chasing recognition; they were sharing because they loved what they did. That energy was contagious, and it helped me find my own rhythm.&lt;/p&gt;
&lt;h3 id="a-look-at-the-numbers"&gt;A Look at the Numbers
&lt;/h3&gt;&lt;p&gt;The Microsoft MVP community might seem global and vast with around 3900 members around the world, but drill down to Australia where is only 122 (thats ~3.12%) current MVP&amp;rsquo;s whilst unsurprising for sum what it does suggest that a tight-knit group or people are making a significant local impact.&lt;/p&gt;
&lt;h4 id="mvps-in-australia-by-category"&gt;MVPs in Australia by Category
&lt;/h4&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Approx. Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Developer Technology&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M365&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business Applications&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Platform&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure AI Foundry&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internet of Things&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Devices&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud and Data Management&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Development&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;122&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You can easily see where Australia’s MVP strength lies — M365 and Azure lead the way, reflecting how deeply those platforms run across local enterprises.&lt;/p&gt;
&lt;h4 id="mvps-in-australia-by-stateterritory"&gt;MVPs in Australia by State/Territory
&lt;/h4&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State / Territory&lt;/th&gt;
&lt;th&gt;Approx. Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New South Wales (NSW)&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Australian Capital Territory (ACT)&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queensland (QLD)&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;South Australia (SA)&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Victoria (VIC)&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Western Australia (WA)&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;122&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I call NSW home and with around &lt;strong&gt;8 Azure MVPs in the state&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="writing-with-purpose"&gt;Writing with Purpose
&lt;/h3&gt;&lt;p&gt;For me, it all started with writing. Sharing what I learnt about Azure networking, infrastructure, and security wasn’t just about documenting my work it has become how I learned best.&lt;/p&gt;
&lt;p&gt;Consistency was the real differentiator. I didn’t write because I had free time; I &lt;strong&gt;made time&lt;/strong&gt; because I wanted to contribute. Even when writer’s block kicked in, even when posts didn’t land perfectly I showed up again the next week.&lt;/p&gt;
&lt;p&gt;That’s what slowly turned effort into opportunity.&lt;/p&gt;
&lt;h3 id="burnout-block-and-brewing-through-it"&gt;Burnout, Block, and Brewing Through It
&lt;/h3&gt;&lt;p&gt;There were definitely low points. Burnout crept in. Writer’s block hit hard. Some weeks I’d question whether the effort even mattered.&lt;/p&gt;
&lt;p&gt;If you’re creating content or contributing to the community, a few lessons I learnt the hard way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consistency ≠ relentlessness.&lt;/strong&gt; You can take breaks. Sustainability beats speed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Batch your creativity.&lt;/strong&gt; When you’re in the zone, create more than you need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connect with others.&lt;/strong&gt; Community thrives on collaboration, not just contributions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some of my best ideas came after a pause, not during the grind. Much like coffee — sometimes you need to let it brew.&lt;/p&gt;
&lt;h3 id="supported-by-community"&gt;Supported by Community
&lt;/h3&gt;&lt;p&gt;I owe so much to the people who encouraged me when they didn’t have to those who read early drafts, shared posts, invited me to speak, or simply said, “keep going”.&lt;/p&gt;
&lt;p&gt;Behind every MVP announcement is an invisible network of encouragers and motivators. My success is as much theirs as it is mine.&lt;/p&gt;
&lt;h3 id="understanding-the-mvp-application-process"&gt;Understanding the MVP Application Process
&lt;/h3&gt;&lt;p&gt;Since going through this process myself I have had others ask around &lt;em&gt;how&lt;/em&gt; someone becomes an MVP, so let’s break it down.&lt;/p&gt;
&lt;p&gt;To be considered for the Microsoft MVP program:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You must be nominated&lt;/strong&gt; — either by a current MVP or a Microsoft Full-Time Employee (FTE).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You need to provide evidence&lt;/strong&gt; of your &lt;em&gt;community reach&lt;/em&gt;: blogging, public speaking, mentoring, open-source contributions, or any content that helps others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your community work must be independent&lt;/strong&gt; of your paid employment. For example, I regularly speak at webinars hosted by cubesys, but those can’t count toward my community metrics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistency matters.&lt;/strong&gt; Doing one talk or a couple of posts a year won’t cut it. You need to show sustained engagement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stay in your lane.&lt;/strong&gt; Pick the category you genuinely live and breathe. I focused on Azure, it wouldn’t make sense for me to apply under “Software Development” when that’s not my craft.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find a mentor.&lt;/strong&gt; Someone already in the program can be invaluable. They’ll have tips, advice, and nuances you won’t find written anywhere.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The process isn’t designed to gatekeep, it’s designed to recognise authenticity. Microsoft wants people who build &lt;em&gt;community impact&lt;/em&gt;, not just technical trivia.&lt;/p&gt;
&lt;h3 id="encouraging-others-to-chase-their-goals"&gt;Encouraging Others to Chase Their Goals
&lt;/h3&gt;&lt;p&gt;If the MVP journey isn’t your thing, that’s okay. The real message here is to &lt;strong&gt;pursue what excites you&lt;/strong&gt;.&lt;br&gt;
Maybe that’s an AWS Hero, a Google Cloud Champion Innovator, or a VMware vExpert. Each has its own flavour, but they all celebrate the same principle: &lt;em&gt;sharing knowledge and growing your community.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you’re passionate about cloud, security, AI, or open source — start creating, start engaging, start small. You don’t need permission to make an impact.&lt;/p&gt;
&lt;p&gt;As I learnt, the most meaningful journeys don’t start with “how do I get recognised?” — they start with “what can I share today that might help someone else?”&lt;/p&gt;
&lt;h3 id="the-journey-doesnt-end-here"&gt;The Journey Doesn’t End Here
&lt;/h3&gt;&lt;p&gt;Becoming an MVP isn’t where it ends, it’s just a checkpoint.&lt;br&gt;
There’s more to learn, more to build, and more to give back.&lt;/p&gt;
&lt;p&gt;Now that I’ve earned the badge, the goal has shifted to helping others earn theirs, mentoring new contributors, and keeping that same curiosity that started all this in the first place.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Community recognition is brewed from authenticity, consistency, and curiosity.&lt;br&gt;
Awards are fleeting however the impact you make by helping others lasts far longer.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="learn-more"&gt;Learn More
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://mvp.microsoft.com/en-US/MvpSearch" target="_blank" rel="noopener"
&gt;Microsoft MVP Global Directory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-community-training/mvp-overview" target="_blank" rel="noopener"
&gt;Become a Microsoft MVP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://aws.amazon.com/developer/community/heroes/" target="_blank" rel="noopener"
&gt;AWS Heroes Program&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cloud.google.com/innovators" target="_blank" rel="noopener"
&gt;Google Cloud Champions Innovators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://vexpert.vmware.com/" target="_blank" rel="noopener"
&gt;VMware vExpert Program&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – Security Operations and Threat Protection</title><link>https://blog.brewedinthecloud.com/p/azure-secure-landing-zone-operations/</link><pubDate>Tue, 02 Dec 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-secure-landing-zone-operations/</guid><description>&lt;p&gt;You’ve built your landing zone, hardened the edges, and enabled controls—congratulations! But as every seasoned security engineer knows, configuration is only half the battle. Now comes the grind: operationalising your defences. Security operations in Azure isn’t about panic-driven dashboards; it’s about creating a steady rhythm where detection, investigation, and response hum together—like an espresso machine firing on precise pressure and timing.&lt;/p&gt;
&lt;p&gt;In this post, we explore how to bring your &lt;strong&gt;Secure Landing Zone (SLZ)&lt;/strong&gt; to life—turning design principles into active defence through &lt;strong&gt;Defender for Cloud&lt;/strong&gt;, &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt;, and well‑orchestrated response automation.&lt;/p&gt;
&lt;h2 id="-what-is-security-operations-in-the-azure-landing-zone"&gt;☁️ What is Security Operations in the Azure Landing Zone?
&lt;/h2&gt;&lt;p&gt;Within the &lt;strong&gt;Microsoft Cloud Adoption Framework (CAF)&lt;/strong&gt;, “Security” and “Operations” are distinct but tightly woven design areas. The &lt;strong&gt;Security Operations &amp;amp; Threat Protection&lt;/strong&gt; pillar of a landing zone focuses on three operational layers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Detection &amp;amp; Prevention&lt;/strong&gt; – Using Azure-native telemetry and analytic capabilities to identify threats in real time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Response &amp;amp; Recovery&lt;/strong&gt; – Orchestrating workflows to minimise response time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Improvement&lt;/strong&gt; – Leveraging incident learnings to refine detections, policies, and processes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;strong&gt;Secure Landing Zone (SLZ)&lt;/strong&gt; expands on the ALZ baseline by pre‑configuring Defender for Cloud, Sentinel, and Azure Policy for consistent management across tenants and environments.&lt;/p&gt;
&lt;p&gt;For &lt;strong&gt;Microsoft Sovereign Landing Zones&lt;/strong&gt;, this foundation adheres to regional compliance and data residency rules—ensuring operational tooling and telemetry remain within the sovereign boundary.&lt;/p&gt;
&lt;h2 id="-how-it-works"&gt;⚙️ How It Works
&lt;/h2&gt;&lt;p&gt;Core Azure services and design patterns supporting security operations include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Defender for Cloud&lt;/strong&gt; – Posture management and workload protection across hybrid resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Sentinel&lt;/strong&gt; – Cloud-native SIEM/SOAR providing analytics, automation, and incident correlation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Monitor / Log Analytics&lt;/strong&gt; – The telemetry backbone that feeds both proactive (Defender) and reactive (Sentinel) insights.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logic Apps / Automation Accounts&lt;/strong&gt; – Enable incident response playbooks and triage workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Policy &amp;amp; Initiative Assignments&lt;/strong&gt; – Automate deployment and configuration of Defender and Sentinel across landing zones.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="control-plane-alignment"&gt;Control Plane Alignment
&lt;/h3&gt;&lt;p&gt;Operational tooling aligns with your &lt;strong&gt;CAF management group hierarchy&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
A[Root Management Group] --&gt; B[Platform MG]
B --&gt; C[Management &amp; Monitoring Subscription]
B --&gt; D[Connectivity Subscription]
B --&gt; E[Workload Subscriptions]
C --&gt; F[Microsoft Sentinel Workspace]
E --&gt; G[Resource Groups - Workloads]
E --&gt; H[Defender for Cloud Initiative]
&lt;/div&gt;
&lt;h3 id="control-flow-summary"&gt;Control Flow Summary
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Defender for Cloud continuously evaluates resources and raises alerts.&lt;/li&gt;
&lt;li&gt;Alerts and security recommendations stream into Sentinel via connectors.&lt;/li&gt;
&lt;li&gt;Sentinel analytics rules correlate and prioritise incidents.&lt;/li&gt;
&lt;li&gt;Response playbooks (Logic Apps) are triggered automatically or manually.&lt;/li&gt;
&lt;li&gt;Insights feed governance reporting and inform Azure Policy updates.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="-real-world-impact"&gt;🏢 Real-World Impact
&lt;/h2&gt;&lt;p&gt;A financial organisation deploying workloads across &lt;strong&gt;multiple ALZ instances&lt;/strong&gt; found that decentralised monitoring led to inconsistent incident handling. By introducing a &lt;strong&gt;centralised Sentinel &amp;amp; Defender deployment&lt;/strong&gt;, they:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unified threat monitoring under a single pane of glass.&lt;/li&gt;
&lt;li&gt;Normalised incident templates and playbooks.&lt;/li&gt;
&lt;li&gt;Reduced incident response time by more than 40 %.&lt;/li&gt;
&lt;li&gt;Simplified compliance reporting across jurisdictions (including sovereign growth regions).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Security operations maturity thus became an &lt;strong&gt;enabler of scale&lt;/strong&gt;—not just a safeguard.&lt;/p&gt;
&lt;h2 id="-implementation-examples"&gt;🧭 Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal-steps"&gt;Azure Portal Steps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Enable Defender for Cloud&lt;/strong&gt; at the management group level.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy Sentinel&lt;/strong&gt; in a central monitoring subscription linked to a Log Analytics workspace.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connect Data Sources&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Azure AD Sign‑In Logs&lt;/li&gt;
&lt;li&gt;Defender for Cloud Alerts&lt;/li&gt;
&lt;li&gt;Microsoft 365 and Entra Audit Logs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create Automation Playbooks&lt;/strong&gt; for incident response.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tune Analytics Rules&lt;/strong&gt; to fit your environment—start with the Microsoft Security content pack and customise thresholds.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example--sentinel-and-defender-configuration"&gt;Bicep Example – Sentinel and Defender Configuration
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalytics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.OperationalInsights/workspaces@2022-10-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;lz-secops-law&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PerGB2018&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionInDays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;90&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sentinel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.SecurityInsights/onboardingStates@2023-02-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzureSentinel&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceResourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;defenderVMs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Security/pricings@2023-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualMachines&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pricingTier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
Adjust Defender plans and workspace retention for compliance or sovereign requirements
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="-gotchas--edge-cases"&gt;⚠️ Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cross‑tenant ingestion:&lt;/strong&gt; Verify Sentinel workspaces can ingest logs from delegated tenants with proper permissions (reader/contributor roles).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate alerts:&lt;/strong&gt; When connecting Defender and Sentinel, disable redundant analytics templates to avoid noisy false positives.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sovereign Cloud gaps:&lt;/strong&gt; Some connectors (e.g., M365 or AWS) may not be available—check sovereign-specific documentation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Role design:&lt;/strong&gt; Use least‑privilege RBAC—grant only Sentinel Responder or Reader roles to analysts, not subscription‑wide Owner rights.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scale limits:&lt;/strong&gt; At high ingestion volumes (&amp;gt;2 TB/day), consider data partitioning or multiple Sentinel workspaces for performance management.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-best-practices"&gt;✅ Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Deploy &lt;strong&gt;centralised Sentinel and Defender&lt;/strong&gt; instances under the &lt;em&gt;Platform / Management &amp;amp; Monitoring&lt;/em&gt; subscription.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Azure Policy&lt;/strong&gt; initiatives to enforce Defender plan enablement globally.&lt;/li&gt;
&lt;li&gt;Implement &lt;strong&gt;Logic App playbooks&lt;/strong&gt; with approval workflows for high‑impact actions.&lt;/li&gt;
&lt;li&gt;Regularly &lt;strong&gt;review analytic rule efficacy&lt;/strong&gt;—disable low‑fidelity detections.&lt;/li&gt;
&lt;li&gt;Correlate security data with &lt;strong&gt;cost and governance metrics&lt;/strong&gt; to validate operational ROI.&lt;/li&gt;
&lt;li&gt;Map all incidents and controls against the &lt;strong&gt;Microsoft Cloud Security Benchmark (MCSB)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For sovereign landing zones, validate &lt;strong&gt;region‑specific compliance mappings&lt;/strong&gt; and restrict cross‑region log export.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Security operations aren’t a one‑time pour—they’re a continuous blend of policy, detection, and human insight. The caffeine kick comes not from how many alerts you generate, but from how effectively you respond and refine.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="-learn-more"&gt;🔗 Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/security?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Cloud Adoption Framework – Security Operations Baseline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Defender for Cloud Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/sentinel/overview?tabs=defender-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Sentinel Architecture &amp;amp; Deployment Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/landing-zones/bicep/landing-zone-bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploy Azure Landing Zone with Bicep&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – Automating Your Platform</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-automation/</link><pubDate>Thu, 27 Nov 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-automation/</guid><description>&lt;p&gt;Think of your Azure Landing Zone (ALZ) like a perfectly brewed flat white. You can handcraft each shot—carefully spinning up management groups, policies, and subscriptions—or you can automate the process with precision, ensuring each brew (deployment) tastes just as intended.&lt;/p&gt;
&lt;p&gt;Automation is where mature cloud environments lift from repeatable to &lt;em&gt;reliable&lt;/em&gt;. In this post, we’re taking that next step: automating your platform layer using Infrastructure as Code (IaC) and modern CI/CD practices with Azure DevOps and GitHub Actions.&lt;/p&gt;
&lt;h2 id="what-is-landing-zone-automation"&gt;What is Landing Zone Automation?
&lt;/h2&gt;&lt;p&gt;Landing zone automation turns the conceptual Azure architecture from the &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Cloud Adoption Framework (CAF)&lt;/a&gt; into deployable, consistent reality.&lt;/p&gt;
&lt;p&gt;It’s about &lt;strong&gt;codifying&lt;/strong&gt; the platform foundation—management groups, policies, networks, role assignments, and more—so your entire environment can be replicated, validated, and governed repeatably.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re deploying Microsoft’s standard ALZ composition or the &lt;a class="link" href="https://github.com/Azure/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone (SLZ)&lt;/a&gt; for government and regulated industries, automation ensures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consistent structure across tenants and subscriptions&lt;/li&gt;
&lt;li&gt;Version-controlled platform definitions&lt;/li&gt;
&lt;li&gt;Governance and compliance baked into the deployment pipeline&lt;/li&gt;
&lt;li&gt;Smooth integration with organisational CI/CD tooling&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;At the heart of automated landing zones sits a hierarchy of IaC definitions and orchestrations:&lt;/p&gt;
&lt;h3 id="1-core-iac--bicep-evolution"&gt;1. Core IaC – Bicep Evolution
&lt;/h3&gt;&lt;p&gt;Bicep has now matured beyond a deployment language—it’s the clear path forward from ARM templates.&lt;br&gt;
With ALZ modules defined in Bicep, engineers can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parameterise management group hierarchies&lt;/li&gt;
&lt;li&gt;Configure resource consistency across environments&lt;/li&gt;
&lt;li&gt;Simplify updates and version pinning through Azure Container Registry (ACR)-hosted modules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The latest ALZ accelerator leverages reusable Bicep modules organised by design area—Identity, Network, Governance, Management, and Security.&lt;/p&gt;
&lt;h3 id="2-deployment-orchestration"&gt;2. Deployment Orchestration
&lt;/h3&gt;&lt;p&gt;Infrastructure deployment happens through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bootstrap scripts&lt;/strong&gt; (&lt;code&gt;main.bicep&lt;/code&gt; orchestrators or PowerShell wrappers)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure DevOps pipelines&lt;/strong&gt; or &lt;strong&gt;GitHub Actions&lt;/strong&gt; for environment rollout&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Separate parameter files&lt;/strong&gt; (e.g., dev, test, prod, sovereign) for scalable multi‑environment management&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-control-plane-integration"&gt;3. Control Plane Integration
&lt;/h3&gt;&lt;p&gt;Each run authenticates via a managed identity or service principal with least‑privilege RBAC, deploying to the control plane (management groups, policy assignments, subscriptions).&lt;br&gt;
The pipeline enforces drift detection through outputs from &lt;code&gt;what-if&lt;/code&gt; operations before applying changes.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Git Repository] --&gt; B[Pipeline Trigger]
B --&gt; C{Environment?}
C --&gt;|Prod| D[Deploy Bicep modules to MG hierarchy]
C --&gt;|Test| E[Deploy to sandbox subscriptions]
D --&gt; F[Policy &amp; Blueprint Assignment]
E --&gt; F
F --&gt; G["Post-deployment validation"]
G --&gt; H["Success Notification / Azure Monitor Logs"]
&lt;/div&gt;
&lt;h3 id="sovereign-landing-zone-automation"&gt;Sovereign Landing Zone Automation
&lt;/h3&gt;&lt;p&gt;For regulated workloads, the &lt;strong&gt;Sovereign Landing Zone (SLZ)&lt;/strong&gt; introduces additional validation layers and compliance automation.&lt;/p&gt;
&lt;p&gt;SLZ deployments use the same core ALZ Bicep modules but add governance and security overlays specific to sovereign or isolated cloud environments.&lt;/p&gt;
&lt;p&gt;Key components to automate include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deployment to sovereign‑specific tenants with restricted Azure AD endpoints&lt;/li&gt;
&lt;li&gt;Policy and Initiative Definitions sourced from the SLZ GitHub repository&lt;/li&gt;
&lt;li&gt;Compliance blueprint outputs registered as artefacts for &lt;strong&gt;audit traceability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Approval gates and manual interventions where government regulations require validation&lt;/li&gt;
&lt;li&gt;Separation of parameter sets per compliance classification (e.g. Standard, Protected, Secret System)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This layered model ensures sovereign deployments remain &lt;strong&gt;CAF‑aligned&lt;/strong&gt; while adhering to national compliance and residency requirements.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Let’s take a common enterprise example:&lt;br&gt;
A national healthcare organisation managing both standard and sovereign tenants across regions.&lt;/p&gt;
&lt;p&gt;With automated landing zones, they can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provision new regulated workloads automatically through the &lt;strong&gt;Sovereign Landing Zone&lt;/strong&gt; blueprint&lt;/li&gt;
&lt;li&gt;Apply the same guardrails, RBAC assignments, and network controls to every deployment&lt;/li&gt;
&lt;li&gt;Satisfy compliance audits via Git version history of policy assignments and configurations&lt;/li&gt;
&lt;li&gt;Maintain consistent operations pipelines across both public and sovereign Azure clouds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This removes human error from foundational design and shifts governance to &amp;ldquo;code as policy&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="deploying-via-the-azure-portal-or-cli"&gt;Deploying via the Azure Portal or CLI
&lt;/h3&gt;&lt;p&gt;For teams just beginning to automate, you can start with Azure CLI or PowerShell to deploy the ALZ accelerator:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment sub create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name platformBootstrap &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --location australiaeast &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file main.bicep &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --parameters @parameters.prod.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="using-bicep--example-snippet"&gt;Using Bicep – Example Snippet
&lt;/h3&gt;&lt;p&gt;Below is a simplified snippet showing an automated management group structure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rootMgId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;contoso-root&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;landingZoneParent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;platform&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;modules/mg.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mgNetwork&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Network&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rootMgId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgSecurity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;modules/mg.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mgSecurity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Security&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rootMgId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgIds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgNetwork&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;security&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgSecurity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="supplementary-module-files"&gt;Supplementary Module Files
&lt;/h3&gt;&lt;p&gt;Each module encapsulates a discrete design area—aligning with the ALZ approach of modular, reusable components.&lt;/p&gt;
&lt;h4 id="-modulesmgbicep"&gt;📂 &lt;code&gt;modules/mg.bicep&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;Creates or updates a management group and outputs its ID.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parentId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups@2021-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;uniqueString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;tenantResourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parentId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="-modulespolicyassignmentbicep"&gt;📂 &lt;code&gt;modules/policyAssignment.bicep&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;Assigns a built‑in or custom policy or initiative to the management group level.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parameters&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policyAssignments@2021-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;uniqueString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enforcementMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;assignmentId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyAssignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="-modulesroleassignmentbicep"&gt;📂 &lt;code&gt;modules/roleAssignment.bicep&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;Grants a role definition to a service principal, group, or managed identity.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/roleAssignments@2022-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;guid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="-modulesnetworkingvnetbicep"&gt;📂 &lt;code&gt;modules/networking/vnet.bicep&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;Defines a basic virtual network with multiple subnets.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;array&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="bicep-file-structure-example"&gt;Bicep File Structure Example
&lt;/h3&gt;&lt;p&gt;A typical repository layout for an automated landing zone looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/alz-platform/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── main.bicep # Root orchestrator for entire platform
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── modules/ # Reusable modules by design area
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── mg.bicep # Management group creation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── policyAssignment.bicep # Azure Policy or Initiative deployment
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── roleAssignment.bicep # RBAC bindings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── networking/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ ├── vnet.bicep
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ └── firewall.bicep
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── identity/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── managedIdentity.bicep
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── parameters/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── prod.parameters.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── test.parameters.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── sovereign.parameters.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── pipelines/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── azure-pipelines.yml # Azure DevOps pipeline definition
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── deploy-alz.yml # GitHub Actions workflow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Each folder represents a deployable component, enabling modular rollouts and granular version control.&lt;br&gt;
This layout scales naturally for multi‑environment and multi‑tenant SLZ scenarios where the sovereign parameters and policy baselines differ.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;p&gt;A few real‑world kinks to watch out for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Management group drift:&lt;/strong&gt; Ensure pipelines perform &lt;code&gt;what-if&lt;/code&gt; prior to deployments to catch unexpected manual changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy replication lag:&lt;/strong&gt; Azure Policy assignments can take minutes to propagate; build delay logic or retry policies into orchestrations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sovereign Cloud API differences:&lt;/strong&gt; Sovereign regions (e.g., Azure Government) may have limited support for preview resource providers—always validate pipeline dependencies in each environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Permissions &amp;amp; scope:&lt;/strong&gt; The service connection must have Management Group Contributor and Policy Contributor roles at the root management group for full control-plane deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parameter reuse drift:&lt;/strong&gt; Reusing &lt;code&gt;*.parameters.json&lt;/code&gt; files across dissimilar tenants may cause mismatched IDs—keep parameter sets per environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Bicep modules with version pinning&lt;/strong&gt; to avoid breaking changes from upstream ALZ module updates.&lt;/li&gt;
&lt;li&gt;Treat the &lt;strong&gt;pipeline as the source of truth&lt;/strong&gt;, never the portal—manual changes create drift.&lt;/li&gt;
&lt;li&gt;Apply &lt;strong&gt;policy assignments&lt;/strong&gt; and &lt;strong&gt;role definitions&lt;/strong&gt; within IaC, not post-provisioning.&lt;/li&gt;
&lt;li&gt;Structure repositories by &lt;strong&gt;design area&lt;/strong&gt; or &lt;strong&gt;environment&lt;/strong&gt;, depending on operating model.&lt;/li&gt;
&lt;li&gt;Incorporate &lt;strong&gt;Azure Policy compliance scans&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;what-if&lt;/code&gt; previews&lt;/strong&gt; into every pull request.&lt;/li&gt;
&lt;li&gt;Separate parameter files for &lt;strong&gt;sovereign&lt;/strong&gt;, &lt;strong&gt;regulatory&lt;/strong&gt;, and &lt;strong&gt;standard&lt;/strong&gt; environments.&lt;/li&gt;
&lt;li&gt;Integrate approval gates in DevOps or GitHub to replicate SLZ-compliant change control.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Automation isn’t just about saving clicks; it’s about embedding your governance model into code and culture. Once your landing zone can deploy itself—public or sovereign cloud alike—your platform becomes the recipe, not the experiment.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zone Accelerators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/landing-zones/bicep/landing-zone-bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploy Azure Landing Zone with Bicep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/platform-automation-devops?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Platform automation and DevOps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/developer/github/connect-from-azure?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;GitHub Actions for Infrastructure as Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – Monitoring, Insights, and Operational Maturity</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-monitoring-observability/</link><pubDate>Tue, 25 Nov 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-monitoring-observability/</guid><description>&lt;p&gt;Imagine running a busy café with no visibility into stock, brewing temperature, or order flow you’d end up guessing where the bottlenecks are. Azure environments aren’t that different. Without proper monitoring and operational insight, you’re flying blind across your landing zones.&lt;/p&gt;
&lt;p&gt;As enterprises adopt the new Azure Landing Zone (ALZ) architecture, observability becomes more than a convenience, it’s a foundation for security, resilience, and compliance. This post explores how the modern ALZ and Secure Landing Zone (SLZ) patterns enable full‑stack visibility, from management groups to workload telemetry, and how new Cloud Adoption Framework (CAF) guidance continues to evolve the story for both global and sovereign deployments.&lt;/p&gt;
&lt;h2 id="what-is-monitoring--operational-maturity-in-the-alz-context"&gt;What is Monitoring &amp;amp; Operational Maturity in the ALZ Context?
&lt;/h2&gt;&lt;p&gt;Azure Landing Zones define a set of design areas — governance, identity, networking, resource organisation, and monitoring. The &lt;strong&gt;Monitoring and Insights design area&lt;/strong&gt; underpins everything else in the ALZ model, ensuring consistent telemetry and response capability across all environments.&lt;/p&gt;
&lt;p&gt;Key objectives include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Centralised telemetry and diagnostics for platform and workload components.&lt;/li&gt;
&lt;li&gt;Alignment with &lt;strong&gt;Microsoft Defender for Cloud&lt;/strong&gt; and &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt; for proactive threat detection.&lt;/li&gt;
&lt;li&gt;Building operational maturity through alert tuning, automation, and policy‑based guardrails.&lt;/li&gt;
&lt;li&gt;Supporting &lt;strong&gt;sovereign and regulated environments&lt;/strong&gt; through strict data‑residency boundaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, monitoring isn’t just data collection — it’s the barista’s dashboard of dials and indicators keeping your Azure brew consistent and under control.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;At its core, observability in ALZ is about &lt;strong&gt;collecting, correlating, and responding&lt;/strong&gt;. Azure provides the ingredients — you architect how they blend.&lt;/p&gt;
&lt;h3 id="core-layers-of-monitoring"&gt;Core Layers of Monitoring
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platform Layer (Landing Zone &amp;amp; Management Groups)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Activity logs and policy compliance at the tenant and management group level.&lt;/li&gt;
&lt;li&gt;Diagnostic settings for core services (Resource Manager, Policy, Security Center).&lt;/li&gt;
&lt;li&gt;Centralised Log Analytics workspaces per environment or region.&lt;/li&gt;
&lt;li&gt;Governance integration via &lt;strong&gt;CAF Monitor &amp;amp; Manage design area&lt;/strong&gt; templates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Workload Layer (Application &amp;amp; Data)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application Insights, container telemetry, database metrics, and workload‑specific logs.&lt;/li&gt;
&lt;li&gt;Data Collection Rules (DCRs) via Azure Monitor Agent (AMA) for VM and container telemetry.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security Layer (Sentinel &amp;amp; Defender Plans)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Sentinel fuses threat and operational data from multiple sources.&lt;/li&gt;
&lt;li&gt;Defender for Cloud enforces continuous assessment and workload protection.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Operations &amp;amp; Integration Layer&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Automation, Logic Apps, and Event Grid for reactive and proactive operations.&lt;/li&gt;
&lt;li&gt;ServiceNow or ITSM connectors for unified incident lifecycle management.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="control-plane-relationships"&gt;Control Plane Relationships
&lt;/h3&gt;&lt;p&gt;Below is a simplified view of how these layers connect through management and resource hierarchies:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
Tenant["Tenant Root Group"]
MG1["Management Group: Platform"]
MG2["Management Group: Workloads"]
Sub1["Subscription: Connectivity &amp; Security"]
Sub2["Subscription: Landing Zone"]
LA["Log Analytics Workspace"]
Sentinel["Microsoft Sentinel"]
Defender["Defender for Cloud"]
RG["Resource Groups"]
Tenant --&gt; MG1 --&gt; Sub1
Tenant --&gt; MG2 --&gt; Sub2
Sub1 --&gt; LA
LA --&gt; Sentinel
LA --&gt; Defender
Sub2 --&gt; RG
RG --&gt; |Diagnostic + Metric Data| LA
&lt;/div&gt;
&lt;p&gt;This topology serves as the backbone of platform‑wide observability — scalable and repeatable across multiple landing zones.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;In a typical enterprise rollout:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Central IT&lt;/strong&gt; manages a shared monitoring workspace and Sentinel instance in the platform management group.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business units&lt;/strong&gt; deploy their own Application Insights instances for line‑of‑business workloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security operations&lt;/strong&gt; correlate activities across Defender plans, policy compliance, and workload signals.&lt;/li&gt;
&lt;li&gt;Troubleshooting shifts from guesswork to traceable, data‑driven investigation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sovereignspecific-observability-design-considerations"&gt;Sovereign‑Specific Observability Design Considerations
&lt;/h3&gt;&lt;p&gt;Microsoft’s &lt;strong&gt;Sovereign Landing Zone (SLZ)&lt;/strong&gt; reference architecture introduces additional observability controls and compliance‑driven design practices, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data Egress Restrictions&lt;/strong&gt; – All diagnostic and telemetry data must remain in the local jurisdiction. Use region‑local Log Analytics and Sentinel endpoints only.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identity &amp;amp; Access Separation&lt;/strong&gt; – Split monitoring permissions between operators and compliance staff using &lt;strong&gt;Privileged Access Workstations (PAWs)&lt;/strong&gt; and &lt;strong&gt;Just‑In‑Time (JIT)&lt;/strong&gt; access through Privileged Identity Management (PIM).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regional Sovereignty Guards&lt;/strong&gt; – Enforce workspace creation within approved sovereign regions via &lt;strong&gt;Azure Policy&lt;/strong&gt; and the CAF &lt;strong&gt;Monitor &amp;amp; Manage&lt;/strong&gt; landing zone accelerator.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sovereign Data Scopes in Defender for Cloud&lt;/strong&gt; – Use region‑scoped threat protection plans and local intelligence feeds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi‑Ring Visibility via Lighthouse&lt;/strong&gt; – Aggregate insights across sovereign “rings” through Azure Lighthouse, maintaining read‑only, cross‑region visibility without data egress.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These additions are essential when applying ALZ patterns to regulated or government workloads hosted in sovereign clouds such as &lt;strong&gt;Australia Central&lt;/strong&gt;, &lt;strong&gt;Norway East&lt;/strong&gt;, or &lt;strong&gt;US Gov&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal-steps-high-level"&gt;Azure Portal Steps (High Level)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Deploy a &lt;strong&gt;Log Analytics Workspace&lt;/strong&gt; in the designated monitoring subscription.&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;Diagnostic Settings&lt;/strong&gt; for key platforms (Policy, Key Vault, NSG, Activity Logs).&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Microsoft Defender for Cloud&lt;/strong&gt; and align protection plans with CAF &lt;strong&gt;Monitor &amp;amp; Manage&lt;/strong&gt; guidance.&lt;/li&gt;
&lt;li&gt;Connect &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt; to the workspace.&lt;/li&gt;
&lt;li&gt;Apply &lt;strong&gt;Data Collection Rules (DCRs)&lt;/strong&gt; to route VM metrics through AMA.&lt;/li&gt;
&lt;li&gt;Add automated responses and escalation through Logic Apps or Azure Automation Runbooks.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="example-bicep-snippet"&gt;Example Bicep Snippet
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalytics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.OperationalInsights/workspaces@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;law-monitoring-platform&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PerGB2018&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionInDays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;90&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;diagnosticSettings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/diagnosticSettings@2021-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;send-activity-logs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Administrative&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Policy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This Bicep snippet centralises subscription‑level activity logs. For SLZ implementations, ensure the workspace’s region aligns with data residency constraints and that cross‑region ingestion is blocked.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Duplicate Diagnostic Streams:&lt;/strong&gt; Avoid redundant diagnostic settings across policies — they can double ingestion costs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workspace Misplacement:&lt;/strong&gt; Check Log Analytics and Sentinel regions for compliance; this is critical in sovereign implementations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alert Fatigue:&lt;/strong&gt; Default Sentinel content packs are noisy. Phase in analytics rules gradually.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi‑Cloud Integration:&lt;/strong&gt; Consider data boundaries before integrating with third‑party SIEMs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross‑Tenant Complexity:&lt;/strong&gt; For multi‑ring SLZ models, use Azure Lighthouse to provide delegated access without compromising sovereignty.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Centralise baseline telemetry&lt;/strong&gt; in a dedicated monitoring or management subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Align resource locations and retention&lt;/strong&gt; with regional compliance mandates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable Defender for Cloud early&lt;/strong&gt; in the rollout to automatically evaluate resource security posture.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leverage CAF Monitor &amp;amp; Manage accelerator&lt;/strong&gt; for standardised baselines across tenants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automate configuration drift detection&lt;/strong&gt; via Azure Policy and DINE scripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regularly tune alert rules and analytics&lt;/strong&gt; in Sentinel to reduce noise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document and test incident response playbooks&lt;/strong&gt; across both ALZ and SLZ environments.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Operational maturity isn’t achieved with dashboards — it’s cultivated through continuous tuning, feedback, and disciplined automation. Observability is your infrastructure’s sensory system. Get it right, and every signal — whether from Sydney or a sovereign enclave — pours clean and consistent like a perfectly calibrated espresso.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-monitor?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zone - Monitoring and Management Design Area&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Monitor Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access-landing-zones#general-recommendations?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploy Microsoft Sentinel in an Azure Landing Zone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Defender for Cloud Plan Details&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – Policy, Governance and Compliance at Scale</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-policy-governance/</link><pubDate>Thu, 20 Nov 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-policy-governance/</guid><description>&lt;p&gt;Any seasoned barista will tell you that consistency is the secret ingredient. The same holds true for your cloud estate — it’s no good if every subscription ends up with a slightly different flavour. Governance in Azure Landing Zones (ALZ) ensures every cup (or workload) comes out consistent, auditable, and within your compliance recipe.&lt;/p&gt;
&lt;p&gt;This post explores how &lt;strong&gt;Azure Policy&lt;/strong&gt;, &lt;strong&gt;security baselines&lt;/strong&gt;, and &lt;strong&gt;Microsoft’s Sovereign Landing Zone&lt;/strong&gt; work together to create policy‑driven guardrails. We’ll look at how automation enforces consistency at scale and how those controls transfer neatly from an Azure Landing Zone (ALZ) to a Secure Landing Zone (SLZ).&lt;/p&gt;
&lt;h2 id="-what-is-policydriven-governance"&gt;☁️ What is Policy‑Driven Governance?
&lt;/h2&gt;&lt;p&gt;Policy‑driven governance is the backbone of any ALZ. It forms the &lt;strong&gt;control plane&lt;/strong&gt;, enforcing compliance, tagging standards, cost management, and security configurations across management groups.&lt;/p&gt;
&lt;p&gt;At the heart of this model is &lt;strong&gt;Azure Policy&lt;/strong&gt;, which uses declarative JSON definitions to apply rules and standards across your environment. These can enforce &lt;strong&gt;mandatory compliance&lt;/strong&gt; (deny actions) or &lt;strong&gt;informative compliance&lt;/strong&gt; (audit only).&lt;/p&gt;
&lt;p&gt;Microsoft’s &lt;strong&gt;Cloud Adoption Framework (CAF)&lt;/strong&gt; and &lt;strong&gt;Azure Landing Zone Accelerators&lt;/strong&gt; provide foundational policy sets that align with key governance disciplines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resource Consistency:&lt;/strong&gt; Standard naming, tagging, and region restrictions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security &amp;amp; Compliance:&lt;/strong&gt; Enforce Defender plans, encryption, or private networking&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational Governance:&lt;/strong&gt; Ensure diagnostic and monitoring settings are applied by default&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Sovereignty:&lt;/strong&gt; Especially critical in &lt;strong&gt;Sovereign Landing Zone (SLZ)&lt;/strong&gt; contexts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-how-it-works"&gt;⚙️ How It Works
&lt;/h2&gt;&lt;p&gt;Azure Policy enforcement operates at multiple levels in your &lt;strong&gt;management group hierarchy&lt;/strong&gt;, creating a cascading and inheritable model for governance.&lt;/p&gt;
&lt;h3 id="updated-example--alz-management-group-structure"&gt;Updated Example – ALZ Management Group Structure
&lt;/h3&gt;&lt;div class="mermaid"&gt;graph TD
A[Root Management Group] --&gt; B[Platform MG]
A --&gt; C[Workloads MG]
B --&gt; D[Identity MG]
B --&gt; E[Management MG]
B --&gt; F[Connectivity MG]
C --&gt; G[App Workloads MG]
G --&gt; H[Subscription Level Resources]
&lt;/div&gt;
&lt;p&gt;Policies and initiatives are typically assigned at the &lt;strong&gt;management group&lt;/strong&gt; level:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Definitions&lt;/strong&gt; – JSON policy logic describing compliance rules&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initiatives&lt;/strong&gt; – Bundled sets of policies for a common intent (e.g. Security Baseline)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assignments&lt;/strong&gt; – Bind the definition or initiative to a specific scope&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remediation&lt;/strong&gt; – Automated correction of non‑compliant resources&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A practical example of this is constraining &lt;strong&gt;Private DNS Zone&lt;/strong&gt; creation. By assigning a policy that restricts DNS resource providers to only the &lt;strong&gt;Connectivity Management Group&lt;/strong&gt;, we ensure network services remain centralised and consistent. This prevents application teams from spinning up ad‑hoc DNS zones that undermine cross‑environment name resolution — a subtle guardrail that pays big dividends later.&lt;/p&gt;
&lt;p&gt;For &lt;strong&gt;Sovereign Landing Zones&lt;/strong&gt;, these initiatives also incorporate regional membership, encryption requirements, and connectivity isolation patterns aligned with frameworks like &lt;strong&gt;IRAP (Australia)&lt;/strong&gt; or &lt;strong&gt;FedRAMP (US)&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="-realworld-impact"&gt;🌏 Real‑World Impact
&lt;/h2&gt;&lt;p&gt;In large organisations, subscriptions proliferate quickly and with good intent — but without policy control, drift and inconsistency take hold fast.&lt;/p&gt;
&lt;p&gt;Deploying ALZ policy assignments upfront ensures governance remains proactive. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; You need to ensure &lt;strong&gt;Private DNS Zones&lt;/strong&gt; live only in the central &lt;strong&gt;Connectivity Zone&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;Outcome:&lt;/strong&gt; The policy denies or remediates deployments of &lt;code&gt;Microsoft.Network/privateDnsZones&lt;/code&gt; outside approved management groups — keeping name resolution consistent across the enterprise fabric.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; The security team mandates encryption‑at‑rest for all storage.&lt;br&gt;
&lt;strong&gt;Outcome:&lt;/strong&gt; A centrally enforced policy denies creation of unencrypted storage accounts, avoiding drift before it happens.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; A financial institution operating under Australian data sovereignty constraints.&lt;br&gt;
&lt;strong&gt;Outcome:&lt;/strong&gt; Using the &lt;strong&gt;Microsoft Sovereign Landing Zone&lt;/strong&gt; baseline automatically ensures data only resides in the &lt;strong&gt;Australia East/Southeast&lt;/strong&gt; region pair, maintaining integrity and compliance with IRAP standards.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When these controls are defined early and baked into your deployment pipelines, the platform team spends less time firefighting and more time improving developer experience.&lt;/p&gt;
&lt;h2 id="-implementation-examples"&gt;💻 Implementation Examples
&lt;/h2&gt;&lt;h3 id="deploy-via-azure-portal"&gt;Deploy via Azure Portal
&lt;/h3&gt;&lt;p&gt;From the &lt;strong&gt;Azure Policy&lt;/strong&gt; blade:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Definitions → Policy Initiatives (set)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Assign Initiative&lt;/strong&gt; at the top‑level management group&lt;/li&gt;
&lt;li&gt;Choose the &lt;strong&gt;ALZ Policy Set&lt;/strong&gt; (for example, &lt;code&gt;AzureLandingZone-PolicySet-v3&lt;/code&gt;) or a &lt;strong&gt;Sovereign&lt;/strong&gt; variant such as &lt;code&gt;SovereignLandingZone-IRAP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Configure relevant parameters like &lt;code&gt;allowedLocations&lt;/code&gt;, &lt;code&gt;connectivityManagementGroupId&lt;/code&gt;, or &lt;code&gt;logWorkspaceId&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Select &lt;strong&gt;Review + Create&lt;/strong&gt; to assign — Azure will begin evaluating and remediating resources automatically.&lt;/p&gt;
&lt;h3 id="deploy-via-bicep"&gt;Deploy via Bicep
&lt;/h3&gt;&lt;p&gt;Here’s a minimal example for assigning a security or governance initiative:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Management group name for the policy assignment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;platform-connectivity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Policy initiative ID&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;initiativeId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/providers/Microsoft.Authorization/policySetDefinitions/AzureLandingZone-Connectivity-v3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Assignment display name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;assignmentName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Connectivity-Guardrails&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policyAssignments@2022-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;assignmentName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;tenantResourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ALZ Connectivity Guardrails&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;initiativeId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectivityMG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enforcementMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SystemAssigned&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This initiative enforces connectivity‑scope controls — such as location restrictions, DNS zone centralisation, and mandatory diagnostic settings — across all workload subscriptions downstream of the connectivity management group.&lt;/p&gt;
&lt;h2 id="-gotchas--edge-cases"&gt;⚠️ Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Timing matters:&lt;/strong&gt; Policies often depend on existing platform resources such as Log Analytics or Defender plans. Deploy connectivity and identity layers first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initiative drift:&lt;/strong&gt; Modifying a single policy definition inside a standard initiative can cause inconsistencies. Always track initiative versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy assignment identity:&lt;/strong&gt; System‑assigned managed identities must have proper permissions, particularly for remediation tasks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sovereign feature parity:&lt;/strong&gt; Not all policy aliases are supported in sovereign clouds — validate definitions against your regulatory baseline matrix.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-best-practices"&gt;✅ Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Apply initiatives at &lt;strong&gt;management group&lt;/strong&gt; level, not per subscription, to reduce governance drift.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;parameterised initiatives&lt;/strong&gt; for environment‑specific exceptions.&lt;/li&gt;
&lt;li&gt;Store your &lt;strong&gt;policy definitions and initiatives&lt;/strong&gt; in source control alongside your IaC modules.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Azure Policy insights&lt;/strong&gt; for continuous compliance reporting.&lt;/li&gt;
&lt;li&gt;Integrate &lt;strong&gt;Policy assignments and Security Baselines&lt;/strong&gt; with &lt;strong&gt;Azure Pipelines&lt;/strong&gt; or &lt;strong&gt;GitHub Actions&lt;/strong&gt; for repeatable governance.&lt;/li&gt;
&lt;li&gt;Explicitly restrict resource types like &lt;strong&gt;Private DNS Zones&lt;/strong&gt; to designated management groups or subscriptions.&lt;/li&gt;
&lt;li&gt;Extend &lt;strong&gt;ALZ guardrails&lt;/strong&gt; using &lt;strong&gt;Sovereign Landing Zone modules&lt;/strong&gt; if operating in regulated sectors.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-extending-governance-for-slz-and-regulated-environments"&gt;🏛️ Extending Governance for SLZ and Regulated Environments
&lt;/h2&gt;&lt;p&gt;While most Enterprise ALZ deployments share a common governance baseline, &lt;strong&gt;Secure and Sovereign Landing Zones (SLZ)&lt;/strong&gt; introduce additional depth around compliance validation, exemption management, and continuous monitoring.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Compliance and Regulatory Mapping&lt;/strong&gt;&lt;br&gt;
SLZ policies are frequently tied to frameworks such as &lt;strong&gt;IRAP (AU)&lt;/strong&gt;, &lt;strong&gt;ISO 27001&lt;/strong&gt;, and &lt;strong&gt;NIST 800‑53&lt;/strong&gt;. Each policy initiative maps to specific control families (identity, networking, audit, data protection). Integrating these mappings into &lt;strong&gt;Defender for Cloud’s Regulatory Compliance Dashboard&lt;/strong&gt; provides automated evidence collection for audit teams.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Policy Exemption Governance&lt;/strong&gt;&lt;br&gt;
Even in regulated environments, exceptions happen — for example, legacy workloads or non‑supported services. SLZ governance patterns encourage &lt;em&gt;time‑bound policy exemptions&lt;/em&gt; with recorded business justification, approval tracking, and optional remediation targets. This process can be automated using policy parameters and version control metadata.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Enhanced Monitoring and Audit Policies&lt;/strong&gt;&lt;br&gt;
SLZ reference guides go beyond standard ALZ diagnostics, enforcing activity log forwarding, resource diagnostic settings, and retention standards for key services such as &lt;strong&gt;Key Vault&lt;/strong&gt;, &lt;strong&gt;Storage&lt;/strong&gt;, and &lt;strong&gt;Firewalls&lt;/strong&gt;.&lt;br&gt;
Embedding those as part of your policy assignments (or deploying the &lt;strong&gt;Azure Monitor Baseline&lt;/strong&gt; initiative) closes the observability gap and builds defence‑in‑depth.&lt;/p&gt;
&lt;p&gt;Together, these enhancements ensure governance not only enforces configuration but also proves compliance — a must‑have for regulated sectors and government workloads.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Governance isn’t about locking things down — it’s about keeping flavours consistent across every pour. The magic of Azure Policy is that it frees platform teams from manual policing, while giving developers the confidence to innovate safely within the right boundaries.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="-learn-more"&gt;📚 Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/#application-landing-zone-accelerators?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zone Accelerator - Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/#azure-verified-modules-for-your-platform-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zone Accelerator - Platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/governance/policy/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Policy Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/considerations/landing-zone-governance?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Cloud Adoption Framework – Governance Design Area&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/governance/policy/concepts/definition-structure#bicep-samples?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploy Policy Assignments with Bicep&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – Networking the Modern Enterprise</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-networking/</link><pubDate>Tue, 18 Nov 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-networking/</guid><description>&lt;p&gt;If the network is the “espresso shot” of your landing zone, then the connectivity model is your barista — it decides how everything gets blended together. Over the last year, Azure networking patterns have had a serious refill. Between &lt;em&gt;Virtual WAN&lt;/em&gt;, &lt;em&gt;private endpoints&lt;/em&gt;, and &lt;em&gt;platform-owned connectivity&lt;/em&gt;, the modern Landing Zone (LZ) and Secure Landing Zone (SLZ) are paving a clearer path for scalable, secure, and consistent enterprise networking.&lt;/p&gt;
&lt;p&gt;This post breaks down what’s changed in the Azure Landing Zone (ALZ) reference design, how it integrates with SLZ guidance, and where sovereign deployment models fit in.&lt;/p&gt;
&lt;p&gt;Let’s stir it up.&lt;/p&gt;
&lt;h2 id="-what-is-networking-the-modern-enterprise"&gt;☁️ What Is “Networking the Modern Enterprise”?
&lt;/h2&gt;&lt;p&gt;In Microsoft’s Cloud Adoption Framework (CAF), &lt;strong&gt;network topology and connectivity&lt;/strong&gt; is one of the eight core design areas for a Landing Zone. It defines &lt;strong&gt;how workloads, users, and services communicate&lt;/strong&gt; — and how governance and security controls flow through that design.&lt;/p&gt;
&lt;p&gt;Historically, enterprises built “Connected Landing Zones” where each domain owned its own virtual network. The Platform team provided connectivity through hub-and-spoke topologies. As governance matured and services like &lt;strong&gt;Azure Virtual WAN&lt;/strong&gt; evolved, Microsoft shifted to the &lt;strong&gt;Platform-Owned Connectivity&lt;/strong&gt; model — a cleaner, scalable, and more secure approach that supports hybrid, multicloud, and sovereign environments.&lt;/p&gt;
&lt;p&gt;The latest addition: &lt;strong&gt;Sovereign Landing Zone (SLZ)&lt;/strong&gt; concepts now extend this model for &lt;strong&gt;compliant, isolated environments&lt;/strong&gt; (e.g., financial services, critical infrastructure, or government workloads).&lt;/p&gt;
&lt;h2 id="-how-it-works"&gt;🔌 How It Works
&lt;/h2&gt;&lt;p&gt;At a high level, modern Azure connectivity now aligns with three design layers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platform Connectivity (Core):&lt;/strong&gt;&lt;br&gt;
A centralised layer that hosts Virtual WAN, route tables, and connectivity policies managed by the platform team.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Landing Zone Networks:&lt;/strong&gt;&lt;br&gt;
Workload vNets or vWAN hubs connected via private endpoints or secured peering. These zones inherit policies and connectivity from the Platform layer, not peer-to-peer connections.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secure Landing Zone (SLZ):&lt;/strong&gt;&lt;br&gt;
Overlays Zero Trust and Defender for Cloud integration on top of the baseline ALZ network model. In many cases, it introduces automated security rulesets and DDoS/Firewall as Code patterns.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In practical terms, traffic flows are now mediated by &lt;strong&gt;Virtual WAN hubs&lt;/strong&gt;, &lt;strong&gt;Azure Firewall Premium&lt;/strong&gt;, and &lt;strong&gt;Private Link&lt;/strong&gt; instead of traditional NVA (Network Virtual Appliance) choke points.&lt;/p&gt;
&lt;h3 id="-example-architecture"&gt;🗺️ Example Architecture
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart TD
A[On-premises WAN/ExpressRoute] --&gt; B[Virtual WAN Hub]
B --&gt; C[Azure Firewall / Security Services]
C --&gt; D[Landing Zone vNet 1]
C --&gt; E[Landing Zone vNet 2]
D --&gt; F[Private Endpoints / PaaS Services]
E --&gt; F
F --&gt; G[Microsoft Backbone Services]
&lt;/div&gt;
&lt;p&gt;This structure supports scale-out networking, consistent routing policy enforcement, and integrates neatly with &lt;strong&gt;Azure Policy&lt;/strong&gt;, &lt;strong&gt;Defender for Cloud&lt;/strong&gt;, and &lt;strong&gt;Azure Monitor&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="-realworld-impact"&gt;🌍 Real‑World Impact
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Scenario 1: Hybrid Enterprise with Global Workloads&lt;/strong&gt;&lt;br&gt;
A financial services customer migrating multiple regional workloads to Azure replaces numerous virtual network peerings with &lt;strong&gt;Virtual WAN hubs per geography&lt;/strong&gt;. Each hub standardises route propagation and central internet egress, cutting operational overhead by 60%.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scenario 2: Secure Landing Zone for Gov Customers&lt;/strong&gt;&lt;br&gt;
A government department implementing a Sovereign Landing Zone uses restricted Azure regions and enforces data residency via Virtual WAN secure hubs with isolated Network Security Groups (NSGs). This model passes audit checks for &lt;em&gt;Information Security Manual (ISM)&lt;/em&gt; compliance while allowing standardised DevOps pipelines.&lt;/p&gt;
&lt;h2 id="-implementation-examples"&gt;🧱 Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal--highlevel-setup-steps"&gt;Azure Portal – High‑Level Setup Steps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Create a &lt;strong&gt;Virtual WAN&lt;/strong&gt; resource in your platform region.&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;Virtual Hubs&lt;/strong&gt; for each geography (e.g., AU‑East, SE‑Asia).&lt;/li&gt;
&lt;li&gt;Connect &lt;strong&gt;VPN/ExpressRoute gateways&lt;/strong&gt; or on-premises edge routers.&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;hub-to-spoke connections&lt;/strong&gt; for each Landing Zone vNet.&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;Azure Firewall Premium&lt;/strong&gt;, NSGs, and route tables.&lt;/li&gt;
&lt;li&gt;Deploy &lt;strong&gt;Private Endpoints&lt;/strong&gt; for platform services (e.g., Storage, SQL).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-bicep-example--platform-owned-connectivity"&gt;🧩 Bicep Example – Platform-Owned Connectivity
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vwanName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;corp-vwan&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vhubName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;au-east-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;corp-fw&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vwan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualWans@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vwanName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowBranchToBranchTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vhub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualHubs@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vhubName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.50.0.0/23&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vwan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azfw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/azureFirewalls@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AZFW_VNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Premium&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;threatIntelMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Alert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;fwConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vhubName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzureFirewallSubnet&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="key-notes"&gt;Key Notes
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Azure Firewall Manager&lt;/strong&gt; for routing and policy orchestration.&lt;/li&gt;
&lt;li&gt;Avoid direct peering between Landing Zones; all traffic should traverse the platform hub.&lt;/li&gt;
&lt;li&gt;In SLZ contexts, enforce outbound web traffic inspection and certificate validation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-gotchas--edge-cases"&gt;⚠️ Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Private Endpoint Sprawl:&lt;/strong&gt; Too many PE connections across vNets can cause DNS complexity — consider Private DNS Zones managed centrally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-region failover:&lt;/strong&gt; Virtual WAN hubs aren’t automatically resilient across geographies; plan hub failover manually or automate via Bicep.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVAs in a new world:&lt;/strong&gt; With Azure Firewall Premium and IDPS features maturing, NVAs should be limited to specific use cases (e.g., vendor-standard inspection or multicloud transit).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sovereign Regions:&lt;/strong&gt; SLZ deployments may have resource provider restrictions; confirm service availability before adopting standard ALZ templates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-best-practices"&gt;✅ Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Adopt &lt;strong&gt;Platform-owned Connectivity&lt;/strong&gt; as the default pattern for enterprise landing zones.&lt;/li&gt;
&lt;li&gt;Consolidate &lt;strong&gt;policy and tagging strategy&lt;/strong&gt; across all vNets for traceability and governance alignment.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Azure Policy&lt;/strong&gt; to control where &lt;strong&gt;Private DNS Zones&lt;/strong&gt; can be created — ensuring they reside &lt;strong&gt;within the Connectivity (Platform) Zone&lt;/strong&gt;, not inside workload subscriptions. This keeps name resolution consistent, auditable, and centrally managed.&lt;/li&gt;
&lt;li&gt;Deploy &lt;strong&gt;Virtual WAN secure hubs&lt;/strong&gt; with Azure Firewall Premium tier for central egress and Zero Trust enforcement.&lt;/li&gt;
&lt;li&gt;Prefer &lt;strong&gt;Private Link&lt;/strong&gt; over service endpoint exposure; eliminate public endpoints altogether.&lt;/li&gt;
&lt;li&gt;Manage &lt;strong&gt;DNS centrally&lt;/strong&gt; in the platform layer and link zones to the appropriate spokes via Private DNS zone virtual network links.&lt;/li&gt;
&lt;li&gt;Automate hub and spoke deployment using &lt;strong&gt;Bicep or Terraform&lt;/strong&gt;, and avoid ad-hoc peering.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Sovereign Landing Zones&lt;/strong&gt;, maintain strict separation between management, workload, and monitoring planes to meet regulatory assurance.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; The shift from connected landing zones to platform-owned connectivity mirrors how enterprises are modernising their cloud governance: centralised guardrails, decentralised innovation.&lt;br&gt;
Think of the network as the “brew method” — the beans (your workloads) won’t taste right without the right pressure, filter, and flow.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="-learn-more"&gt;🔗 Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Cloud Adoption Framework – Azure Landing Zones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-wan/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Virtual WAN Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Azure/Enterprise-Scale?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Landing Zone GitHub Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/firewall/premium-features?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Firewall Premium Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-dns?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Private Link and DNS Zone Integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – Identity and Access Foundations</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-identity-access/</link><pubDate>Thu, 13 Nov 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-identity-access/</guid><description>&lt;p&gt;A landing zone without a proper identity model is like a café without portion control—too much espresso and everything goes haywire, too little and nothing works with any punch. The latest &lt;strong&gt;Azure Landing Zone (ALZ)&lt;/strong&gt; design has refined its approach to &lt;strong&gt;identity and access&lt;/strong&gt;, ensuring your platform and workloads aren’t over‑caffeinated with excessive privilege.&lt;/p&gt;
&lt;p&gt;In this post, we’ll look at how the ALZ identity layer is structured, how to align with least‑privilege principles, and how tools like &lt;strong&gt;Privileged Identity Management (PIM)&lt;/strong&gt; and &lt;strong&gt;Conditional Access&lt;/strong&gt; keep your digital baristas in check.&lt;/p&gt;
&lt;h2 id="what-is-identity-and-access-foundations-in-alz"&gt;What is “Identity and Access Foundations” in ALZ?
&lt;/h2&gt;&lt;p&gt;In Microsoft’s &lt;strong&gt;Cloud Adoption Framework (CAF)&lt;/strong&gt;, &lt;em&gt;Identity and Access Management&lt;/em&gt; is one of the core design areas underpinning governance, networking, and operations. It defines how &lt;strong&gt;Microsoft Entra ID&lt;/strong&gt; (formerly Azure AD) authenticates and authorises users, applications, and services.&lt;/p&gt;
&lt;p&gt;Within a landing zone, identity foundations mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrative layers are clearly divided using &lt;strong&gt;management groups and subscriptions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Access follows &lt;strong&gt;least privilege&lt;/strong&gt; and &lt;strong&gt;just‑in‑time&lt;/strong&gt; principles.&lt;/li&gt;
&lt;li&gt;Conditional Access (CA) policies and &lt;strong&gt;break‑glass&lt;/strong&gt; accounts are defined from day one.&lt;/li&gt;
&lt;li&gt;Platform and workload identities operate independently, reducing blast radius.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deployed via the &lt;strong&gt;ALZ Bicep&lt;/strong&gt; or &lt;strong&gt;Terraform accelerators&lt;/strong&gt;, these principles become part of your control plane architecture—not an afterthought after workloads land.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;Identity in an ALZ spans three planes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Control Plane&lt;/strong&gt; – Managed through Entra ID and management groups. This is where global policies and Conditional Access live. Only a small, well‑audited team should hold access here.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform Layer&lt;/strong&gt; – Covers shared services such as networking, monitoring, and security. Role assignments here are limited to platform engineers via RBAC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workload Layer&lt;/strong&gt; – Each workload subscription inherits a baseline identity policy while maintaining autonomy for its application teams.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A simple mapping looks like this:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Entra ID Tenant] --&gt; B[Management Group Hierarchy]
B --&gt; C[Platform Subscription]
B --&gt; D[Connectivity Subscription]
B --&gt; E[Workload Subscriptions]
A --&gt;|PIM + Conditional Access| B
C --&gt;|RBAC Roles| F[Platform Team]
E --&gt;|Managed Identities + Custom Roles| G[Workload Teams]
&lt;/div&gt;
&lt;p&gt;Each layer integrates with &lt;strong&gt;Entra roles&lt;/strong&gt;, &lt;strong&gt;Azure RBAC&lt;/strong&gt;, and &lt;strong&gt;PIM&lt;/strong&gt; to maintain separation between operational, security, and application functions.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;When identity is poorly structured, everyone ends up wearing too many aprons—network admins holding Owner rights on production subscriptions, or developers creating service principals with excessive permissions.&lt;/p&gt;
&lt;p&gt;By enforcing tiered identity and PIM activation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Privilege sprawl&lt;/strong&gt; is drastically reduced.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational oversight&lt;/strong&gt; improves with clear audit trails.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security breaches&lt;/strong&gt; are contained—access is temporary, traceable, and justified.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross‑team collaboration&lt;/strong&gt; becomes safer with controlled Entra B2B roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s a design that scales with your tenancy, not against it.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="1-assign-rolebased-access-in-azure-portal"&gt;1. Assign Role‑Based Access in Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Management Groups → Access Control (IAM)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Assign:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Owner&lt;/code&gt; or &lt;code&gt;Contributor&lt;/code&gt; roles only at &lt;strong&gt;Platform&lt;/strong&gt; or &lt;strong&gt;Connectivity&lt;/strong&gt; tiers to core teams.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Reader&lt;/code&gt; or &lt;code&gt;Monitoring Contributor&lt;/code&gt; roles for governance visibility.&lt;/li&gt;
&lt;li&gt;Narrow roles (e.g. &lt;code&gt;Network Contributor&lt;/code&gt;, &lt;code&gt;Security Reader&lt;/code&gt;) for workload subscriptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="2-enable-privileged-identity-management-pim"&gt;2. Enable Privileged Identity Management (PIM)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Entra ID → Privileged Identity Management&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Onboard Azure resources.&lt;/li&gt;
&lt;li&gt;Define permanent &lt;em&gt;eligible&lt;/em&gt; role assignments (not &lt;em&gt;active&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Require MFA, justification, and approval to activate roles.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="3-bicep-example--controlled-role-assignment"&gt;3. Bicep Example – Controlled Role Assignment
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Assign Network Contributor at platform subscription level&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/roleAssignments@2022-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;guid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ServicePrincipal&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Example values:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;roleDefinitionId&lt;/code&gt;: &lt;code&gt;b24988ac-6180-42a0-ab88-20f7382dd24c&lt;/code&gt; (Contributor)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scope&lt;/code&gt;: &lt;code&gt;/subscriptions/{platformSubscriptionId}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-conditional-access--mfa-enforcement"&gt;4. Conditional Access + MFA Enforcement
&lt;/h3&gt;&lt;p&gt;Use Conditional Access in &lt;strong&gt;Entra ID → Security → Conditional Access&lt;/strong&gt; to enforce MFA for administrative roles.&lt;br&gt;
Common patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Require &lt;strong&gt;compliant device&lt;/strong&gt; or &lt;strong&gt;Azure AD‑joined&lt;/strong&gt; machine.&lt;/li&gt;
&lt;li&gt;Block access from legacy auth or anonymous IP ranges.&lt;/li&gt;
&lt;li&gt;Apply strict policies to &lt;code&gt;Global Administrator&lt;/code&gt;, &lt;code&gt;Privileged Role Administrator&lt;/code&gt;, and PIM‑eligible roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sovereign-landing-zones-and-identity"&gt;Sovereign Landing Zones and Identity
&lt;/h2&gt;&lt;p&gt;While most ALZ identity designs target commercial Azure regions, the same principles extend to &lt;strong&gt;Microsoft Sovereign Landing Zones (SLZ)&lt;/strong&gt;. These environments service jurisdictions such as &lt;em&gt;Azure Australia Central&lt;/em&gt;, &lt;em&gt;Azure Government&lt;/em&gt;, and &lt;em&gt;Azure for EU Data Boundary&lt;/em&gt;—offering additional isolation and compliance controls.&lt;/p&gt;
&lt;p&gt;Key differences include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tenant separation&lt;/strong&gt; – Sovereign or regulated environments may require a &lt;em&gt;dedicated Entra ID tenant&lt;/em&gt;, isolated from corporate or commercial directories.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conditional Access under local policy&lt;/strong&gt; – CA rules may enforce sovereign network ranges, national ID providers, or hardware‑backed MFA.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PIM activation oversight&lt;/strong&gt; – Privileged activations often require local approval aligned with regulatory standards (e.g. IRAP, FedRAMP, or EU GDPR).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identity data residency&lt;/strong&gt; – Authentication logs and audit data may be restricted to certified national datacentres.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most enterprises, the identity design principles in this post serve as the &lt;strong&gt;baseline for sovereign expansion&lt;/strong&gt;—the same brew, just filtered through a compliance‑grade portafilter.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global Admin concentration&lt;/strong&gt;: Limit tenant‑wide roles. Use scoped Entra roles like &lt;code&gt;Cloud App Administrator&lt;/code&gt; or &lt;code&gt;Security Admin&lt;/code&gt; wherever possible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation accounts&lt;/strong&gt;: Managed identities don’t always bridge cross‑tenant scenarios; consider using app registrations secured with certificates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PIM activation latency&lt;/strong&gt;: Factor delays into incident response playbooks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Break‑glass accounts&lt;/strong&gt;: Maintain two emergency cloud‑only accounts with monitored sign‑in alerts—&lt;em&gt;never&lt;/em&gt; MFA‑disabled by accident.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Model access around &lt;strong&gt;management group hierarchy&lt;/strong&gt;, not ad‑hoc subscription roles.&lt;/li&gt;
&lt;li&gt;Group RBAC assignments via &lt;strong&gt;Azure AD security groups&lt;/strong&gt; to simplify lifecycle management.&lt;/li&gt;
&lt;li&gt;Enforce &lt;strong&gt;Conditional Access&lt;/strong&gt; with MFA for all administrators.&lt;/li&gt;
&lt;li&gt;Separate &lt;strong&gt;platform&lt;/strong&gt; and &lt;strong&gt;workload&lt;/strong&gt; identities—no shared service principals.&lt;/li&gt;
&lt;li&gt;Automate credential rotation through &lt;strong&gt;Key Vault&lt;/strong&gt; and managed identity.&lt;/li&gt;
&lt;li&gt;Review PIM usage quarterly; revoke stale eligible assignments.&lt;/li&gt;
&lt;li&gt;Document ownership boundaries as part of your governance artefacts.&lt;/li&gt;
&lt;li&gt;For sovereign deployments, confirm &lt;strong&gt;identity residency and tenant isolation&lt;/strong&gt; requirements early in design.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Identity is the grind setting of your cloud security—too coarse and everything slips through, too fine and no one can do their job. Get it just right with structured access tiers and automation, and your landing zone will run as consistently as your first morning cuppa.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access-application-access?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Cloud Adoption Framework – Identity and Access Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Azure/ALZ-Bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zone Bicep Modules – Identity Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/entra/id-governance/privileged-identity-management/pim-configure?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Entra – Privileged Identity Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/role-based-access-control/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure RBAC Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/entra/identity/conditional-access/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Conditional Access Policies in Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – Introducing the Secure Landing Zone</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-secure-overview/</link><pubDate>Tue, 11 Nov 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-secure-overview/</guid><description>&lt;p&gt;Like a precision-engineered espresso machine, a mature Azure environment is all about control — achieving just the right balance between pressure and flow. In our cloud world, that balance exists between &lt;strong&gt;security&lt;/strong&gt;, &lt;strong&gt;governance&lt;/strong&gt;, and &lt;strong&gt;operational agility&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Secure Landing Zone (SLZ)&lt;/strong&gt; is the mechanism that keeps that balance finely tuned. It’s the dedicated space within your Azure Landing Zone architecture where security, compliance, and trust boundaries converge — the operational embodiment of &lt;strong&gt;Sovereign Landing Zone (SoLZ)&lt;/strong&gt; principles.&lt;/p&gt;
&lt;p&gt;As organisations expand beyond their initial Azure foundations, they often need to navigate regulatory compliance, data residency, and strict access separation.&lt;br&gt;
That’s where the SLZ steps in — extending your Azure Landing Zone architecture to deliver sovereign-grade security and control.&lt;/p&gt;
&lt;h2 id="what-is-the-secure-landing-zone"&gt;What is the Secure Landing Zone?
&lt;/h2&gt;&lt;p&gt;The &lt;strong&gt;Secure Landing Zone (SLZ)&lt;/strong&gt; builds upon the &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Cloud Adoption Framework (CAF)&lt;/a&gt; design areas to provide a &lt;strong&gt;sovereign-ready&lt;/strong&gt; platform for security operations.&lt;/p&gt;
&lt;p&gt;It separates core security capabilities into a distinct management and operational boundary, allowing for strong isolation, independent lifecycle management, and compliance alignment.&lt;/p&gt;
&lt;p&gt;The SLZ focuses on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security &amp;amp; Compliance&lt;/strong&gt; – Centrally managing policies, alerting, and detection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identity &amp;amp; Access&lt;/strong&gt; – Segregated privileged identities via Microsoft Entra ID&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring &amp;amp; Response&lt;/strong&gt; – Unified telemetry and automation through Sentinel&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Sovereignty&lt;/strong&gt; – Restricting telemetry and data flow to specific regional boundaries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, the SLZ is a &lt;strong&gt;Sovereign Control Plane&lt;/strong&gt; for your Azure estate — enforcing identity, policy, and compliance guardrails without constraining day-to-day innovation.&lt;/p&gt;
&lt;h2 id="how-it-fits-in-the-landing-zone-hierarchy"&gt;How It Fits in the Landing Zone Hierarchy
&lt;/h2&gt;&lt;p&gt;The Secure Landing Zone extends the standard Azure Landing Zone layout by introducing &lt;strong&gt;controlled, sovereignty‑aware boundaries&lt;/strong&gt; that mirror the &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/secure/sovereignty/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone (SoLZ)&lt;/a&gt; pattern.&lt;/p&gt;
&lt;p&gt;By structuring management groups and subscriptions around &lt;strong&gt;trust tiers&lt;/strong&gt; and &lt;strong&gt;regional boundaries&lt;/strong&gt;, the design ensures that sensitive operations and data remain isolated within trusted Azure regions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tenant Root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── Platform
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Identity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Management
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Connectivity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Shared Services
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── Secure
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── Workloads
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── Corp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── Secure-Corp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── Online
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── Secure-Online
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="platform-secure-layer-sovereign-core"&gt;Platform Secure Layer (Sovereign Core)
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;Secure&lt;/code&gt; management group represents the &lt;strong&gt;sovereign control plane&lt;/strong&gt; of your Azure platform.&lt;br&gt;
This is where you locate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Sentinel&lt;/strong&gt; (SIEM/SOAR) and &lt;strong&gt;Log Analytics&lt;/strong&gt; — centralised but region‑restricted&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defender for Cloud&lt;/strong&gt; — managed at scale via policies scoped to this management group&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Policy and Governance Initiatives&lt;/strong&gt; — enforcing security and compliance baselines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation and Playbooks&lt;/strong&gt; — contained within a sovereign data region (e.g., Australia East/Central)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This design ensures that both governance and operational intelligence are processed &lt;strong&gt;locally&lt;/strong&gt; within approved regions, addressing data residency and compliance requirements.&lt;/p&gt;
&lt;h3 id="sovereign-secured-workload-zones"&gt;Sovereign Secured Workload Zones
&lt;/h3&gt;&lt;p&gt;Under each workload domain — &lt;em&gt;Corp&lt;/em&gt; and &lt;em&gt;Online&lt;/em&gt; — the inclusion of &lt;code&gt;secure-corp&lt;/code&gt; and &lt;code&gt;secure-online&lt;/code&gt; follows the &lt;strong&gt;SoLZ pattern&lt;/strong&gt; for sovereign application zones. These are specialised sub‑zones dedicated to sensitive or compliance‑bound workloads.&lt;/p&gt;
&lt;p&gt;Each secure workload zone is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bound to specific sovereign Azure regions&lt;/strong&gt; via the “Allowed Locations” policy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connected only via the Connectivity Platform&lt;/strong&gt;, using private endpoints and hub-spoke topology&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subject to delegated Defender for Cloud policies&lt;/strong&gt; while reporting telemetry back to the Platform Secure workspace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliant by default&lt;/strong&gt;, using Azure Policy and RBAC definitions inherited from the sovereign control plane&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These secure subzones act as &lt;strong&gt;sovereign enclaves&lt;/strong&gt; — maintaining isolation, compliance posture, and audit traceability.&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
A[Tenant Root]
A --&gt; B[Platform]
B --&gt; B1[Connectivity]
B --&gt; B2[Identity]
B --&gt; B3[Management]
B --&gt; B4[Shared Services]
B --&gt; B5["Secure Platform (Sovereign Control Plane)"]
A --&gt; C[Workloads]
C --&gt; C1[Corp]
C1 --&gt; D1["Secure-Corp (Sovereign Zone)"]
C --&gt; C2[Online]
C2 --&gt; D2["Secure-Online (Sovereign Zone)"]
&lt;/div&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;In regulated and defence-grade organisations across Australia, these Secure Landing Zones deliver measurable benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data residency assurance.&lt;/strong&gt; Telemetry and logs never leave sovereign regions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduced blast radius.&lt;/strong&gt; Platform and workload security scopes remain strictly separated.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Centralised compliance.&lt;/strong&gt; Security policies, audit logs, and Defender alerts flow to a single, sovereign workspace.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational clarity.&lt;/strong&gt; Security personnel manage the SLZ; application teams focus on workloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By adopting an SLZ following Sovereign Landing Zone principles, teams accelerate their security maturity without complicating operational models.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="portal-deployment-sequence-high-level"&gt;Portal Deployment Sequence (High Level)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Create a &lt;strong&gt;Secure&lt;/strong&gt; management group under &lt;em&gt;Platform&lt;/em&gt; and deploy a dedicated &lt;strong&gt;security subscription&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Deploy &lt;strong&gt;Log Analytics&lt;/strong&gt;, &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt;, and &lt;strong&gt;Azure Automation&lt;/strong&gt; in a sovereign region.&lt;/li&gt;
&lt;li&gt;Apply &lt;strong&gt;Defender for Cloud&lt;/strong&gt; standard plans across the Secure management group.&lt;/li&gt;
&lt;li&gt;Assign &lt;strong&gt;sovereign and security policy initiatives&lt;/strong&gt; targeting compliance (e.g. ISO27001, IRAP, or Essential Eight).&lt;/li&gt;
&lt;li&gt;Build &lt;strong&gt;secure‑corp&lt;/strong&gt; and &lt;strong&gt;secure‑online&lt;/strong&gt; subscriptions for sovereign application workloads.&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;private connectivity and telemetry flow&lt;/strong&gt; back into the Secure platform workspace.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="example-bicep-configuration"&gt;Example Bicep Configuration
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Prefix for secure landing zone resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;secure&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Region for sovereign deployment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;secureLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.OperationalInsights/workspaces@2022-10-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-law&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PerGB2018&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionInDays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sentinel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.SecurityInsights/onboardingStates@2022-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-sentinel&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;secureLog&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;defender&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Security/pricings@2022-03-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualMachines&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pricingTier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This configuration ensures sovereignty by constraining deployment to an Australian region and centralising all SIEM and Defender activity within the &lt;em&gt;Secure Platform&lt;/em&gt; boundary.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Policy overlap across management groups&lt;/strong&gt; – Validate inheritance to avoid conflicting enforcement when sovereign policies cross scopes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Telemetry costs&lt;/strong&gt; – Data retention and SIEM ingestion in sovereign regions can be higher due to compliance logging. Plan retention carefully.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defender plan overuse&lt;/strong&gt; – Avoid enabling every plan globally; use management group scoping to control coverage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identity segregation&lt;/strong&gt; – Maintain &lt;strong&gt;Entra Privileged Identity Management (PIM)&lt;/strong&gt; separation between platform and workload identities.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;✅ Create a &lt;strong&gt;dedicated Secure management group&lt;/strong&gt; under Platform to host all SLZ resources.&lt;/li&gt;
&lt;li&gt;✅ Deploy &lt;strong&gt;Sentinel&lt;/strong&gt; and &lt;strong&gt;Defender for Cloud&lt;/strong&gt; in compliance-approved Azure regions only.&lt;/li&gt;
&lt;li&gt;✅ Use &lt;strong&gt;&amp;ldquo;Allowed Locations&amp;rdquo;&lt;/strong&gt; and &lt;strong&gt;&amp;ldquo;Audit VNet Peering&amp;rdquo;&lt;/strong&gt; policies to guarantee sovereign network boundaries.&lt;/li&gt;
&lt;li&gt;✅ Follow the &lt;strong&gt;Sovereign Landing Zone reference architecture&lt;/strong&gt; for structured isolation.&lt;/li&gt;
&lt;li&gt;✅ Keep all &lt;strong&gt;automation, alerting, and telemetry&lt;/strong&gt; private — no Internet dependencies.&lt;/li&gt;
&lt;li&gt;✅ Apply &lt;strong&gt;least privilege (RBAC/PIM)&lt;/strong&gt; and separate operational lifecycles for Secure, Corp, and Online zones.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; The Secure Landing Zone is the espresso shot of sovereignty — concentrated, deliberate, and potent.&lt;br&gt;
It’s not just about compliance; it’s about &lt;strong&gt;trust and autonomy&lt;/strong&gt;. Adopting Sovereign Landing Zone principles ensures your Azure environment is ready to meet both local regulation and global security standards without sacrificing agility.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Cloud Adoption Framework – Landing Zone Design Areas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/sentinel/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Sentinel Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Defender for Cloud Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/governance/policy/samples/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Policy and Initiative Samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Azure/azure-landing-zones?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;CAF Secure Landing Zone Reference Implementation (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – The Anatomy of an ALZ</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-components/</link><pubDate>Thu, 06 Nov 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-components/</guid><description>&lt;p&gt;Designing an Azure Landing Zone (ALZ) can feel like crafting the perfect flat white, you need the right blend of structure and flexibility, delivered consistently every time. Miss the proportions and you’ll either over‑govern or under‑secure your environment.&lt;/p&gt;
&lt;p&gt;With Microsoft’s latest ALZ guidance evolving through the Cloud Adoption Framework (CAF), understanding what makes up an ALZ, and how these pieces interlock, is key to setting up a platform that scales cleanly across workloads and teams.&lt;/p&gt;
&lt;p&gt;In this post, we’ll unpack the anatomy of an ALZ from the ground up: management groups, baseline services, connectivity, logging, and what parts are open for customisation versus “hands‑off” prescriptive control.&lt;/p&gt;
&lt;h2 id="what-is-an-azure-landing-zone"&gt;What is an Azure Landing Zone?
&lt;/h2&gt;&lt;p&gt;An &lt;strong&gt;Azure Landing Zone (ALZ)&lt;/strong&gt; is a collection of Azure resources, policies, and configurations that establish a &lt;strong&gt;secure and governed foundation&lt;/strong&gt; for deploying workloads. It’s essentially the “control plane” for the rest of your cloud estate — defining how resources are structured, secured, and connected.&lt;/p&gt;
&lt;p&gt;Microsoft’s &lt;strong&gt;Cloud Adoption Framework (CAF)&lt;/strong&gt; describes ALZs as reference implementations that help organisations balance &lt;strong&gt;enterprise guardrails&lt;/strong&gt; with &lt;strong&gt;developer agility&lt;/strong&gt;. They span critical design areas such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identity and access management&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network topology and connectivity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security and compliance baseline&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource organisation and policy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring and management&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The current ALZ architecture (v3 and beyond) continues to evolve toward &lt;strong&gt;modularity and automation&lt;/strong&gt;, allowing partial or full deployment through templates, pipelines, or tools like Azure Developer CLI (azd).&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;Every ALZ is built around a &lt;strong&gt;management group hierarchy&lt;/strong&gt;, &lt;strong&gt;baseline policies&lt;/strong&gt;, &lt;strong&gt;governance services&lt;/strong&gt;, and &lt;strong&gt;shared platform resources&lt;/strong&gt;. Think of it as the skeleton of your Azure estate.&lt;/p&gt;
&lt;h3 id="1-management-group-hierarchy"&gt;1. Management Group Hierarchy
&lt;/h3&gt;&lt;p&gt;At the top sits the &lt;strong&gt;Tenant Root Group&lt;/strong&gt;, followed by a recommended structure like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tenant Root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── Platform
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── Identity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── Management
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── Connectivity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └── Shared Services
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── Workloads
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── Corp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── Online
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Each branch enforces scope‑specific policy assignments and role inheritances.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Platform&lt;/strong&gt; → central services like Firewall, DNS, and Hub networks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Corp&lt;/strong&gt; → internal workloads following restricted egress/internet controls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Online&lt;/strong&gt; → internet‑facing or public workloads with isolated routing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A simplified &lt;strong&gt;Mermaid&lt;/strong&gt; diagram helps illustrate this structure.&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
A[Tenant Root Group]
A --&gt; B[Platform]
A --&gt; C[Workloads]
B --&gt; D[Identity]
B --&gt; E[Management]
B --&gt; F[Connectivity]
C --&gt; G[Corp]
C --&gt; H[Online]
&lt;/div&gt;
&lt;h3 id="2-baseline-services"&gt;2. Baseline Services
&lt;/h3&gt;&lt;p&gt;Under the &lt;strong&gt;Platform&lt;/strong&gt; branch, Azure policy, Defender for Cloud, logging, and network topologies take shape:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Policy and Initiative Assignments:&lt;/strong&gt; Enforce naming, tagging, resource restrictions, security mandates, and region constraints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defender for Cloud (DfC):&lt;/strong&gt; Enables Cloud Security Posture Management (CSPM) and threat protection across subscriptions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Networking:&lt;/strong&gt; Hub‑and‑spoke is still the go‑to, though the &lt;strong&gt;Virtual WAN&lt;/strong&gt; model is gaining traction for global routing needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring:&lt;/strong&gt; Azure Monitor, Log Analytics, and Activity Logs are centralised in a management subscription for visibility and response.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-connectivity-and-hub-and-spoke-evolution"&gt;3. Connectivity and Hub-and-Spoke Evolution
&lt;/h3&gt;&lt;p&gt;The “Connectivity” management group or subscription houses baseline resources such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Virtual Network (Hub)&lt;/li&gt;
&lt;li&gt;Network Security Groups (NSGs) and Azure Firewall&lt;/li&gt;
&lt;li&gt;Private DNS zones&lt;/li&gt;
&lt;li&gt;VPN/ExpressRoute Gateways&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many teams now use &lt;strong&gt;Virtual WAN hubs&lt;/strong&gt; for unified global routing and security, combining multiple regions or geographies into a standardised topology.&lt;/p&gt;
&lt;h3 id="4-control-plane-vs-workload-plane"&gt;4. Control Plane vs. Workload Plane
&lt;/h3&gt;&lt;p&gt;An ALZ effectively splits your estate into two operating domains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control Plane:&lt;/strong&gt; The policies, RBAC assignments, and platform resources managed typically by a central platform team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workload Plane:&lt;/strong&gt; Application subscriptions that inherit governance and integrate using shared services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This separation enables autonomy without loss of oversight — the hallmark of a mature Azure platform.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;A well‑structured ALZ provides three tangible benefits to real‑world operations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Faster workload onboarding&lt;/strong&gt; — Teams can deploy workloads without re‑creating identity, networking, or monitoring from scratch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent compliance&lt;/strong&gt; — Built‑in policies ensure resources automatically align with regulatory or security requirements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalable governance&lt;/strong&gt; — As new workloads or business units appear, they slot neatly into the existing hierarchy with inherited guardrails.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example: A financial services customer adopted the latest ALZ baseline and halved provisioning time for new environments, while achieving automatic DfC coverage across all subscriptions.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="using-the-azure-portal"&gt;Using the Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Azure Landing Zone Accelerator&lt;/strong&gt; in the &lt;a class="link" href="https://portal.azure.com/" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Deploy to Azure&lt;/strong&gt; using the CAF‑aligned Bicep templates.&lt;/li&gt;
&lt;li&gt;Choose your management group root and desired topology (Hub &amp;amp; Spoke or VWAN).&lt;/li&gt;
&lt;li&gt;Review policy and role assignments, then deploy baseline resources.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example"&gt;Bicep Example
&lt;/h3&gt;&lt;p&gt;A shortened snippet defining part of the management group hierarchy and a policy assignment:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;targetScope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tenant&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;platformMgmtGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups@2021-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mg-platform&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Platform&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;tenantResourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tenant-root&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workloadsMgmtGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups@2021-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mg-workloads&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Workloads&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;tenantResourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tenant-root&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyAssign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policyAssignments@2021-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;audit-tagging&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Audit required tags&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/providers/Microsoft.Authorization/policyDefinitions/audit-tags&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;platformMgmtGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This modular design means the same hierarchy can be reused or modified via pipelines or automation frameworks.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Policy Overlaps:&lt;/strong&gt; Avoid redundant policy assignments between management groups; precedence can override higher‑level settings unexpectedly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hub Peering Limits:&lt;/strong&gt; Virtual network peers across regions can hit subscription or region limits; plan capacity early.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Role Assignment Delays:&lt;/strong&gt; Tenant‑level role changes can take minutes to propagate, complicating automated deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross‑Tenant Scenarios:&lt;/strong&gt; ALZ assumes single‑tenant governance; cross‑tenant or B2B integration often needs manual override policies.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start with the CAF Baseline&lt;/strong&gt; and customise incrementally—don’t boil the ocean on day one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Separate Platform and Workload subscriptions&lt;/strong&gt; to maintain isolation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable Defender for Cloud early&lt;/strong&gt; for unified posture management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Centralise monitoring and logs&lt;/strong&gt; using Azure Monitor and Sentinel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Template everything&lt;/strong&gt; — deploy ALZ Scaffolding with Bicep or Terraform to stay consistent across environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use feature flags or config maps&lt;/strong&gt; to control rollout of new policies safely.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="brewed-insights"&gt;Brewed Insights
&lt;/h2&gt;&lt;p&gt;Your ALZ is only as strong as its hierarchy. Treat it like the espresso shot in your morning brew — get the foundation right, and everything built on top flows smoother. Naming “Workloads” instead of “Landing Zones” keeps the hierarchy intuitive and clear for stakeholders managing real application estates.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Cloud Adoption Framework – Azure Landing Zones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Azure/azure-landing-zones?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zones GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;CAF Ready Checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-cloud-introduction?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Defender for Cloud Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Latest Azure Landing Zone – What’s New and Why It Matters</title><link>https://blog.brewedinthecloud.com/p/azure-landing-zone-overview/</link><pubDate>Tue, 04 Nov 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-landing-zone-overview/</guid><description>&lt;p&gt;If your organisation’s Azure environment has ever started to resemble a messy workbench, with half‑finished projects, cables everywhere, and no one sure who owns what then you already understand why &lt;strong&gt;Azure Landing Zones (ALZ)&lt;/strong&gt; exist.&lt;/p&gt;
&lt;p&gt;The latest refresh of Microsoft’s &lt;strong&gt;Azure Landing Zone and Secure Landing Zone&lt;/strong&gt; architecture is like upgrading from a faithful stovetop espresso to a precision‑calibrated machine: same goal, but vastly improved consistency, control, and flavour.&lt;/p&gt;
&lt;p&gt;This post breaks down what’s new, how the reference design has evolved, and why it’s now easier than ever to create compliant, secure, and scalable environments from day one.&lt;/p&gt;
&lt;h2 id="what-is-an-azure-landing-zone"&gt;What is an Azure Landing Zone?
&lt;/h2&gt;&lt;p&gt;An &lt;strong&gt;Azure Landing Zone&lt;/strong&gt; is Microsoft’s &lt;strong&gt;reference architecture and deployment pattern&lt;/strong&gt; for building a secure, governed cloud foundation. It defines how to organise resources, apply policy, manage identity, and connect workloads. It&amp;rsquo;s the scaffolding every Azure environment should start from.&lt;/p&gt;
&lt;h3 id="from-enterprisescale-to-the-unified-alz"&gt;From Enterprise‑Scale to the Unified ALZ
&lt;/h3&gt;&lt;p&gt;Older architectures like &lt;em&gt;Enterprise‑Scale Landing Zone&lt;/em&gt; and &lt;em&gt;CAF foundations&lt;/em&gt; acted as blueprints for large enterprises. However, Microsoft has now &lt;strong&gt;folded those frameworks directly into the unified Azure Landing Zone guidance&lt;/strong&gt;. The goal: a single, modular reference that fits startups through to global multi‑tenant enterprises.&lt;/p&gt;
&lt;p&gt;So rather than a single monolith of templates, ALZ now offers a &lt;strong&gt;modular, design‑area‑driven approach&lt;/strong&gt; where you choose which elements to adopt, iterate on them over time, and evolve the platform in step with cloud maturity.&lt;/p&gt;
&lt;h2 id="the-eight-core-design-areas"&gt;The Eight Core Design Areas
&lt;/h2&gt;&lt;p&gt;The latest design defines &lt;strong&gt;eight interconnected areas&lt;/strong&gt;, each representing a pillar of your landing zone foundation:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Design Area&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Identity and Access Management (IAM)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID foundations, RBAC design, Privileged Identity Management (PIM), and conditional access strategy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Network Topology and Connectivity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hub‑and‑spoke or Virtual WAN, hybrid connectivity, DNS, and Private Link design.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Resource Organisation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Management group hierarchy, subscription strategy, and consistent naming and tagging standards.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Governance and Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Azure Policy, Resource Locks, Defender for Cloud, and cross‑environment guardrails.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Security, Operations and Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Baseline configurations for threat protection, central log collection, and secure configuration enforcement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Management and Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Azure Monitor, Log Analytics, Automation Accounts, and service health visibility.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Business Continuity and Disaster Recovery (BCDR)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Backup, site recovery, multi‑region workloads, and resilience planning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Platform Automation and DevOps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Infrastructure‑as‑Code (IaC), CI/CD pipelines, GitOps processes, and automated configuration drift management.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These areas combine to form an adaptable foundation governed by &lt;strong&gt;Landing Zone&lt;/strong&gt; and &lt;strong&gt;Secure Landing Zone&lt;/strong&gt; reference models.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;The Landing Zone design leverages Azure’s native &lt;strong&gt;control plane hierarchy&lt;/strong&gt; The Entra ID tenant, management group, subscription, resource group, and resource — to distinguish governance from workload operations.&lt;/p&gt;
&lt;p&gt;Below is a simplified view of the reference structure using updated terminology:&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;I am NOT a fan of using the term &amp;ldquo;Landing Zones&amp;rdquo; within a Landing Zone design I feel like I get caught over explaining the difference or confusing customers when I am speaking about a specific space within the design and they think I am talking about the holistic design or visa versa.&lt;/p&gt;
&lt;p&gt;To avoid this confusion I relabel &amp;ldquo;Landing Zones&amp;rdquo; as Workloads. I feel this provides a better definition of the space and the subsequent subscriptions and resources&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;div class="mermaid"&gt;graph TD
TENANT[Entra ID Tenant]
TENANT --&gt; MGRoot[Root Management Group]
MGRoot --&gt; MGPlatform[Platform]
MGRoot --&gt; MGLandingZones[Workloads]
MGPlatform --&gt; MGIdentity[Identity]
MGPlatform --&gt; MGConnectivity[Connectivity]
MGPlatform --&gt; MGSecurity[Central Security]
MGPlatform --&gt; MGManagement[Management]
MGLandingZones --&gt; SubWorkload1[Workload A Subscription]
MGLandingZones --&gt; SubWorkload2[Workload B Subscription]
SubWorkload1 --&gt; RG1[Resource Groups / Apps]
SubWorkload2 --&gt; RG2[Resource Groups / Data]
&lt;/div&gt;
&lt;p&gt;This structure enables tight control of &lt;strong&gt;policy inheritance and delegation&lt;/strong&gt;, ensuring that corporate standards cascade from the top management groups but still allow agility within workload subscriptions.&lt;/p&gt;
&lt;h3 id="whats-changed-in-the-latest-reference-design"&gt;What’s Changed in the Latest Reference Design
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secure Landing Zone (SLZ) Becomes First‑Class&lt;/strong&gt;&lt;br&gt;
Security controls are no longer a bolt‑on. SLZ is now an integral model with pre‑mapped controls aligning directly to &lt;em&gt;Zero Trust&lt;/em&gt; and Defender for Cloud benchmarks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Eight‑Area Alignment&lt;/strong&gt;&lt;br&gt;
The legacy “design principle” view is now formalised into these eight well‑defined areas, which together cover every subscription lifecycle from governance to DR.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automation‑First Paradigm&lt;/strong&gt;&lt;br&gt;
Microsoft’s emphasis has shifted: Landing Zones should be deployed and maintained via &lt;strong&gt;automation pipelines&lt;/strong&gt;, not manual configurations. The supporting &lt;a class="link" href="https://github.com/Azure/ALZ-Bicep" target="_blank" rel="noopener"
&gt;ALZ‑Bicep repository&lt;/a&gt; and modular template packages make this achievable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platform Resources Redefined&lt;/strong&gt;&lt;br&gt;
The hierarchy now groups &lt;strong&gt;Identity&lt;/strong&gt;, &lt;strong&gt;Connectivity&lt;/strong&gt;, and &lt;strong&gt;Security&lt;/strong&gt; under &lt;strong&gt;Platform Resources&lt;/strong&gt; — clarifying ownership boundaries and improving access segregation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enhanced Resilience Focus&lt;/strong&gt;&lt;br&gt;
ALZ now embeds &lt;strong&gt;BCDR&lt;/strong&gt; as a design area, recommending Azure Backup, Site Recovery, and region pairing guidance as baseline expectations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retirement of Enterprise‑Scale Terminology&lt;/strong&gt;&lt;br&gt;
The previous ESLZ guidance is now deprecated in favour of this unified pattern. The concepts remain, but the language and modularity are refined.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;h3 id="-customer-1--greenfield-azure-a-clean-start-with-guardrails"&gt;☕ Customer 1 – Greenfield Azure: A Clean Start with Guardrails
&lt;/h3&gt;&lt;p&gt;A mid‑sized enterprise is preparing to migrate from its on‑prem environment — a single flat network with little role segmentation or billing separation — into Azure.&lt;br&gt;
They’ve built a consistent naming convention locally but know it’s not directly cloud‑ready.&lt;/p&gt;
&lt;p&gt;Their priorities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Segment environments into &lt;strong&gt;Prod&lt;/strong&gt;, &lt;strong&gt;Dev&lt;/strong&gt;, &lt;strong&gt;Test&lt;/strong&gt;, and &lt;strong&gt;DMZ&lt;/strong&gt; tiers.&lt;/li&gt;
&lt;li&gt;Maintain &lt;strong&gt;consistent security and policy enforcement&lt;/strong&gt; without added complexity.&lt;/li&gt;
&lt;li&gt;Avoid unnecessary spend by &lt;strong&gt;keeping the network layout simple&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Centralise connectivity through a &lt;strong&gt;hub‑and‑spoke or Virtual WAN topology&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using the &lt;strong&gt;Azure Landing Zone design areas&lt;/strong&gt;, the roadmap looked like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Resource Organisation &amp;amp; Governance:&lt;/strong&gt;&lt;br&gt;
Adopted the standard management group hierarchy (&lt;code&gt;Platform&lt;/code&gt;, &lt;code&gt;Workloads&lt;/code&gt;, &lt;code&gt;Management&lt;/code&gt;), applying environment tags and subscription separation per environment.&lt;br&gt;
CAF‑aligned naming conventions were re‑tooled to ensure scalability across environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Network Topology and Connectivity:&lt;/strong&gt;&lt;br&gt;
Built a shared &lt;strong&gt;Connectivity subscription&lt;/strong&gt; hosting the hub virtual network and Azure Firewall Manager. Spokes represented the segmented environments (&lt;code&gt;Prod&lt;/code&gt;, &lt;code&gt;Dev&lt;/code&gt;, etc.), each with segregated subnets but governed by central routing and policy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secure Landing Zone:&lt;/strong&gt;&lt;br&gt;
Security baselines were enforced through pre‑built policy initiatives — encrypting storage accounts, restricting VM SKUs, and standardising region deployment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Outcome:&lt;/strong&gt;&lt;br&gt;
Within weeks, the customer established a clean, well‑segmented environment with predictable connectivity and security built‑in. They avoided sprawl and surprise charges while achieving a structure ready for workload migrations.&lt;/p&gt;
&lt;h3 id="-customer-2--brownfield-azure-evolving-towards-the-landing-zone-pattern"&gt;☕ Customer 2 – Brownfield Azure: Evolving Towards the Landing Zone Pattern
&lt;/h3&gt;&lt;p&gt;Another customer already operates in Azure but realises their environment has grown organically — inconsistent tagging, scattered resources, and no clear linkage between dev, test, and production workloads.&lt;/p&gt;
&lt;p&gt;Their challenges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing structure doesn’t fully align with the proposed &lt;strong&gt;Landing Zone pattern&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tagging taxonomy&lt;/strong&gt; is inconsistent and not providing real business value.&lt;/li&gt;
&lt;li&gt;Desire to &lt;strong&gt;centralise connectivity&lt;/strong&gt; for better security visibility and control.&lt;/li&gt;
&lt;li&gt;Need to &lt;strong&gt;apply policy guardrails&lt;/strong&gt; to limit region sprawl and costly VM SKU choices.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Their approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assessment via CAF Readiness Review:&lt;/strong&gt;&lt;br&gt;
Mapped the current environment against the &lt;strong&gt;eight design areas&lt;/strong&gt; to identify remediation scope and technical debt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Incremental Landing Zone Adoption:&lt;/strong&gt;&lt;br&gt;
Decided not to “lift‑and‑shift” the entire estate, but instead &lt;strong&gt;deploy the new ALZ structure&lt;/strong&gt; in parallel. Existing production workloads started migrating gradually, while new projects launched directly inside Landing Zone subscriptions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automation and Governance Enhancements:&lt;/strong&gt;&lt;br&gt;
Introduced Azure Policy initiatives for allowed SKUs, region restrictions, and tagging enforcement.&lt;br&gt;
Leveraged &lt;strong&gt;Azure Resource Graph&lt;/strong&gt; queries to discover and remediate old resources outside governance boundaries.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Centralised Connectivity:&lt;/strong&gt;&lt;br&gt;
Built a new &lt;strong&gt;hub network&lt;/strong&gt; under the Platform management group and rerouted spokes via Virtual Network Peering.&lt;br&gt;
This central hub established consistent ingress/egress controls and visibility via Network Watcher and NSG Flow Logs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Outcome:&lt;/strong&gt;&lt;br&gt;
Within a few months, the organisation achieved much better visibility, control, and cost predictability.&lt;br&gt;
While legacy resources still coexist, the Landing Zone architecture provided a north star for modernisation — replacing chaos with incremental, systematic improvement.&lt;/p&gt;
&lt;p&gt;Both cases show how &lt;strong&gt;Azure Landing Zones&lt;/strong&gt; are not only for new cloud adopters but also a practical refactoring target for existing Azure estates.&lt;br&gt;
Whether greenfield or brownfield, the framework turns fragmented footprints into repeatable, monitored, and governed platforms — proving that the perfect brew is achievable, even when you start with yesterday’s grounds.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="deploy-via-azure-portal"&gt;Deploy via Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Open the &lt;a class="link" href="https://portal.azure.com/?feature.customportal=false#view/Microsoft_Azure_Governance/BlueprintsBlade" target="_blank" rel="noopener"
&gt;Azure Landing Zone Accelerator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Secure Landing Zone&lt;/strong&gt; definition.&lt;/li&gt;
&lt;li&gt;Configure:
&lt;ul&gt;
&lt;li&gt;Management Group hierarchy&lt;/li&gt;
&lt;li&gt;Connectivity type: &lt;strong&gt;Hub‑Spoke&lt;/strong&gt; or &lt;strong&gt;Virtual WAN&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Defender for Cloud plan onboarding&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deploy directly or export configuration for IaC pipeline integration.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-foundation-example"&gt;Bicep Foundation Example
&lt;/h3&gt;&lt;p&gt;Here’s a refreshed sample to spin up the management group scaffolding from Automation pipelines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rootMG&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mg-root&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgManagement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups@2021-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mg-management&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;tenantResourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rootMG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mg-management&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgPlatform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups@2021-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mg-platform&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;tenantResourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rootMG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mg-platform&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mgLanding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups@2021-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mg-workloads&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;tenantResourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Management/managementGroups&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rootMG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mg-workloads&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can then import the modular &lt;strong&gt;ALZ‑Bicep&lt;/strong&gt; packages for policies, connectivity, and monitoring:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az bicep install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bicep install az:alz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bicep build ./main.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Policy sequencing&lt;/strong&gt;: Order of policy assignments still matters. Deploy policy baseline modules before workload‑specific ones to avoid blocking legitimate resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross‑tenant identity&lt;/strong&gt;: Multi‑directory environments may require explicit configuration for Entra cross‑tenant access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CIDR overlap&lt;/strong&gt;: When migrating legacy hubs, ensure address space planning aligns with vWAN or secure hub modules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drift detection lag&lt;/strong&gt;: If automation is disabled, ALZ configurations can drift — leverage compliance scans and DevOps triggers to correct automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Adopt ALZ components &lt;strong&gt;incrementally&lt;/strong&gt; — not every design area needs to be deployed on day one.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Bicep or Terraform pipelines&lt;/strong&gt; for repeatable deployment and compliance validation.&lt;/li&gt;
&lt;li&gt;Map &lt;strong&gt;landing zone policy initiatives&lt;/strong&gt; directly to CAF policy categories for clarity in audits.&lt;/li&gt;
&lt;li&gt;Integrate &lt;strong&gt;Defender for Cloud&lt;/strong&gt; and &lt;strong&gt;Log Analytics&lt;/strong&gt; early to baseline secure posture.&lt;/li&gt;
&lt;li&gt;Apply &lt;strong&gt;Privileged Identity Management (PIM)&lt;/strong&gt; for tenant and management group administrators.&lt;/li&gt;
&lt;li&gt;Align &lt;strong&gt;naming and tagging conventions&lt;/strong&gt; with your Resource Organisation strategy.&lt;/li&gt;
&lt;li&gt;For resiliency, configure &lt;strong&gt;Geo‑replicated backups&lt;/strong&gt; and &lt;strong&gt;pair regions&lt;/strong&gt; for core workloads.&lt;/li&gt;
&lt;li&gt;Treat Automation and DevOps as part of platform design, not post‑deployment tooling.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; The latest Azure Landing Zone release isn’t just another iteration it’s a maturity moment. Governance, security, automation, and resilience have merged under one consistent pattern. Think of it as refining your brewing process: same beans, better extraction. With the new ALZ, your cloud foundation is engineered for scale and repeatability, not just deployment speed.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zone Conceptual Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Azure/ALZ-Bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Landing Zone Bicep Modules on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/cloud-adoption-framework/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Cloud Adoption Framework (CAF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Sovereign Landing Zone Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Essential 8 Maturity Level 2 in Microsoft Cloud VDI (AVD &amp; W365) – Regular Backups</title><link>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-backups/</link><pubDate>Thu, 30 Oct 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-backups/</guid><description>&lt;p&gt;A good cold brew is all about preparation and patience. You steep it overnight, untouched, so it&amp;rsquo;s ready when the temperature rises. Backups are no different they only matter when things go wrong, but they’re useless if not carefully prepared.&lt;/p&gt;
&lt;p&gt;In Azure Virtual Desktop (AVD) or Windows 365 (W365), solid backup practices are what transform a simple outage into a quick recovery.&lt;/p&gt;
&lt;h3 id="what-is-backups"&gt;What is “Backups”?
&lt;/h3&gt;&lt;p&gt;Under the &lt;strong&gt;ACSC Essential 8&lt;/strong&gt;, the Backup control is all about &lt;strong&gt;resilience&lt;/strong&gt;: being able to recover critical systems, data, and configurations after a breach, ransomware event, or mistake.&lt;/p&gt;
&lt;p&gt;For &lt;strong&gt;Maturity Level 2&lt;/strong&gt;, backups must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run automatically and be retained per business criticality&lt;/li&gt;
&lt;li&gt;Be synchronised for consistent point‑in‑time recovery&lt;/li&gt;
&lt;li&gt;Be stored securely and tested regularly&lt;/li&gt;
&lt;li&gt;Be protected against unauthorised modification or deletion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short — a working recovery plan with provable isolation and integrity.&lt;/p&gt;
&lt;h3 id="how-it-works-in-cloudvdi"&gt;How It Works in Cloud VDI
&lt;/h3&gt;&lt;h4 id="azurevirtualdesktopavd"&gt;Azure Virtual Desktop (AVD)
&lt;/h4&gt;&lt;p&gt;AVD operates across several Azure layers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User profiles and data&lt;/strong&gt; – FSLogix containers stored in &lt;strong&gt;Azure Files&lt;/strong&gt; or &lt;strong&gt;Azure NetApp Files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session hosts&lt;/strong&gt; – Azure Compute virtual machines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration definitions&lt;/strong&gt; – ARM or Bicep templates, PowerShell&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependent services&lt;/strong&gt; – Azure SQL, Key Vault, or Azure Storage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Backups apply differently at each layer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protect &lt;strong&gt;Azure Files&lt;/strong&gt; with Azure Backup or &lt;strong&gt;NetApp volume snapshots&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Back up &lt;strong&gt;session‑host VMs&lt;/strong&gt; using &lt;strong&gt;Recovery Services Vaults&lt;/strong&gt;. In multi‑host designs, use gold‑image version control rather than backing up each instance.&lt;/li&gt;
&lt;li&gt;Store all &lt;strong&gt;Infrastructure‑as‑Code&lt;/strong&gt; (Bicep, ARM, JSON) in version‑controlled repositories to allow environment rebuilds at short notice.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Backups for AVD environments should also use &lt;strong&gt;immutable Recovery Services Vaults&lt;/strong&gt; with &lt;strong&gt;Geo‑Redundant Storage (GRS)&lt;/strong&gt; enabled to deliver true ML2‑grade resilience.&lt;/p&gt;
&lt;h3 id="windows365w365-and-microsoft365dataprotection"&gt;Windows 365 (W365) and Microsoft 365 Data Protection
&lt;/h3&gt;&lt;p&gt;Windows 365 abstracts almost all infrastructure layers, leaving Microsoft 365 to manage user data protection. In this model, your ability to restore depends on the native data‑protection features built into the Microsoft 365 stack.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What Microsoft provides:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OneDrive for Business&lt;/strong&gt;: Version history, 30‑day file restore, and a 93‑day recycle bin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SharePoint Online&lt;/strong&gt;: Dual‑stage recycle bins retained for 93 days, and library versioning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exchange Online&lt;/strong&gt;: Item‑level recovery and deleted‑item retention (default 30 days, extendable), underpinned by database‑level replication and availability groups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform replication:&lt;/strong&gt; Microsoft maintains multi‑region replication for service continuity and platform‑level resilience.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These measures support availability, limited retention, and short‑term recovery, but &lt;strong&gt;do not fully meet Essential 8 ML2 requirements&lt;/strong&gt;. Microsoft’s protection model is designed for &lt;em&gt;service continuity&lt;/em&gt;, not for &lt;em&gt;tenant‑controlled backup&lt;/em&gt;. You cannot make data immutable, restore a complete site at will, or isolate copies from the production tenancy.&lt;/p&gt;
&lt;p&gt;To close this compliance gap, many organisations deploy &lt;strong&gt;cloud‑to‑cloud backup solutions&lt;/strong&gt; such as &lt;strong&gt;ConnectWise M365 Backup (formerly SkyKick)&lt;/strong&gt; or &lt;strong&gt;Veeam Backup for M365&lt;/strong&gt;. These tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep &lt;strong&gt;independent, immutable copies&lt;/strong&gt; of OneDrive, SharePoint, and Exchange data.&lt;/li&gt;
&lt;li&gt;Offer &lt;strong&gt;region‑specific replication&lt;/strong&gt; and flexible retention schedules.&lt;/li&gt;
&lt;li&gt;Support &lt;strong&gt;granular, point‑in‑time recovery&lt;/strong&gt; aligned to business and compliance objectives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using third‑party M365 backups moves tenant data under your administrative control the critical step needed to achieve ML2 alignment for Microsoft 365 workloads supporting W365 users.&lt;/p&gt;
&lt;h3 id="immutablebackups--handsofflockedtight"&gt;Immutable Backups – Hands Off, Locked Tight
&lt;/h3&gt;&lt;p&gt;Immutable backups are those that &lt;strong&gt;cannot be modified or deleted&lt;/strong&gt; until their retention period ends. In Azure this is delivered using &lt;strong&gt;Immutable Vaults&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stops ransomware dead&lt;/strong&gt; — even compromised credentials can’t alter or remove stored copies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eliminates insider tampering&lt;/strong&gt; — backup and platform admins can’t purge protected data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supports audit and compliance&lt;/strong&gt; — the vault enforces evidence of retention integrity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once locked, backups remain intact until the specified retention period ends — the digital equivalent of sealing a litre of cold brew and labelling it &lt;em&gt;hands off until morning&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="backupresiliencywithgeoredundancy"&gt;Backup Resiliency with Geo‑Redundancy
&lt;/h3&gt;&lt;p&gt;Resilient backups survive not just tampering but regional disasters.&lt;br&gt;
Setting your Recovery Services Vault to &lt;strong&gt;Geo‑Redundant Storage (GRS)&lt;/strong&gt; replicates backup data to a paired Azure region.&lt;/p&gt;
&lt;p&gt;When enabled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Backups are written to both primary and secondary regions.&lt;/li&gt;
&lt;li&gt;In a regional outage, Microsoft can initiate recovery from the secondary region.&lt;/li&gt;
&lt;li&gt;Combined with immutability, this provides both &lt;strong&gt;off‑site protection&lt;/strong&gt; and &lt;strong&gt;change‑proof retention&lt;/strong&gt; — ideal for ML2 compliance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Portal path:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open your &lt;em&gt;Recovery Services Vault&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Properties → Backup Configuration&lt;/em&gt;, select &lt;strong&gt;Geo‑Redundant Storage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Ensure &lt;strong&gt;Soft Delete&lt;/strong&gt; and &lt;strong&gt;Immutable Vault&lt;/strong&gt; are both enabled&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="implementationflow"&gt;Implementation Flow
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart TD
AVD[Azure Virtual Desktop] --&gt; FS["FSLogix Containers - Azure Files"]
FS --&gt; Vault["Recovery Services Vault (Immutable + GRS)"]
Vault --&gt; TestRestore["Tested Restore / DR Exercise"]
subgraph M365 [Windows 365 + Microsoft 365]
U1[Cloud PC Users] --&gt; OD["OneDrive / SharePoint / Exchange Online"]
OD --&gt; Protect["Microsoft Data Protection - Versioning, Retention"]
Protect --&gt; Backup3P["Optional Tenant-Controlled Backup Platform (e.g. ConnectWise M365 Backup)"]
end
&lt;/div&gt;
&lt;h3 id="realworldimpact"&gt;Real‑World Impact
&lt;/h3&gt;&lt;p&gt;Immutable and geo‑resilient backups bring calm to otherwise chaotic recovery moments. Without them, ransomware or an administrator’s mis‑click could erase both production and recovery data in an instant.&lt;/p&gt;
&lt;p&gt;A properly designed plan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enables rapid, point‑in‑time recovery from isolated data copies&lt;/li&gt;
&lt;li&gt;Provides cross‑region durability for continuity&lt;/li&gt;
&lt;li&gt;Defends against insider and external tampering&lt;/li&gt;
&lt;li&gt;Demonstrates tested, auditable control for compliance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For AVD and W365 alike, that’s the difference between a minor outage and a week of downtime.&lt;/p&gt;
&lt;h3 id="bestpractices"&gt;Best Practices
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Enable &lt;strong&gt;Immutable Vaults with GRS&lt;/strong&gt; for all AVD critical file shares and backup vaults.&lt;/li&gt;
&lt;li&gt;Activate &lt;strong&gt;Soft Delete&lt;/strong&gt; to guard against unexpected purge operations.&lt;/li&gt;
&lt;li&gt;Tighten &lt;strong&gt;RBAC&lt;/strong&gt; on Recovery Services Vaults; restrict “restore operator” privileges.&lt;/li&gt;
&lt;li&gt;Store infrastructure definitions in &lt;strong&gt;source control&lt;/strong&gt; for rapid environment rebuilds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test restores quarterly&lt;/strong&gt;; record results to evidence DR capability.&lt;/li&gt;
&lt;li&gt;For Microsoft 365 tenants, deploy &lt;strong&gt;independent backup&lt;/strong&gt; where compliance or legal retention requires isolation.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Microsoft’s native protection is like keeping a backup jug of cold brew in the same fridge as the main batch — safe from small spills but not from a power cut.&lt;br&gt;
Adding immutable, geo‑redundant Azure backups and independent M365 backups is like moving that jug across town to a powered cellar: slower to set up but rock‑solid when everything else melts down.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="learnmore"&gt;Learn More
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/backup/backup-azure-files" target="_blank" rel="noopener"
&gt;Azure Backup for Azure Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/virtual-desktop/disaster-recovery" target="_blank" rel="noopener"
&gt;Azure Virtual Desktop Disaster Recovery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/backup/backup-azure-immutable-vault-concept?tabs=recovery-services-vault" target="_blank" rel="noopener"
&gt;Immutable Backup Vaults in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/backup/backup-overview#redundancy-options" target="_blank" rel="noopener"
&gt;Azure Backup Storage Redundancy Options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/windows-365/business-continuity-disaster-recovery" target="_blank" rel="noopener"
&gt;Windows 365 Business Continuity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cyber.gov.au/acsc/view-all-content/publications/essential-eight-maturity-model" target="_blank" rel="noopener"
&gt;ACSC Essential Eight Maturity Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.connectwise.com/platform/bcdr/cloud-backup" target="_blank" rel="noopener"
&gt;ConnectWise M365 Backup (formerly SkyKick)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Essential 8 Maturity Level 2 in Microsoft Cloud VDI (AVD &amp; W365) – User Application Hardening</title><link>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-user-app-hardening/</link><pubDate>Tue, 28 Oct 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-user-app-hardening/</guid><description>&lt;p&gt;We’ve all had that one poorly made coffee that somehow ruins your morning flow — bitter, messy, and impossible to fix once poured. In many ways, unprotected applications in a virtual desktop are the same. A single dodgy browser plugin or outdated PDF reader can completely spoil your security blend. That’s where &lt;strong&gt;User Application Hardening&lt;/strong&gt; comes in. It keeps the bad add-ins and malicious macros from spilling into your users’ sessions.&lt;/p&gt;
&lt;h3 id="what-is-user-application-hardening"&gt;What is User Application Hardening?
&lt;/h3&gt;&lt;p&gt;User Application Hardening is one of the &lt;strong&gt;Australian Cyber Security Centre (ACSC) Essential Eight&lt;/strong&gt; strategies. At &lt;strong&gt;Maturity Level 2 (ML2)&lt;/strong&gt;, it’s all about &lt;strong&gt;reducing exposure in user-facing applications&lt;/strong&gt; — browsers, Office apps, PDF readers, and similar — by removing or disabling risky capabilities.&lt;/p&gt;
&lt;p&gt;In plain terms, it means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Removing Internet Explorer 11&lt;/li&gt;
&lt;li&gt;Disabling Java, Flash, and other deprecated script engines&lt;/li&gt;
&lt;li&gt;Blocking Office from running macros, injecting code, or launching child processes&lt;/li&gt;
&lt;li&gt;Hardening PDF readers to prevent malicious scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These changes collectively close high-frequency exploitation routes that adversaries love to abuse.&lt;/p&gt;
&lt;h3 id="how-it-works-in-cloud-vdi"&gt;How it Works in Cloud VDI
&lt;/h3&gt;&lt;p&gt;For both &lt;strong&gt;Azure Virtual Desktop (AVD)&lt;/strong&gt; and &lt;strong&gt;Windows 365 Cloud PCs&lt;/strong&gt;, these controls are applied through &lt;strong&gt;centralised management and policy enforcement&lt;/strong&gt;. The approach differs slightly depending on how compute sessions are delivered.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Virtual Desktop (AVD):&lt;/strong&gt;&lt;br&gt;
Multi-session environments typically use a &lt;strong&gt;golden image&lt;/strong&gt; that includes hardened apps and preconfigured baselines. Configuration policies are applied using &lt;strong&gt;Microsoft Intune&lt;/strong&gt;, &lt;strong&gt;Group Policy Objects (GPOs)&lt;/strong&gt;, and &lt;strong&gt;Defender for Endpoint&lt;/strong&gt; integration via the session host templates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows 365:&lt;/strong&gt;&lt;br&gt;
Each Cloud PC runs as a dedicated instance for a single user. Intune device policies and security baselines map directly to each machine, which simplifies lifecycle management.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="policy-flow-diagram"&gt;Policy Flow Diagram
&lt;/h4&gt;&lt;div class="mermaid"&gt;flowchart LR
A[Intune &amp; Defender Policies] --&gt; B{Policy Delivery}
B --&gt; C[Azure Virtual Desktop Session Hosts]
B --&gt; D[Windows 365 Cloud PCs]
C --&gt; E["Applications Hardened (Edge, Office, Acrobat Reader)"]
D --&gt; E
E --&gt; F["Telemetry sent to Defender / SIEM"]
F --&gt; G[Security Operations Centre for Analysis]
&lt;/div&gt;
&lt;p&gt;This unified approach enforces restriction policies across the environment and provides telemetry for continuous oversight through Defender and log integrations.&lt;/p&gt;
&lt;h3 id="real-world-impact"&gt;Real-World Impact
&lt;/h3&gt;&lt;p&gt;Attackers exploit what users trust most — browsers, email attachments, spreadsheets, and documents. Once embedded in a malicious payload, even an Office macro can deliver PowerShell commands or dropper scripts within seconds.&lt;/p&gt;
&lt;p&gt;User Application Hardening directly trims these attack surfaces. When paired with logging and timely analysis, it creates a resilient, self-defending virtual desktop environment that meets both &lt;strong&gt;ACSC ML2&lt;/strong&gt; obligations and enterprise expectations for modern security operations.&lt;/p&gt;
&lt;p&gt;The business outcome: fewer incidents, faster detection, and a far more predictable user experience.&lt;/p&gt;
&lt;h3 id="implementation-example"&gt;Implementation Example
&lt;/h3&gt;&lt;h4 id="intune"&gt;Intune
&lt;/h4&gt;&lt;p&gt;You can deliver application hardening through a &lt;strong&gt;single, unified Intune policy&lt;/strong&gt; that implements all required ML2 browser, Office, and PDF settings.&lt;/p&gt;
&lt;h5 id="step-1--create-a-consolidated-configuration-profile"&gt;Step 1 – Create a consolidated configuration profile
&lt;/h5&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In the &lt;a class="link" href="https://intune.microsoft.com" target="_blank" rel="noopener"
&gt;Microsoft Intune admin centre&lt;/a&gt;, go to &lt;strong&gt;Endpoint Security → Security Baselines → Microsoft Edge baseline&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Create Profile&lt;/strong&gt; and assign a clear name such as &lt;code&gt;Essential8-UserApplicationHardening-ML2&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the following &lt;strong&gt;browser protection settings&lt;/strong&gt; derived from both ASD and Microsoft guidance:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Recommended Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SmartScreen&lt;/td&gt;
&lt;td&gt;Require SmartScreen for URLs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enabled&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugins&lt;/td&gt;
&lt;td&gt;Allow Adobe Flash and Java&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Disabled&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tracking Prevention&lt;/td&gt;
&lt;td&gt;Apply Strict Mode&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enabled&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extensions&lt;/td&gt;
&lt;td&gt;Block unapproved extensions&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enabled&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Updates&lt;/td&gt;
&lt;td&gt;Disallow user override of update policy&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enabled&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IE Mode&lt;/td&gt;
&lt;td&gt;Disable IE Integration&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enabled&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Allow only signed scripts from trusted zones&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enabled&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Site Security&lt;/td&gt;
&lt;td&gt;Prevent site isolation overrides&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enabled&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Assign the profile to both &lt;strong&gt;AVD session host&lt;/strong&gt; and &lt;strong&gt;Windows 365&lt;/strong&gt; device groups.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This single policy ensures browsers are protected against common vectors such as Java-based web content, Flash exploits, and malicious ads or extensions.&lt;/p&gt;
&lt;h5 id="step-2--office-and-pdf-hardening"&gt;Step 2 – Office and PDF Hardening
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;Add the &lt;strong&gt;Microsoft 365 Apps Baseline&lt;/strong&gt; to disable macro execution from the Internet and restrict add-ins to trusted publishers.&lt;/li&gt;
&lt;li&gt;Enforce &lt;strong&gt;ASR rules&lt;/strong&gt; to block child process creation, executable content, and code injection:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;D4F940AB-401B-4EFC-AADC-AD5F3C50688A&lt;/code&gt; (Child Processes)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3B576869-A4EC-4529-8536-B80A7769E899&lt;/code&gt; (Executable Content)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;75668C1F-73B5-4CF0-BB93-3ECF5CB7CC84&lt;/code&gt; (Code Injection)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deploy a &lt;strong&gt;custom configuration profile&lt;/strong&gt; for PDF readers disabling JavaScript (&lt;code&gt;bDisableJS=1&lt;/code&gt;) and network features.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="step-3--defender-for-endpoint-integration"&gt;Step 3 – Defender for Endpoint Integration
&lt;/h5&gt;&lt;p&gt;Integrate hardening with Defender for Endpoint to manage and enforce ASR rules automatically:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avdVmExtension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines/extensions@2022-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AVD-Defender-Policy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avdSessionHost&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publisher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Azure.Security&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MDE.Windows&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;typeHandlerVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;autoUpgradeMinorVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="logging-monitoring-and-timely-analysis"&gt;Logging, Monitoring, and Timely Analysis
&lt;/h3&gt;&lt;p&gt;ML2 goes beyond configuration — it demands that logs are &lt;strong&gt;collected, retained, and analysed in a timely manner&lt;/strong&gt; to detect and respond to threats.&lt;/p&gt;
&lt;p&gt;That means enabling and centralising:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Command-line process creation events&lt;/strong&gt; (Event ID 4688)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PowerShell script and block logging&lt;/strong&gt; (Events 4103 and 4104)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defender for Endpoint telemetry&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application event logs for Office, Edge, and Acrobat&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Logs should funnel into a single collection point for active analysis — not passive storage. This is where a &lt;strong&gt;Security Operations Centre (SOC)&lt;/strong&gt; capability becomes essential.&lt;/p&gt;
&lt;p&gt;If you already operate an in-house SOC, integrate AVD and Windows 365 telemetry into your existing monitoring workflows through &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you don’t, consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Huntress SIEM&lt;/strong&gt; – a streamlined, cloud-based offering ideal for smaller environments looking to meet ML2 logging analysis obligations, or&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Managed Sentinel deployment&lt;/strong&gt; delivered through a Microsoft partner providing continuous SOC monitoring, threat correlation, and response capability.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The ACSC expectation is that indicators of compromise are &lt;strong&gt;identified and acted on quickly&lt;/strong&gt; — it’s not compliance until there’s detection with action behind it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dual Configuration Sources:&lt;/strong&gt; Avoid policy conflicts between Intune and GPO; choose a single management authority.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Macro-Dependent Workflows:&lt;/strong&gt; Use digitally signed macros or trusted locations instead of disabling macros entirely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PDF Vendor Support:&lt;/strong&gt; Ensure your preferred PDF tool supports configuration at policy level.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SOC Gaps:&lt;/strong&gt; Logging without analysis breaches ML2 intent. Every control should have someone — or something — watching logs for anomalies.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="best-practices"&gt;Best Practices
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use Microsoft Security Baselines&lt;/strong&gt; as a foundation and overlay ACSC guidance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Harden images upstream&lt;/strong&gt; for AVD; redeploy session hosts from a clean, compliant golden image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Link to Defender for Endpoint&lt;/strong&gt; early to capture telemetry.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable SIEM integration&lt;/strong&gt; from day one to meet the “timely analysis” requirement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automate validation&lt;/strong&gt; using PowerShell scripts and Azure Policy compliance checks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document deviations&lt;/strong&gt; and review them quarterly to retain ML2 alignment.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Like brewing a double-shot, this control is all about pressure and precision. Tighten policies too hard and workflow suffers; too loose, and your security posture leaks. The right blend of Intune policies, Defender enforcement, and SOC visibility keeps your digital espresso crisp and strong every time.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="learn-more"&gt;Learn More
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cyber.gov.au/resources-business-and-government/essential-cyber-security/essential-eight" target="_blank" rel="noopener"
&gt;ACSC Essential Eight Strategies to Mitigate Cyber Security Incidents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/mem/intune/protect/security-baselines" target="_blank" rel="noopener"
&gt;Microsoft Intune Security Baselines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/microsoft-365/security/defender-endpoint/attack-surface-reduction" target="_blank" rel="noopener"
&gt;Attack Surface Reduction Rules in Microsoft Defender for Endpoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-desktop/security-guide" target="_blank" rel="noopener"
&gt;Azure Virtual Desktop Security Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/windows-365/enterprise/security" target="_blank" rel="noopener"
&gt;Windows 365 Security Guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/" target="_blank" rel="noopener"
&gt;Microsoft Sentinel Managed Solutions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.huntress.com/platform/siem" target="_blank" rel="noopener"
&gt;Huntress Managed SIEM Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Essential 8 Maturity Level 2 in Microsoft Cloud VDI (AVD &amp; W365) – Restricting Admin Privileges</title><link>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-restrict-admin-privileges/</link><pubDate>Thu, 23 Oct 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-restrict-admin-privileges/</guid><description>&lt;p&gt;You wouldn’t hand the bar keys to every patron on a Saturday night, right? The same logic applies to administrative rights in your cloud VDI estate.&lt;br&gt;
When every user has a pint-sized admin role, one bad click can spill into an incident faster than a dropped schooner. Restricting administrative privileges isn’t about mistrust—it’s about measured access to keep your environment clean and secure.&lt;/p&gt;
&lt;h2 id="what-is-restrict-administrative-privileges"&gt;What is “Restrict Administrative Privileges”?
&lt;/h2&gt;&lt;p&gt;The &lt;strong&gt;Restrict Administrative Privileges&lt;/strong&gt; control is one of the &lt;strong&gt;Australian Cyber Security Centre (ACSC)&lt;/strong&gt; &lt;a class="link" href="https://www.cyber.gov.au/resources-business-and-government/essential-cyber-security/essential-eight" target="_blank" rel="noopener"
&gt;Essential 8&lt;/a&gt; strategies.&lt;br&gt;
Its goal is to &lt;strong&gt;limit the number and duration of accounts with administrative rights&lt;/strong&gt;. These privileges should be assigned only when necessary, tightly monitored, and revoked once not in use.&lt;/p&gt;
&lt;p&gt;At &lt;strong&gt;Maturity Level 2&lt;/strong&gt;, organisations are expected to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use separate accounts for &lt;strong&gt;administration and day-to-day work&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Implement &lt;strong&gt;just-in-time privileged access&lt;/strong&gt; using tools such as &lt;strong&gt;Microsoft Entra Privileged Identity Management (PIM)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Conduct &lt;strong&gt;periodic revalidation of privileged access&lt;/strong&gt; (e.g., every 12 months)&lt;/li&gt;
&lt;li&gt;Remove &lt;strong&gt;inactive privileged roles after 45 days&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Ensure all administrative actions are &lt;strong&gt;centrally logged, monitored, and auditable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enforce &lt;strong&gt;restricted internet and email access&lt;/strong&gt; for privileged accounts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-it-works-in-cloud-vdi"&gt;How it Works in Cloud VDI
&lt;/h2&gt;&lt;p&gt;Azure Virtual Desktop (AVD) and Windows 365 both host user desktops in the Microsoft cloud, but &lt;strong&gt;how we manage privilege&lt;/strong&gt; varies depending on desktop persistence and management scope.&lt;/p&gt;
&lt;h3 id="azure-virtual-desktop-avd"&gt;Azure Virtual Desktop (AVD)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;AVD &lt;strong&gt;session hosts&lt;/strong&gt; are multi-user machines, rebuilt frequently via automation.&lt;/li&gt;
&lt;li&gt;Admin privileges should be &lt;strong&gt;granted temporarily&lt;/strong&gt; via Azure AD roles or local group membership managed through tools like &lt;strong&gt;Azure AD Group Policy Objects (GPOs)&lt;/strong&gt; or &lt;strong&gt;Intune Device Configuration Profiles&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;PIM&lt;/strong&gt; to assign &lt;strong&gt;Virtual Machine Administrator Login&lt;/strong&gt; and &lt;strong&gt;Virtual Machine Contributor&lt;/strong&gt; roles &lt;em&gt;just in time&lt;/em&gt; to trusted users.&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;access reviews and expiry policies&lt;/strong&gt; in PIM to automatically remove inactive roles (45 days) and revalidate eligibility every 12 months.&lt;/li&gt;
&lt;li&gt;For delegated operations (e.g., image updates or session host management), prefer &lt;strong&gt;Azure RBAC&lt;/strong&gt; over local admin accounts.&lt;/li&gt;
&lt;li&gt;When performing privileged actions, connect through a &lt;strong&gt;jump host&lt;/strong&gt; or &lt;strong&gt;secure AVD management pool&lt;/strong&gt;—not from general user sessions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="windows-365-w365"&gt;Windows 365 (W365)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;W365 &lt;strong&gt;Cloud PCs&lt;/strong&gt; are &lt;strong&gt;persistent, single-user desktops&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Admin rights should be avoided for standard users and only enabled on a per-device basis with &lt;strong&gt;Intune Endpoint Privilege Management (EPM)&lt;/strong&gt; or &lt;strong&gt;temporary local admin assignment&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For IT admins, management should occur via Intune or Microsoft Endpoint Manager portals—not by logging into the Cloud PC itself.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Cloud PCs as Privileged Access Workstations (PAWs)&lt;/strong&gt; for administration duties, ensuring these environments are isolated and do not overlap with unprivileged desktops.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="leveraging-cloud-vdi-as-a-privileged-access-workstation-paw"&gt;Leveraging Cloud VDI as a Privileged Access Workstation (PAW)
&lt;/h2&gt;&lt;p&gt;A well-brewed privileged access model often hinges on the workstation itself. Whether you prefer &lt;strong&gt;AVD&lt;/strong&gt; for ephemeral sessions or &lt;strong&gt;W365&lt;/strong&gt; for persistent access, both can serve as controlled brewing vessels for secure administration.&lt;/p&gt;
&lt;h3 id="1-azure-virtual-desktop-as-a-secure-admin-pool"&gt;1. Azure Virtual Desktop as a Secure Admin Pool
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Provide short-lived, locked-down desktops for privileged activities inside Azure or Microsoft 365.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Approach:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;dedicated host pool&lt;/strong&gt; for privileged operations separate from the user host pool.&lt;/li&gt;
&lt;li&gt;Configure each session host with Intune or GPO hardening:
&lt;ul&gt;
&lt;li&gt;Block browsers, email, and non-essential software.&lt;/li&gt;
&lt;li&gt;Require &lt;strong&gt;MFA and device compliance&lt;/strong&gt; via Conditional Access.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Microsoft Defender for Endpoint&lt;/strong&gt; and &lt;strong&gt;attack surface reduction&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;PIM&lt;/strong&gt; to grant &lt;em&gt;Virtual Machine Administrator Login&lt;/em&gt; roles only when required.&lt;/li&gt;
&lt;li&gt;Set up ephemeral hosts that reset after logoff—each session is freshly brewed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt;&lt;br&gt;
Cloud administrators log into the “Admin Pool,” elevate through PIM, perform administrative tasks, then sign out. The VM resets, purging cached credentials and leaving a minimal attack surface.&lt;/p&gt;
&lt;h3 id="2-windows-365-enterprise-as-a-persistent-paw"&gt;2. Windows 365 Enterprise as a Persistent PAW
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Provide a dedicated, always-available workstation for tenant administration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Approach:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deliver a &lt;strong&gt;Cloud PC SKU&lt;/strong&gt; per privileged identity.&lt;/li&gt;
&lt;li&gt;Manage exclusively via &lt;strong&gt;Microsoft Intune&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Apply &lt;strong&gt;Endpoint Privilege Management&lt;/strong&gt; for temporary elevation.&lt;/li&gt;
&lt;li&gt;Enforce &lt;strong&gt;application control&lt;/strong&gt; and &lt;strong&gt;hardening baselines&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Restrict &lt;strong&gt;internet and email&lt;/strong&gt; via app policies and Conditional Access.&lt;/li&gt;
&lt;li&gt;Integrate &lt;strong&gt;Defender for Cloud Apps&lt;/strong&gt; and &lt;strong&gt;Defender for Endpoint&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use the W365 Cloud PC only for administrative tasks—no personal browsing, no email.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt;&lt;br&gt;
Global administrators use managed, persistent Cloud PCs to handle Azure and Microsoft 365 duties in isolation. The environment remains fully under corporate management and auditable.&lt;/p&gt;
&lt;h3 id="3-reference-architecture--privileged-access-flow"&gt;3. Reference Architecture – Privileged Access Flow
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
A[Standard User Workstation] --&gt;|Conditional Access Block| B[Azure &amp; M365 Admin Portals]
C[AVD Admin Pool] --&gt;|Just-In-Time Role| B
D[W365 Secure Cloud PC] --&gt;|Dedicated Admin Account| B
subgraph Tenant Administration Boundary
B
end
C-.-&gt;|Ephemeral Session Reset|X[Hardened Template Image]
D-.-&gt;|Intune Policies + EPM|Y[Persistent Managed PAW]
&lt;/div&gt;
&lt;p&gt;This architecture ensures administrators operate only within &lt;strong&gt;trusted, monitored environments&lt;/strong&gt;. All privileged sessions are logged to Sentinel, enforced with Conditional Access, and segregated from unprivileged workstations.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Over-privileged accounts are the fast track to compromise.&lt;br&gt;
Attackers hunt for admin credentials because they unlock persistence, lateral movement, and data access.&lt;/p&gt;
&lt;p&gt;By restricting admin privileges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You reduce &lt;strong&gt;privilege escalation vectors&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Limit &lt;strong&gt;malware impact scope&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;audit visibility&lt;/strong&gt; for policy compliance&lt;/li&gt;
&lt;li&gt;Establish a &lt;strong&gt;clean separation between admin and user functions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, it’s like locking the keg fridge—you control who pours, when, and how much.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal--privileged-identity-management-setup-for-avd"&gt;Azure Portal – Privileged Identity Management Setup (for AVD)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Entra ID &amp;gt; Privileged Identity Management&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Azure resources &amp;gt; Assignments&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;+ Add assignments&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Pick a role like &lt;em&gt;Virtual Machine Administrator Login&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Select eligible users or groups&lt;/li&gt;
&lt;li&gt;Set assignment type to &lt;strong&gt;Eligible&lt;/strong&gt;, and define &lt;strong&gt;Approval and Justification&lt;/strong&gt; requirements&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;Activation Duration&lt;/strong&gt; (e.g., 4 hours per request)&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;Access Review policies&lt;/strong&gt; for 12-month revalidation and &lt;strong&gt;automatic removal of inactive assignments&lt;/strong&gt; after 45 days&lt;/li&gt;
&lt;li&gt;Review and assign&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Break-glass accounts&lt;/strong&gt;: Maintain at least one non-PIM local admin for emergency recovery, but secure its credentials in &lt;strong&gt;Azure Key Vault&lt;/strong&gt; or a password vault. Use long, unique, and unpredictable passwords and log all usage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Third-party management tools&lt;/strong&gt;: Agents may need service accounts with consistent privileges—scope them tightly and disable interactive logon.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;W365 Pro vs Enterprise&lt;/strong&gt;: Privilege controls differ; &lt;strong&gt;Enterprise&lt;/strong&gt; integrates with Intune and PIM, while &lt;strong&gt;Pro&lt;/strong&gt; relies more on local settings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session Host recreation&lt;/strong&gt;: Admin changes made manually on ephemeral hosts won’t persist—use automation or policy-based config instead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privileged account internet use&lt;/strong&gt;: Block web and email access using Conditional Access or Endpoint Security baselines.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Separate &lt;strong&gt;user&lt;/strong&gt; and &lt;strong&gt;admin identities&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Implement &lt;strong&gt;just-in-time (JIT)&lt;/strong&gt; privileged access using &lt;strong&gt;PIM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Apply &lt;strong&gt;least privilege RBAC&lt;/strong&gt; at subscription and resource group levels&lt;/li&gt;
&lt;li&gt;Automate &lt;strong&gt;group membership&lt;/strong&gt;, &lt;strong&gt;access reviews&lt;/strong&gt;, and &lt;strong&gt;logging&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enforce &lt;strong&gt;expiry of inactive privileged roles&lt;/strong&gt; after 45 days&lt;/li&gt;
&lt;li&gt;Revalidate all &lt;strong&gt;privileged assignments&lt;/strong&gt; at least every 12 months&lt;/li&gt;
&lt;li&gt;Route all &lt;strong&gt;audit and PIM logs&lt;/strong&gt; to &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt; or &lt;strong&gt;immutable storage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Deny &lt;strong&gt;internet and email access&lt;/strong&gt; for privileged accounts&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;AVD or W365 PAWs&lt;/strong&gt; for all privileged administration&lt;/li&gt;
&lt;li&gt;Always enable &lt;strong&gt;multi-factor authentication (MFA)&lt;/strong&gt; for privileged operations&lt;/li&gt;
&lt;li&gt;Integrate privileged detections into your &lt;strong&gt;incident response plan&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="compliance-tip--meeting-ml2-requirements"&gt;Compliance Tip – Meeting ML2 Requirements
&lt;/h2&gt;&lt;p&gt;To align fully with &lt;strong&gt;Essential 8 Maturity Level 2&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure PIM policies for &lt;strong&gt;automatic expiry (≤45 days inactivity)&lt;/strong&gt; and &lt;strong&gt;annual revalidation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Prohibit &lt;strong&gt;privileged accounts from internet, email, or personal app access&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Store and manage &lt;strong&gt;break-glass credentials securely&lt;/strong&gt; in a password or key vault&lt;/li&gt;
&lt;li&gt;Forward all &lt;strong&gt;Entra ID, Intune, and Defender&lt;/strong&gt; logs to &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt; with &lt;strong&gt;immutable retention&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Monitor for &lt;strong&gt;privileged role changes&lt;/strong&gt;, &lt;strong&gt;logon anomalies&lt;/strong&gt;, and &lt;strong&gt;inactive assignments&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Ensure &lt;strong&gt;incident response&lt;/strong&gt; processes are triggered by privileged anomalies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These fine-tuning steps transform a good design into a &lt;strong&gt;fully compliant ML2 implementation&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Restricting admin rights isn’t about locking people out—it’s about &lt;strong&gt;serving access responsibly&lt;/strong&gt;.&lt;br&gt;
Think of &lt;strong&gt;AVD Admin Pools&lt;/strong&gt; as &lt;em&gt;temporary tasting paddles&lt;/em&gt;—you get just what you need for one session and then hand the glass back.&lt;br&gt;
&lt;strong&gt;W365 PAWs&lt;/strong&gt;, on the other hand, are your dedicated tap at the bar—always managed, always ready, and just for you.&lt;br&gt;
Balance them properly, and you’ll pour privileged access safely without over-serving risk.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cyber.gov.au/acsc/view-all-content/essential-eight" target="_blank" rel="noopener"
&gt;Essential Eight from the ACSC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/id-governance/privileged-identity-management/pim-configure" target="_blank" rel="noopener"
&gt;Microsoft Learn – Implement Just-in-Time Access using Privileged Identity Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/mem/intune/protect/epm-overview" target="_blank" rel="noopener"
&gt;Microsoft Learn – Windows 365 Endpoint Privilege Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/overview" target="_blank" rel="noopener"
&gt;Microsoft Learn – Azure Role-Based Access Control (RBAC)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-desktop/security-guide" target="_blank" rel="noopener"
&gt;Microsoft Learn – Secure Azure Virtual Desktop Deployments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/architecture/security-operations-privileged-accounts" target="_blank" rel="noopener"
&gt;Microsoft Learn – Use Microsoft Sentinel to Monitor Privileged Access&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Essential 8 Maturity Level 2 in Microsoft Cloud VDI (AVD &amp; W365) – Multi‑Factor Authentication</title><link>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-mfa/</link><pubDate>Tue, 21 Oct 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-mfa/</guid><description>&lt;p&gt;You wouldn’t serve a flat white with instant coffee granules. So why trust a single password to protect your cloud desktops? Multi‑Factor Authentication (MFA) is the second shot your security posture needs. It takes that weak, often reused password and tops it up with something the bad actors can’t easily steal, something you &lt;strong&gt;have&lt;/strong&gt; or &lt;strong&gt;are&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Whether your users connect to Azure Virtual Desktop (AVD), Windows 365, M365 Services or third‑party SaaS apps, MFA keeps every session secure without making sign‑ins unbearable. Think of it as your bouncer at the café door checking ID before anyone grabs a seat.&lt;/p&gt;
&lt;h3 id="what-is-multifactor-authentication"&gt;What is Multi‑Factor Authentication?
&lt;/h3&gt;&lt;p&gt;Under the &lt;strong&gt;Essential Eight Maturity Model Level 2 (ML2)&lt;/strong&gt;, the purpose of MFA is to stop a compromise of any single factor, like a password, from leading straight to a breach.&lt;/p&gt;
&lt;p&gt;MFA requires two or more of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Something you know:&lt;/strong&gt; password or PIN&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Something you have:&lt;/strong&gt; phone, passkey, or hardware token&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Something you are:&lt;/strong&gt; fingerprint or facial recognition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At Level 2, MFA must be enforced for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All users (privileged and unprivileged) accessing any online services that process sensitive data&lt;/li&gt;
&lt;li&gt;All third‑party or SaaS platforms federated through your identity platform&lt;/li&gt;
&lt;li&gt;Internet‑facing remote access and VDI environments like AVD and Windows 365&lt;/li&gt;
&lt;li&gt;Authentication of all privileged accounts&lt;/li&gt;
&lt;li&gt;Any sign‑ins that must be &lt;strong&gt;phishing‑resistant&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;MFA events logged, secured, and analysed&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how-it-works-in-cloud-vdi"&gt;How it Works in Cloud VDI
&lt;/h3&gt;&lt;p&gt;Both Azure Virtual Desktop and Windows 365 authenticate through &lt;strong&gt;Microsoft Entra ID (Azure AD)&lt;/strong&gt;. MFA enforcement sits within Entra’s &lt;strong&gt;Conditional Access&lt;/strong&gt; framework, applied consistently across Microsoft 365 and federated third‑party services.&lt;/p&gt;
&lt;h4 id="azurevirtualdesktop"&gt;Azure Virtual Desktop
&lt;/h4&gt;&lt;p&gt;When a user signs in through the AVD client or browser, credentials first pass through Entra ID. Conditional Access evaluates user, device, and location, and won’t issue a session token until MFA is satisfied.&lt;/p&gt;
&lt;h4 id="windows365-cloudpc"&gt;Windows 365 (Cloud PC)
&lt;/h4&gt;&lt;p&gt;Identical logic applies here. The sign‑in prompt is evaluated by Entra ID before the Cloud PC session is launched.&lt;/p&gt;
&lt;h4 id="thirdparty-and-customerfacing-saas"&gt;Third‑Party and Customer‑Facing SaaS
&lt;/h4&gt;&lt;p&gt;Entra ID can federate external services (Salesforce, ServiceNow, GitHub Enterprise, etc.). Conditional Access policies extend to these apps automatically, giving one place to enforce phishing‑resistant MFA across all cloud assets.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
U[User or Customer Device] --&gt; E[Entra ID Authentication]
E --&gt;|Conditional Access Evaluation| P{MFA Required?}
P --&gt;|Yes| M[Prompt for MFA Verification]
P --&gt;|No| G[Grant Token]
M --&gt;|Verified| G
G --&gt;|Access Granted| AVD[AVD, Windows 365, or SaaS App]
subgraph Logging
L[Entra ID Sign‑in and Audit Logs] --&gt; S[Microsoft Sentinel or SIEM]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h3 id="phishingresistant-options-in-entraid"&gt;Phishing‑Resistant Options in Entra ID
&lt;/h3&gt;&lt;p&gt;No keys? No dramas. Microsoft Entra ID supports multiple passwordless, phishing‑resistant methods that satisfy Essential Eight ML2 without the need for physical FIDO2 devices (Because days of carrying around RSA tokens is gone):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows Hello for Business:&lt;/strong&gt;&lt;br&gt;
Uses asymmetric keys secured by the device TPM. The private key never leaves the endpoint and can only be unlocked by a local PIN or biometric, making it resistant to credential theft.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Microsoft Authenticator with Number Matching:&lt;/strong&gt;&lt;br&gt;
Adds in‑context verification — users match numbers between login prompt and Authenticator app. This blocks replay, man‑in‑the‑middle, and push‑fatigue attacks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Entra ID Passkeys:&lt;/strong&gt;&lt;br&gt;
Based on WebAuthn, users store a cryptographic credential in their device or OS passkey manager (Windows, iOS, Android). Supports cross‑device sign‑in through the same asymmetric model as FIDO2.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use &lt;strong&gt;Conditional Access → Authentication Strengths&lt;/strong&gt; to enforce these phishing‑resistant MFA types across AVD, Windows 365, and SaaS applications. Select &lt;strong&gt;“Phishing‑resistant MFA”&lt;/strong&gt; to ensure only the approved methods above are accepted.&lt;/p&gt;
&lt;h3 id="realworld-impact"&gt;Real‑World Impact
&lt;/h3&gt;&lt;p&gt;Passwords are the weakest brew in the pot, a little social engineering and they’re gone. MFA blocks over 99 percent of credential‑based attacks and gives solid assurance even when users are entirely remote.&lt;/p&gt;
&lt;p&gt;For AVD and Windows 365, MFA is essential because both services are directly reachable from the internet. One weak password could hand over network‑level access.&lt;/p&gt;
&lt;h3 id="implementation-examples"&gt;Implementation Examples
&lt;/h3&gt;&lt;h4 id="azure-portal-conditionalaccess"&gt;Azure Portal: Conditional Access
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Microsoft Entra ID &amp;gt; Security &amp;gt; Conditional Access &amp;gt; Policies&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;+ New Policy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Assign to &lt;strong&gt;All Users&lt;/strong&gt; (including privileged and unprivileged).&lt;/li&gt;
&lt;li&gt;Target &lt;strong&gt;All Cloud Apps&lt;/strong&gt; or limit to &lt;strong&gt;AVD&lt;/strong&gt;, &lt;strong&gt;Windows 365&lt;/strong&gt;, and key SaaS connections.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Access Controls &amp;gt; Grant&lt;/strong&gt;, check &lt;strong&gt;Require Multi‑Factor Authentication&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Authentication Strengths&lt;/strong&gt;, select &lt;strong&gt;Phishing‑resistant MFA&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enable and save the policy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="centralised-logging-with-microsoftsentinel"&gt;Centralised Logging with Microsoft Sentinel
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Enable &lt;strong&gt;Diagnostic Settings&lt;/strong&gt; under &lt;strong&gt;Entra ID &amp;gt; Audit Logs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Send both &lt;strong&gt;Sign‑in Logs&lt;/strong&gt; and &lt;strong&gt;Audit Logs&lt;/strong&gt; to a &lt;strong&gt;Log Analytics Workspace&lt;/strong&gt; linked to Sentinel.&lt;/li&gt;
&lt;li&gt;Build analytics rules for repeated MFA denials, impossible‑travel sign‑ins, and push‑fatigue.&lt;/li&gt;
&lt;li&gt;Forward incidents to your SOC workflow and CISO delegate for escalation.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="gotchas--edgecases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Legacy RDP or LDAP applications:&lt;/strong&gt; Use &lt;strong&gt;Azure AD Application Proxy&lt;/strong&gt; for pre‑auth protection or maintain documented exceptions with timeline to modernise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service and automation accounts:&lt;/strong&gt; Move to &lt;strong&gt;Managed Identities&lt;/strong&gt; instead of user credentials.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customer portals:&lt;/strong&gt; Use &lt;strong&gt;External ID&lt;/strong&gt; with optional or enforced phishing‑resistant methods for customer MFA.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log protection:&lt;/strong&gt; Apply RBAC to audit data and enable immutable storage in Azure Monitor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="best-practices"&gt;Best Practices
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Enforce &lt;strong&gt;phishing‑resistant MFA&lt;/strong&gt; using Authentication Strength policies.&lt;/li&gt;
&lt;li&gt;Prefer &lt;strong&gt;Windows Hello for Business&lt;/strong&gt;, &lt;strong&gt;Authenticator Number Matching&lt;/strong&gt;, or &lt;strong&gt;Passkeys&lt;/strong&gt; — not SMS or email codes.&lt;/li&gt;
&lt;li&gt;Apply MFA to all connected SaaS and third‑party services federated via Entra ID.&lt;/li&gt;
&lt;li&gt;Centralise MFA and sign‑in logs in &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt; for correlation.&lt;/li&gt;
&lt;li&gt;Protect logs with immutable retention and restricted admin access.&lt;/li&gt;
&lt;li&gt;Integrate detection with &lt;strong&gt;Defender for Cloud Apps&lt;/strong&gt; for extra visibility.&lt;/li&gt;
&lt;li&gt;Test and rehearse &lt;strong&gt;incident response&lt;/strong&gt; including MFA‑related anomalies.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; An MFA policy without proper phishing resistance or log analytics is like pulling a shot and forgetting the coffee grounds, motion but no flavour. Turn Conditional Access and Authentication Strengths into your coffee grinder: fine‑tuning every authentication so nothing bitter gets through.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="learnmore"&gt;Learn More
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/sfi/phishing-resistant-mfa" target="_blank" rel="noopener"
&gt;Authentication Strengths and Phishing‑Resistant MFA – Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/policy-all-users-mfa-strength" target="_blank" rel="noopener"
&gt;Configure Conditional Access Policies – Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/sentinel/connect-azure-active-directory" target="_blank" rel="noopener"
&gt;Collect Entra ID Logs in Microsoft Sentinel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-desktop/security-guide" target="_blank" rel="noopener"
&gt;Azure Virtual Desktop Security Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/windows-365/enterprise/security" target="_blank" rel="noopener"
&gt;Windows 365 Security and Compliance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cyber.gov.au/acsc/view-all-content/essential-eight" target="_blank" rel="noopener"
&gt;Essential Eight from the ACSC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Essential 8 Maturity Level 2 in Microsoft Cloud VDI (AVD &amp; W365) – Patch OS</title><link>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-patchos/</link><pubDate>Thu, 16 Oct 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-patchos/</guid><description>&lt;p&gt;Ever left milk out in the sun? You know how that ends sour, useless, and a bit embarrassing if anyone catches you. Unpatched operating systems are the same. They start smooth and reliable, but leave them a few cycles and they turn into a security liability. In a cloud-hosted desktop environment, a stale OS image is like serving last week’s brew to your end users it&amp;rsquo;s risky, inconsistent, and hard to swallow.&lt;/p&gt;
&lt;h2 id="what-is-patch-operating-systems"&gt;What is Patch Operating Systems?
&lt;/h2&gt;&lt;p&gt;This control from the &lt;strong&gt;ACSC Essential Eight&lt;/strong&gt; focuses on keeping your operating systems current to reduce exposure to known vulnerabilities. For &lt;strong&gt;Maturity Level 2&lt;/strong&gt;, organisations must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apply &lt;strong&gt;critical&lt;/strong&gt; patches for internet‑facing systems within &lt;strong&gt;48 hours&lt;/strong&gt; of release.&lt;/li&gt;
&lt;li&gt;Apply &lt;strong&gt;non‑critical&lt;/strong&gt; patches for internet‑facing systems within &lt;strong&gt;two weeks&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Apply all OS patches for &lt;strong&gt;internal systems&lt;/strong&gt; and non‑internet‑facing workloads within &lt;strong&gt;one month&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Regularly run automated discovery and vulnerability scans (at least fortnightly).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, stay current or stay vulnerable.&lt;/p&gt;
&lt;h2 id="how-it-works-in-cloud-vdi"&gt;How it Works in Cloud VDI
&lt;/h2&gt;&lt;p&gt;Whether you’re using &lt;strong&gt;Azure Virtual Desktop (AVD)&lt;/strong&gt; or &lt;strong&gt;Windows 365 (W365)&lt;/strong&gt;, the principle is the same: your operating system layer must be patched on a consistent and traceable schedule.&lt;/p&gt;
&lt;h3 id="azure-virtual-desktop"&gt;Azure Virtual Desktop
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Uses &lt;strong&gt;golden images&lt;/strong&gt;: a master VM image updates and redeploys downstream hosts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Update Manager (UMC)&lt;/strong&gt; or &lt;strong&gt;Windows Update for Business (WUfB)&lt;/strong&gt; handles recurring OS updates.&lt;/li&gt;
&lt;li&gt;You test patches and rebuild host pools using automation to keep environments fresh.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="windows-365"&gt;Windows 365
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Each Cloud PC is &lt;strong&gt;policy‑driven&lt;/strong&gt; through Intune and WUfB.&lt;/li&gt;
&lt;li&gt;Admins configure servicing channels, deferral periods, and reboot behaviour.&lt;/li&gt;
&lt;li&gt;Updates are delivered directly from Microsoft, meaning no image rebuilds or manual patch runs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Unpatched operating systems are one of the most common root causes of ransomware incidents. Attackers leverage public exploits faster than most teams can brew a long black. Regular, automated patching:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reduces the attack surface and vulnerability dwell time.&lt;/li&gt;
&lt;li&gt;Ensures consistent compliance with ACSC’s mandated timeframes.&lt;/li&gt;
&lt;li&gt;Improves operational stability and audit readiness.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In a cloud VDI setup, patch discipline is the difference between a smooth latte and a burnt espresso.&lt;/p&gt;
&lt;h2 id="implementation--meeting-the-essential-eight-timeframes"&gt;Implementation – Meeting the Essential Eight Timeframes
&lt;/h2&gt;&lt;p&gt;To hit the Maturity Level 2 compliance bar, your patching process must be automated, repeatable, and verifiable. Azure gives you multiple ways to meet the &lt;strong&gt;48‑hour, two‑week, and one‑month&lt;/strong&gt; patch windows across AVD and W365 environments.&lt;/p&gt;
&lt;h3 id="1-discover-and-scan-regularly"&gt;1. Discover and Scan Regularly
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Microsoft Defender for Servers / Endpoint&lt;/em&gt; — Daily OS vulnerability scanning.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Azure Update Manager (UMC)&lt;/em&gt; — Detects missing updates and compliance drift.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Defender External Attack Surface Management&lt;/em&gt; — Identifies internet‑facing assets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cadence:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Asset discovery: every 14 days.&lt;/li&gt;
&lt;li&gt;Vulnerability scans: daily for internet‑facing, fortnightly for internal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-internetfacing-session-hosts--patch-within-48-hours"&gt;2. Internet‑Facing Session Hosts – Patch Within 48 Hours
&lt;/h3&gt;&lt;p&gt;Create a &lt;strong&gt;daily security‑only update schedule&lt;/strong&gt; for any AVD session hosts tagged as internet‑facing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Azure Portal Steps&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Update Management Center&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;new update deployment schedule&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Target hosts tagged &lt;code&gt;avd-role=sessionhost&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Select update classification: &lt;em&gt;Security&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Set recurrence to &lt;em&gt;Every 1 day&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Enable automatic reboot and email notifications for compliance verification.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Bicep Example&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Define a maintenance configuration for daily patching of a VM&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// This configuration targets OS image Critical updates and specifies a maintenance window&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DailySchedule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Maintenance/maintenanceConfigurations@2023-10-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;dailySchedule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maintenanceScope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;OSImage&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;extensionProperties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;visibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Public&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maintenanceWindow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT4H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 4 hours of Maintenance&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;startDateTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;2025-01-01T02:00:00Z&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Start at 2 AM Sydney Time&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;recurEvery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Every day&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeZone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UTC+10:00&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// AEST&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;installPatches&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;windowsParameters&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;classificationsToInclude&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Critical&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rebootSetting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IfRequired&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Apply the maintenance configuration to virtual machines with specific tags&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tagBasedAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Maintenance/configurationAssignments@2023-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AVD-tagBased-Critical-PatchSchedule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maintenanceConfigurationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DailySchedule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/subscriptions/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;subscriptionId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/resourceGroups/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Target the resource group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tagSettings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avd-role&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;sessionhost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;filterOperator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;All&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Match all specified tags&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This schedule comfortably achieves the &lt;strong&gt;critical‑within‑48‑hours&lt;/strong&gt; mandate.&lt;/p&gt;
&lt;h3 id="3-internal-or-noninternetfacing-hosts"&gt;3. Internal or Non‑Internet‑Facing Hosts
&lt;/h3&gt;&lt;p&gt;For back‑end VMs and non‑internet‑facing AVD hosts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a recurring deployment that includes both &lt;em&gt;Critical&lt;/em&gt; and &lt;em&gt;Security&lt;/em&gt; classifications.&lt;/li&gt;
&lt;li&gt;Set frequency to &lt;strong&gt;every 14 days&lt;/strong&gt; or &lt;strong&gt;monthly&lt;/strong&gt; depending on risk classification.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;tagging&lt;/strong&gt; (e.g. &lt;code&gt;patch-group=internal&lt;/code&gt;) to scope deployments automatically via Update Manager.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Portal Tip:&lt;/strong&gt; Use &lt;em&gt;Maintenance Configurations&lt;/em&gt; to enforce reboots after patching and to isolate patch windows outside business hours.&lt;/p&gt;
&lt;h3 id="4-windows-365-cloud-pcs--intune-update-rings"&gt;4. Windows 365 Cloud PCs – Intune Update Rings
&lt;/h3&gt;&lt;p&gt;Windows 365 handles updates through &lt;strong&gt;Windows Update for Business (WUfB)&lt;/strong&gt;, so compliance relies on your Intune configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In Intune, navigate to &lt;strong&gt;Devices &amp;gt; Windows &amp;gt; Update Rings for Windows 10 and later&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Create a new profile and set:
&lt;ul&gt;
&lt;li&gt;Quality update deferral: &lt;em&gt;0–7 days&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Servicing channel: &lt;em&gt;Monthly Enterprise Channel&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Deadline for installation: &lt;em&gt;2 days&lt;/em&gt; after availability.&lt;/li&gt;
&lt;li&gt;Enable auto‑restart with end‑user notice.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Assign to Cloud PC groups.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This achieves both the &lt;strong&gt;48‑hour critical&lt;/strong&gt; and &lt;strong&gt;two‑week non‑critical&lt;/strong&gt; timing requirements.&lt;/p&gt;
&lt;h3 id="5-verification-and-reporting"&gt;5. Verification and Reporting
&lt;/h3&gt;&lt;p&gt;Validation is what separates “automated patching” from &lt;strong&gt;documented compliance&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Azure Policy&lt;/strong&gt;: “Machines should be compliant with Update Manager”.&lt;/li&gt;
&lt;li&gt;Review &lt;strong&gt;UMC Compliance Reports&lt;/strong&gt; weekly.&lt;/li&gt;
&lt;li&gt;Export results to &lt;strong&gt;Log Analytics&lt;/strong&gt; or &lt;strong&gt;Power BI&lt;/strong&gt; for evidence.&lt;/li&gt;
&lt;li&gt;Cross‑check with &lt;strong&gt;Defender for Endpoint’s Weaknesses and Exposures&lt;/strong&gt; report.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ACSC Requirement&lt;/th&gt;
&lt;th&gt;Control Mechanism&lt;/th&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;th&gt;Verification&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Internet‑facing hosts patched (critical ≤48 hrs)&lt;/td&gt;
&lt;td&gt;Daily security‑only Update Manager schedule&lt;/td&gt;
&lt;td&gt;Daily&lt;/td&gt;
&lt;td&gt;Update Manager compliance logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internet‑facing hosts patched (non‑critical ≤14 days)&lt;/td&gt;
&lt;td&gt;General update deployment&lt;/td&gt;
&lt;td&gt;14 days&lt;/td&gt;
&lt;td&gt;UMC reports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal hosts patched (≤1 month)&lt;/td&gt;
&lt;td&gt;Tag‑based deployment scope&lt;/td&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;td&gt;Log Analytics reports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerability scanning&lt;/td&gt;
&lt;td&gt;Defender and Update Manager&lt;/td&gt;
&lt;td&gt;1–14 days&lt;/td&gt;
&lt;td&gt;MDE dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="6-image-lifecycle-for-avd"&gt;6. Image Lifecycle for AVD
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart TD
A[Base OS Image] --&gt; B[Apply Latest Patches in Staging]
B --&gt; C[Test Applications and GPOs]
C --&gt; D[Publish as Golden Image]
D --&gt; E[Deploy New Host Pool]
E --&gt; F[Automatic UMC Compliance and Reporting]
&lt;/div&gt;
&lt;p&gt;This ensures each AVD pool starts with a clean base image, patched hosts remain consistent, and rollback capability exists if a patch causes issues.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Golden Image Drift&lt;/strong&gt;: Avoid manually patching running hosts; always refresh from the updated base image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reboot Dependencies&lt;/strong&gt;: Some cumulative updates don’t take effect until a restart.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intune Sync Delay&lt;/strong&gt;: W365 devices only check in at intervals — plan deadlines accordingly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing Windows Updates&lt;/strong&gt;: Use a &lt;em&gt;staging host pool&lt;/em&gt; or pilot ring before mass deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Align patch cycles with &lt;strong&gt;Microsoft Patch Tuesday&lt;/strong&gt; for predictability.&lt;/li&gt;
&lt;li&gt;Automate notification workflows using &lt;strong&gt;Logic Apps&lt;/strong&gt; or &lt;strong&gt;Automation Runbooks&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Maintain &lt;strong&gt;tag‑based patch groupings&lt;/strong&gt; (AVD‑PROD, AVDS‑UAT, W365‑TEST).&lt;/li&gt;
&lt;li&gt;Track Compliance KPIs monthly — “mean time to patch” is an excellent internal metric.&lt;/li&gt;
&lt;li&gt;Always verify before claiming ACSC compliance — auditors love data trails.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Patching is rarely glamorous, but it’s foundational. Think of it like regularly cleaning the group head on your espresso machine — skip it once and nobody notices, skip it twice and everything tastes off. Automate your patching, verify your cycles, and let Update Manager and Intune handle the grind for you.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/update-center/overview" target="_blank" rel="noopener"
&gt;Azure Update Manager Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/windows/deployment/update/waas-wufb-overview" target="_blank" rel="noopener"
&gt;Windows Update for Business Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/virtual-desktop/image-version-update" target="_blank" rel="noopener"
&gt;Maintain Azure Virtual Desktop Host Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cyber.gov.au/acsc/view-all-content/essential-eight/patch-operating-systems" target="_blank" rel="noopener"
&gt;ACSC Essential Eight – Patch Operating Systems&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Essential 8 Maturity Level 2 in Microsoft Cloud VDI (AVD &amp; W365) – Office Macros</title><link>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-officemacros/</link><pubDate>Tue, 14 Oct 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-officemacros/</guid><description>&lt;p&gt;You know that feeling when your latte art turns into a murky blob instead of a perfect rosetta? That’s what happens when macro security is ignored, it&amp;rsquo;s messy, inconsistent, and occasionally dangerous. In Microsoft Cloud VDI environments like Azure Virtual Desktop (AVD) and Windows 365, locking down Microsoft Office macros is a delicate pour. It’s about creating that balance between creativity and control — letting automation fuel productivity, but never letting a dodgy macro spill over into compromise.&lt;/p&gt;
&lt;h2 id="what-is-configure-microsoft-office-macros"&gt;What is &amp;ldquo;Configure Microsoft Office Macros&amp;rdquo;?
&lt;/h2&gt;&lt;p&gt;Under the &lt;strong&gt;Essential Eight&lt;/strong&gt;, the goal of this control is simple: don’t let macros become a backdoor for malware. At &lt;strong&gt;Maturity Level 2&lt;/strong&gt;, the ACSC expects you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disable macros for users without a proven business requirement.&lt;/li&gt;
&lt;li&gt;Allow only trusted or digitally signed macros.&lt;/li&gt;
&lt;li&gt;Block macros originating from the Internet.&lt;/li&gt;
&lt;li&gt;Prevent users from changing macro settings.&lt;/li&gt;
&lt;li&gt;Enable macro antivirus scanning.&lt;/li&gt;
&lt;li&gt;Block macros from making Win32 API calls.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s all about ensuring automation is helpful and harmless — like adding sugar, not sand, to your morning brew.&lt;/p&gt;
&lt;h2 id="how-it-works-in-cloudvdi"&gt;How it Works in Cloud VDI
&lt;/h2&gt;&lt;p&gt;Macro enforcement can look a little different depending on whether you’re managing &lt;strong&gt;session hosts&lt;/strong&gt; in Azure Virtual Desktop or &lt;strong&gt;Cloud PCs&lt;/strong&gt; in Windows 365.&lt;/p&gt;
&lt;p&gt;Both run Microsoft 365 Apps, but the way policy is delivered differs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AVD is generally &lt;strong&gt;multi‑session&lt;/strong&gt; and &lt;strong&gt;device‑centric&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;W365 is &lt;strong&gt;single‑user&lt;/strong&gt; and &lt;strong&gt;identity‑centric&lt;/strong&gt;, better suited for &lt;strong&gt;app policy management&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s break down both flavours.&lt;/p&gt;
&lt;h2 id="two-ways-to-pour-the-policy-device-vs-app"&gt;Two Ways to Pour the Policy: Device vs App
&lt;/h2&gt;&lt;h3 id="option1-device-configuration-profiles-intune-or-gpo"&gt;Option 1: Device Configuration Profiles (Intune or GPO)
&lt;/h3&gt;&lt;p&gt;Device‑level enforcement pushes configuration directly to the Windows environment — essentially, registry‑based policy under &lt;code&gt;HKCU\Software\Policies\Microsoft\Office\16.0\Common\Security&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AVD session hosts (multi‑user or pooled environments).&lt;/li&gt;
&lt;li&gt;Hybrid joined or domain joined machines.&lt;/li&gt;
&lt;li&gt;Scenarios where you need registry‑backed, “no user override allowed” enforcement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Key Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Covers &lt;em&gt;all&lt;/em&gt; ACSC ML2 requirements, including the Win32 API block.&lt;/li&gt;
&lt;li&gt;Macro UI fully greyed out.&lt;/li&gt;
&lt;li&gt;Consistent across multi‑user sessions and golden images.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Caveats:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Requires periodic image or script updates in some environments.&lt;/li&gt;
&lt;li&gt;Slightly heavier management overhead for dynamic host pools.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="option2-app-policy-for-microsoft365apps-via-officecloudpolicyservice"&gt;Option 2: App Policy for Microsoft 365 Apps (via Office Cloud Policy Service)
&lt;/h3&gt;&lt;p&gt;The newer, cloud‑based approach lets you target macro behaviour at the &lt;strong&gt;app level&lt;/strong&gt;, not the Windows device.&lt;br&gt;
These policies are managed through Intune under:&lt;br&gt;
&lt;strong&gt;Apps &amp;gt; Policies for Microsoft 365 Apps&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They flow down from the &lt;strong&gt;Office Cloud Policy Service (OCPS)&lt;/strong&gt; and are applied whenever the user signs in to Microsoft 365 Apps with their Entra ID account.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 365 Cloud PCs (single‑user, fully cloud‑managed).&lt;/li&gt;
&lt;li&gt;Azure AD‑joined user devices where policy follows the identity, not the VM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Key Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lightweight, user‑centric management (no image rebuilds).&lt;/li&gt;
&lt;li&gt;Follows the user if their Cloud PC is replaced or reset.&lt;/li&gt;
&lt;li&gt;Ideal for tenant‑wide baseline enforcement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Caveats:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Limited macro configuration scope (cannot yet block Win32 API calls).&lt;/li&gt;
&lt;li&gt;Settings apply only while connected to Office services.&lt;/li&gt;
&lt;li&gt;Not recommended for AVD multi‑session hosts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sidebyside-comparison"&gt;Side‑by‑Side Comparison
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt; &lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Device Configuration (Intune/GPO)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;App Configuration (Office Cloud Policy Service)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Policy Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Machine / User (via registry)&lt;/td&gt;
&lt;td&gt;User / Identity (via Office sign‑in)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best Fit For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AVD, hybrid join, shared devices&lt;/td&gt;
&lt;td&gt;Windows 365 Cloud PCs, user‑centric fleets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Delivery Channel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intune MDM or Group Policy&lt;/td&gt;
&lt;td&gt;Cloud Policy Service (OCPS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Offline Behaviour&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enforced locally&lt;/td&gt;
&lt;td&gt;Requires connectivity to refresh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Win32 API Block Supported&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ (not yet available)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Macro AV Scanning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lockdown (user cannot change)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (for available settings)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consistency across multi‑session&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Mismanaged macro policies are still one of the top causes of ransomware detonation and lateral‑movement campaigns.&lt;br&gt;
A disciplined configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Closes a major phishing vector.&lt;/li&gt;
&lt;li&gt;Reinforces least‑privilege operations.&lt;/li&gt;
&lt;li&gt;Creates a clean, consistent security posture across app delivery models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most deployments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Intune Device Profiles&lt;/strong&gt; for &lt;strong&gt;AVD&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;App Policy (OCPS)&lt;/strong&gt; for &lt;strong&gt;Windows 365&lt;/strong&gt;.&lt;br&gt;
Mix them if your organisation runs both — those policies happily coexist.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="a-using-intunedevice-configuration-profile"&gt;A. Using Intune (Device Configuration Profile)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;Intune admin center&lt;/strong&gt;, go to &lt;strong&gt;Devices &amp;gt; Configuration Profiles &amp;gt; Create Profile&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Platform:&lt;/strong&gt; Windows 10 and later, and &lt;strong&gt;Profile type:&lt;/strong&gt; &lt;em&gt;Templates &amp;gt; Administrative Templates&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Configure these settings under &lt;strong&gt;Microsoft Office 2016 (or later) &amp;gt; Security Settings &amp;gt; Trust Center&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Disable all macros except digitally signed macros&lt;/li&gt;
&lt;li&gt;Block macros from running in files from the Internet&lt;/li&gt;
&lt;li&gt;Enable antivirus scanning of macros&lt;/li&gt;
&lt;li&gt;Block macros from calling Win32 API&lt;/li&gt;
&lt;li&gt;Prevent users from changing macro settings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Assign to device groups used for AVD session hosts or hybrid desktops.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="b-using-intuneapp-policy-for-microsoft365apps"&gt;B. Using Intune (App Policy for Microsoft 365 Apps)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;Intune admin center&lt;/strong&gt;, go to &lt;strong&gt;Apps &amp;gt; Policies for Microsoft 365 Apps &amp;gt; Create Policy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Sign in with appropriate privileges and select &lt;strong&gt;Configure Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Security Settings &amp;gt; Macros&lt;/strong&gt;, configure:
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Disable macros except digitally signed macros&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Block macros from the Internet&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Prevent users from changing macro settings&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Optional)&lt;/em&gt; Enable macro antivirus scanning&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Assign to &lt;strong&gt;AAD user groups&lt;/strong&gt; (this follows the user across devices).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The &lt;strong&gt;“Block Win32 API calls”&lt;/strong&gt; setting is &lt;em&gt;not&lt;/em&gt; available here. If ML2 compliance is mandatory, use the Device‑level policy alongside app policy to close that gap.&lt;/p&gt;
&lt;h3 id="policy-flow-diagram"&gt;Policy Flow Diagram
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
A[Intune Device/Profile Policy] --&gt;|Registry enforcement| B[Office Trust Center]
A2["App Policy (OCPS)"] --&gt;|User-based delivery| B
B --&gt;|Open document| C[Macro Execution]
C --&gt;|Signed/trusted source| D[Run macro safely]
C --&gt;|Untrusted or Internet sourced| E[Macro blocked + AV scan]
E --&gt; F[No Win32 API calls allowed]
&lt;/div&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unsigned macros in internal templates:&lt;/strong&gt; use a &lt;strong&gt;corporate code‑signing certificate&lt;/strong&gt; (via AD CS or Azure Key Vault).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Older builds of Microsoft 365 Apps:&lt;/strong&gt; ensure you deploy to supported channels (Current Channel / Monthly Enterprise) for macro enforcement parity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple policy sources:&lt;/strong&gt; If both OCPS and GPO apply, &lt;strong&gt;the most restrictive&lt;/strong&gt; setting wins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local elevation:&lt;/strong&gt; remove local admin rights on session hosts to prevent registry regression.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trusted Locations:&lt;/strong&gt; restrict write access; treat them like a tap locked after hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bestpractices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Always default to &lt;strong&gt;“disable except signed macros.”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Combine &lt;strong&gt;AV scanning&lt;/strong&gt; + &lt;strong&gt;Win32 API blocking&lt;/strong&gt; for full ML2 coverage.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;App Policy (OCPS)&lt;/strong&gt; where users are single‑tenant and mobility matters.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Device Policy&lt;/strong&gt; where consistency and lockdown are key.&lt;/li&gt;
&lt;li&gt;Audit macro execution and blocked events with &lt;strong&gt;Microsoft Defender for Endpoint&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Re‑test after Office channel upgrades; macro policy enforcement occasionally changes between builds.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Macro controls are like pulling espresso — pressure, temperature, and timing all matter. If you get one off, it either burns the shot (too restrictive for users) or lets something unwanted flow through.&lt;br&gt;
Use Intune App Policy for flexibility, Device Profiles for reliability, and you’ll have a perfect balance — creamy productivity with zero bitter aftertaste.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learnmore"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cyber.gov.au/acsc/view-all-content/essential-eight/" target="_blank" rel="noopener"
&gt;ACSC Essential Eight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/compliance/anz/e8-macro" target="_blank" rel="noopener"
&gt;Essential Eight configure Microsoft Office macro settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-desktop/security-guide" target="_blank" rel="noopener"
&gt;Best practices for Azure Virtual Desktop security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/windows-365/enterprise/security-guidelines" target="_blank" rel="noopener"
&gt;Best practices for Windows 365 security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Essential 8 Maturity Level 2 in Microsoft Cloud VDI (AVD &amp; W365) – Application Control</title><link>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-patchapp/</link><pubDate>Thu, 09 Oct 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-patchapp/</guid><description>&lt;p&gt;A stale flat white is bad, but a stale system image is worse.&lt;br&gt;
In Cloud VDI, old software doesn’t just ruin the experience, it opens the door to exploitation. Whether you’re running &lt;strong&gt;Azure Virtual Desktop&lt;/strong&gt; (AVD) or &lt;strong&gt;Windows 365&lt;/strong&gt;, both need regular patching discipline to meet the &lt;strong&gt;ACSC Essential 8 “Patch Applications” Maturity Level 2&lt;/strong&gt; control.&lt;/p&gt;
&lt;p&gt;These two platforms share the same goal, consistent, secure endpoints but they take different routes to get there. Think of one as an automatic coffee pod machine and the other as a hand‑crafted espresso rig. Both deliver great results when maintained right.&lt;/p&gt;
&lt;h2 id="what-is-patch-applications"&gt;What is Patch Applications?
&lt;/h2&gt;&lt;p&gt;The &lt;strong&gt;Patch Applications&lt;/strong&gt; control ensures vulnerabilities in applications and online services are identified and remediated quickly.&lt;br&gt;
At &lt;strong&gt;Maturity Level 2&lt;/strong&gt;, you must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Perform &lt;strong&gt;automated vulnerability scanning at least fortnightly&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Apply &lt;strong&gt;critical patches or mitigations within 48 hours&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Apply &lt;strong&gt;non‑critical patches within two weeks&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Patch other applications (non‑core) within &lt;strong&gt;one month&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Remove unsupported or end‑of‑life software.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s essentially maintenance discipline — applied not to a coffee grinder, but to your digital workspace.&lt;/p&gt;
&lt;h2 id="how-it-works-in-cloud-vdi"&gt;How It Works in Cloud VDI
&lt;/h2&gt;&lt;p&gt;Essential 8 doesn’t dictate the tools — only the outcome. In Azure, the methods differ depending on whether you use Windows 365 or Azure Virtual Desktop.&lt;/p&gt;
&lt;h3 id="windows-365--the-managed-shot"&gt;Windows 365 — The Managed Shot
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Windows 365 Cloud PCs&lt;/strong&gt; are managed Windows devices. Microsoft maintains the backend, leaving you responsible for OS and app patching through &lt;strong&gt;Intune&lt;/strong&gt; and &lt;strong&gt;Microsoft Defender for Endpoint&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key components:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Intune Update Rings:&lt;/strong&gt; Control OS update cadence and reboots.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defender Vulnerability Management:&lt;/strong&gt; Provides continuous vulnerability discovery and exposure scoring, satisfying the fortnightly scan requirement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patch My PC Enterprise:&lt;/strong&gt; Automates packaging and updating of third‑party applications through Intune.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intune Compliance Policies:&lt;/strong&gt; Detect unsupported or outdated software and remove or re‑install as needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Microsoft 365 Admin] --&gt; B[Intune Policies]
B --&gt; C[Windows 365 Cloud PCs]
C --&gt; D[Microsoft Update Services]
C --&gt; E[Patch My PC Third-Party Updates]
C --&gt; F[Defender Vulnerability Management]
F --&gt; G[Exposure Score &amp; Reports]
G --&gt; H[Compliance Dashboard]
classDef azure fill:#007FFF,stroke:#fff,color:#fff
class B,C,D,E,F,G,H azure
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;In practice:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create and assign &lt;strong&gt;Windows Update Rings&lt;/strong&gt; in Intune.&lt;/li&gt;
&lt;li&gt;Integrate &lt;strong&gt;Patch My PC&lt;/strong&gt; for third‑party app patching.&lt;/li&gt;
&lt;li&gt;Monitor &lt;strong&gt;Defender Vulnerability Management&lt;/strong&gt; weekly or fortnightly.&lt;/li&gt;
&lt;li&gt;Enforce compliance by removing unsupported or legacy software.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Result: Cloud PCs stay patched and compliant with minimal admin touch — automation does the pouring.&lt;/p&gt;
&lt;h3 id="azure-virtual-desktop--the-baristas-setup"&gt;Azure Virtual Desktop — The Barista’s Setup
&lt;/h3&gt;&lt;p&gt;In &lt;strong&gt;AVD&lt;/strong&gt;, you control the infrastructure, which means patching must cover both &lt;strong&gt;session hosts&lt;/strong&gt; and the &lt;strong&gt;golden image&lt;/strong&gt; in the &lt;strong&gt;Shared Image Gallery&lt;/strong&gt;. The modern approach uses &lt;strong&gt;Azure Update Manager&lt;/strong&gt; for orchestration and &lt;strong&gt;Defender Vulnerability Management&lt;/strong&gt; for assurance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key components:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Update Manager:&lt;/strong&gt; Native patch management in the Azure Portal; replaces legacy Automation Accounts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared Image Gallery:&lt;/strong&gt; Source of truth for golden image lifecycle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defender Vulnerability Management:&lt;/strong&gt; Performs regular (at least fortnightly) scans across hosts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patch My PC Enterprise (optional):&lt;/strong&gt; Publishes third‑party app updates to Intune for deployment to AVD hosts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Policy:&lt;/strong&gt; Ensures unsupported images or workloads are detected and blocked from deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
A[Admin Team] --&gt; B[Golden Image in Shared Image Gallery]
B --&gt; C[Session Host Pool]
C --&gt; D[Azure Update Manager Patch Deployment]
D --&gt; E[Microsoft Update Services]
C --&gt; F[Defender Vulnerability Management Scans]
F --&gt; G[Vulnerability Reports / Log Analytics]
E --&gt; C
B --&gt; H[Monthly Image Refresh Cycle]
classDef azure fill:#007FFF,stroke:#fff,color:#fff
class B,C,D,E,F,G,H azure
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;In practice:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update the Golden Image:&lt;/strong&gt; Patch the base image each month using Azure Update Manager. Include Windows updates, Microsoft 365 Apps, and common tools. Republish the image to your Shared Image Gallery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patch Active Session Hosts:&lt;/strong&gt; Use &lt;strong&gt;Azure Update Manager&lt;/strong&gt; schedules to keep hosts current between image cycles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vulnerability Visibility:&lt;/strong&gt; Defender Vulnerability Management continuously scans sessions and reports missing patches.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reimage Regularly:&lt;/strong&gt; Re‑deploy session hosts from the updated image to eliminate drift.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Result: A consistent, controlled baseline — every host as reliable as a freshly cleaned group head.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Both AVD and Windows 365 can meet all Maturity Level 2 outcomes, they just get there differently:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;th&gt;Tooling&lt;/th&gt;
&lt;th&gt;Automation Level&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows 365&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intune‑driven patching and app updates&lt;/td&gt;
&lt;td&gt;Intune, Defender, Patch My PC&lt;/td&gt;
&lt;td&gt;High (hands‑off)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure Virtual Desktop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Admin controls image refresh and host patch cadence&lt;/td&gt;
&lt;td&gt;Update Manager, Defender, optional Patch My PC&lt;/td&gt;
&lt;td&gt;Medium (hands‑on)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Either path gives you predictable patch windows, shorter vulnerability exposure, and clear audit evidence against ACSC requirements.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="windows-365-via-intune"&gt;Windows 365 via Intune
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create Update Rings:&lt;/strong&gt; &lt;em&gt;Intune Admin Centre → Devices → Windows Update Rings → Create Policy.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy Patch My PC:&lt;/strong&gt; Synchronise supported applications to Intune and assign them to device groups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defender Vulnerability Management:&lt;/strong&gt; Enable vulnerability scanning and review exposure reports fortnightly.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="avd-via-azure-update-manager"&gt;AVD via Azure Update Manager
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Azure Portal → Azure Update Manager.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select your &lt;strong&gt;AVD session host resource group&lt;/strong&gt; or machines.&lt;/li&gt;
&lt;li&gt;Create an &lt;strong&gt;update deployment schedule&lt;/strong&gt; (weekly or monthly).&lt;/li&gt;
&lt;li&gt;Configure update classifications (&lt;code&gt;Critical&lt;/code&gt; and &lt;code&gt;Security&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Enable reboot if required and monitor compliance in the &lt;strong&gt;Updates&lt;/strong&gt; dashboard.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Example Bicep Snippet — VM Inclusion for Update Manager:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Define a maintenance configuration for weekly patching of a VM&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// This configuration targets OS image critical &amp;amp; security updates and specifies a maintenance window&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;weeklySchedule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Maintenance/maintenanceConfigurations@2023-10-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;weeklySchedule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maintenanceScope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;OSImage&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;extensionProperties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;visibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Public&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maintenanceWindow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT4H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 4 hours of Maintenance&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;startDateTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;2024-01-01T02:00:00Z&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;recurEvery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;P7D&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Every 7 days&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeZone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UTC+10:00&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// AEST&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;installPatches&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;windowsParameters&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;classificationsToInclude&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Critical&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Security&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rebootSetting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IfRequired&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Get the VM id of the AVD Gold Image Machine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines@2021-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avd-goldimg-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Apply the maintenance configuration to a specific VM&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maintenanceConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Maintenance/configurationAssignments@2023-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avdPatchSchedule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maintenanceConfigurationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;weeklySchedule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Session Host Drift (AVD):&lt;/strong&gt; Hosts patched manually or off‑cycle may deviate from the image — rebuild from the golden image regularly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Third‑Party Apps (Both):&lt;/strong&gt; Patch My PC covers most catalogues, but internal LOB apps still need custom packaging.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Licensing:&lt;/strong&gt; Defender Vulnerability Management and Patch My PC require additional licensing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reboot Management:&lt;/strong&gt; Coordinate reboots for AVD session hosts to avoid user disruption.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scan Fortnightly:&lt;/strong&gt; Use Defender Vulnerability Management to detect missing patches.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automate Regularly:&lt;/strong&gt; For W365, rely on Intune and Patch My PC; for AVD, lean on Azure Update Manager.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refresh Monthly:&lt;/strong&gt; Rebuild AVD golden images monthly and redeploy hosts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove Unsupported Software:&lt;/strong&gt; Detect and remove old versions through Intune or Azure Policy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visibility Matters:&lt;/strong&gt; Monitor Defender exposure scores and Update Manager compliance to track posture improvement.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;For &lt;strong&gt;Windows 365&lt;/strong&gt;, patching is a push‑button brew — Intune and Patch My PC handle the flow, Defender highlights the exposure, and compliance takes care of itself.&lt;/p&gt;
&lt;p&gt;For &lt;strong&gt;Azure Virtual Desktop&lt;/strong&gt;, you’re the barista. Update your golden image through Azure Update Manager, deploy it regularly, and let Defender confirm everything’s clean. It’s a little more manual but built for those who like precision control.&lt;/p&gt;
&lt;p&gt;Different tools, same aroma — both paths deliver a smooth, ACSC Maturity Level 2‑compliant patch regime if you keep the cadence, refresh cycle, and scanning tight.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/update-manager/overview" target="_blank" rel="noopener"
&gt;Microsoft Learn: Azure Update Manager Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-desktop/update-management" target="_blank" rel="noopener"
&gt;Microsoft Learn: Manage updates in Azure Virtual Desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/windows-365/manage/windows-update-for-business" target="_blank" rel="noopener"
&gt;Microsoft Learn: Manage Windows updates for Windows 365&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/defender-vulnerability-management/overview" target="_blank" rel="noopener"
&gt;Microsoft Defender Vulnerability Management Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://patchmypc.com/microsoft-intune-automation" target="_blank" rel="noopener"
&gt;Patch My PC Enterprise for Intune&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cyber.gov.au/acsc/view-all-content/essential-eight/patch-applications" target="_blank" rel="noopener"
&gt;Essential Eight Explained – Patch Applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Essential 8 Maturity Level 2 in Microsoft Cloud VDI (AVD &amp; W365) – Application Control</title><link>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-appcontrol/</link><pubDate>Tue, 07 Oct 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-appcontrol/</guid><description>&lt;p&gt;Ever poured milk into your coffee only to realise it had gone off? That’s a similar kind of disappointment to what happens when unknown or malicious software sneaks into your virtual desktop environment. Application Control keeps your environment free from untrusted code—making sure only good beans go through the grinder.&lt;/p&gt;
&lt;p&gt;In the world of Azure Virtual Desktop (AVD) and Windows 365 (W365), that means clearly defining and enforcing which applications and binaries can run. The result: stable, predictable, and secure workspaces ready for production.&lt;/p&gt;
&lt;h2 id="what-is-application-control"&gt;What is Application Control?
&lt;/h2&gt;&lt;p&gt;Application Control is one of the &lt;strong&gt;Essential Eight&lt;/strong&gt; mitigation strategies from the Australian Cyber Security Centre (ACSC).&lt;/p&gt;
&lt;p&gt;Think of it as a virtual doorman: only pre‑approved software gets through the door, and everything else is turned away before it even gets to the bar.&lt;/p&gt;
&lt;h3 id="goal-for-maturity-level-2"&gt;Goal for Maturity Level 2
&lt;/h3&gt;&lt;p&gt;Implement centrally managed &lt;strong&gt;application allow‑listing&lt;/strong&gt; across all workstations, internet‑facing servers, and cloud desktops. Policies must restrict execution of executables, installers, scripts, compiled HTML, and software libraries to an &lt;strong&gt;organisation‑approved set&lt;/strong&gt;, while blocking everything else.&lt;/p&gt;
&lt;p&gt;ML2 also requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Microsoft’s recommended application blocklist&lt;/strong&gt; to be implemented.&lt;/li&gt;
&lt;li&gt;All &lt;strong&gt;allow and block events to be centrally logged&lt;/strong&gt;, analysed in a timely manner, and protected from unauthorised modification or deletion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cybersecurity events&lt;/strong&gt; to be triaged, escalated to the &lt;strong&gt;CISO (or delegate)&lt;/strong&gt;, reported to the &lt;strong&gt;Australian Signals Directorate (ASD)&lt;/strong&gt; where applicable, and managed under the organisation’s &lt;strong&gt;incident response plan&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solutions meeting this level include &lt;strong&gt;Microsoft Defender Application Control (MDAC)&lt;/strong&gt;, &lt;strong&gt;AppLocker&lt;/strong&gt;, and third‑party tools such as &lt;strong&gt;ThreatLocker&lt;/strong&gt; and &lt;strong&gt;Huntress&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="how-it-works-in-cloud-vdi"&gt;How it Works in Cloud VDI
&lt;/h2&gt;&lt;p&gt;Application Control enforces trust rules at the OS layer for AVD and W365 endpoints. Policies block execution outside approved paths, publishers, or hashes—keeping user and attacker activity under control.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Common Tools&lt;/th&gt;
&lt;th&gt;Policy Scope&lt;/th&gt;
&lt;th&gt;Management Approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure Virtual Desktop (AVD)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MDAC, AppLocker, ThreatLocker&lt;/td&gt;
&lt;td&gt;Session hosts or golden image&lt;/td&gt;
&lt;td&gt;Intune, Group Policy, or ThreatLocker Cloud Portal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows 365 (W365)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MDAC or ThreatLocker&lt;/td&gt;
&lt;td&gt;Individual Cloud PCs&lt;/td&gt;
&lt;td&gt;Intune Configuration Profiles or ThreatLocker Agent policies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Both AVD &amp;amp; W365 can leverage Microsoft Sentinel or Huntress for their centralised logging &amp;amp; managed SIEM requirements&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="centralised-logging-flow"&gt;Centralised Logging Flow
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart TD
U[User connects to VDI] --&gt; V["Virtual Desktop (AVD/W365)"]
V --&gt; App[User Launches Application]
App --&gt; P["Application Control Rules (MDAC / ThreatLocker)"]
P --&gt;|Approved| A[Run App]
P --&gt;|Denied| X[Block Execution]
X --&gt; E[Write Event to Local Event Log]
E --&gt; L["Forward to Central Log Platform (Sentinel / Huntress / Defender / SIEM)"]
L --&gt; S[Security Team Review and Incident Response]
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MDAC/AppLocker&lt;/strong&gt; logs to &lt;em&gt;Microsoft‑Windows‑CodeIntegrity&lt;/em&gt; and &lt;em&gt;AppLocker Operational&lt;/em&gt; event logs.&lt;/li&gt;
&lt;li&gt;Logs can be forwarded using the &lt;strong&gt;Azure Monitor agent&lt;/strong&gt; into &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt;, &lt;strong&gt;Defender for Endpoint&lt;/strong&gt;, or a &lt;strong&gt;Huntress Managed SIEM&lt;/strong&gt; instance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ThreatLocker&lt;/strong&gt; provides cloud‑native audit logs that can export directly to Huntress or Sentinel for SOC‑level analysis.&lt;/li&gt;
&lt;li&gt;Once ingested, events are &lt;strong&gt;write‑once and immutable&lt;/strong&gt;, satisfying ML2’s requirement for protecting logs from modification or deletion.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Without Application Control, users or attackers can run virtually anything—from legitimate but risky admin tools to full‑blown malware.&lt;/p&gt;
&lt;p&gt;Implementing this control delivers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clear separation between &lt;strong&gt;trusted and rogue executables&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Reduced &lt;strong&gt;attack surface&lt;/strong&gt; across both pooled and personal VDI instances.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational consistency&lt;/strong&gt; between session hosts and Cloud PCs.&lt;/li&gt;
&lt;li&gt;Stronger &lt;strong&gt;evidence for Essential Eight ML2 compliance&lt;/strong&gt;, with verifiable centralised logs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Application allow‑listing also simplifies post‑incident analysis, helping teams trace root causes fast without hunting through endpoints one by one.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="intune-portal-mdac-with-central-logging"&gt;Intune Portal: MDAC with Central Logging
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;Intune&lt;/strong&gt;, open &lt;strong&gt;Endpoint security &amp;gt; Attack surface reduction &amp;gt; Application control&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Create a new &lt;strong&gt;Defender Application Control Policy&lt;/strong&gt; and select &lt;em&gt;Microsoft’s recommended blocklist&lt;/em&gt; to satisfy ASD requirements.&lt;/li&gt;
&lt;li&gt;Assign a &lt;strong&gt;Starter policy&lt;/strong&gt; (for example, “Allow Microsoft and Store‑signed apps”).&lt;/li&gt;
&lt;li&gt;Deploy logging by:
&lt;ul&gt;
&lt;li&gt;Installing the &lt;strong&gt;Azure Monitor Agent&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configuring diagnostic settings for &lt;strong&gt;CodeIntegrity&lt;/strong&gt; and &lt;strong&gt;AppLocker operational logs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Sending events to &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt;, &lt;strong&gt;Huntress Managed SIEM&lt;/strong&gt;, or &lt;strong&gt;Defender for Endpoint&lt;/strong&gt; via secure connectivity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create analytic rules or detection packs to highlight blocked or unsigned executions.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example-log-forwarding-configuration-concept"&gt;Bicep Example (Log forwarding configuration concept)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;law&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.OperationalInsights/workspaces@2022-10-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;law-avd-security&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;diag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/diagnosticSettings@2021-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;sendAppControlLogs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avdSessionHost&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;law&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AppLocker&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft-Windows-CodeIntegrity/Operational&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="threatlocker"&gt;ThreatLocker
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Deploy &lt;strong&gt;ThreatLocker agents&lt;/strong&gt; to your AVD or W365 devices.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Learning Mode&lt;/strong&gt; to baseline permitted applications.&lt;/li&gt;
&lt;li&gt;Enforce policies after validation.&lt;/li&gt;
&lt;li&gt;Review block events and alerts sent automatically to the ThreatLocker Portal or your connected SIEM.&lt;/li&gt;
&lt;li&gt;Logs can stream directly to &lt;strong&gt;Huntress&lt;/strong&gt; or &lt;strong&gt;Sentinel&lt;/strong&gt;, where they’re retained securely with integrity controls.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="huntress-managed-siem"&gt;Huntress Managed SIEM
&lt;/h3&gt;&lt;p&gt;If you prefer a fully managed logging backbone without owning a Sentinel workspace:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Connect your &lt;strong&gt;MDAC&lt;/strong&gt;, &lt;strong&gt;Defender&lt;/strong&gt;, or &lt;strong&gt;ThreatLocker&lt;/strong&gt; telemetry sources using Huntress ingestion connectors.&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;Windows Event Forwarding&lt;/strong&gt; from VDI hosts (CodeIntegrity and AppLocker logs).&lt;/li&gt;
&lt;li&gt;Huntress collects, normalises, and monitors events, providing SOC analysis and alerting back to your security team.&lt;/li&gt;
&lt;li&gt;This satisfies ASD’s requirement for &lt;strong&gt;timely analysis&lt;/strong&gt; and &lt;strong&gt;incident identification&lt;/strong&gt; of application control events.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Audit First&lt;/strong&gt;: Begin with audit or learning mode before enforcement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unsigned Apps&lt;/strong&gt;: Internal or custom apps must be signed or explicitly allowed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Golden Image Sync&lt;/strong&gt;: AVD hosts rebuilt from the master image must automatically receive updated allow‑lists and log forwarding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event Volume&lt;/strong&gt;: Application control logs can grow quickly—plan retention filters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clarify SIEM Ownership&lt;/strong&gt;: Whether Sentinel or Huntress, ensure someone is reviewing the dashboards; unattended logs don’t count toward ML2 “analysed in a timely manner.”&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Apply &lt;strong&gt;Microsoft’s Recommended Application Blocklist&lt;/strong&gt; in all MDAC deployments.&lt;/li&gt;
&lt;li&gt;Continuously tune &lt;strong&gt;AppLocker&lt;/strong&gt; or &lt;strong&gt;ThreatLocker&lt;/strong&gt; rules based on review logs.&lt;/li&gt;
&lt;li&gt;Forward logs to a central SIEM—choose &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt; if you want deep Azure integration, or &lt;strong&gt;Huntress Managed SIEM&lt;/strong&gt; if you prefer a fully managed option with SOC oversight.&lt;/li&gt;
&lt;li&gt;Confirm central SIEM stores logs &lt;strong&gt;immutably&lt;/strong&gt; and monitors event integrity.&lt;/li&gt;
&lt;li&gt;Validate rulesets annually, following policy drift reviews.&lt;/li&gt;
&lt;li&gt;Strengthen your &lt;strong&gt;incident escalation workflow&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;SOC receives SIEM alerts from Sentinel or Huntress.&lt;/li&gt;
&lt;li&gt;Escalate confirmed cases to the &lt;strong&gt;CISO or delegate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If warranted, report to &lt;strong&gt;ASD&lt;/strong&gt; and execute the active &lt;strong&gt;cyber incident response plan&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;If you’re leaning toward MDAC, remember it’s included with &lt;strong&gt;Microsoft Defender for Endpoint Plan 2&lt;/strong&gt; or &lt;strong&gt;Microsoft 365 E5&lt;/strong&gt; licences. For organisations already invested in the Microsoft ecosystem, it’s a great cost‑efficient choice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ThreatLocker&lt;/strong&gt;, meanwhile, delivers a refreshing user experience and strong hybrid coverage—though you’ll want to keep an eye on the subscription tab.&lt;/p&gt;
&lt;p&gt;From experience, &lt;strong&gt;MDAC&lt;/strong&gt; can require a little more operational caffeine, especially when patching shifts file paths or hash values. &lt;strong&gt;ThreatLocker&lt;/strong&gt; smooths that out with autodetection and an intuitive portal interface.&lt;/p&gt;
&lt;p&gt;For logging, &lt;strong&gt;Huntress Managed SIEM&lt;/strong&gt; is fast becoming a practical option for teams that don’t want to run Sentinel themselves but still need SOC‑level visibility and Essential Eight log assurance. It’s like outsourcing the night shift for your café—someone’s always watching the machine so you can focus on the blend.&lt;/p&gt;
&lt;p&gt;Whichever beans you pick, don’t skip the central logs. Running Application Control without proper, tamper‑proof event collection is like pulling espresso in the dark—you’ll smell what’s happening but never see where it overflowed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/wdac-and-applocker-overview" target="_blank" rel="noopener"
&gt;Microsoft Defender Application Control Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/windows/security/threat-protection/applocker/applocker-overview" target="_blank" rel="noopener"
&gt;AppLocker Policies in Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://threatlocker.kb.help/en/" target="_blank" rel="noopener"
&gt;ThreatLocker Official Documentation&lt;/a&gt; : &lt;em&gt;only accessible via a portal login&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.huntress.com/platform/siem" target="_blank" rel="noopener"
&gt;Huntress Managed SIEM Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/microsoft-recommended-block-rules" target="_blank" rel="noopener"
&gt;Microsoft Recommended Block Rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/agents/azure-monitor-agent-overview" target="_blank" rel="noopener"
&gt;Azure Monitor Agent Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/sentinel/connect-windows-security-events" target="_blank" rel="noopener"
&gt;Microsoft Sentinel Data Connectors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cyber.gov.au/acsc/view-all-content/publications/essential-eight-maturity-model" target="_blank" rel="noopener"
&gt;ACSC Essential Eight Maturity Model&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Essential 8 Maturity Level 2 in Microsoft Cloud VDI (AVD &amp; W365) – Overview</title><link>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-overview/</link><pubDate>Thu, 02 Oct 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vdi-e8-ml2-overview/</guid><description>&lt;p&gt;If you’ve ever run a café, you know the key to success isn’t just brewing good coffee, it’s keeping the milk cold, the till locked, and the regulars happy. Azure Virtual Desktop (AVD) and Windows 365 (W365) are much the same: you’ve got to serve up a smooth, secure experience while making sure the behind-the-scenes hygiene is on point.&lt;/p&gt;
&lt;p&gt;For Australian organisations, that hygiene is often measured by the &lt;strong&gt;ASD Essential 8&lt;/strong&gt; – a set of mitigation strategies published by the Australian Cyber Security Centre (ACSC). And while reaching &lt;strong&gt;Maturity Level 3&lt;/strong&gt; (the top shelf whiskey of compliance) is the long-term goal, most enterprises aim for &lt;strong&gt;Maturity Level 2&lt;/strong&gt; – the practical baseline where security meets operational reality with minimal user experience impact.&lt;/p&gt;
&lt;p&gt;This series will show you how each of the eight controls can be implemented in Microsoft Cloud VDI (Azure Virtual Desktop &amp;amp; Windows 365).&lt;/p&gt;
&lt;h2 id="what-is-the-asd-essential-8"&gt;What is the ASD Essential 8?
&lt;/h2&gt;&lt;p&gt;The &lt;strong&gt;Essential 8&lt;/strong&gt; is a cyber maturity set of controls designed to help organisations protect against common cyber threats. Each control is scored across three levels of maturity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Level 1:&lt;/strong&gt; Basic hygiene&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 2:&lt;/strong&gt; Reasonably resistant against adversaries with moderate capability&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 3:&lt;/strong&gt; Strong defence against more sophisticated, determined adversaries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most businesses running &lt;strong&gt;AVD or W365&lt;/strong&gt;, &lt;strong&gt;Level 2&lt;/strong&gt; is the “sweet spot” – achievable without paralysing operations or end user experience, but still significantly hardening the attack surface.&lt;/p&gt;
&lt;h2 id="how-it-works-in-cloud-vdi"&gt;How it Works in Cloud VDI
&lt;/h2&gt;&lt;p&gt;In a cloud-hosted desktop world, applying the Essential 8 comes with nuances:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Virtual Desktop (AVD):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You’re responsible for image management, patching, and some underlying infra choices.&lt;/li&gt;
&lt;li&gt;More flexibility but also more operational work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows 365 (W365):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft handles more of the “plumbing”.&lt;/li&gt;
&lt;li&gt;You enforce Essential 8 primarily through &lt;strong&gt;Intune policies&lt;/strong&gt;, &lt;strong&gt;M365 security&lt;/strong&gt;, and &lt;strong&gt;Conditional Access&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Essential 8 is &lt;strong&gt;technology-agnostic&lt;/strong&gt; – but implementing it in these VDI environments means mapping controls to &lt;strong&gt;Azure-native services&lt;/strong&gt; and &lt;strong&gt;Microsoft security stacks&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Getting to Maturity Level 2 in AVD/W365 isn’t just a compliance tick-box – it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reduces the chance of zero-day exploits wrecking your VDI environment&lt;/li&gt;
&lt;li&gt;Aligns with government/industry compliance requirements (especially in AU sectors like health, finance, and gov suppliers)&lt;/li&gt;
&lt;li&gt;Simplifies audits – you can confidently demonstrate mapped controls&lt;/li&gt;
&lt;li&gt;Improves user trust; fewer disruptions from macro-based malware or admin misuse&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short: it lets you serve desktops with confidence, like a barista who knows the milk jug’s been cleaned.&lt;/p&gt;
&lt;h2 id="architectural-view"&gt;Architectural View
&lt;/h2&gt;&lt;p&gt;Here’s a simple high-level view mapping &lt;strong&gt;Essential 8&lt;/strong&gt; controls with Cloud VDI layers:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
subgraph Users["End Users"]
U1["AVD Session Host"]
U2["W365 Cloud PC"]
end
subgraph SecurityControls["Essential 8 Controls"]
direction TB
A["1. App Control"]
B["2. Patch Apps"]
C["3. Office Macros Config"]
D["4. Patch OS"]
E["5. MFA"]
F["6. Admin Priv Restriction"]
G["7. Application Hardening"]
H["8. Daily Backups"]
end
Users --&gt; SecurityControls
SecurityControls --&gt; AzureAD["Azure AD / Entra ID"]
SecurityControls --&gt; Intune["Intune / Endpoint Manager"]
SecurityControls --&gt; Defender["Microsoft Defender Suite"]
SecurityControls --&gt; AzureInfra["Azure Infra Services (Storage, Update Mgmt, Backup)"]
&lt;/div&gt;
&lt;p&gt;This series will step through how each control translates into tangible configurations inside AVD &amp;amp; W365.&lt;/p&gt;
&lt;h2 id="implementation-approach"&gt;Implementation Approach
&lt;/h2&gt;&lt;p&gt;We’ll take each of the eight controls and break them down like so:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What the control means in practice&lt;/li&gt;
&lt;li&gt;How it applies to AVD and/or W365&lt;/li&gt;
&lt;li&gt;Implementation via &lt;strong&gt;Azure Portal&lt;/strong&gt; and &lt;strong&gt;Bicep&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Gotchas &amp;amp; edge cases&lt;/li&gt;
&lt;li&gt;Best practices&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;p&gt;Right from the outset, some challenges to keep in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shared Responsibility:&lt;/strong&gt; W365 abstracts away VM management, but you still must configure policies to align with Essential 8.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FSLogix Dependencies (AVD):&lt;/strong&gt; Application &amp;amp; OS patching interacts heavily with golden images and profile containers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Licensing:&lt;/strong&gt; Some controls (App Control, Advanced MFA scenarios, Defender features) require higher-tier licensing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational Rhythm:&lt;/strong&gt; Essential 8 isn’t “set and forget” – it’s about ongoing governance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Line of Business (LoB) Apps:&lt;/strong&gt; The only application within my test environment will be Microsoft Office 365 Apps, your LoB apps may have different requirements, capabilities, limitations and restrictions that you need to consider when applying E8 ML2.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;security baselines&lt;/strong&gt; in Intune as a quick start.&lt;/li&gt;
&lt;li&gt;Map every Essential 8 control to &lt;strong&gt;a measurable outcome&lt;/strong&gt; (e.g., “100% AVD session hosts patched within 48 hours”).&lt;/li&gt;
&lt;li&gt;Build policy-as-code with &lt;strong&gt;Bicep&lt;/strong&gt; where possible; align controls with CI/CD culture.&lt;/li&gt;
&lt;li&gt;Pilot each control &lt;strong&gt;gradually&lt;/strong&gt; – a poorly tested application control policy can stop users faster than a flat white served cold.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Essential 8 isn’t a compliance chore – it’s a survival kit. In the VDI world, controls like patching and admin restrictions matter even more because you’re scaling a single desktop configuration across &lt;strong&gt;hundreds of people&lt;/strong&gt;. Mess it up, and you multiply your exposure. Nail it, and you’ve scaled security efficiency.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cyber.gov.au/resources-business-and-government/essential-cyber-security/essential-eight" target="_blank" rel="noopener"
&gt;Australian Cyber Security Centre – Essential Eight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-desktop/" target="_blank" rel="noopener"
&gt;Microsoft Learn – Azure Virtual Desktop Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/windows-365/" target="_blank" rel="noopener"
&gt;Microsoft Learn – Windows 365 Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/mem/intune/protect/protect-devices" target="_blank" rel="noopener"
&gt;Microsoft Learn – Intune Endpoint Security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Microsoft Defender for Cloud Apps vs Zscaler, Netskope, and Prisma</title><link>https://blog.brewedinthecloud.com/p/defending-saas-mcas-vs-competitors/</link><pubDate>Tue, 30 Sep 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/defending-saas-mcas-vs-competitors/</guid><description>&lt;p&gt;If you’ve been in security long enough, you know that Cloud Access Security Brokers (CASBs) have become the bouncers of the SaaS products keeping dodgy apps out, policing who gets in, and checking identities.&lt;/p&gt;
&lt;p&gt;In this post, we’ll pit &lt;strong&gt;Microsoft Defender for Cloud Apps (MCAS)&lt;/strong&gt; against three well-known rivals — Zscaler, Netskope, and Prisma (by Palo Alto Networks). Think of it as a tasting paddle: same category of brew, different flavours, and the right choice depends on your palate (and platform).&lt;/p&gt;
&lt;p&gt;Its worth noting that this is an opinion article based on my own experience with each of the tools which I have leveraged or utilised over the past 12 months through various projects and personally labbing.&lt;/p&gt;
&lt;h2 id="what-is-mcas"&gt;What is MCAS?
&lt;/h2&gt;&lt;p&gt;MCAS is Microsoft’s CASB offering, designed to help organisations secure SaaS, IaaS, and PaaS usage. It bridges the gap between users, cloud apps, and security policies by providing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visibility into shadow IT&lt;/li&gt;
&lt;li&gt;Data protection via built-in DLP&lt;/li&gt;
&lt;li&gt;Threat detection and anomaly monitoring&lt;/li&gt;
&lt;li&gt;Seamless integration with Microsoft security stack (Entra, Defender XDR, Purview)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words: MCAS is the default bartender if you’re already in Microsoft’s pub.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it Works
&lt;/h2&gt;&lt;p&gt;At a high level, a CASB sits between your users and cloud services, inspecting access requests, enforcing policies, and feeding telemetry back into your security tools.&lt;/p&gt;
&lt;p&gt;Here’s a simplified view of MCAS in action with conditional access:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
U[User] --&gt;|Login request| EntraID[Microsoft Entra ID]
EntraID --&gt;|Conditional Access| MCAS[Defender for Cloud Apps]
MCAS --&gt;|"Policy check: DLP, Session control"| SaaS["Cloud App (O365/Salesforce/Dropbox)"]
SaaS --&gt;|"Data &amp; Session response"| U
&lt;/div&gt;
&lt;p&gt;Here’s a simplified look at how the competitor CASBs typically work:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
U[User] --&gt;|"Login / App request"| CASB["CASB Proxy (Zscaler / Netskope)"]
CASB --&gt;|"Policy check: DLP, Threat protection, Access control"| SaaS["Cloud App (O365/Salesforce/Dropbox)"]
SaaS --&gt;|"App response (inspected / enforced)"| CASB
CASB --&gt; U
&lt;/div&gt;
&lt;h2 id="the-big-difference"&gt;The Big Difference
&lt;/h2&gt;&lt;p&gt;One of the key architectural distinctions between &lt;strong&gt;Microsoft Defender for Cloud Apps (MCAS)&lt;/strong&gt; and traditional CASBs like &lt;strong&gt;Zscaler&lt;/strong&gt; or &lt;strong&gt;Netskope&lt;/strong&gt; comes down to &lt;em&gt;how&lt;/em&gt; they sit in the traffic flow.&lt;/p&gt;
&lt;h3 id="zscaler--netskope--proxy-style-casbs"&gt;Zscaler / Netskope — Proxy-Style CASBs
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;User traffic is &lt;strong&gt;routed through the vendor’s cloud&lt;/strong&gt; (via VPN, GRE/IPsec tunnel, PAC file, or endpoint agent).&lt;/li&gt;
&lt;li&gt;Every request to a SaaS app is inspected &lt;em&gt;inline&lt;/em&gt; for DLP, threat protection, and access policies.&lt;/li&gt;
&lt;li&gt;This means &lt;strong&gt;all session data passes through their infrastructure&lt;/strong&gt; for inspection and enforcement.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="microsoft-defender-for-cloud-apps--identity-driven-casb"&gt;Microsoft Defender for Cloud Apps — Identity-Driven CASB
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Works hand in glove with &lt;strong&gt;Microsoft Entra ID Conditional Access&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;During login/authentication, sessions are &lt;strong&gt;redirected&lt;/strong&gt; to MCAS — where rules like DLP, block download, or watermarking can apply.&lt;/li&gt;
&lt;li&gt;Instead of forcing &lt;strong&gt;all network traffic&lt;/strong&gt; through a proxy, MCAS leverages &lt;strong&gt;authentication redirection&lt;/strong&gt; at the identity layer.&lt;/li&gt;
&lt;li&gt;The trade-off: less intrusive to the network, but typically limited to apps that support &lt;strong&gt;SAML/OAuth federation&lt;/strong&gt; and Conditional Access App Control.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Quick Takeaway&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zscaler/Netskope:&lt;/strong&gt; “All your traffic flows through us for enforcement.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCAS:&lt;/strong&gt; “We step in at authentication and handle policies without touching all traffic.”&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Why does this matter? Because SaaS sprawl is real. Users spin up new cloud apps daily, and without visibility, sensitive data starts leaking like a dodgy beer tap.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MCAS Strengths:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Native Microsoft integration (licensing, Entra, Purview, Defender XDR)&lt;/li&gt;
&lt;li&gt;Conditional access session controls baked directly in&lt;/li&gt;
&lt;li&gt;Cost advantage: bundled into Microsoft 365 E5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Competitor Edge:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Netskope&lt;/strong&gt;: Market leader in app coverage, broad SaaS connector library&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zscaler&lt;/strong&gt;: Strong secure web gateway (SWG) plus CASB integration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prisma&lt;/strong&gt;: Multi-cloud monitoring and rich DLP capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you’re heavily Microsoft-centric, MCAS is convenient and affordable. But in hybrid or multi-cloud environments, Netskope or Prisma may bring stronger muscle.&lt;/p&gt;
&lt;h2 id="comparison-matrix"&gt;Comparison Matrix
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;MCAS&lt;/th&gt;
&lt;th&gt;Netskope&lt;/th&gt;
&lt;th&gt;Zscaler&lt;/th&gt;
&lt;th&gt;Prisma&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Visibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;★ Strong (M365 native, shadow IT discovery)&lt;/td&gt;
&lt;td&gt;★ Strong&lt;/td&gt;
&lt;td&gt;★ Strong&lt;/td&gt;
&lt;td&gt;★ Strong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DLP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✔ Good (Purview integration)&lt;/td&gt;
&lt;td&gt;★ Strong&lt;/td&gt;
&lt;td&gt;✔ Good&lt;/td&gt;
&lt;td&gt;★ Strong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ecosystem Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;★ Strong (Microsoft security stack)&lt;/td&gt;
&lt;td&gt;✔ Good&lt;/td&gt;
&lt;td&gt;✔ Good&lt;/td&gt;
&lt;td&gt;✔ Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ease of SaaS Connectors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;△ Weak (limited vs competitors)&lt;/td&gt;
&lt;td&gt;★ Strong&lt;/td&gt;
&lt;td&gt;✔ Good&lt;/td&gt;
&lt;td&gt;★ Strong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Licensing Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;★ Strong (included in E5)&lt;/td&gt;
&lt;td&gt;△ Weak (separate licensing)&lt;/td&gt;
&lt;td&gt;△ Weak&lt;/td&gt;
&lt;td&gt;△ Weak&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;App Coverage:&lt;/strong&gt; Many SaaS apps are supported out-of-the-box by competitors but need API customisation in MCAS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Experience:&lt;/strong&gt; Session control policies can feel “clunky” with third-party apps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Licensing Confusion:&lt;/strong&gt; While MCAS is bundled in M365 E5, not every tenant realises they have it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Start with &lt;strong&gt;discovery&lt;/strong&gt;: map your shadow IT using MCAS and Entra sign-in logs.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;conditional access app control&lt;/strong&gt; strategically — not blanket, or users will revolt.&lt;/li&gt;
&lt;li&gt;Integrate MCAS with &lt;strong&gt;Microsoft Sentinel&lt;/strong&gt; for incident correlation.&lt;/li&gt;
&lt;li&gt;Regularly review &lt;strong&gt;policy hits&lt;/strong&gt; and false positives to fine-tune rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If you’re running Microsoft 365 and Azure, MCAS is your &lt;strong&gt;house brew&lt;/strong&gt; — already on tap, nicely paired with the rest of the stack. But if your bar is multi-cloud and full of eclectic apps, you might want Netskope or Prisma on draught instead.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/defender-cloud-apps/what-is-defender-for-cloud-apps" target="_blank" rel="noopener"
&gt;Microsoft Defender for Cloud Apps documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/defender-cloud-apps/discovered-apps" target="_blank" rel="noopener"
&gt;Shadow IT discovery in MCAS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Defender for Cloud Apps</title><link>https://blog.brewedinthecloud.com/p/defending-saas-cloudapps/</link><pubDate>Thu, 25 Sep 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/defending-saas-cloudapps/</guid><description>&lt;p&gt;Ever walked into a café, looked at the menu, and realised your team’s been ordering “secret shots” behind your back? That’s what shadow IT feels like: dozens of unsanctioned SaaS apps sneaking into your environment without an invite.&lt;/p&gt;
&lt;p&gt;Microsoft Defender for Cloud Apps (formerly MCAS) is the tool that helps identify, govern, and secure those unauthorised lattes—sorry, apps—before they spill risk across your environment. Let’s break down how to get from discovery to enforcement in less time than it’d take to finish an espresso.&lt;/p&gt;
&lt;h2 id="what-is-defender-for-cloud-apps"&gt;What is Defender for Cloud Apps?
&lt;/h2&gt;&lt;p&gt;Defender for Cloud Apps (MDCA) is Microsoft’s Cloud Access Security Broker (CASB). In plain terms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It discovers SaaS applications in use (authorised and unauthorised)&lt;/li&gt;
&lt;li&gt;It assesses the risk of those apps&lt;/li&gt;
&lt;li&gt;It enforces access and session policies to keep data secure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think of it as the bouncer at your cloud bar. Staff might try to sneak in through side doors (shadow IT), but MDCA checks who’s allowed in, and how they behave once they’re inside.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it Works
&lt;/h2&gt;&lt;p&gt;At its core, Defender for Cloud Apps integrates with &lt;strong&gt;Entra ID&lt;/strong&gt; and your &lt;strong&gt;network traffic sources&lt;/strong&gt; (firewalls, proxies, etc.) to provide app discovery and control. Once connected, it can apply session controls and block risky behaviours in real-time.&lt;/p&gt;
&lt;p&gt;Here’s a simple integration flow:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
Firewall["Network Devices / Firewalls"] --&gt;|Log Collector| MDCA[Defender for Cloud Apps]
EntraID[Entra ID Conditional Access] --&gt; MDCA
MDCA --&gt; DefenderXDR[Microsoft Defender XDR]
User["Employees &amp; Contractors"] --&gt;|Access SaaS Apps| EntraID
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Log collector&lt;/strong&gt;: Ingests traffic data from firewalls/proxies for Shadow IT discovery&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App connectors&lt;/strong&gt;: Integrate directly with sanctioned apps like Office 365, Salesforce&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conditional Access App Control&lt;/strong&gt;: Session-level enforcement handled via Entra ID policies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defender XDR integration&lt;/strong&gt;: Brings cloud app alerts into your broader security ecosystem&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Why it matters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shadow IT visibility&lt;/strong&gt;: Identify hundreds of unsanctioned apps your IT team never approved&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session control&lt;/strong&gt;: Stop sensitive data from walking out the door (e.g., block downloads, enforce read-only web sessions)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OAuth app governance&lt;/strong&gt;: Track and block dodgy third-party integrations into productivity suites&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified defence&lt;/strong&gt;: Tie into Defender XDR for incident correlation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In production, this translates to less guesswork and more enforceable guardrails.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;Here’s how to get Defender for Cloud Apps moving in your first 30 minutes.&lt;/p&gt;
&lt;h3 id="portal-steps"&gt;Portal Steps
&lt;/h3&gt;&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Identify your firewall/proxy: Ensure it’s supported by MDCA (e.g., Palo Alto, Fortinet, Cisco, Check Point, Blue Coat, etc.).
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download the Log Collector: In the Defender for Cloud Apps portal, go to Cloud Discovery &amp;gt; Settings &amp;gt; Log collectors. Click + Add log collector.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Give it a name and download the Docker image and configuration file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the Docker Container: on a server (Linux or Windows with Docker), run the Log Collector using the provided command and config file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -v /path/to/config:/config -p 514:514/udp mcr.microsoft.com/azure-cas/logcollector:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Replace /path/to/config with the actual path to your config file.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure Your Firewall/Proxy: Forward logs to the Log Collector’s IP and port (usually UDP 514 for Syslog).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify Log Collection: In the Defender for Cloud Apps portal, check the status of your Log Collector under Cloud Discovery &amp;gt; Settings &amp;gt; Log collectors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Review Continuous Reports: Go to Cloud Discovery &amp;gt; Continuous reports. Select your Log Collector to view discovered apps, users, and traffic.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; This is where you want to gain the understanding of your environment and what cloudapps are being used, you can then look to implement Conditional Access policies or firewall policies to treat them accordingly.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="bicep-snippet-example"&gt;Bicep Snippet Example
&lt;/h3&gt;&lt;p&gt;Here’s a simple Bicep snippet to create a Conditional Access policy wired to Defender for Cloud Apps:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;conditionalAccessPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policyAssignments@2020-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;CA-Policy-O365-MCAS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;global&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Block downloads of sensitive files from unmanaged devices&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/providers/Microsoft.Authorization/policyDefinitions/ConditionalAccessPolicy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;O365-MCAS-SessionControl&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;enabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;includeUsers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;All&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;applications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;includeApplications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Office365&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;clientAppTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;browser&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;platforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;includePlatforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;all&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;grantControls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;OR&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;builtInControls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mcasSession&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sessionControls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cloudAppSecurity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cloudAppSecurityType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;monitorOnly&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// or &amp;#39;blockDownloads&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Log collector placement matters&lt;/strong&gt;: If your traffic doesn’t flow through the collector, Shadow IT data will be incomplete.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not all apps support session control&lt;/strong&gt;: Conditional Access App Control targets specific web apps (check the official list).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor mode first&lt;/strong&gt;: Always start in “monitor only” mode before flipping to block—otherwise you risk employee revolts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OAuth consent sprawl&lt;/strong&gt;: Pay attention to risky OAuth apps bypassing controls via user consent.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Deploy log collectors in &lt;strong&gt;strategic choke points&lt;/strong&gt; (central firewalls, VPN gateways)&lt;/li&gt;
&lt;li&gt;Always configure &lt;strong&gt;app connectors&lt;/strong&gt; for sanctioned SaaS, not just rely on discovery logs&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Conditional Access policies&lt;/strong&gt; with &lt;strong&gt;session controls&lt;/strong&gt; for high-risk use cases (downloads, personal device access)&lt;/li&gt;
&lt;li&gt;Regularly &lt;strong&gt;review OAuth app usage&lt;/strong&gt; for suspicious integrations into Microsoft 365&lt;/li&gt;
&lt;li&gt;Integrate alerts into &lt;strong&gt;Defender XDR&lt;/strong&gt; or your SIEM for unified security monitoring&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Enabling App Discovery without follow-through policies is like grinding beans but never making the coffee. Visibility is great, but without enforcement, you’re still handing out cappuccinos to anyone walking past your shop.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/defender-for-cloud-apps/what-is-defender-for-cloud-apps" target="_blank" rel="noopener"
&gt;Microsoft Defender for Cloud Apps documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/defender-cloud-apps/discovery-docker" target="_blank" rel="noopener"
&gt;App discovery in Defender for Cloud Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/defender-cloud-apps/proxy-deployment-aad" target="_blank" rel="noopener"
&gt;Set up Conditional Access App Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/defender-cloud-apps/app-governance-manage-apps" target="_blank" rel="noopener"
&gt;OAuth app governance overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>What is a CASB and Why Does it Matter?</title><link>https://blog.brewedinthecloud.com/p/defending-saas-whats-casb/</link><pubDate>Tue, 23 Sep 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/defending-saas-whats-casb/</guid><description>&lt;p&gt;Imagine running a pub with no bouncer. Everyone gets in, nobody checks IDs, and sooner or later, trouble starts. In the cloud world, that’s pretty much what happens without a Cloud Access Security Broker (CASB). SaaS sprawl sneaks in, users start syncing sensitive data, and suddenly your business is exposed.&lt;/p&gt;
&lt;p&gt;That’s where CASB solutions step in. They’re the bouncers of the SaaS scene — checking logins, enforcing rules, and escorting out the shady apps before they cause a problem.&lt;/p&gt;
&lt;h2 id="what-is-a-casb"&gt;What is a CASB?
&lt;/h2&gt;&lt;p&gt;A &lt;strong&gt;Cloud Access Security Broker (CASB)&lt;/strong&gt; is a security control point that sits between your users and their cloud applications. It provides visibility, policy enforcement, and protection when cloud usage goes rogue.&lt;/p&gt;
&lt;p&gt;Industry research usually defines CASB functions into four categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Visibility&lt;/strong&gt; – Discover shadow IT (e.g. “Why is half the marketing team suddenly using Dropbox?”).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance&lt;/strong&gt; – Enable auditing and make sure cloud activities align with regulations (GDPR, ISO 27001).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Security&lt;/strong&gt; – DLP-style controls, stop employees from dragging sensitive data out to personal apps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Threat Protection&lt;/strong&gt; – Detect compromised accounts, suspicious logins, and anomalous behaviour.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In plain English? CASBs are the in-between layer that helps enterprises safely embrace SaaS without losing their grip on security.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it Works
&lt;/h2&gt;&lt;p&gt;CASBs can work in &lt;strong&gt;two primary modes&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;API-based integration&lt;/strong&gt; – Directly connects to SaaS platforms (e.g. O365, Salesforce) via APIs for deep inspection and control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proxy-based inspection&lt;/strong&gt; – Inserts itself inline between user and cloud app traffic to enforce real-time controls.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Microsoft’s implementation, &lt;strong&gt;Defender for Cloud Apps (formerly MCAS)&lt;/strong&gt;, can do both — API connectors for sanctioned apps, and real-time enforcement via &lt;strong&gt;Conditional Access App Control&lt;/strong&gt; through Entra ID.&lt;/p&gt;
&lt;h3 id="diagram--user-to-app-with-casb-enforcement"&gt;Diagram – User to App with CASB Enforcement
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
U[User Device] --&gt;|"Login / Session"| CA[Entra Conditional Access]
CA --&gt; MCAS["Defender for Cloud Apps (CASB)"]
MCAS --&gt; SaaS[SaaS Application]
&lt;/div&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Here’s why CASBs matter in day-to-day IT operations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stop Shadow IT&lt;/strong&gt; – Uncover unsanctioned usage of Dropbox, Box, Slack etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improve Governance&lt;/strong&gt; – Ensure company data isn’t stored in dodgy regions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protect IP&lt;/strong&gt; – Block exfiltration of sensitive documents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Threat Detection&lt;/strong&gt; – Spot logins from impossible geographies (Sydney at 9am, then London five minutes later).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For organisations racing towards SaaS-first models, a CASB isn’t “nice to have” — it’s mandatory to scale without blind spots.&lt;/p&gt;
&lt;h2 id="implementation-example"&gt;Implementation Example
&lt;/h2&gt;&lt;h3 id="allow-microsoft-365"&gt;Allow Microsoft 365
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;&lt;a class="link" href="https://security.microsoft.com" target="_blank" rel="noopener"
&gt;Microsoft 365 Defender portal&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to Settings &amp;gt; Cloud Apps &amp;gt; Information Protection &amp;gt; Files.&lt;/li&gt;
&lt;li&gt;Enable File Monitoring and click Save.&lt;/li&gt;
&lt;li&gt;Connect Office 365 as an App Connector:&lt;/li&gt;
&lt;li&gt;Go to Settings &amp;gt; Cloud Apps &amp;gt; App Connectors.&lt;/li&gt;
&lt;li&gt;Click + Connect an app &amp;gt; Microsoft 365.&lt;/li&gt;
&lt;li&gt;Select all relevant services (e.g., Azure AD sign-ins, Office 365 activities/files).&lt;/li&gt;
&lt;li&gt;Click Connect and wait for the status to show Connected.&lt;/li&gt;
&lt;li&gt;Navigate to Control &amp;gt; Policies &amp;gt; Session policies.&lt;/li&gt;
&lt;li&gt;Create a policy like:
“Block download of sensitive files from unmanaged devices” using filters like file sensitivity labels, device compliance, etc.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-snippet---configure-conditional-access-for-session-control-optional"&gt;Bicep Snippet - Configure Conditional Access for Session Control (Optional)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;conditionalAccessPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policyAssignments@2020-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;CA-Policy-O365-MCAS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;global&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Block downloads of sensitive files from unmanaged devices&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/providers/Microsoft.Authorization/policyDefinitions/ConditionalAccessPolicy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;O365-MCAS-SessionControl&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;enabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;includeUsers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;All&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;applications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;includeApplications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Office365&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;clientAppTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;browser&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;platforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;includePlatforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;all&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;grantControls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;OR&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;builtInControls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mcasSession&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sessionControls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cloudAppSecurity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cloudAppSecurityType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;monitorOnly&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// or &amp;#39;blockDownloads&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="block-dropbox"&gt;Block Dropbox
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;&lt;a class="link" href="https://security.microsoft.com" target="_blank" rel="noopener"
&gt;Microsoft 365 Defender portal&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to Discover &amp;gt; Discovered apps.&lt;/li&gt;
&lt;li&gt;Find Dropbox: Use the search bar to locate Dropbox in the list of discovered apps.&lt;/li&gt;
&lt;li&gt;Mark as Unsanctioned: Click the three dots next to Dropbox.&lt;/li&gt;
&lt;li&gt;Block Access Automatically (Recommended): If you&amp;rsquo;re using Microsoft Defender for Endpoint, the unsanctioned app will be automatically blocked on enrolled devices.&lt;/li&gt;
&lt;li&gt;Create a conditional access policy (optional) to deny / block access&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-snippet--configure-conditional-access-policy"&gt;Bicep Snippet – Configure Conditional Access Policy
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;dropbox-app&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Get the application ID from EntraID&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;caPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Entra/conditionalAccessPolicies@2023-07-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Block-Dropbox-Downloads&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Block unsanctioned SaaS downloads&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;enabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;includeGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;All&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;applications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;includeApplications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appid&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;grantControls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;builtInControls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;block&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sessionControls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;applicationEnforcedRestrictions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;enforce&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;API connectors&lt;/strong&gt; don’t cover &lt;em&gt;every&lt;/em&gt; SaaS app. Some can only be monitored inline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance overhead&lt;/strong&gt;: Routing traffic through proxy = network latency if it’s all users + all SaaS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Users hate change&lt;/strong&gt;: If enforcement is too strict, expect support tickets. Scope carefully.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Start with &lt;strong&gt;discovery only&lt;/strong&gt; → see what SaaS apps are really in use.&lt;/li&gt;
&lt;li&gt;Connect the &lt;strong&gt;core sanctioned apps&lt;/strong&gt; (M365, Salesforce, ServiceNow).&lt;/li&gt;
&lt;li&gt;Build &lt;strong&gt;pilot policies with one department&lt;/strong&gt; (e.g., Finance).&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;session controls for high-risk scenarios&lt;/strong&gt; (BYOD, contractors).&lt;/li&gt;
&lt;li&gt;Monitor impact before going org-wide — balance control and user experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; “Shadow IT isn’t evil; it’s often people just trying to get their job done faster. The trick is to shine a light on it with CASB, then decide what’s genuinely dangerous versus what just needs a proper license.”
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/defender-cloud-apps/what-is-defender-for-cloud-apps" target="_blank" rel="noopener"
&gt;What is Microsoft Defender for Cloud Apps? (Microsoft Docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/overview" target="_blank" rel="noopener"
&gt;Conditional Access in Microsoft Entra (MS Learn)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing a Secure Hub-and-Spoke in Azure - Operationalising the Secure Hub-and-Spoke</title><link>https://blog.brewedinthecloud.com/p/secure-hub-operations/</link><pubDate>Thu, 18 Sep 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/secure-hub-operations/</guid><description>&lt;p&gt;So you’ve designed it, deployed it, and secured it, now comes the unglamorous but critical part: operating it. A secure hub-and-spoke without monitoring and governance is like buying a coffee machine and never descaling it: it looks impressive, but eventually it’ll clog and let you down.&lt;/p&gt;
&lt;h2 id="operationalising-the-hub-and-spoke"&gt;Operationalising the Hub-and-Spoke
&lt;/h2&gt;&lt;p&gt;A successful deployment needs three things in steady state:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monitoring &amp;amp; Analytics&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Governance &amp;amp; Cost Controls&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Referenceable End-State Architecture&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="monitoring-with-azure-native-tools"&gt;Monitoring with Azure Native Tools
&lt;/h2&gt;&lt;p&gt;You can’t secure what you can’t see. Wire in visibility from day one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Monitor&lt;/strong&gt; — Baseline telemetry for VNets, connections, NSGs, and traffic flows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic Analytics&lt;/strong&gt; — Analyses NSG flow logs to surface patterns, hotspots, and potential misconfigurations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Sentinel (Microsoft Sentinel)&lt;/strong&gt; — SIEM integration for correlation, detections, and incident response. Ingest logs from Firewall, App GW WAF, VPN, and NSGs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workbooks &amp;amp; Dashboards&lt;/strong&gt; — Don’t forget simple dashboards for the teams who need quick answers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="governance--cost-considerations"&gt;Governance &amp;amp; Cost Considerations
&lt;/h2&gt;&lt;p&gt;Security appliances don’t run on goodwill alone:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firewall vs NVA&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Azure Firewall Premium is scalable and integrated, but NVAs may be justified for niche features (advanced user-ID, IPSec termination).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic Costs&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Remember: inter‑VNet traffic via hubs incurs data processing and bandwidth charges. Don’t be surprised when east-west chatter racks up bills.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy Governance&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Centrally manage NSGs and Firewall Policy using &lt;strong&gt;Azure Policy&lt;/strong&gt; definitions.&lt;/li&gt;
&lt;li&gt;Deploy guardrails for subnet creation, route changes, or direct internet exposure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="end-state-reference-architecture"&gt;End-State Reference Architecture
&lt;/h2&gt;&lt;p&gt;At this stage, you’ve got all the ingredients in place:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
Internet --&gt; FW[Azure Firewall Premium]
FW --&gt; AGW[App Gateway + WAF v2]
AGW --&gt; WebApp["Web Spoke(s)"]
FW --&gt; Data["Data Spoke(s)"]
FW --&gt; Shared[Shared Services]
Monitor[Azure Monitor/Sentinel] --&gt; FW
Monitor --&gt; AGW
Monitor --&gt; NSGs
&lt;/div&gt;
&lt;p&gt;Everything feeds into monitoring, everything is governed by policy, and every spoke routes securely via the hub.&lt;/p&gt;
&lt;h2 id="checklist-end-state-readiness"&gt;Checklist (End-State Readiness)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Hub contains Firewall, Gateway, Logging&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Spokes use UDRs routing to Firewall&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; NSGs applied for subnet boundaries&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; App Gateway WAF fronting inbound web apps&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Logs flowing to Sentinel/Log Analytics&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Azure Policy applied for guardrails&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Cost reviews scheduled regularly&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Log Noise&lt;/strong&gt; — Sentinel dashboards can swamp you if you don’t tune. Get your query hygiene sorted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Certificate Lifecycle&lt;/strong&gt; — Between TLS inspection and AppGW listeners, be ready for cert renewal processes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi‑Region Scaling&lt;/strong&gt; — If you replicate the hub, keep Firewall Policy consistent across regions to avoid drift.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Bake &lt;strong&gt;operational logging&lt;/strong&gt; into your IaC modules — don’t make it a manual add‑on.&lt;/li&gt;
&lt;li&gt;Leverage &lt;strong&gt;Azure Policy&lt;/strong&gt; for drift correction (e.g. enforce NSG, UDR rules).&lt;/li&gt;
&lt;li&gt;Benchmark &lt;strong&gt;firewall usage costs monthly&lt;/strong&gt; and optimise rules to avoid excess logging or unnecessary routing.&lt;/li&gt;
&lt;li&gt;Run periodic &lt;strong&gt;architecture reviews&lt;/strong&gt; — networks sprawl quickly; a neat hub-and-spoke can turn into spaghetti if left unchecked.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; It’s tempting to treat hub-and-spoke as a “set and forget” — but that’s how you end up with stale beans and bitter coffee. To actually deliver value, you need ongoing monitoring, cost awareness, and policy enforcement. A well‑run hub-and-spoke is less about the tech and more about the discipline.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/overview" target="_blank" rel="noopener"
&gt;Azure Monitor overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/traffic-analytics" target="_blank" rel="noopener"
&gt;Traffic Analytics in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/sentinel/overview" target="_blank" rel="noopener"
&gt;Microsoft Sentinel documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/governance/policy/overview" target="_blank" rel="noopener"
&gt;Azure Policy overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/well-architected/cost/overview" target="_blank" rel="noopener"
&gt;Azure Well-Architected Framework: Cost Optimisation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing a Secure Hub-and-Spoke in Azure - Azure Application Gateway</title><link>https://blog.brewedinthecloud.com/p/secure-hub-spoke-azappgw/</link><pubDate>Tue, 16 Sep 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/secure-hub-spoke-azappgw/</guid><description>&lt;p&gt;You wouldn’t ask your local barista to start pouring pints behind the pub bar. The same goes for security controls in Azure. &lt;strong&gt;Azure Firewall&lt;/strong&gt; and &lt;strong&gt;Application Gateway WAF&lt;/strong&gt; are both vital, but they serve different purposes. Get them confused and you’ll either overspend or under‑protect.&lt;/p&gt;
&lt;h2 id="what-is-application-gateway-waf"&gt;What is Application Gateway WAF?
&lt;/h2&gt;&lt;p&gt;Application Gateway (AppGW) is a &lt;strong&gt;Layer 7 load balancer&lt;/strong&gt; with optional &lt;strong&gt;WAF (Web Application Firewall) capabilities&lt;/strong&gt;. Think of it as traffic control at the HTTP/S level. The WAF inspects requests bound for web apps, protecting against OWASP Top 10 threats like SQLi and XSS.&lt;/p&gt;
&lt;p&gt;Key features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reverse proxy with SSL offload, end-to-end TLS, and SNI support&lt;/li&gt;
&lt;li&gt;WAF in &lt;strong&gt;Detection&lt;/strong&gt; or &lt;strong&gt;Prevention&lt;/strong&gt; mode (based on OWASP rulesets)&lt;/li&gt;
&lt;li&gt;HTTP header rewrites, redirects, URL-based routing&lt;/li&gt;
&lt;li&gt;Autoscaling and zone redundancy for resilience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It doesn’t replace Azure Firewall. Instead, it complements it.&lt;/p&gt;
&lt;h2 id="how-they-differ-appgw-waf-vs-azure-firewall"&gt;How They Differ: AppGW WAF vs Azure Firewall
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Firewall&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L3–L7 controls&lt;/li&gt;
&lt;li&gt;East-west + north-south traffic&lt;/li&gt;
&lt;li&gt;TLS inspection, IDPS, Threat Intel&lt;/li&gt;
&lt;li&gt;Network-centric enforcement&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;App Gateway WAF&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L7, &lt;strong&gt;application-specific inspection&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Inbound HTTP/S (north-south only)&lt;/li&gt;
&lt;li&gt;OWASP rule protection for web apps&lt;/li&gt;
&lt;li&gt;Application-centric enforcement&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short: &lt;strong&gt;Firewall protects networks, WAF protects apps.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="deployment-models"&gt;Deployment Models
&lt;/h2&gt;&lt;p&gt;Two options exist, each used in production depending on needs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Side-by-Side&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Firewall secures all traffic centrally.&lt;/li&gt;
&lt;li&gt;Application Gateway WAF directly fronts the web apps.&lt;/li&gt;
&lt;li&gt;Internet → App Gateway WAF → Web App (spoke)&lt;/li&gt;
&lt;li&gt;Outbound/other spoke traffic → Firewall&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Chained&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Firewall sits in front of App Gateway.&lt;/li&gt;
&lt;li&gt;Firewall does ingress filtering, threat intel, TLS inspection.&lt;/li&gt;
&lt;li&gt;Clean traffic is then forwarded to App GW for WAF and app‑layer routing.&lt;/li&gt;
&lt;li&gt;Internet → Firewall → App Gateway WAF → Web App&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="mermaid"&gt;flowchart TD
Internet --&gt; FW[Azure Firewall Premium]
FW --&gt; AGW[Application Gateway + WAF]
AGW --&gt; WebApp[Web App in Spoke VNet]
FW --&gt; SpokeDB[Other Spokes / Data Tiers]
&lt;/div&gt;
&lt;h2 id="real-world-example"&gt;Real-World Example
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Inbound web traffic:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users access public web apps hosted in Spoke VNets.&lt;/li&gt;
&lt;li&gt;Azure Firewall Premium inspects TLS traffic, applies IDPS and Threat Intel checks.&lt;/li&gt;
&lt;li&gt;Traffic is then allowed to Application Gateway WAF, which applies OWASP rules to the HTTP/S requests.&lt;/li&gt;
&lt;li&gt;Clean, authorised traffic is then routed to backend VMs or App Service instances.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This setup marries the strength of both services, reducing blind spots.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal-quick-steps"&gt;Azure Portal Quick Steps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Deploy &lt;strong&gt;Azure Firewall Premium&lt;/strong&gt; in Hub VNet.&lt;/li&gt;
&lt;li&gt;Deploy &lt;strong&gt;Application Gateway&lt;/strong&gt; (with WAF v2) into its own subnet, either in Hub or a Spoke.&lt;/li&gt;
&lt;li&gt;Configure Firewall UDRs to steer inbound HTTP/S traffic via Firewall → AppGW → WebApp.&lt;/li&gt;
&lt;li&gt;Enable WAF in &lt;strong&gt;Prevention&lt;/strong&gt; mode with the latest OWASP ruleset.&lt;/li&gt;
&lt;li&gt;Set App Gateway Listener with custom domain + SSL cert.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example--app-gateway-waf-v2-skeleton"&gt;Bicep Example — App Gateway WAF v2 Skeleton
&lt;/h3&gt;&lt;p&gt;To continue on our previous post where we split things into modules we have created a few new resources in order to enable this feature set.&lt;/p&gt;
&lt;h2 id="-folder-structure-recommended"&gt;📂 Folder Structure (recommended)
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/bicep
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ main.bicep &lt;span class="c1"&gt;# Entry point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ azappgateway.bicep &lt;span class="c1"&gt;# Azure Application Gateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ azfw.bicep &lt;span class="c1"&gt;# Azure Firewall&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ azfwpolicy.bicep &lt;span class="c1"&gt;# Azure Firewall Policy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ azfwpolicypremium.bicep &lt;span class="c1"&gt;# Azure Firewall Premium Policy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ keyvault.bicep &lt;span class="c1"&gt;# Azure KeyVault + Managed Identity (Required for TLS Inspection)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ hub.bicep &lt;span class="c1"&gt;# Hub VNet + Firewall Subnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ spoke.bicep &lt;span class="c1"&gt;# Spoke VNet + NSG + UDR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ peering.bicep &lt;span class="c1"&gt;# Hub-Spoke peering&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-mainbicep--root-deployment-updated-to-include-additional-resource-changes"&gt;🔹 &lt;code&gt;main.bicep&lt;/code&gt; — Root deployment updated to include additional resource changes
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Key Vault needs another new Certificate for the Application Gateway&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;./modules/keyvault.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;keyVaultDeployment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzFwTlsCert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certSubject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;CN=AzFwTlsCert.brewedinthecloud.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;kv-azfw-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appgwcertName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AppGwTlsCert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//I&amp;#39;m using self signed in the example&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy Azure Application Gateway&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;./modules/azappgw.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGatewayDeployment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetNameid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;appgwSubnetId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appgw-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwPublicIPName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appgw-hub-publicIP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;keyVaultId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwCertName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;appgwcertName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-moduleshubbicep--our-secure-hub-virtual-network-needs-an-additional-subnet-for-the-application-gateway"&gt;🔹 &lt;code&gt;modules/hub.bicep&lt;/code&gt; — Our secure hub virtual network needs an additional subnet for the Application Gateway
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;hubAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzureFirewallSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;GatewaySubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.255.0/27&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SharedServices&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.2.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ApplicationGateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.3.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appgwSubnetId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-modulesazappgatewaybicep--deploy-azure-application-gateway-with-wafv2"&gt;🔹 &lt;code&gt;modules/azappgateway.bicep&lt;/code&gt; — Deploy Azure Application Gateway with WAFv2
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetNameid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwPublicIPName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwCertName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwPublicIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwPublicIPName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Regional&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appgwwafpolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-wafpolicy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policySettings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabledState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Enabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Prevention&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;requestBodyCheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maxRequestBodySizeInKb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;128&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fileUploadLimitInMb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;exclusions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;customRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;managedRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;managedRuleSets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleSetType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;OWASP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleSetVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;3.2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleGroupOverrides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/applicationGateways@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;WAF_v2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;WAF_v2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;autoscaleConfiguration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;minCapacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwIpConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetNameid&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwFrontendIP-port443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwPublicIP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendPorts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwFrontendPort-443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendAddressPools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwBackendPool&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendHttpSettingsCollection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwBackendHttpSettings&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Http&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cookieBasedAffinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Disabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pickHostNameFromBackendAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;requestTimeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;httpListeners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwHttpsListener&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfiguration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/applicationGateways/frontendIPConfigurations&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwFrontendIP&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/applicationGateways/frontendPorts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwFrontendPort&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Https&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sslCertificate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;keyVaultId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/certificates/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;appGwCertName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;requireServerNameIndication&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appgwwafpolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enableHttp2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;App Gateway Placement&lt;/strong&gt; — Deploy in its own subnet; don’t cram it into shared services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chaining Adds Latency&lt;/strong&gt; — More security checks = more hops. Test carefully for user‑facing apps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Certificates&lt;/strong&gt; — Both Firewall TLS inspection and App Gateway TLS termination need managed cert lifecycle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Costs&lt;/strong&gt; — Running WAF + Firewall Premium together isn’t cheap. Justify with compliance or risk posture.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Place App Gateway close to app workloads (same region, minimal latency).&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;WAF_v2 or higher&lt;/strong&gt; for autoscaling and zone redundancy.&lt;/li&gt;
&lt;li&gt;Only chain Firewall + App Gateway when you need both &lt;strong&gt;network + app layer security&lt;/strong&gt; on inbound flows.&lt;/li&gt;
&lt;li&gt;Feed WAF logs into &lt;strong&gt;Log Analytics&lt;/strong&gt; to correlate alerts with Firewall.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; App Gateway WAF is not a general-purpose firewall. It’s a purpose-built HTTP/S filter for protecting web apps, and it plays best when paired with Azure Firewall. Call it the hops to your malt — neither alone makes a great beer, but together they give it balance.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/application-gateway/overview" target="_blank" rel="noopener"
&gt;What is Azure Application Gateway?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview" target="_blank" rel="noopener"
&gt;Web Application Firewall on Application Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/firewall/premium-features" target="_blank" rel="noopener"
&gt;Azure Firewall Premium features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/example-scenario/gateway/firewall-application-gateway" target="_blank" rel="noopener"
&gt;Design patterns for secure hybrid topologies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing a Secure Hub-and-Spoke in Azure - Azure Firewall Premium</title><link>https://blog.brewedinthecloud.com/p/secure-hub-spoke-azfirewall/</link><pubDate>Thu, 11 Sep 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/secure-hub-spoke-azfirewall/</guid><description>&lt;p&gt;If the hub-and-spoke is the café itself, &lt;strong&gt;Azure Firewall Premium&lt;/strong&gt; is the barista making sure every shot pulled (packet inspected) is clean, safe, and consistent. You can run hub‑and‑spoke without it, but would you trust your flat white to a dodgy apprentice? Exactly.&lt;/p&gt;
&lt;h2 id="what-is-azure-firewall-premium"&gt;What is Azure Firewall Premium?
&lt;/h2&gt;&lt;p&gt;Azure Firewall Premium is Microsoft’s &lt;strong&gt;managed, cloud-native next-gen firewall&lt;/strong&gt; service. It’s not just packet filtering; it brings in deeper traffic inspection that usually required third-party NVAs. Its main feature set includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TLS Inspection&lt;/strong&gt;: Decrypt and inspect HTTPS traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDPS (Intrusion Detection &amp;amp; Prevention System)&lt;/strong&gt;: Detects and blocks malicious activity in both inbound (north-south) and internal (east-west) flows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Threat Intelligence-Based Filtering&lt;/strong&gt;: Blocks or alerts on traffic to/from known malicious IPs/domains.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web Categories&lt;/strong&gt;: Allows policy setting by application category (e.g. block “Gambling” in corporate networks).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-it-works"&gt;How it Works
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;North-South Traffic (Internet ↔ Workloads)&lt;/strong&gt;&lt;br&gt;
Routes all inbound/outbound through Azure Firewall Premium. TLS inspection and IDPS help catch suspicious connections before they hit your apps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;East-West Traffic (Spoke ↔ Spoke or VNet ↔ VNet)&lt;/strong&gt;&lt;br&gt;
Use UDRs to force inter‑VNet traffic through the hub firewall. This enables inspection of internal movement (lateral traffic) and is critical for Zero Trust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Policy Enforcement&lt;/strong&gt;&lt;br&gt;
Azure Firewall uses &lt;strong&gt;Firewall Policy objects&lt;/strong&gt; (separate resource) for consistent, reusable rule configuration. Policies can be shared across multiple firewalls in different regions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s what the secure traffic flow looks like:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
Internet --&gt; FW[Azure Firewall Premium]
FW --&gt; HubVNet[Hub VNet]
HubVNet --&gt; Spoke1[Spoke VNet 1]
HubVNet --&gt; Spoke2[Spoke VNet 2]
HubVNet --&gt; Spoke3[Spoke VNet 3]
Spoke1 --&gt;|East-West| FW
Spoke2 --&gt;|East-West| FW
&lt;/div&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Think of these scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ransomware&lt;/strong&gt;: Malware spreads laterally between spokes. With east-west inspection enabled, the firewall can detect and block suspicious SMB traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phishing&lt;/strong&gt;: An internal VM gets popped and tries calling a C2 (command-and-control) endpoint. Threat intelligence filtering stops the outbound connection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance&lt;/strong&gt;: TLS inspection ensures sensitive data flows are logged and inspected, satisfying regulatory requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without these features, most orgs would need an NVA like Palo Alto, Fortinet, or Check Point. Azure Firewall Premium narrows that gap.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal"&gt;Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Create a &lt;strong&gt;Firewall Policy&lt;/strong&gt; (Premium).
&lt;ul&gt;
&lt;li&gt;Enable &lt;strong&gt;TLS Inspection&lt;/strong&gt; with a Key Vault certificate.&lt;/li&gt;
&lt;li&gt;Turn on &lt;strong&gt;IDPS&lt;/strong&gt; in Alert or Alert+Block mode.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Threat Intelligence Mode&lt;/strong&gt; (Alert or Deny).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Attach the Firewall Policy to your &lt;strong&gt;Azure Firewall Premium&lt;/strong&gt; instance.&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;Application Rules&lt;/strong&gt; (e.g. allow HTTPS, block categories).&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;Network Rules&lt;/strong&gt; for traffic needing explicit control.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example--firewall-policy-with-tls-inspection-idps--threat-intel"&gt;Bicep Example — Firewall Policy with TLS Inspection, IDPS &amp;amp; Threat Intel
&lt;/h3&gt;&lt;p&gt;To continue on our previous post where we split things into modules we have created a few new resources in order to enable this feature set.&lt;/p&gt;
&lt;h2 id="-folder-structure-recommended"&gt;📂 Folder Structure (recommended)
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/bicep
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ main.bicep &lt;span class="c1"&gt;# Entry point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ azfw.bicep &lt;span class="c1"&gt;# Azure Firewall&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ azfwpolicy.bicep &lt;span class="c1"&gt;# Azure Firewall Policy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ azfwpolicypremium.bicep &lt;span class="c1"&gt;# Azure Firewall Premium Policy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ keyvault.bicep &lt;span class="c1"&gt;# Azure KeyVault + Managed Identity (Required for TLS Inspection)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ hub.bicep &lt;span class="c1"&gt;# Hub VNet + Firewall Subnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ spoke.bicep &lt;span class="c1"&gt;# Spoke VNet + NSG + UDR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ peering.bicep &lt;span class="c1"&gt;# Hub-Spoke peering&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-mainbicep--root-deployment-updated"&gt;🔹 &lt;code&gt;main.bicep&lt;/code&gt; — Root deployment updated
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Deploy Key Vault &amp;amp; TLS Inspection cert&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;./modules/keyvault.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;keyVaultDeployment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzFwTlsCert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certSubject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;CN=AzFwTlsCert.brewedinthecloud.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;kv-azfw-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy Azure Firewall Premium Policy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azfwPolicyPremium&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;./modules/azfwpolicypremium.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azfwPolicyPremiumDeployment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myAzureFirewallPolicyPremium&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;managedid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;managedIdentityId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;certName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;threatIntelMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Alert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;idpsMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Alert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-moduleskeyvaultbicep--deploy-a-keyvault--certificate-for-tls-inspection"&gt;🔹 &lt;code&gt;modules/keyvault.bicep&lt;/code&gt; — Deploy a KeyVault &amp;amp; Certificate for TLS Inspection
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;span class="lnt"&gt;87
&lt;/span&gt;&lt;span class="lnt"&gt;88
&lt;/span&gt;&lt;span class="lnt"&gt;89
&lt;/span&gt;&lt;span class="lnt"&gt;90
&lt;/span&gt;&lt;span class="lnt"&gt;91
&lt;/span&gt;&lt;span class="lnt"&gt;92
&lt;/span&gt;&lt;span class="lnt"&gt;93
&lt;/span&gt;&lt;span class="lnt"&gt;94
&lt;/span&gt;&lt;span class="lnt"&gt;95
&lt;/span&gt;&lt;span class="lnt"&gt;96
&lt;/span&gt;&lt;span class="lnt"&gt;97
&lt;/span&gt;&lt;span class="lnt"&gt;98
&lt;/span&gt;&lt;span class="lnt"&gt;99
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Key Vault&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location of the Key Vault&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Certificate name to create in the Key Vault&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzFwTlsCert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Subject name for the self-signed certificate&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certSubject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;CN=AzFwTlsCert.brewedinthecloud.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Key Vault SKU&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kvSku&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.KeyVault/vaults@2023-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tenantId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;tenantId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kvSku&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabledForDeployment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabledForTemplateDeployment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabledForDiskEncryption&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kvCert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.KeyVault/vaults/certificates@2023-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;certName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;secretProperties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;application/x-pkcs12&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;x509CertificateProperties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certSubject&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;validityInMonths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;12&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyUsage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;digitalSignature&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;keyEncipherment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyProperties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;exportable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RSA&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keySize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2048&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;reuseKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;issuerParameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Self&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;createMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kvmangedid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-mi&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kvAccessPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.KeyVault/vaults/accessPolicies@2023-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/add&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;accessPolicies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tenantId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;tenantId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;objectId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kvmangedid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certificates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;get&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;list&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;secrets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;get&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;list&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;get&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;list&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kvmangedid&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certSecretId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kvCert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;secretId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kvCert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;managedIdentityId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kvmangedid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-modulesazfwpolicypremiumbicep--deploy-a-new-firewall-policy-on-premium-tier"&gt;🔹 &lt;code&gt;modules/azfwpolicypremium.bicep&lt;/code&gt; — Deploy a new Firewall Policy on premium Tier
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Azure Firewall Policy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location of the Firewall Policy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Object ID of the Azure Firewall managed identity (for cert access)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;managedid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Certificate name to create in the Key Vault&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzFwTlsCert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Threat intelligence mode (Off, Alert, Deny)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;threatIntelMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Alert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IDPS mode (Off, Alert, AlertAndBlock)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;idpsMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Alert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azfwPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/firewallPolicies@2023-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;threatIntelMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;threatIntelMode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;intrusionDetection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;idpsMode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Premium&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;transportSecurity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certificateAuthority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultSecretId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;https://kv-azfw-hub.vault.azure.net/secrets/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;certName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azfwPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyNameOut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azfwPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TLS Inspection + Certificates&lt;/strong&gt;: You’ll need to manage a trusted root CA in Key Vault and distribute the cert to clients. Miss that and apps will break.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance Overhead&lt;/strong&gt;: TLS decryption eats into throughput and adds latency. Size accordingly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDPS Tuning&lt;/strong&gt;: Default signatures can be noisy. You’ll likely need to tune exclusions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Costs&lt;/strong&gt;: Firewall Policy Premium and TLS inspection certificate handling do add to bills. Don’t enable everything blindly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Attach multiple firewalls to the &lt;strong&gt;same Policy&lt;/strong&gt; for consistent management.&lt;/li&gt;
&lt;li&gt;Start &lt;strong&gt;IDPS in Alert mode&lt;/strong&gt; before jumping into block. Get a baseline, then tighten up.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;categories&lt;/strong&gt; where possible (e.g. block “High Risk Domains”) to reduce rule sprawl.&lt;/li&gt;
&lt;li&gt;Instrument with &lt;strong&gt;Log Analytics&lt;/strong&gt; immediately – you’ll want visibility into which inspection rules are firing.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Azure Firewall Premium isn’t perfect — NVAs from big vendors still win on advanced integrations. But for most enterprises in Azure, especially if you’re centralising security in a hub-and-spoke, Premium gets you 80% of the way with far less operational sweat.&lt;/p&gt;
&lt;p&gt;Your mileage? Depends on whether you need user‑identity controls and advanced VPN terminations — if not, Azure Firewall Premium is usually the better roast.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/premium-features" target="_blank" rel="noopener"
&gt;Azure Firewall Premium features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/premium-features#tls-inspection" target="_blank" rel="noopener"
&gt;Azure Firewall TLS inspection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/premium-features#intrusion-detection-and-prevention-system-idps" target="_blank" rel="noopener"
&gt;Azure Firewall Intrusion Detection and Prevention (IDPS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.azure.cn/en-us/firewall/policy-rule-sets" target="_blank" rel="noopener"
&gt;Azure Firewall policy rule sets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing a Secure Hub-and-Spoke in Azure - Foundations</title><link>https://blog.brewedinthecloud.com/p/secure-hub-spoke-foundations/</link><pubDate>Tue, 09 Sep 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/secure-hub-spoke-foundations/</guid><description>&lt;p&gt;Do you really need another hub-and-spoke analogy? Probably not, but in enterprise networking, this pattern is as reliable as your local café’s flat white. It’s structured, scalable, and when brewed with security in mind, it keeps both auditors and architects happy.&lt;/p&gt;
&lt;h2 id="what-is-the-hub-and-spoke-model"&gt;What is the Hub-and-Spoke Model?
&lt;/h2&gt;&lt;p&gt;In Azure, the &lt;strong&gt;hub-and-spoke network topology&lt;/strong&gt; is a way of organising and securing workloads:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hub&lt;/strong&gt;: Centralised network services such as firewalls, VPNs, and shared services (DNS, logging, identity).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spokes&lt;/strong&gt;: Workload VNets for applications, databases, or teams.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peering&lt;/strong&gt;: Low-latency, high-bandwidth connections between hub and spokes. Traffic is controlled centrally.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s essentially the espresso machine at the heart of your café: the spokes (applications) don’t each need their own machine — they share the central hub.&lt;/p&gt;
&lt;h2 id="why-hub-and-spoke-remains-the-go-to"&gt;Why Hub-and-Spoke Remains the Go-To
&lt;/h2&gt;&lt;p&gt;Despite newer designs like full mesh and service chaining, hub-and-spoke continues to be the &lt;strong&gt;enterprise default&lt;/strong&gt; because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Centralised security&lt;/strong&gt;: Easier to enforce policies (firewalls, monitoring) at a single control point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost management&lt;/strong&gt;: No need to duplicate network appliances in every spoke.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational simplicity&lt;/strong&gt;: North-south internet traffic routed through one perimeter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;: Spokes can scale independently, without dragging security along for the ride.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="core-components"&gt;Core Components
&lt;/h2&gt;&lt;p&gt;A secure hub-and-spoke isn’t just about wiring up VNets — it’s about aligning &lt;strong&gt;platform services with security design principles&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Virtual WAN vs Traditional Hub&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Traditional Hub&lt;/em&gt;: Build your own hub VNet with Azure Firewall, VPN Gateway, etc. High control, higher management overhead.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Azure Virtual WAN&lt;/em&gt;: Microsoft-managed global transit network. Easier to scale, great for &lt;em&gt;&lt;strong&gt;multi-region&lt;/strong&gt;&lt;/em&gt; and branch connectivity, but less granular control.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Network Security Groups (NSGs)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Used for basic subnet or NIC-level filtering. Best for east-west microsegmentation, not a replacement for a firewall.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User Defined Routes (UDRs)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Steer traffic through security appliances (e.g. Azure Firewall in the hub).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Firewall (Recommended over NVAs)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enterprise-grade, cloud-native firewall. Central control point for north-south and east-west flows. Goes far beyond NSGs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Is Azure Firewall the right solution for you? This is a question I get a lot. Azure Firewall is still a relatively young player in the next‑gen firewall space. Compared to NVAs from vendors like Palo Alto, Fortinet, or Check Point, it lacks some of the deep integrations and polish those platforms have built up over decades.&lt;/p&gt;
&lt;p&gt;But here’s the kicker: if all you’re after is solid layer 4 and layer 7 control, centralised logging, and cloud‑native scale without heavy user-level integrations then Azure Firewall is often more than enough.&lt;/p&gt;
&lt;p&gt;As features continue to evolve (Premium SKUs especially), the gap is closing fast. Just make sure you line up the feature set with your actual requirements before jumping in, rather than assuming “firewall is firewall”.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="security-design-principles"&gt;Security Design Principles
&lt;/h2&gt;&lt;p&gt;If you want your hub-and-spoke to hold up under scrutiny, ground it in these security concepts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Least Privilege Networking&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Don’t rely on “allow all VNet” rules. Be deliberate with NSGs and firewall rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero Trust Alignment&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Every spoke should authenticate and authorise. Assume compromise within the network.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Segmentation&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Keep dev, test, and prod in separate spokes — and don’t forget service-level segmentation (e.g. databases isolated from front-end tiers).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="architecture-diagram"&gt;Architecture Diagram
&lt;/h2&gt;&lt;p&gt;Here’s a high-level look at a secure hub-and-spoke built with Azure Firewall:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
Internet --&gt; |North-South| AzureFirewall
AzureFirewall --&gt; HubVNet[Hub VNet]
HubVNet --&gt; Spoke1[Spoke VNet 1 - App Layer]
HubVNet --&gt; Spoke2[Spoke VNet 2 - Data Layer]
HubVNet --&gt; Spoke3[Spoke VNet 3 - Shared Services]
Spoke1 &lt;--&gt; Spoke2
Spoke1 &lt;--&gt; Spoke3
&lt;/div&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal-quick-setup"&gt;Azure Portal (Quick Setup)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Create &lt;strong&gt;Hub VNet&lt;/strong&gt; with subnets: &lt;code&gt;AzureFirewallSubnet&lt;/code&gt;, &lt;code&gt;GatewaySubnet&lt;/code&gt;, &lt;code&gt;SharedServices&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Deploy &lt;strong&gt;Azure Firewall&lt;/strong&gt; into &lt;code&gt;AzureFirewallSubnet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;Spoke VNets&lt;/strong&gt; for workloads.&lt;/li&gt;
&lt;li&gt;Peer each &lt;strong&gt;Spoke VNet&lt;/strong&gt; with the &lt;strong&gt;Hub VNet&lt;/strong&gt; (enable “Use remote gateway” for spoke).&lt;/li&gt;
&lt;li&gt;Assign UDRs in spokes to route 0.0.0.0/0 to the firewall’s private IP.&lt;/li&gt;
&lt;li&gt;Apply NSGs for subnet-level control.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example--hub-n-spoke-using-bicep-modules"&gt;Bicep Example — Hub n Spoke using Bicep Modules
&lt;/h3&gt;&lt;p&gt;I often see folks build the first hub-and-spoke through the Azure Portal for speed, then later scramble to retrofit Bicep/ARM. Don’t, set the Bicep up front. Even if you start simple, you’ll thank yourself later when you need to scale hubs to multiple regions or automate deployments for dev/test/prod.&lt;/p&gt;
&lt;h2 id="-folder-structure-recommended"&gt;📂 Folder Structure (recommended)
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/bicep
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ main.bicep &lt;span class="c1"&gt;# Entry point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ azfw.bicep &lt;span class="c1"&gt;# Azure Firewall&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ├─ azfwpolicy.bicep &lt;span class="c1"&gt;# Azure Firewall Policy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ hub.bicep &lt;span class="c1"&gt;# Hub VNet + Firewall Subnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ spoke.bicep &lt;span class="c1"&gt;# Spoke VNet + NSG + UDR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ peering.bicep &lt;span class="c1"&gt;# Hub-Spoke peering&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-mainbicep--root-deployment"&gt;🔹 &lt;code&gt;main.bicep&lt;/code&gt; — Root deployment
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Hub parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-vnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubAddressPrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Firewall Policy parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallpolicyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azfwpolicy-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Firewall&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azfw-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Spoke parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;spoke-vnet1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeAddressPrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy Hub&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;./modules/hub.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hubDeployment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubAddressPrefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy Spoke with Route Table and NSG&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spoke&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;./modules/spoke.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;spokeDeployment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeAddressPrefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPrivateIp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;firewallPrivateIp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy Peering&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;peering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;./modules/peering.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;peeringDeployment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy Azure Firewall Policy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azfwPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;./modules/azfwpolicy.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azfwPolicyDeployment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallpolicyName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallpolicyName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy Azure Firewall&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azfw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;./modules/azfw.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azfwDeployment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;hubVnetId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicyId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azfwPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;azureFWPolicyId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-moduleshubbicep--hub--firewall"&gt;🔹 &lt;code&gt;modules/hub.bicep&lt;/code&gt; — Hub + Firewall
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubAddressPrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;hubAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzureFirewallSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;GatewaySubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.255.0/27&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SharedServices&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.2.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-pip&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Regional&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewall&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/azureFirewalls@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AZFW_VNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Premium&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;fwconfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPrivateIp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;privateIPAddress&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-modulesspokebicep--spoke-vnet--subnet-nsg--udr"&gt;🔹 &lt;code&gt;modules/spoke.bicep&lt;/code&gt; — Spoke VNet + Subnet NSG + UDR
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;span class="lnt"&gt;87
&lt;/span&gt;&lt;span class="lnt"&gt;88
&lt;/span&gt;&lt;span class="lnt"&gt;89
&lt;/span&gt;&lt;span class="lnt"&gt;90
&lt;/span&gt;&lt;span class="lnt"&gt;91
&lt;/span&gt;&lt;span class="lnt"&gt;92
&lt;/span&gt;&lt;span class="lnt"&gt;93
&lt;/span&gt;&lt;span class="lnt"&gt;94
&lt;/span&gt;&lt;span class="lnt"&gt;95
&lt;/span&gt;&lt;span class="lnt"&gt;96
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeAddressPrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPrivateIp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;spokeAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;workload&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Route Table&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/routeTables@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-udr&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default-to-firewall&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0.0.0.0/0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualAppliance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopIpAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPrivateIp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Update subnet with Route Table association&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeSubnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/workload&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// NSG with sample rules&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeNsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-nsg&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;allow-https-out&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Tcp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;deny-all-in&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Associate NSG&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetNsgAssoc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets/networkSecurityGroups@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/workload/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;spokeNsg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-modulespeeringbicep--hub-spoke-peering"&gt;🔹 &lt;code&gt;modules/peering.bicep&lt;/code&gt; — Hub-Spoke Peering
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubToSpoke&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-to-spoke&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowGatewayTransit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeToHub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;spoke-to-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useRemoteGateways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-modulesazfwpolicybicep--azure-firewall-policy"&gt;🔹 &lt;code&gt;modules/azfwpolicy.bicep&lt;/code&gt; — Azure Firewall Policy
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;span class="lnt"&gt;87
&lt;/span&gt;&lt;span class="lnt"&gt;88
&lt;/span&gt;&lt;span class="lnt"&gt;89
&lt;/span&gt;&lt;span class="lnt"&gt;90
&lt;/span&gt;&lt;span class="lnt"&gt;91
&lt;/span&gt;&lt;span class="lnt"&gt;92
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Azure Firewall Policy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallpolicyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myAzureFirewallPolicy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Azure Firewall Policy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azureFWPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/firewallPolicies@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallpolicyName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkRuleCollectionGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/firewallPolicies/ruleCollectionGroups@2022-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azureFWPolicy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DefaultNetworkRuleCollectionGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleCollections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleCollectionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FirewallPolicyFilterRuleCollection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllowAllExceptHTTPandHTTPS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllowAllExcept80and443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow all traffic except ports 80 and 443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;NetworkRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipProtocols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Any&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPorts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;1-79&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;81-442&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;444-60000&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;applicationRuleCollectionGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/firewallPolicies/ruleCollectionGroups@2022-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azureFWPolicy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DefaultApplicationRuleCollectionGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;300&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleCollections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleCollectionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FirewallPolicyFilterRuleCollection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllowHTTPandHTTPS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ApplicationRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllowHTTPandHTTPS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocolType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Http&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocolType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Https&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetFqdns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azureFWPolicyId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azureFWPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-modulesazfwbicep--azure-firewall"&gt;🔹 &lt;code&gt;modules/azfw.bicep&lt;/code&gt; — Azure Firewall
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicyId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Public IP Name for Azure Firewall&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPublicIPName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-publicIP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Public IP for Azure Firewall&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPublicIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPublicIPName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Regional&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Azure Firewall Resource&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azureFirewall&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/azureFirewalls@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-ipConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPublicIP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzureFirewallSubnet&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicyId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; By modularising, you’re essentially setting up a reusable “coffee recipe”. Add more spokes? Just call the &lt;code&gt;spoke.bicep&lt;/code&gt; module with a new name and CIDR. Want multi-region? Deploy another &lt;code&gt;hub.bicep&lt;/code&gt; and connect. Keeps deployments consistent, scalable, and way less error‑prone.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Peering limits&lt;/strong&gt;: Default hard caps exist; plan address ranges carefully.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS resolution&lt;/strong&gt;: Centralise DNS in the hub to avoid mismatched name resolution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firewall costs&lt;/strong&gt;: Premium SKU punches holes in budgets if underutilised. Scale and size properly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Go cloud native first by using &lt;strong&gt;Azure Firewall&lt;/strong&gt; (premium where inspection required) for hub security over third-party NVAs unless you have a feature Azure doesn’t support.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Logging + Diagnostics&lt;/strong&gt; from day one. Push Firewall, NSG, and Azure Activity logs into &lt;strong&gt;Log Analytics / Sentinel&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Align NSGs with segmentation — firewalls manage inter-VNet traffic, NSGs should refine subnet/application boundaries.&lt;/li&gt;
&lt;li&gt;Plan IP ranges early to avoid re-addressing (think coffee stains on a white shirt — harder to clean up later!).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Hub-and-spoke in Azure is a classic design that’s aged surprisingly well. The trick isn’t in building it — it’s in securing it properly. Think of it like a strong flat white: the foundation is simple (espresso + milk), but small variations in execution make all the difference. In the next post, we’ll pour a deeper shot and focus on how &lt;strong&gt;Azure Firewall Premium&lt;/strong&gt; becomes the real enforcer of security.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/hybrid-networking/hub-spoke" target="_blank" rel="noopener"
&gt;Hub-spoke network topology in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/overview" target="_blank" rel="noopener"
&gt;Azure Firewall documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-wan/virtual-wan-about" target="_blank" rel="noopener"
&gt;Virtual WAN overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/network-security-groups-overview" target="_blank" rel="noopener"
&gt;Network Security Groups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;User Defined Routes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Stirring in Services: Zero Trust for PaaS with Private Links</title><link>https://blog.brewedinthecloud.com/p/zero-trust-azure-private-link/</link><pubDate>Thu, 04 Sep 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/zero-trust-azure-private-link/</guid><description>&lt;p&gt;You’ve segmented your VNets, layered in NSGs, and rolled out Security Admin Rules. Your traffic path is tightly controlled. But what about your Azure SQL Database? Or that Storage Account full of secrets and blobs?&lt;/p&gt;
&lt;p&gt;By default, many PaaS services in Azure are reachable over the public internet — even if you’ve got everything else segmented. That’s like leaving the sugar jar on the café counter; any passer‑by could dip into it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero Trust means your services need segmentation too.&lt;/strong&gt; And in Azure, that’s where &lt;strong&gt;Private Endpoints&lt;/strong&gt; and &lt;strong&gt;Private Links&lt;/strong&gt; come in.&lt;/p&gt;
&lt;h2 id="what-are-private-endpoints--private-link"&gt;What are Private Endpoints / Private Link?
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Private Endpoint:&lt;/strong&gt; A network interface inside your VNet that maps to a PaaS resource (SQL, Storage, Key Vault, etc).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Private Link:&lt;/strong&gt; The overall service that enables PaaS resources to be accessible privately over Azure backbone instead of public endpoints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Effectively, you’re giving your service a private address in the VNet, reachable only by authenticated traffic from trusted sources.&lt;/p&gt;
&lt;h2 id="why-it-matters-in-zero-trust"&gt;Why It Matters in Zero Trust
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Removes public internet exposure.&lt;/li&gt;
&lt;li&gt;Enforces &lt;strong&gt;least privilege&lt;/strong&gt; by only allowing access from the segments/VNets you define.&lt;/li&gt;
&lt;li&gt;Works seamlessly with &lt;strong&gt;DNS integration&lt;/strong&gt; using Private DNS Zones.&lt;/li&gt;
&lt;li&gt;Reduces the blast radius — compromised workloads can’t hit services unless explicitly permitted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Take a Storage Account that holds application data. By default:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developers might reach it from home IPs.&lt;/li&gt;
&lt;li&gt;The app VNet sends requests to the public endpoint.&lt;/li&gt;
&lt;li&gt;Anyone with SAS tokens could hit it over the internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With Private Link in place:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Storage has a &lt;strong&gt;Private Endpoint in the Data VNet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Only VNets integrated with that endpoint can reach it.&lt;/li&gt;
&lt;li&gt;Access controlled further with NSGs and identity (Azure AD + RBAC).&lt;/li&gt;
&lt;li&gt;DNS automatically resolves &lt;code&gt;storageaccount.blob.core.windows.net&lt;/code&gt; → the private IP in your VNet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now the service sits safely &lt;strong&gt;inside your segmented network boundary&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="architecture-overview"&gt;Architecture Overview
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart TD
subgraph WebVNet[Web VNet]
WebVM[Web VMs]
end
subgraph AppVNet[App VNet]
AppVM[App VMs]
end
subgraph DataVNet[Data VNet]
SQLpe[SQL Private Endpoint]
StPE[Storage Private Endpoint]
KVPE[Key Vault Private Endpoint]
end
subgraph HubVNet[Hub VNet]
AFW[Azure Firewall]
Bastion[Azure Bastion]
DNS[Private DNS Zone Resolver]
end
Internet((Internet))
Internet --&gt; AFW
AFW --&gt; WebVM
WebVM --&gt; AppVM
AppVM --&gt; SQLpe
AppVM --&gt; StPE
AppVM --&gt; KVPE
Bastion --&gt; WebVM
Bastion --&gt; AppVM
&lt;/div&gt;
&lt;p&gt;PaaS is now pulled &lt;em&gt;into&lt;/em&gt; the same segmentation model. All access is denied by default unless private paths are configured.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal-steps"&gt;Azure Portal Steps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Navigate to your PaaS resource (e.g. Storage Account).&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Networking&lt;/strong&gt;, select &lt;strong&gt;Private Endpoint connections&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add a new Private Endpoint in the &lt;strong&gt;Data VNet&lt;/strong&gt; (or wherever your consumers live).&lt;/li&gt;
&lt;li&gt;Associate with a &lt;strong&gt;Private DNS Zone&lt;/strong&gt; (&lt;code&gt;privatelink.blob.core.windows.net&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Test resolution from App VMs → traffic stays private.&lt;/li&gt;
&lt;li&gt;Disable public network access on the resource.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example"&gt;Bicep Example
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetrg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVnetRg&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PrivateEndpointSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mystorageacct&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;uniqueString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Virtual Network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vnetrg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetrg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Storage Account&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Storage/storageAccounts@2023-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_LRS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;StorageV2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;minimumTlsVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;TLS1_2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Disabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// critical step&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Private Endpoint&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stgPe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/privateEndpoints@2023-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-pe&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/subnets/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateLinkServiceConnections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;stgConnection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateLinkServiceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupIds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;blob&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Private DNS Zone&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stgDns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/privateDnsZones@2020-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;privatelink.blob.core.windows.net&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;global&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Virtual Network Link&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetLink&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;stg-dnslink&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stgDns&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;registrationEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DNS configuration:&lt;/strong&gt; Most errors are DNS resolution issues. Make sure Private DNS Zones are linked to every relevant VNet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overlapping endpoints:&lt;/strong&gt; One service → multiple VNets → you’ll need multiple Private Endpoints or central service VNet design.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Costs:&lt;/strong&gt; Each Private Endpoint + DNS zone has a cost. Plan accordingly at scale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disable public access:&lt;/strong&gt; Forgetting this leaves your service accessible two ways — which defeats the point.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Deploy Private Endpoints in the &lt;strong&gt;data tier VNet&lt;/strong&gt; for sensitive workloads.&lt;/li&gt;
&lt;li&gt;Use Private DNS Zones consistently across spokes.&lt;/li&gt;
&lt;li&gt;Always disable public access once Private Endpoints are validated.&lt;/li&gt;
&lt;li&gt;Combine with identity (Azure AD auth for SQL, Storage, Key Vault) for layered Zero Trust.&lt;/li&gt;
&lt;li&gt;Consider centralising Private Endpoints in a “Shared Services VNet” with controlled access if scaling across subscriptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;em&gt;Private Endpoints are like keeping your beans behind the counter — only staff should have access. Leaving PaaS exposed to the internet is like putting them out on the footpath. Zero Trust means service traffic should be private, deliberate, and identity‑verified.&lt;/em&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/private-link/private-link-overview" target="_blank" rel="noopener"
&gt;Azure Private Link Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/storage/common/storage-network-security#deny-traf" target="_blank" rel="noopener"
&gt;Disable public network access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/dns/private-dns-privatednszone" target="_blank" rel="noopener"
&gt;Private DNS Zone integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/azure-infrastructure-overview" target="_blank" rel="noopener"
&gt;Zero Trust PaaS guidance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Identity is the New Perimeter: Conditional Access &amp; Network Access</title><link>https://blog.brewedinthecloud.com/p/zero-trust-azure-identity-network-access/</link><pubDate>Tue, 02 Sep 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/zero-trust-azure-identity-network-access/</guid><description>&lt;p&gt;In the old world, your perimeter was defined by firewalls and LANs. If you were on the corporate network, you were “trusted.” But in Azure, admins and users connect from anywhere — home Wi‑Fi, hotel lobbies, coffee shops. The traditional perimeter doesn’t hold.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero Trust&lt;/strong&gt; in Azure networking means fusing &lt;em&gt;who you are&lt;/em&gt; with &lt;em&gt;what you can reach&lt;/em&gt;. That’s where &lt;strong&gt;Conditional Access (CA)&lt;/strong&gt;, &lt;strong&gt;Privileged Identity Management (PIM)&lt;/strong&gt;, and &lt;strong&gt;Just‑in‑Time (JIT) VM access&lt;/strong&gt; come in, reshaping the perimeter around &lt;strong&gt;identity&lt;/strong&gt; itself.&lt;/p&gt;
&lt;h2 id="what-is-identitydriven-network-access"&gt;What is Identity‑Driven Network Access?
&lt;/h2&gt;&lt;p&gt;Microsoft’s Zero Trust mantra: &lt;em&gt;never trust, always verify&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In practice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every network request is tied back to &lt;strong&gt;identity&lt;/strong&gt; (user, service principal, managed identity).&lt;/li&gt;
&lt;li&gt;Access is granted dynamically, based on &lt;strong&gt;context&lt;/strong&gt; → user role, device compliance, location, and risk signals.&lt;/li&gt;
&lt;li&gt;Networking and identity controls are aligned.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of “allow traffic from this subnet range”, you can define:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Require MFA if sign‑in comes from outside a trusted region.&lt;/li&gt;
&lt;li&gt;Block legacy authentication globally.&lt;/li&gt;
&lt;li&gt;Allow only time‑bound RDP via Bastion after JIT approval.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-identity-meets-networking-in-azure"&gt;How Identity Meets Networking in Azure
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Bastion + JIT VM Access&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Removes the need for open public IPs or permanent RDP/SSH access.&lt;/li&gt;
&lt;li&gt;Admin session flows through Bastion, authorised by JIT + Conditional Access.&lt;/li&gt;
&lt;li&gt;Network path only exists while the user is approved.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conditional Access Policies (CA)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Govern access to the Azure Portal, PowerShell, CLI, and apps.&lt;/li&gt;
&lt;li&gt;Can require compliant devices, enforced MFA, or block risky sign‑ins entirely.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Privileged Identity Management (PIM)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Admin rights aren’t always‑on. Roles become “eligible,” then explicitly activated when needed, often with approval + MFA.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Private Endpoints with Identity&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PaaS workloads (e.g. Azure SQL, Storage) are reachable via Private Endpoint inside segmented VNets.&lt;/li&gt;
&lt;li&gt;Resource access is granted to AAD identities or Managed Identities, not IP addresses.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Consider a medium‑sized SaaS company:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Developers&lt;/strong&gt; occasionally need SSH access to VMs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ops team&lt;/strong&gt; manages SQL daily but wants no exposure to internet endpoints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt; demands no standing admin rights and no exposed RDP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By combining identity controls + network controls:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developers must request &lt;strong&gt;JIT VM access&lt;/strong&gt;, session goes via &lt;strong&gt;Bastion&lt;/strong&gt;, &lt;strong&gt;MFA enforced&lt;/strong&gt;, and access times out automatically.&lt;/li&gt;
&lt;li&gt;Ops team connects only to &lt;strong&gt;SQL over Private Endpoint&lt;/strong&gt; and authenticates with AAD — no public access.&lt;/li&gt;
&lt;li&gt;Security enforces &lt;strong&gt;global SARs from Part 2&lt;/strong&gt; + Conditional Access, ensuring no open doors even if creds are leaked.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="architecture-overview"&gt;Architecture Overview
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart TD
User["User Identity (Azure AD)"]
CA[Conditional Access Policies]
PIM[PIM Role Activation]
Bastion[Azure Bastion]
VM["VM (Spoke VNet)"]
SQL["(Azure SQL w/ Private Endpoint)"]
AVNM[AVNM Security Admin Rules]
User --&gt; CA
CA --&gt; PIM
PIM --&gt; Bastion
Bastion --&gt; VM
VM --&gt; SQL
AVNM -. blocks bad traffic .- VM
AVNM -. blocks bad traffic .- SQL
&lt;/div&gt;
&lt;p&gt;Identity acts as the perimeter → access flows only when verified and approved, layered alongside segmentation.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal-steps"&gt;Azure Portal Steps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enable JIT VM Access&lt;/strong&gt; via &lt;em&gt;Microsoft Defender for Servers&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to Defender for Cloud → Virtual Machines → select your VM → configure JIT.&lt;/li&gt;
&lt;li&gt;Define allowed ports (22/3389), allowed IPs, and max duration.&lt;/li&gt;
&lt;li&gt;Access requests then flow through the Azure AD approval process.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="warning"&gt;
&lt;div class="warning-icon"&gt;⚠️&lt;/div&gt;
&lt;div class="warning-content"&gt;
&lt;strong&gt;Warning:&lt;/strong&gt; JIT VM Access requires an active &lt;strong&gt;Defender for Servers plan&lt;/strong&gt; on your subscription or resource group. Without it, you won’t see JIT in the portal.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.warning {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #ffcc00;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.warning-icon {
font-size: 24px;
margin-right: 10px;
}
.warning-content {
flex: 1;
}
&lt;/style&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Conditional Access&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a policy for “Azure Management” → require MFA and compliant device.&lt;/li&gt;
&lt;li&gt;Block logins from high‑risk sign‑ins.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set up PIM role eligibility&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove permanent Contributor/Owner permissions.&lt;/li&gt;
&lt;li&gt;Assign roles as “eligible” → require activation with justification and approval.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy Bastion in hub VNet&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure VMs live without public IPs.&lt;/li&gt;
&lt;li&gt;All management flows tunnel via Bastion + identity policy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example-functional-jit-policy"&gt;Bicep Example (Functional JIT Policy)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVm&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Existing VM reference&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Just-In-Time policy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Just-In-Time (JIT) network access policy for the VM&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;jitPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Security/locations/jitNetworkAccessPolicies@2020-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;JITPolicyLocation/default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// always &amp;#39;default&amp;#39; for JIT but you have to have a Location pre-defined in Azure&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Basic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// SSH&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;TCP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maxRequestAccessDuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT3H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// ISO 8601 duration, here: 3 hours&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowedSourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// allow from any IP (tighten this in prod)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3389&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// RDP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;TCP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maxRequestAccessDuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT2H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 2 hours&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowedSourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="warning"&gt;
&lt;div class="warning-icon"&gt;⚠️&lt;/div&gt;
&lt;div class="warning-content"&gt;
&lt;strong&gt;Warning:&lt;/strong&gt; Remember: this resource only works if Defender for Servers is enabled on the subscription.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.warning {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #ffcc00;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.warning-icon {
font-size: 24px;
margin-right: 10px;
}
.warning-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Licensing dependency:&lt;/strong&gt; JIT requires Defender for Servers — attempting to deploy without it will fail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch exclusions:&lt;/strong&gt; Always maintain at least one break‑glass account exempt from Conditional Access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocol coverage:&lt;/strong&gt; Conditional Access works at identity layers, not raw protocol layers. Use CA + Bastion + segmentation together.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit &amp;amp; logs:&lt;/strong&gt; Track JIT requests, Bastion sessions, and PIM activations for compliance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Enforce MFA everywhere, especially admin access.&lt;/li&gt;
&lt;li&gt;Always use JIT + Bastion rather than open NSG rules for RDP/SSH.&lt;/li&gt;
&lt;li&gt;Combine segmentation (Post 1) and AVNM baseline denies (Post 2) with identity enforcement.&lt;/li&gt;
&lt;li&gt;Keep privileged roles “eligible” under PIM, not “always on.”&lt;/li&gt;
&lt;li&gt;Test CA policies carefully to prevent accidental lock‑outs.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;em&gt;Identity really is the new firewall. Think of it as the crema on your Zero Trust espresso — without it, the brew lacks structure and protection. With it, you add a rich, consistent layer that ties networking back to “who” is asking, not just “where” they’re from.&lt;/em&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/identity" target="_blank" rel="noopener"
&gt;Microsoft Zero Trust Identity Guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/active-directory/conditional-access/overview" target="_blank" rel="noopener"
&gt;Conditional Access Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/bastion/bastion-overview" target="_blank" rel="noopener"
&gt;Azure Bastion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/just-in-time-access-overview" target="_blank" rel="noopener"
&gt;Just-in-Time VM Access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/active-directory/privileged-identity-management/pim-configure" target="_blank" rel="noopener"
&gt;Privileged Identity Management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Least Privilege Pour: Using NSGs &amp; AVNM Security Admin Rules</title><link>https://blog.brewedinthecloud.com/p/zero-trust-azure-nsgs-avnm/</link><pubDate>Thu, 28 Aug 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/zero-trust-azure-nsgs-avnm/</guid><description>&lt;p&gt;In security, “least privilege” is like espresso the right amount gives you a perfect cup, but too much or too little ruins the pour.&lt;/p&gt;
&lt;p&gt;In Azure networking, least privilege is enforced with &lt;strong&gt;Network Security Groups (NSGs)&lt;/strong&gt; for local segmentation, and &lt;strong&gt;Azure Virtual Network Manager (AVNM) Security Admin Rules (SARs)&lt;/strong&gt; for consistent global enforcement. Together, they keep your environment locked down without drowning you in manual rule management.&lt;/p&gt;
&lt;h2 id="nsgs-your-local-filter"&gt;NSGs: Your Local Filter
&lt;/h2&gt;&lt;p&gt;NSGs sit at the subnet or network interfaces and:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Filter traffic by priority, protocol, and source/destination.&lt;/li&gt;
&lt;li&gt;Allow/deny only the flows you intend.&lt;/li&gt;
&lt;li&gt;Form the backbone of micro segmentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web NSG → allow inbound 443 from internet.&lt;/li&gt;
&lt;li&gt;App NSG → allow inbound 443 only from Web VNet.&lt;/li&gt;
&lt;li&gt;Data NSG → allow inbound 1433 only from App VNet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s least privilege in action, but it can get messy across dozens of VNets.&lt;/p&gt;
&lt;h2 id="scaling-with-avnm--security-admin-rules"&gt;Scaling with AVNM + Security Admin Rules
&lt;/h2&gt;&lt;p&gt;When you want to apply rules consistently across many VNets and regions, AVNM steps in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Network Groups:&lt;/strong&gt; logical collections of VNets (e.g. “All Prod”).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Admin Rules:&lt;/strong&gt; policies that apply across those groups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Precedence:&lt;/strong&gt; SARs override NSGs — a deny at SAR level always wins.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Typical baseline SARs:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deny inbound RDP (3389) everywhere.&lt;/li&gt;
&lt;li&gt;Deny inbound SMB (445) everywhere.&lt;/li&gt;
&lt;li&gt;Only allow internet HTTPS to web‑tier VNets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This lets you enforce non‑negotiable org‑wide controls, while teams still use NSGs for local traffic shaping.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;A dev team might accidentally allow RDP inbound on a test VNet. With SARs in place, the global &lt;strong&gt;deny 3389&lt;/strong&gt; rule overrides them. You get consistent protection without having to patrol every NSG.&lt;/p&gt;
&lt;p&gt;That mix — NSGs for segmentation, SARs for global enforcement — is what makes “least privilege” stick in large Azure estates.&lt;/p&gt;
&lt;h2 id="implementation-snapshot"&gt;Implementation Snapshot
&lt;/h2&gt;&lt;h3 id="azure-portal"&gt;Azure Portal
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Create &lt;strong&gt;Network Groups&lt;/strong&gt; (by environment).&lt;/li&gt;
&lt;li&gt;Apply a &lt;strong&gt;Security Admin Config&lt;/strong&gt; for global denies.&lt;/li&gt;
&lt;li&gt;Validate rule enforcement alongside existing NSGs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bicep-example-abridged"&gt;Bicep Example (abridged)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// AVNM with Security Admin Rules&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetMgr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers@2023-12-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;corp-network-manager&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopeAccesses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Connectivity&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SecurityAdmin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prodGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups@2023-12-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;prod-vnets&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetMgr&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;secConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations@2023-12-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;baseline-sec&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetMgr&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;deny3389&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations/ruleCollections@2023-12-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;deny-rdp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;secConfig&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appliesToGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkGroupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prodGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny-RDP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Tcp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;3389&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--best-practices"&gt;Gotchas &amp;amp; Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;SARs override NSGs — test carefully before rollout.&lt;/li&gt;
&lt;li&gt;Scope SARs to the right VNets/regions using Network Groups.&lt;/li&gt;
&lt;li&gt;Use NSGs for &lt;strong&gt;application‑specific rules&lt;/strong&gt;, SARs for &lt;strong&gt;baseline “thou shalt nots”&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pair with Azure Policy to ensure all VNets join the correct AVNM groups.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="want-the-full-deep-dive"&gt;Want the Full Deep Dive?
&lt;/h2&gt;&lt;p&gt;This is the 100ml pour. If you want the &lt;strong&gt;full espresso shot&lt;/strong&gt; — including detailed rule conflicts, precedence tests, and operational lessons check out my separate article:&lt;br&gt;
&lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-avnm-secadmin-vs-nsg/" target="_blank" rel="noopener"
&gt;Azure AVNM Security Admin Rules vs NSGs in the Real World&lt;/a&gt;&lt;/p&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; NSGs are like your pour‑over they are crafted, precise, per‑application. But AVNM SARs are the café‑wide rule: nobody gets a cup with salt in it. Use them together, and you get security that scales without losing flavour.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/overview" target="_blank" rel="noopener"
&gt;Azure Virtual Network Manager overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-security-admins" target="_blank" rel="noopener"
&gt;Security Admin rules explainer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/network-security-groups-overview" target="_blank" rel="noopener"
&gt;Network Security Groups&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Brewing the Basics: Zero Trust Networking in Azure</title><link>https://blog.brewedinthecloud.com/p/zero-trust-networking-azure-basics/</link><pubDate>Tue, 26 Aug 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/zero-trust-networking-azure-basics/</guid><description>&lt;p&gt;Back in the on‑prem days, network security was like making coffee with a single big percolator. You poured everything in, pressed a button, and assumed the end result would be drinkable. A big firewall at the edge, a DMZ for polish, and job done.&lt;/p&gt;
&lt;p&gt;But Azure networking demands something more refined. Workloads scale elastically, PaaS services sneak into the mix, and identities wander across devices and geographies. That “one big brew” model loses flavour quickly.&lt;/p&gt;
&lt;p&gt;This is where &lt;strong&gt;Zero Trust&lt;/strong&gt; steps in. Instead of trusting the whole pot, you brew each cup individually, verifying every grain and every pour. And at the network layer, that refinement looks like &lt;strong&gt;segmentation&lt;/strong&gt;: carving your infrastructure into deliberate, isolated segments where access is granted only when justified.&lt;/p&gt;
&lt;h2 id="what-is-zero-trust-networking"&gt;What is Zero Trust Networking?
&lt;/h2&gt;&lt;p&gt;Microsoft frames Zero Trust with three core ideas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Verify explicitly&lt;/strong&gt; → Authorise based on identity, policy, and context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Least privilege access&lt;/strong&gt; → Allow just enough, and only for as long as needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assume breach&lt;/strong&gt; → Design as if attackers are already inside the network.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When mapped into networking, one extra dimension gets special focus: &lt;strong&gt;segmentation&lt;/strong&gt;. That means designing networks so that resources only talk to what they need, and nothing more. In other words, your SQL database shouldn’t chat to your web tier unless you’ve brewed in rules that say it can.&lt;/p&gt;
&lt;h2 id="how-it-works-in-azure"&gt;How it Works in Azure
&lt;/h2&gt;&lt;p&gt;A Zero Trust‑aligned Azure network typically combines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Virtual Networks and Subnets&lt;/strong&gt; → Provide isolation zones to enforce segmentation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Security Groups (NSGs)&lt;/strong&gt; → Control what can flow in/out of each subnet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Firewall&lt;/strong&gt; or &lt;strong&gt;Firewall Policy&lt;/strong&gt; → Centralised inspection and outbound control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private Link / Private Endpoints&lt;/strong&gt; → Ensure PaaS services (SQL, Storage, Key Vault) are reachable only via trusted VNets, not the internet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Virtual Network Manager (AVNM)&lt;/strong&gt; → Scale segmentation and security rules across environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identity‑aware access&lt;/strong&gt; → Use Just in Time (JIT), Conditional Access, Bastion integration to align network traffic to authenticated users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Let’s say you’re running a classic 3‑tier app in Azure: Web, App, and Database. The easy (but risky) design would be to dump everything into a single flat VNet, where any tier can talk to any other without restriction. That’s perfect for attackers but painful for defenders.&lt;/p&gt;
&lt;p&gt;By taking a Zero Trust view, you place each tier in its own spoke VNet, connect them via a secured hub, and attach NSGs to only allow the flows you intend. That design:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prevents a compromised web VM in one spoke from freely reaching your data tier.&lt;/li&gt;
&lt;li&gt;Enforces explicit, logged east‑west rules through the hub.&lt;/li&gt;
&lt;li&gt;Scales cleanly with Azure Virtual Network Manager (AVNM) to apply consistent policies across many VNets.&lt;/li&gt;
&lt;li&gt;Makes troubleshooting easier by having logs and flow records show exactly which segment boundary is passing or blocking traffic.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="architecture-overview"&gt;Architecture Overview
&lt;/h2&gt;&lt;p&gt;Here’s a high-level Zero Trust segmentation pattern in Azure:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
subgraph HubVNet[Hub VNet]
AFW[Azure Firewall]
Bastion[Azure Bastion]
end
subgraph Spoke1[Web VNet]
SubnetWeb[Web Subnet]
WebVM["Web VM(s)"]
NSGWeb[Web NSG]
end
subgraph Spoke2[App VNet]
SubnetApp[App Subnet]
AppVM["App VM(s)"]
NSGApp[App NSG]
end
subgraph Spoke3[Data VNet]
SQLpe[SQL Private Endpoint]
NSGData[Data NSG]
end
Internet[(Internet)]
Internet --&gt; AFW
AFW --&gt; WebVM
WebVM --&gt; AppVM
AppVM --&gt; SQLpe
Bastion --&gt; WebVM
Bastion --&gt; AppVM
&lt;/div&gt;
&lt;p&gt;Notice each tier has its own VNet + subnet + NSG. Access is only permitted along the explicit paths (Web→App, App→SQL).&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal-steps"&gt;Azure Portal Steps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the Hub VNet&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deploy a hub VNet that will host shared services (Azure Firewall, Bastion, DNS forwarders if needed).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create Spoke VNets&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web VNet&lt;/strong&gt; → For your front‑end workloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App VNet&lt;/strong&gt; → For application logic tier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data VNet&lt;/strong&gt; → For databases, storage, or other sensitive back‑end systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Peering&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Peer each spoke VNet to the hub VNet (hub‑and‑spoke).&lt;/li&gt;
&lt;li&gt;Disable spoke‑to‑spoke direct peering to force all east‑west traffic through the hub.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Attach NSGs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WebNSG&lt;/strong&gt; → Allow inbound HTTPS from internet, outbound only to App VNet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AppNSG&lt;/strong&gt; → Allow inbound traffic only from Web VNet, outbound only to Data VNet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DataNSG&lt;/strong&gt; → Allow inbound traffic only from App VNet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apply Firewall Rules in Hub&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use Azure Firewall or Firewall Policy to allow/deny specific flows (e.g., Web→App, App→DB).&lt;/li&gt;
&lt;li&gt;Log and monitor everything centrally from the hub.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Private Endpoints for PaaS&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add Private Endpoints (e.g., SQL, Storage, Key Vault) inside the &lt;strong&gt;Data VNet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ensure DNS resolution points to the private endpoint IP, not public endpoints.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy Resources&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Place VMs, App Services (via VNet Integration), and databases into their respective VNets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Result: Each tier lives in its own &lt;strong&gt;segmented VNet&lt;/strong&gt;, only talks to the tier it needs, and all traffic is filtered centrally by the hub.&lt;/p&gt;
&lt;h3 id="bicep-example"&gt;Bicep Example
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;span class="lnt"&gt;127
&lt;/span&gt;&lt;span class="lnt"&gt;128
&lt;/span&gt;&lt;span class="lnt"&gt;129
&lt;/span&gt;&lt;span class="lnt"&gt;130
&lt;/span&gt;&lt;span class="lnt"&gt;131
&lt;/span&gt;&lt;span class="lnt"&gt;132
&lt;/span&gt;&lt;span class="lnt"&gt;133
&lt;/span&gt;&lt;span class="lnt"&gt;134
&lt;/span&gt;&lt;span class="lnt"&gt;135
&lt;/span&gt;&lt;span class="lnt"&gt;136
&lt;/span&gt;&lt;span class="lnt"&gt;137
&lt;/span&gt;&lt;span class="lnt"&gt;138
&lt;/span&gt;&lt;span class="lnt"&gt;139
&lt;/span&gt;&lt;span class="lnt"&gt;140
&lt;/span&gt;&lt;span class="lnt"&gt;141
&lt;/span&gt;&lt;span class="lnt"&gt;142
&lt;/span&gt;&lt;span class="lnt"&gt;143
&lt;/span&gt;&lt;span class="lnt"&gt;144
&lt;/span&gt;&lt;span class="lnt"&gt;145
&lt;/span&gt;&lt;span class="lnt"&gt;146
&lt;/span&gt;&lt;span class="lnt"&gt;147
&lt;/span&gt;&lt;span class="lnt"&gt;148
&lt;/span&gt;&lt;span class="lnt"&gt;149
&lt;/span&gt;&lt;span class="lnt"&gt;150
&lt;/span&gt;&lt;span class="lnt"&gt;151
&lt;/span&gt;&lt;span class="lnt"&gt;152
&lt;/span&gt;&lt;span class="lnt"&gt;153
&lt;/span&gt;&lt;span class="lnt"&gt;154
&lt;/span&gt;&lt;span class="lnt"&gt;155
&lt;/span&gt;&lt;span class="lnt"&gt;156
&lt;/span&gt;&lt;span class="lnt"&gt;157
&lt;/span&gt;&lt;span class="lnt"&gt;158
&lt;/span&gt;&lt;span class="lnt"&gt;159
&lt;/span&gt;&lt;span class="lnt"&gt;160
&lt;/span&gt;&lt;span class="lnt"&gt;161
&lt;/span&gt;&lt;span class="lnt"&gt;162
&lt;/span&gt;&lt;span class="lnt"&gt;163
&lt;/span&gt;&lt;span class="lnt"&gt;164
&lt;/span&gt;&lt;span class="lnt"&gt;165
&lt;/span&gt;&lt;span class="lnt"&gt;166
&lt;/span&gt;&lt;span class="lnt"&gt;167
&lt;/span&gt;&lt;span class="lnt"&gt;168
&lt;/span&gt;&lt;span class="lnt"&gt;169
&lt;/span&gt;&lt;span class="lnt"&gt;170
&lt;/span&gt;&lt;span class="lnt"&gt;171
&lt;/span&gt;&lt;span class="lnt"&gt;172
&lt;/span&gt;&lt;span class="lnt"&gt;173
&lt;/span&gt;&lt;span class="lnt"&gt;174
&lt;/span&gt;&lt;span class="lnt"&gt;175
&lt;/span&gt;&lt;span class="lnt"&gt;176
&lt;/span&gt;&lt;span class="lnt"&gt;177
&lt;/span&gt;&lt;span class="lnt"&gt;178
&lt;/span&gt;&lt;span class="lnt"&gt;179
&lt;/span&gt;&lt;span class="lnt"&gt;180
&lt;/span&gt;&lt;span class="lnt"&gt;181
&lt;/span&gt;&lt;span class="lnt"&gt;182
&lt;/span&gt;&lt;span class="lnt"&gt;183
&lt;/span&gt;&lt;span class="lnt"&gt;184
&lt;/span&gt;&lt;span class="lnt"&gt;185
&lt;/span&gt;&lt;span class="lnt"&gt;186
&lt;/span&gt;&lt;span class="lnt"&gt;187
&lt;/span&gt;&lt;span class="lnt"&gt;188
&lt;/span&gt;&lt;span class="lnt"&gt;189
&lt;/span&gt;&lt;span class="lnt"&gt;190
&lt;/span&gt;&lt;span class="lnt"&gt;191
&lt;/span&gt;&lt;span class="lnt"&gt;192
&lt;/span&gt;&lt;span class="lnt"&gt;193
&lt;/span&gt;&lt;span class="lnt"&gt;194
&lt;/span&gt;&lt;span class="lnt"&gt;195
&lt;/span&gt;&lt;span class="lnt"&gt;196
&lt;/span&gt;&lt;span class="lnt"&gt;197
&lt;/span&gt;&lt;span class="lnt"&gt;198
&lt;/span&gt;&lt;span class="lnt"&gt;199
&lt;/span&gt;&lt;span class="lnt"&gt;200
&lt;/span&gt;&lt;span class="lnt"&gt;201
&lt;/span&gt;&lt;span class="lnt"&gt;202
&lt;/span&gt;&lt;span class="lnt"&gt;203
&lt;/span&gt;&lt;span class="lnt"&gt;204
&lt;/span&gt;&lt;span class="lnt"&gt;205
&lt;/span&gt;&lt;span class="lnt"&gt;206
&lt;/span&gt;&lt;span class="lnt"&gt;207
&lt;/span&gt;&lt;span class="lnt"&gt;208
&lt;/span&gt;&lt;span class="lnt"&gt;209
&lt;/span&gt;&lt;span class="lnt"&gt;210
&lt;/span&gt;&lt;span class="lnt"&gt;211
&lt;/span&gt;&lt;span class="lnt"&gt;212
&lt;/span&gt;&lt;span class="lnt"&gt;213
&lt;/span&gt;&lt;span class="lnt"&gt;214
&lt;/span&gt;&lt;span class="lnt"&gt;215
&lt;/span&gt;&lt;span class="lnt"&gt;216
&lt;/span&gt;&lt;span class="lnt"&gt;217
&lt;/span&gt;&lt;span class="lnt"&gt;218
&lt;/span&gt;&lt;span class="lnt"&gt;219
&lt;/span&gt;&lt;span class="lnt"&gt;220
&lt;/span&gt;&lt;span class="lnt"&gt;221
&lt;/span&gt;&lt;span class="lnt"&gt;222
&lt;/span&gt;&lt;span class="lnt"&gt;223
&lt;/span&gt;&lt;span class="lnt"&gt;224
&lt;/span&gt;&lt;span class="lnt"&gt;225
&lt;/span&gt;&lt;span class="lnt"&gt;226
&lt;/span&gt;&lt;span class="lnt"&gt;227
&lt;/span&gt;&lt;span class="lnt"&gt;228
&lt;/span&gt;&lt;span class="lnt"&gt;229
&lt;/span&gt;&lt;span class="lnt"&gt;230
&lt;/span&gt;&lt;span class="lnt"&gt;231
&lt;/span&gt;&lt;span class="lnt"&gt;232
&lt;/span&gt;&lt;span class="lnt"&gt;233
&lt;/span&gt;&lt;span class="lnt"&gt;234
&lt;/span&gt;&lt;span class="lnt"&gt;235
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Hub VNet – shared services like Azure Firewall, Bastion, DNS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-vnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzureFirewallSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// reserved name for firewall&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;BastionSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// reserved name for Bastion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/27&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Web Tier Spoke VNet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;web-vnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// App Tier Spoke VNet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;app-vnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.2.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Data Tier Spoke VNet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dataVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;data-vnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.3.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Example NSGs for spoke segmentation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webNsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;web-nsg&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-HTTPS-In&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Tcp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-Out-AppVnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appNsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;app-nsg&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-In-WebVnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-Out-DataVnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dataVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dataNsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;data-nsg&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-In-AppVnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Tcp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;1433&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Add Subnets and Associated NSGs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webSubnetAndNSG&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;web-subnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkSecurityGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webNsg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appSubnetNsgAssociation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;app-subnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.2.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkSecurityGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appNsg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dataSubnetNsgAssociation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;data-subnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dataVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.3.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkSecurityGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dataNsg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Hub-Spoke VNet Peerings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubToWebPeering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-to-web&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webToHubPeering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;web-to-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubToAppPeering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-to-app&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appToHubPeering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;app-to-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubToDataPeering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-to-data&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dataVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dataToHubPeering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;data-to-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dataVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That’s segmentation in action: each subnet is fenced off, with NSGs acting as gates.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flat VNets&lt;/strong&gt; = flat risk. If you don’t segment, lateral movement gets too easy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NSGs aren’t inspection engines&lt;/strong&gt; — use Firewall when you need advanced filtering, FQDNs, or logging at scale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Over‑segmentation&lt;/strong&gt; can slow development. Strike balance: enough to contain blasts, not so much that your developers revolt.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Segment by &lt;strong&gt;function/tier&lt;/strong&gt; (Web, App, Data) as a baseline.&lt;/li&gt;
&lt;li&gt;Consider landing zones in an enterprise environment where segmentation often matches business units, environments or even functions.&lt;/li&gt;
&lt;li&gt;Deny by default in every NSG.&lt;/li&gt;
&lt;li&gt;Use AVNM to deploy and audit segmentation policies consistently across subscriptions. (Check out my blog post around &lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-avnm-secadmin-vs-nsg" target="_blank" rel="noopener"
&gt;AVNM Security Admin Rules in the Real World&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;Combine segmentation + Private Endpoints to fully cut off internet exposure.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Think of segmentation as the espresso shot in your Zero Trust latte. Without it, you just have warm milk (a flat network with skimpy controls). But layer those shots the right way, and you build strong, structured flavour — traffic flows only where intended, and every sip is deliberate.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/" target="_blank" rel="noopener"
&gt;Microsoft Zero Trust Guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/azure-infrastructure-networking" target="_blank" rel="noopener"
&gt;Zero Trust Networking in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/azure-networking-segmentation" target="_blank" rel="noopener"
&gt;Virtual Network Segmentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/network-security-groups-overview" target="_blank" rel="noopener"
&gt;Azure NSG Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/" target="_blank" rel="noopener"
&gt;Azure Virtual Network documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/network-security-groups-overview" target="_blank" rel="noopener"
&gt;NSG Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>NVAs &amp; Dynamic Routing with Azure Route Server</title><link>https://blog.brewedinthecloud.com/p/azure-routing-bgp/</link><pubDate>Thu, 21 Aug 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-routing-bgp/</guid><description>&lt;p&gt;Static routes with UDRs are great—until networks grow, routes change, and you&amp;rsquo;re updating dozens of route tables by hand at 1am on a Sunday. Enter BGP (Border Gateway Protocol), the internet’s gift to dynamic routing and Azure Route Server, which lets your NVAs speak BGP with the fabric itself.&lt;/p&gt;
&lt;p&gt;In this post, we explore how to use Azure Route Server with NVAs to enable dynamic routing, reduce static configuration overhead, and build smarter, faster convergence into your Azure network designs.&lt;/p&gt;
&lt;h2 id="what-is-azure-route-server"&gt;What is Azure Route Server?
&lt;/h2&gt;&lt;p&gt;Azure Route Server is a managed service that simplifies routing between your network virtual appliances (NVAs) and Azure’s virtual network routing, using Border Gateway Protocol (BGP). It acts as a bridge between your BGP-capable NVA and Azure’s control plane.&lt;/p&gt;
&lt;p&gt;In plain terms: it lets your NVA advertise and learn routes dynamically, without needing API access or route table edits.&lt;/p&gt;
&lt;h3 id="key-capabilities"&gt;Key capabilities
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;BGP peering between Azure and your NVA&lt;/li&gt;
&lt;li&gt;Dynamic route updates from NVA → VNet and vice versa&lt;/li&gt;
&lt;li&gt;No need for manual UDR updates for many routing changes&lt;/li&gt;
&lt;li&gt;Supports active/active and active/passive appliance setups&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;Basic flow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Deploy Azure Route Server into a dedicated /27 subnet (RouteServerSubnet) in your VNet&lt;/li&gt;
&lt;li&gt;Deploy your NVA in the same or peered VNet with BGP enabled&lt;/li&gt;
&lt;li&gt;Configure BGP peering between Azure Route Server and your NVA (ASNs, IPs)&lt;/li&gt;
&lt;li&gt;Routes learned by your NVA are injected into Azure’s routing fabric&lt;/li&gt;
&lt;li&gt;Azure can also advertise “default routes” and VNet address space back to the NVA&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="real-world-impact"&gt;Real-world impact
&lt;/h3&gt;&lt;p&gt;Let’s say you&amp;rsquo;re using a third-party firewall or SD-WAN appliance to control all outbound traffic.&lt;/p&gt;
&lt;p&gt;With Azure Route Server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The NVA advertises a 0.0.0.0/0 default route to Azure via BGP&lt;/li&gt;
&lt;li&gt;Azure updates the route tables dynamically, no UDR required&lt;/li&gt;
&lt;li&gt;As workloads scale, new subnets automatically follow the NVA without needing manual updates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deploy another appliance? Adjust policy? As long as your BGP config is updated on the appliance, Azure routes follow.&lt;/p&gt;
&lt;h2 id="architecture-diagram"&gt;Architecture Diagram
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart TD
Workload1[App VM Subnet] --&gt;|Default route| AzureInfra[VNet Fabric]
AzureInfra --&gt; RS[Azure Route Server]
RS --&gt;|BGP Advertise| NVA1["Firewall/NVA"]
RS &lt;--&gt; NVA1
NVA1 --&gt;|"0.0.0.0/0 via BGP"| RS
RS --&gt; AzureInfra
AzureInfra --&gt; Internet
subgraph Azure VNet
Workload1
RS
NVA1
end
&lt;/div&gt;
&lt;h2 id="azure-implementation"&gt;Azure Implementation
&lt;/h2&gt;&lt;h3 id="azure-portal-steps"&gt;Azure Portal Steps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deploy virtual network&lt;/strong&gt; with &lt;code&gt;/27&lt;/code&gt; subnet named &lt;code&gt;RouteServerSubnet&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy Azure Route Server&lt;/strong&gt; into that subnet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy NVA&lt;/strong&gt; (with BGP enabled) into same VNet or peered VNet&lt;/li&gt;
&lt;li&gt;Use CLI or Portal to configure BGP peering:
&lt;ul&gt;
&lt;li&gt;ASN for your NVA&lt;/li&gt;
&lt;li&gt;NVA BGP peer IP&lt;/li&gt;
&lt;li&gt;Enable &lt;code&gt;peerASN&lt;/code&gt;, &lt;code&gt;peerIP&lt;/code&gt;, &lt;code&gt;bgpPeeringEnabled&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Verify routing table on VM shows NVA via dynamic route&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-deployment-example"&gt;Bicep Deployment Example
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-vnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rsSubnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RouteServerSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/26&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2020-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myRouteServer-pip&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddressVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IPv4&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;idleTimeoutInMinutes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;RouteServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualHubs@2020-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myRouteServer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipconfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualHubs/ipConfigurations@2020-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myRouteServer-ipconfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;RouteServer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rsSubnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Note: Azure Route Server uses ASN 65515. Your NVA must use a different ASN.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NVA must support BGP&lt;/strong&gt;: Not all appliances support this out of the box—check feature sets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No UDRs with same prefixes&lt;/strong&gt;: They’ll override BGP-learned routes. Remove conflicting UDRs where Route Server is in use&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVA failover needs BFD or control plane detection&lt;/strong&gt;: Otherwise route withdrawal is slow&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Works best within one region/VNet.&lt;/strong&gt; Peering adds complexity to route propagation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;/27 subnet for RouteServerSubnet&lt;/strong&gt; (mandatory requirement)&lt;/li&gt;
&lt;li&gt;Always &lt;strong&gt;validate route propagation&lt;/strong&gt; using &lt;code&gt;Get-AzEffectiveRouteTable&lt;/code&gt; or Network Watcher&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid static UDRs&lt;/strong&gt; on subnets meant to follow BGP-learned routes&lt;/li&gt;
&lt;li&gt;Monitor with &lt;strong&gt;Network Insights&lt;/strong&gt; and logs from Route Server + NVA&lt;/li&gt;
&lt;li&gt;Design for &lt;strong&gt;active/passive failover&lt;/strong&gt; with route priorities or BGP communities&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Route Server changes the game for Azure routing at scale. If you’re managing NVAs with growing complexity or multi-region workloads, ditching static UDRs for BGP via Route Server is like going from instant coffee to single-origin pour over: smoother, smarter, and way more flexible. That said, test failover, keep BGP simple, and document like your life depends on it.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/route-server/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Route Server overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/route-server/peer-route-server-with-virtual-appliance?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Tutorial: Configure BGP peering between Azure Route Server and network virtual appliance (NVA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/virtual-network/manage-route-table#view-effective-routes?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Effective routes troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Next Hop, Please - Routing to Network Virtual Appliances (NVAs)</title><link>https://blog.brewedinthecloud.com/p/azure-routing-nva/</link><pubDate>Tue, 19 Aug 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-routing-nva/</guid><description>&lt;p&gt;Ever wonder how to tell your packets to take the scenic route through your security stack instead of bolting straight to the internet? That’s where NVAs and Azure routing step in. Whether you&amp;rsquo;re centralising inspection or shaping network flows, understanding next hops and the power of User Defined Routes (UDRs) is what keeps your Azure environment secure and predictable.&lt;/p&gt;
&lt;p&gt;If you missed our intro to routing and UDRs, check out &lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-routing-udr" target="_blank" rel="noopener"
&gt;Azure Route Tables 101 — Controlling Traffic in the Cloud&lt;/a&gt;. That post covers the basics: route types, priorities, and the ins and outs of custom routes. In this one, we’re building on that foundation — applying UDRs to route traffic through a network security stack using Network Virtual Appliances (NVAs) or Azure Firewall.&lt;/p&gt;
&lt;p&gt;Imagine your network traffic like a fleet of delivery vans. By default, they follow GPS (system routes) and take the shortest path to the destination. But if you’ve got a checkpoint (like a firewall), you’ll want to add some signs — custom routes — to guide them through it. Welcome to routing through NVAs.&lt;/p&gt;
&lt;h2 id="what-is-an-nva"&gt;What Is an NVA?
&lt;/h2&gt;&lt;p&gt;A Network Virtual Appliance (NVA) is a virtual machine that performs network-related functions — firewalls, proxy servers, intrusion detection systems, you name it. In Azure, it&amp;rsquo;s just another VM in a subnet, except instead of serving users, it&amp;rsquo;s inspecting and controlling traffic flows.&lt;/p&gt;
&lt;p&gt;NVAs are commonly used to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enforce centralised firewall policies&lt;/li&gt;
&lt;li&gt;Inspect traffic between on-prem and cloud&lt;/li&gt;
&lt;li&gt;Perform deep packet inspection (e.g., IDS/IPS)&lt;/li&gt;
&lt;li&gt;Proxy internet-bound traffic for logging or threat detection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Common options include third-party firewalls like Palo Alto, Fortinet, Check Point, or even native Azure solutions like &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/overview" target="_blank" rel="noopener"
&gt;Azure Firewall&lt;/a&gt;, which behaves like an NVA with cloud-native benefits.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;Azure sets up system routes automatically, letting your traffic flow between subnets, VNets, on-prem, or the internet. But to redirect traffic through an NVA, you need to override those defaults using &lt;strong&gt;User Defined Routes&lt;/strong&gt; (UDRs).&lt;/p&gt;
&lt;p&gt;The key is the “next hop” type. Here’s a quick refresher:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route Type&lt;/th&gt;
&lt;th&gt;Behaviour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Virtual Network&lt;/td&gt;
&lt;td&gt;Stays within the VNet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internet&lt;/td&gt;
&lt;td&gt;Points to the internet (default or override)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual Appliance&lt;/td&gt;
&lt;td&gt;Sends traffic to a specific IP address — like your NVA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Blackholes the traffic — useful for deliberate blocking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;To route through an NVA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a route with the destination CIDR (e.g. 0.0.0.0/0 for internet)&lt;/li&gt;
&lt;li&gt;Set the next hop to “Virtual Appliance”&lt;/li&gt;
&lt;li&gt;Enter the NVA’s private IP as the next hop address&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This gives you full control over east-west or north-south flows.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Here’s where this setup shines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Centralised security inspection&lt;/strong&gt;: All traffic from spoke VNets is filtered through a single point in the hub&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forced tunnelling&lt;/strong&gt;: Internet-bound packets must pass through an on-premises firewall or cloud-based NVA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;East-West flow control&lt;/strong&gt;: You can monitor and restrict traffic between subnets or VNets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach helps ensure you&amp;rsquo;re seeing and securing everything — not just trusting default paths.&lt;/p&gt;
&lt;h2 id="architecture-hub-and-spoke-with-azure-firewall"&gt;Architecture: Hub-and-Spoke with Azure Firewall
&lt;/h2&gt;&lt;p&gt;Let’s say you want all traffic from spoke VMs to be inspected before heading to the internet. You place Azure Firewall in the hub and customise routing to send everything through it.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TD
SpokeVM[Spoke VM] --&gt; |"10.0.0.0/16"| SpokeSubnet[Spoke Subnet]
SpokeSubnet --&gt; |"UDR: 0.0.0.0/0 → Firewall"| AzureFirewall[Azure Firewall in Hub]
AzureFirewall --&gt; Internet[Internet]
AzureFirewall --&gt; HubVNet[Hub VNet]
&lt;/div&gt;
&lt;p&gt;Key points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spoke VM wants to talk to the internet (or another spoke)&lt;/li&gt;
&lt;li&gt;UDR routes that traffic to Azure Firewall&lt;/li&gt;
&lt;li&gt;Firewall inspects and forwards traffic accordingly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is how you bring traditional perimeter-style security into your cloud landscape.&lt;/p&gt;
&lt;h2 id="azure-portal-steps"&gt;Azure Portal Steps
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Deploy Azure Firewall (or your preferred NVA) into the hub VNet&lt;/li&gt;
&lt;li&gt;Grab the private IP of the firewall&lt;/li&gt;
&lt;li&gt;Create a route table:
&lt;ul&gt;
&lt;li&gt;Prefix: &lt;code&gt;0.0.0.0/0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Next hop type: &lt;code&gt;Virtual Appliance&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Next hop IP: private IP of the firewall&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Associate that route table with the subnet in your spoke VNet&lt;/li&gt;
&lt;li&gt;Make sure IP forwarding is enabled on the NVA (not needed for Azure Firewall)&lt;/li&gt;
&lt;li&gt;Ensure NSGs allow traffic from your source subnet to the firewall&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="bicep-example"&gt;Bicep Example
&lt;/h2&gt;&lt;p&gt;Here’s a simple Bicep snippet for the UDR setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/routeTables@2022-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;spoke-udr&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default-to-nva&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0.0.0.0/0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualAppliance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopIpAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.4&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Make sure this IP has IP forwarding enabled if it’s a custom NVA&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Lookup existing VNET&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNet-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Assign the UDR to my spoke subnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySubnet-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;p&gt;Trying to route through NVAs? Watch out for these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IP Forwarding&lt;/strong&gt;: NVAs (except Azure Firewall) must have IP forwarding enabled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Return Path&lt;/strong&gt;: If return traffic skips the firewall, you’ll get asymmetric routing — and broken flows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Appliance scaling&lt;/strong&gt;: If your NVA scales out using VMSS, routing to a single IP becomes tricky. You might need a load balancer or go with Azure Firewall’s native scaling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPN/ER conflicts&lt;/strong&gt;: BGP-advertised routes from on-prem can override your UDRs unless you disable route propagation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use Azure Firewall if you&amp;rsquo;re going all-in on native tooling&lt;/li&gt;
&lt;li&gt;Always enable NSG flow logs — auditability is half the value&lt;/li&gt;
&lt;li&gt;Test routing with &lt;code&gt;az network watcher&lt;/code&gt; topologies or diagnostics&lt;/li&gt;
&lt;li&gt;Keep return traffic symmetric, or use Source NAT to ensure replies go back through the firewall&lt;/li&gt;
&lt;li&gt;Tag and document route tables carefully — circular or conflicting routes cause pain&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Routing to an NVA is like sending every coffee bean through the roaster before it hits your cup — it’s an extra stop, but absolutely critical for full-bodied security flavour. NVAs give you visibility, control, and compliance — but with added complexity. If you&amp;rsquo;re running at scale or want vendor-free simplicity, Azure Firewall might be the cleaner brew, but be mindful that it may not be as fully featured as your chosen NVA
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/tutorial-create-route-table-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;User-defined routes (UDRs) in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;What is Azure Firewall?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/windows-server/networking/sdn/manage/use-network-virtual-appliances-on-a-vn?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Network Virtual Appliances on a Virtual Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-network-interface#enable-ip-forwarding?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Enable IP forwarding for a VM NVA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Peering into the Void — Routing with VNet Peering</title><link>https://blog.brewedinthecloud.com/p/azure-routing-peering/</link><pubDate>Thu, 14 Aug 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-routing-peering/</guid><description>&lt;p&gt;Ever built a beautiful pair of Azure VNets, peered them, and then &amp;hellip; nothing. One side can&amp;rsquo;t talk to the other. It’s like building two suburbs with no connecting roads nobody’s able to drop around for a brew.&lt;/p&gt;
&lt;p&gt;This post is your roadmap for how routing works in VNet peering, both within a region and globally. We’ll look at how route propagation works (and where it doesn’t), plus those subtle peering settings that make the difference between smooth traffic and a silent timeout.&lt;/p&gt;
&lt;p&gt;Whether you’re building a hub-and-spoke architecture or just linking services across VNets, this is the guide to help you avoid routing pitfalls and get your packets home safe.&lt;/p&gt;
&lt;h2 id="what-is-vnet-peering"&gt;What is VNet Peering?
&lt;/h2&gt;&lt;p&gt;VNet peering connects two Azure virtual networks, letting resources talk to each other over the Microsoft backbone network, fast and low-latency.&lt;/p&gt;
&lt;p&gt;There are two flavours:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Intra-region peering&lt;/strong&gt; (within the same Azure region)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global VNet peering&lt;/strong&gt; (across different regions)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Peering is non-transitive which means VNets don’t automatically route through each other so routing must be deliberate. It doesn’t involve public IP traffic, just private addressing and internal routing.&lt;/p&gt;
&lt;h2 id="how-routing-works-with-vnet-peering"&gt;How Routing Works with VNet Peering
&lt;/h2&gt;&lt;p&gt;When VNets are peered, Azure automatically adds system routes so that each VNet can route traffic to the other&amp;rsquo;s address space.&lt;/p&gt;
&lt;p&gt;But there’s nuance, especially when it comes to gateways, UDRs, and route propagation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Peering Options That Matter:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Allow forwarded traffic&lt;/strong&gt;&lt;br&gt;
→ Required if traffic is coming from a third VNet, or through a NVA (like a firewall).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use remote gateway&lt;/strong&gt;&lt;br&gt;
→ Lets a spoke VNet use the hub’s VPN/ExpressRoute Gateway.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Routing Propagation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System routes between peered VNets are added automatically.&lt;/li&gt;
&lt;li&gt;UDRs (User Defined Routes) override system routes as expected.&lt;/li&gt;
&lt;li&gt;Propagation from a remote gateway works only if:
&lt;ul&gt;
&lt;li&gt;The hub VNet has a gateway.&lt;/li&gt;
&lt;li&gt;The spoke peering has &lt;em&gt;Use remote gateway: Enabled&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The hub peering has &lt;em&gt;Allow gateway transit: Enabled&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="real-world-use-case-hub-and-spoke-starter"&gt;Real-World Use Case: Hub and Spoke Starter
&lt;/h3&gt;&lt;p&gt;You’ve got:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hub VNet&lt;/strong&gt; with a VPN Gateway and an Azure Firewall&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spoke VNet&lt;/strong&gt; hosting workloads&lt;/li&gt;
&lt;li&gt;You want spoke traffic to route via the firewall for internet or VPN for on-prem traffic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s where the peering/router settings get real handy.&lt;/p&gt;
&lt;h2 id="implementation-peering--routing-via-bicep"&gt;Implementation: Peering &amp;amp; Routing via Bicep
&lt;/h2&gt;&lt;p&gt;Let’s walk through Bicep templates to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Deploy a Hub and Spoke VNet&lt;/li&gt;
&lt;li&gt;Peer them correctly&lt;/li&gt;
&lt;li&gt;Route spoke traffic through the firewall in the hub&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="architecture-overview"&gt;Architecture Overview
&lt;/h3&gt;&lt;div class="mermaid"&gt;graph TD
subgraph Hub VNet
A[FirewallSubnet]
B[Azure Firewall]
end
subgraph Spoke VNet
C[AppSubnet]
end
A --&gt; B
C -.-&gt; B
B --&gt; Internet[(Internet)]
&lt;/div&gt;
&lt;h3 id="1-define-vnets"&gt;1. Define VNets
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-vnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzureFirewallSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;spoke-vnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AppSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-peer-hub--spoke"&gt;2. Peer Hub ↔ Spoke
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeToHub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;spoke-to-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowGatewayTransit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useRemoteGateways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubToSpoke&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hub-to-spoke&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowGatewayTransit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useRemoteGateways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-add-route-table-in-spoke"&gt;3. Add Route Table in Spoke
&lt;/h3&gt;&lt;p&gt;You’ll need to push a UDR to the AppSubnet so that traffic destined for 0.0.0.0/0 routes to the Azure Firewall Private IP (assume 10.0.0.4 here).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/routeTables@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;spoke-udr&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default-route-to-firewall&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0.0.0.0/0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualAppliance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopIpAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.4&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetUpdate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AppSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Black holes from partial peering config:&lt;/strong&gt; If &lt;em&gt;Use remote gateway&lt;/em&gt; is enabled on one side but &lt;em&gt;Allow gateway transit&lt;/em&gt; is not enabled on the other, your routes won’t propagate, and the traffic goes nowhere.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UDRs always win:&lt;/strong&gt; If you set a UDR on a subnet, it overrides any propagated system or BGP routes—even if that UDR is broken.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global peering latency:&lt;/strong&gt; Still fast, still private, but slightly higher latency than intra-region.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No transitive peering:&lt;/strong&gt; If VNet A peers with B, and B with C, A can’t reach C unless directly peered.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Always validate both sides of a peering connection. Peering is a two-way street.&lt;/li&gt;
&lt;li&gt;Use &lt;em&gt;Allow forwarded traffic&lt;/em&gt; when routing via network virtual appliances or needing spoke-to-spoke via hub routes.&lt;/li&gt;
&lt;li&gt;For hub-and-spoke with VPN/ER gateways, &lt;em&gt;Enable one&lt;/em&gt;, &lt;em&gt;Use on the other&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Document peering topologies—spaghetti peerings are hard to unravel later.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; “It’s the network’s fault” is the unofficial motto of every mystery outage. Peering and routing often get set up once and forgotten, until something breaks, and traffic silently goes nowhere. The truth is, these settings are dead easy to overlook but critical to get right. Don’t assume routing will “just work” when you peer VNets, make verifying the peering config and effective routes your first step, not your last hope.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-peering-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Configure VNet Peering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/hybrid-networking/vnet-peering?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Route traffic between VNets using peering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/templates/microsoft.network/virtualnetworks/virtualnetworkpeerings?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Virtual Network Peering Bicep Resource&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Route Tables 101 — Controlling Traffic in the Cloud</title><link>https://blog.brewedinthecloud.com/p/azure-routing-udr/</link><pubDate>Tue, 12 Aug 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-routing-udr/</guid><description>&lt;p&gt;You can have the best security appliances, the cleanest IP schema, and a VNet layout that would make a CCIE weep with admiration, but if your routes aren’t right, your traffic&amp;rsquo;s not getting anywhere.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re connecting virtual machines, segmenting workloads, or forcing traffic through inspection hops, you have to understand how Azure route tables work. And more importantly, how to override the defaults when needed.&lt;/p&gt;
&lt;p&gt;Let’s ditch autopilot and take control of our network flows.&lt;/p&gt;
&lt;h2 id="what-are-azure-route-tables"&gt;What Are Azure Route Tables?
&lt;/h2&gt;&lt;p&gt;Azure route tables (known in the docs as “user-defined route tables” or UDRs) are your way of telling Azure how traffic should flow within your virtual networks.&lt;/p&gt;
&lt;p&gt;Out of the box, Azure adds a set of system routes to every subnet—these cover basic scenarios like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Traffic within the same VNet&lt;/li&gt;
&lt;li&gt;Internet-bound traffic&lt;/li&gt;
&lt;li&gt;Routing to peered VNets or service endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But when default isn&amp;rsquo;t enough—say you’re deploying a firewall or need to isolate traffic, you’ll define your own routes using UDRs.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;Azure performs routing at the subnet level. Each subnet can optionally be associated with a route table. Every outbound packet is evaluated against these rules in order of specificity.&lt;/p&gt;
&lt;p&gt;Routing decision order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;User-defined routes (UDRs)&lt;/strong&gt;: Always take priority when matched.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System routes&lt;/strong&gt;: Used when no UDR applies.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A single route table can be associated to multiple subnets, but each subnet can only have one route table.&lt;/p&gt;
&lt;p&gt;Each route has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Address prefix&lt;/strong&gt;: Destination range (CIDR format)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next hop type&lt;/strong&gt;: Where traffic should be sent
&lt;ul&gt;
&lt;li&gt;Virtual Appliance (e.g., firewall)&lt;/li&gt;
&lt;li&gt;Virtual Network Gateway&lt;/li&gt;
&lt;li&gt;Internet&lt;/li&gt;
&lt;li&gt;None (drop traffic)&lt;/li&gt;
&lt;li&gt;VNet Peering&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next hop IP&lt;/strong&gt;: Required for Virtual Appliance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sidebar: Can you assign UDRs to a NIC?
You might come across older blog posts or docs mentioning that route tables can be associated directly with a network interface (NIC). That was true once—but no longer.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Let’s explore basic traffic flow scenarios.&lt;/p&gt;
&lt;h3 id="traffic-within-a-vnet-default"&gt;Traffic within a VNet (default)
&lt;/h3&gt;&lt;p&gt;In a fresh VNet with two subnets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VM in Subnet A can talk to VM in Subnet B via default system route &lt;code&gt;10.0.0.0/16 → Virtual network&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No UDRs are required. Smooth traffic. Like coffee on a Monday morning, no surprises.&lt;/p&gt;
&lt;h3 id="vnet-peering"&gt;VNet peering
&lt;/h3&gt;&lt;p&gt;Peered VNets auto learn each other’s address ranges.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If VNet A (10.0.0.0/16) and VNet B (10.1.0.0/16) are peered, Azure adds system routes in both directions.&lt;/li&gt;
&lt;li&gt;Packets treat these destinations transparently, as if part of the same network fabric.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;UDRs can &lt;strong&gt;override&lt;/strong&gt; this behaviour if you want to insert a middlebox (like a firewall) or block access.&lt;/p&gt;
&lt;h3 id="force-traffic-through-a-firewall-defined"&gt;Force traffic through a firewall (Defined)
&lt;/h3&gt;&lt;p&gt;You can steer traffic to a firewall by creating a UDR:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Destination: &lt;code&gt;0.0.0.0/0&lt;/code&gt; (assumes catching all outbound)&lt;/li&gt;
&lt;li&gt;Next hop: Virtual Appliance&lt;/li&gt;
&lt;li&gt;Next hop IP: Firewall IP in same subnet/VNet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deploying this in the subnet&amp;rsquo;s route table forces outbound traffic through the firewall.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="example-isolate-a-subnet-from-the-internet"&gt;Example: Isolate a subnet from the internet
&lt;/h3&gt;&lt;p&gt;Block outbound internet access from a subnet completely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Route Table:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name: DenyInternet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Route:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Address prefix: 0.0.0.0/0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Next hop: None
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="azure-portal-steps"&gt;Azure Portal Steps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;From the Azure Portal, go to &lt;strong&gt;Route Tables &amp;gt; + Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Name it e.g., &lt;code&gt;DenyInternet&lt;/code&gt;, assign it to a region and resource group.&lt;/li&gt;
&lt;li&gt;Once created, go to &lt;strong&gt;Routes &amp;gt; + Add&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Address prefix: &lt;code&gt;0.0.0.0/0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Next hop type: &lt;code&gt;None&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Subnets &amp;gt; Associate &amp;gt; Select VNet and Subnet&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Traffic from that subnet now has nowhere to go.&lt;/p&gt;
&lt;h3 id="bicep-example"&gt;Bicep Example
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/routeTables@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DenyInternet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;disableBgpRoutePropagation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;blockInternet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0.0.0.0/0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nextHopType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;None&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNet-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySubnet-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routeTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="diagram-routing-via-udr"&gt;Diagram: Routing via UDR
&lt;/h2&gt;&lt;div class="mermaid"&gt;graph TD
sub1[Subnet A]
sub2[Subnet B]
fw["Firewall (NVA)"]
internet[Internet]
sub1 -- UDR: 0.0.0.0/0 --&gt; fw
fw --&gt; internet
sub2 --&gt; internet
&lt;/div&gt;
&lt;p&gt;In this example, only Subnet A is forced through the firewall, while Subnet B maintains default internet access.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UDRs only affect outbound traffic from the subnet&lt;/strong&gt;. Inbound traffic still relies on other routes and NSGs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service endpoints and private endpoints&lt;/strong&gt; can interact subtly with UDRs—be mindful of forced tunnelling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don’t drop all routes unintentionally&lt;/strong&gt;. Setting &lt;code&gt;0.0.0.0/0 → None&lt;/code&gt; blocks all egress. Great for isolation, but painful when you forget an exception for Azure services.&lt;/li&gt;
&lt;li&gt;If using &lt;strong&gt;Azure Firewall&lt;/strong&gt;, be sure to route &lt;strong&gt;only&lt;/strong&gt; egress via it, unless it&amp;rsquo;s also configured for east-west subnet flows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;least routes&lt;/strong&gt; needed—more routes mean more complexity.&lt;/li&gt;
&lt;li&gt;Group related subnets with shared egress paths to the same route table.&lt;/li&gt;
&lt;li&gt;When using firewalls or NVAs, make sure to apply &lt;strong&gt;health probes and failover logic.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Build &lt;strong&gt;layered security&lt;/strong&gt;: route + NSG + Azure Firewall = defence in depth.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;The default system routes in Azure are surprisingly good—until they aren&amp;rsquo;t.&lt;br&gt;
The moment you need to inspect, isolate, or redirect traffic, UDRs become essential. But with great route tables comes great responsibility. Don&amp;rsquo;t just copy/paste. Understand what traffic you&amp;rsquo;re catching and where it’s headed.&lt;/p&gt;
&lt;p&gt;Start simple. Test in a sandbox. Then scale out your design.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/virtual-network/virtual-networks-udr-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Docs: User-defined routes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-udr-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure virtual network traffic routing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AVNM + IPAM: Finally, Centralised Address Management without the Spreadsheet</title><link>https://blog.brewedinthecloud.com/p/azure-avnm-ipam/</link><pubDate>Thu, 31 Jul 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-avnm-ipam/</guid><description>&lt;p&gt;If you’ve ever inherited a half-broken Excel workbook to manage IP ranges across dozens of VNets, you already know the pain. No validation, no automation, no mercy.&lt;/p&gt;
&lt;p&gt;Well, grab your coffee, Azure Virtual Network Manager (AVNM) just got a serious upgrade: built-in IP Address Management (IPAM).&lt;/p&gt;
&lt;p&gt;This feature rounds out AVNM as a first-party control plane for enterprise-scale networking. Let&amp;rsquo;s get into what it is, how it works, and why it&amp;rsquo;s a game-changer.&lt;/p&gt;
&lt;h2 id="what-is-avnm-ipam"&gt;What is AVNM IPAM?
&lt;/h2&gt;&lt;p&gt;AVNM’s IP Address Management (IPAM) is a native Azure capability for centrally managing private IP address spaces across your Virtual Networks, without flogging spreadsheets or building DIY governance layers.&lt;/p&gt;
&lt;h3 id="common-uses"&gt;Common Uses
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Automating IP address assignment at scale&lt;/li&gt;
&lt;li&gt;Preventing overlapping CIDR allocations across business units&lt;/li&gt;
&lt;li&gt;Standardising subnet ranges within environments (e.g., non-prod, prod)&lt;/li&gt;
&lt;li&gt;Improving visibility for audit and growth planning&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="key-features"&gt;Key Features
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Centrally manage IP spaces within an AVNM scope&lt;/li&gt;
&lt;li&gt;Create and assign child IP prefixes to VNets and subnets&lt;/li&gt;
&lt;li&gt;Enforce address allocation policies to avoid overlaps&lt;/li&gt;
&lt;li&gt;Visualise and track IP usage across regions and subscriptions&lt;/li&gt;
&lt;li&gt;Integrate directly with VNet creation and subnet allocation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think of it as an address ledger with guardrails — and it&amp;rsquo;s built right into the same control plane you&amp;rsquo;re (hopefully) already using for network groupings and connectivity configurations.&lt;/p&gt;
&lt;h2 id="architecture-view"&gt;Architecture View
&lt;/h2&gt;&lt;div class="mermaid"&gt;graph TD
AVNM[Azure Virtual Network Manager]
IPAMPool[IPAM Pool]
ParentPrefix["Parent Prefix (e.g., 10.1.0.0/16)"]
ChildPrefix1["Child Prefix (10.1.1.0/24)"]
ChildPrefix2["Child Prefix (10.1.2.0/24)"]
VNet1[VNet A]
VNet2[VNet B]
AVNM --&gt; IPAMPool
IPAMPool --&gt; ParentPrefix
ParentPrefix --&gt; ChildPrefix1 --&gt; VNet1
ParentPrefix --&gt; ChildPrefix2 --&gt; VNet2
&lt;/div&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an IPAM Pool&lt;/strong&gt;&lt;br&gt;
This acts as a container for your IP space hierarchy. You can have one or more per AVNM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define Parent Prefixes&lt;/strong&gt;&lt;br&gt;
These are top-level CIDR ranges you plan to carve up (e.g. 10.0.0.0/8). These must be non-overlapping per IPAM Pool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Allocate Child Prefixes&lt;/strong&gt;&lt;br&gt;
Carve out smaller address blocks — like 10.0.1.0/24 — from your parent prefix. These can be assigned manually to VNets or automatically through deployment tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Track IP Usage and Availability&lt;/strong&gt;&lt;br&gt;
IPAM gives you visibility into what&amp;rsquo;s been used, what&amp;rsquo;s free, and what’s assigned where — all within the AVNM scope.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Before IPAM, Azure customers had a few not-so-great options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manual IP range tracking with spreadsheets (error-prone and unscalable)&lt;/li&gt;
&lt;li&gt;Custom solutions using Tags, Policies, or scripts (hard to maintain)&lt;/li&gt;
&lt;li&gt;Over-architecting with CIDR guesswork to avoid future conflicts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now with IPAM baked into AVNM:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Network teams get full control over address planning and enforcement&lt;/li&gt;
&lt;li&gt;App teams can consume space predictably without stepping on toes&lt;/li&gt;
&lt;li&gt;Governance and growth are no longer mutually exclusive&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;Let’s walk through allocating a prefix to a new VNet using Azure Portal and Bicep.&lt;/p&gt;
&lt;h3 id="azure-portal"&gt;Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Azure Virtual Network Manager&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select your &lt;strong&gt;AVNM scope&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;IPAM&lt;/strong&gt;, create an &lt;strong&gt;IPAM Pool&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Add a &lt;strong&gt;Parent Prefix&lt;/strong&gt; — e.g., &lt;code&gt;10.1.0.0/16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Allocate a &lt;strong&gt;Child Prefix&lt;/strong&gt; — e.g., &lt;code&gt;10.1.1.0/24&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;When creating a new VNet, select &lt;strong&gt;Use IPAM&lt;/strong&gt; and bind it to your AVNM and specific prefix&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example-hub--spoke-with-ipam"&gt;Bicep Example: Hub &amp;amp; Spoke with IPAM
&lt;/h3&gt;&lt;p&gt;This example sets up a Network Manager and IPAM Pool, then creates a Hub and Spoke VNet pair — each allocated dynamically from the pool.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Network Manager&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myNetworkManager&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create the Azure Virtual Network Manager (AVNM)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopeAccesses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Connectivity&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SecurityAdmin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmIPAM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/ipamPools@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IPAM-AUEast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Parent prefix for Australia East VNets&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create AU East Hub VNet and use IPAM Pool for prefix allocation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEasthubVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyHubVNet-AUEast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamPoolPrefixAllocations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmIPAM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;numberOfIpAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;256&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// requests a /24 prefix from the IPAM Pool. Azure will automatically assign a non-overlapping block of that size.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;HubNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create AU East Spoke VNet and use IPAM Pool for prefix allocation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEastspokeVnet01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySpokeVNet01-AUEast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamPoolPrefixAllocations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmIPAM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;numberOfIpAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;256&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// requests a /24 prefix from the IPAM Pool. Azure will automatically assign a non-overlapping block of that size.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No retroactive allocations&lt;/strong&gt;: You can only assign prefixes to VNets that opt-in to IPAM. Existing VNets without IPAM are left untouched.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforcement isn’t universal&lt;/strong&gt;: IPAM doesn’t stop someone from manually typing in a bad address — yet. Policy integration is coming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Doesn’t manage public IPs&lt;/strong&gt;: This is strictly private address space for now.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Plan your hierarchy early&lt;/strong&gt;: Define parent blocks at /16 or similar size for long-term flexibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One IPAM Group per environment or region&lt;/strong&gt;: Keeps things clean and logically segmented.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automate allocations&lt;/strong&gt;: Use Bicep or Terraform to keep it consistent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable IPAM with NetOps, not after&lt;/strong&gt;: This isn’t a bolt-on; make it part of your standard network provisioning flow.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; IPAM in AVNM isn’t flashy, but it solves a problem almost every serious Azure deployment hits eventually. The lack of centralised IP tracking was a blind spot – this fixes it, cleanly and natively. More importantly: it keeps networking out of Excel. That alone deserves a toast.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-ip-address-management?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;IP Address Management with AVNM – Microsoft Docs&lt;/a&gt;&lt;br&gt;
Official overview of IPAM features and capabilities inside Azure Virtual Network Manager&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;AVNM Overview&lt;/a&gt;&lt;br&gt;
Starts from the top: what AVNM is, why it matters, and where IPAM fits in&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-connectivity-configuration?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Connectivity configurations in AVNM&lt;/a&gt;&lt;br&gt;
Learn how to layer IPAM with custom connectivity across VNets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/templates/microsoft.network/networkmanagers?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep Templates for AVNM / IPAM&lt;/a&gt;&lt;br&gt;
Full Bicep reference for deploying AVNM components&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Virtual Network Manager for Disaster Recovery</title><link>https://blog.brewedinthecloud.com/p/azure-avnm-dr/</link><pubDate>Tue, 29 Jul 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-avnm-dr/</guid><description>&lt;p&gt;When a regional outage hits—or someone trips over a network cable in the wrong data centre your we need to enact our Disaster Recovery plan. If you don&amp;rsquo;t have one, get one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AVNM doesn’t replace DR, but it can sure make it more resilient and repeatable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post explores how to design AVNM with disaster recovery in mind, covering regional network segmentation, active/passive VNets, and failover patterns that actually hold up under pressure.&lt;/p&gt;
&lt;h2 id="what-is-disaster-recovery-dr-in-the-context-of-avnm"&gt;What is Disaster Recovery (DR) in the context of AVNM?
&lt;/h2&gt;&lt;p&gt;In Azure, Disaster Recovery planning means replicating your workloads and network configurations across regions to maintain availability during outages. AVNM helps by centralising network topology and connectivity rules, allowing consistent failover designs across your environments.&lt;/p&gt;
&lt;p&gt;AVNM doesn’t manage replication or data for that you need to look towards services like Azure Site Recovery or Azure Backup. But it is critical in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensuring consistent network security rules across primary and secondary regions&lt;/li&gt;
&lt;li&gt;Deploying connectivity rules (mesh, hub-spoke) as code&lt;/li&gt;
&lt;li&gt;Reducing risk of drift between your recovery and production network topologies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short: AVNM helps your failover network behave like your production network—without extra manual effort.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;AVNM lets you define network groups and configurations (connectivity and security rules) centrally. You can apply these across VNets within and across regions. AVNM’s strength in DR is its ability to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manage cross-region connectivity policies&lt;/li&gt;
&lt;li&gt;Apply consistent NSGs and admin rules (via Security Admin Rules)&lt;/li&gt;
&lt;li&gt;Integrate into CI/CD pipelines for automated, ring-fenced deployment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In disaster recovery, you typically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mirror your VNet topologies across regions&lt;/li&gt;
&lt;li&gt;Use AVNM to apply the same connectivity/security configurations to both sides&lt;/li&gt;
&lt;li&gt;Trigger failover and know that the secondary region behaves like production&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Let’s say you run an internal app stack with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Firewall and monitoring in a shared services VNet&lt;/li&gt;
&lt;li&gt;Web + API + SQL tiers split across VNets in a production region&lt;/li&gt;
&lt;li&gt;A full mirror of the above in a failover region&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without AVNM:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You manage peering, security groups, and routing in both regions manually&lt;/li&gt;
&lt;li&gt;Any deviations hurt when failover is needed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With AVNM:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You define once, apply to both&lt;/li&gt;
&lt;li&gt;Your DR region becomes predictable, testable, and deployment-safe&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="scenario-activepassive-split-across-regions"&gt;Scenario: Active/Passive split across regions
&lt;/h3&gt;&lt;p&gt;You’ve got:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primary in Australia East&lt;/li&gt;
&lt;li&gt;Secondary in Australia Southeast&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You’ve built matching VNets: &lt;code&gt;prod-web&lt;/code&gt;, &lt;code&gt;prod-api&lt;/code&gt;, &lt;code&gt;prod-db&lt;/code&gt; in both regions. Traffic is normally served from the primary. Failover is DNS-based or routed via Azure Traffic Manager / Front Door.&lt;/p&gt;
&lt;h3 id="avnm-approach"&gt;AVNM Approach
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Create a network group that includes both regions&amp;rsquo; VNets&lt;/li&gt;
&lt;li&gt;Set up a hub-and-spoke security config for each region&lt;/li&gt;
&lt;li&gt;Apply the same configuration to both sets via AVNM&lt;/li&gt;
&lt;li&gt;Use Policy/Tags to enforce DR region VNets are always included&lt;/li&gt;
&lt;li&gt;(Advanced) Integrate with an automation pipeline to validate drift and deploy config updates&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="azure-portal-steps"&gt;Azure Portal Steps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to AVNM in Portal&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create or select a Network Group&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use dynamic membership rules—example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tag.region = australiaeast
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tag.region = australiasoutheast
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Define a Connectivity Configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Topology: Hub and Spoke&lt;/li&gt;
&lt;li&gt;Assign matching Hubs per region&lt;/li&gt;
&lt;li&gt;Add all VNets using dynamic rules&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Define a Security Admin Rule Collection:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow: L3 inbound between Trusted VNets (e.g., API -&amp;gt; DB)&lt;/li&gt;
&lt;li&gt;Deny: Internet inbound except Web zone&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example"&gt;Bicep Example
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;In this example we are deploying two Virtual Networks in each Australia region connecting them using a Hub-n-Spoke topology and then applying security rules. Note that the example is missing the deployment scripts to deploy the configurations but you can get that from my previous posts.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;span class="lnt"&gt;127
&lt;/span&gt;&lt;span class="lnt"&gt;128
&lt;/span&gt;&lt;span class="lnt"&gt;129
&lt;/span&gt;&lt;span class="lnt"&gt;130
&lt;/span&gt;&lt;span class="lnt"&gt;131
&lt;/span&gt;&lt;span class="lnt"&gt;132
&lt;/span&gt;&lt;span class="lnt"&gt;133
&lt;/span&gt;&lt;span class="lnt"&gt;134
&lt;/span&gt;&lt;span class="lnt"&gt;135
&lt;/span&gt;&lt;span class="lnt"&gt;136
&lt;/span&gt;&lt;span class="lnt"&gt;137
&lt;/span&gt;&lt;span class="lnt"&gt;138
&lt;/span&gt;&lt;span class="lnt"&gt;139
&lt;/span&gt;&lt;span class="lnt"&gt;140
&lt;/span&gt;&lt;span class="lnt"&gt;141
&lt;/span&gt;&lt;span class="lnt"&gt;142
&lt;/span&gt;&lt;span class="lnt"&gt;143
&lt;/span&gt;&lt;span class="lnt"&gt;144
&lt;/span&gt;&lt;span class="lnt"&gt;145
&lt;/span&gt;&lt;span class="lnt"&gt;146
&lt;/span&gt;&lt;span class="lnt"&gt;147
&lt;/span&gt;&lt;span class="lnt"&gt;148
&lt;/span&gt;&lt;span class="lnt"&gt;149
&lt;/span&gt;&lt;span class="lnt"&gt;150
&lt;/span&gt;&lt;span class="lnt"&gt;151
&lt;/span&gt;&lt;span class="lnt"&gt;152
&lt;/span&gt;&lt;span class="lnt"&gt;153
&lt;/span&gt;&lt;span class="lnt"&gt;154
&lt;/span&gt;&lt;span class="lnt"&gt;155
&lt;/span&gt;&lt;span class="lnt"&gt;156
&lt;/span&gt;&lt;span class="lnt"&gt;157
&lt;/span&gt;&lt;span class="lnt"&gt;158
&lt;/span&gt;&lt;span class="lnt"&gt;159
&lt;/span&gt;&lt;span class="lnt"&gt;160
&lt;/span&gt;&lt;span class="lnt"&gt;161
&lt;/span&gt;&lt;span class="lnt"&gt;162
&lt;/span&gt;&lt;span class="lnt"&gt;163
&lt;/span&gt;&lt;span class="lnt"&gt;164
&lt;/span&gt;&lt;span class="lnt"&gt;165
&lt;/span&gt;&lt;span class="lnt"&gt;166
&lt;/span&gt;&lt;span class="lnt"&gt;167
&lt;/span&gt;&lt;span class="lnt"&gt;168
&lt;/span&gt;&lt;span class="lnt"&gt;169
&lt;/span&gt;&lt;span class="lnt"&gt;170
&lt;/span&gt;&lt;span class="lnt"&gt;171
&lt;/span&gt;&lt;span class="lnt"&gt;172
&lt;/span&gt;&lt;span class="lnt"&gt;173
&lt;/span&gt;&lt;span class="lnt"&gt;174
&lt;/span&gt;&lt;span class="lnt"&gt;175
&lt;/span&gt;&lt;span class="lnt"&gt;176
&lt;/span&gt;&lt;span class="lnt"&gt;177
&lt;/span&gt;&lt;span class="lnt"&gt;178
&lt;/span&gt;&lt;span class="lnt"&gt;179
&lt;/span&gt;&lt;span class="lnt"&gt;180
&lt;/span&gt;&lt;span class="lnt"&gt;181
&lt;/span&gt;&lt;span class="lnt"&gt;182
&lt;/span&gt;&lt;span class="lnt"&gt;183
&lt;/span&gt;&lt;span class="lnt"&gt;184
&lt;/span&gt;&lt;span class="lnt"&gt;185
&lt;/span&gt;&lt;span class="lnt"&gt;186
&lt;/span&gt;&lt;span class="lnt"&gt;187
&lt;/span&gt;&lt;span class="lnt"&gt;188
&lt;/span&gt;&lt;span class="lnt"&gt;189
&lt;/span&gt;&lt;span class="lnt"&gt;190
&lt;/span&gt;&lt;span class="lnt"&gt;191
&lt;/span&gt;&lt;span class="lnt"&gt;192
&lt;/span&gt;&lt;span class="lnt"&gt;193
&lt;/span&gt;&lt;span class="lnt"&gt;194
&lt;/span&gt;&lt;span class="lnt"&gt;195
&lt;/span&gt;&lt;span class="lnt"&gt;196
&lt;/span&gt;&lt;span class="lnt"&gt;197
&lt;/span&gt;&lt;span class="lnt"&gt;198
&lt;/span&gt;&lt;span class="lnt"&gt;199
&lt;/span&gt;&lt;span class="lnt"&gt;200
&lt;/span&gt;&lt;span class="lnt"&gt;201
&lt;/span&gt;&lt;span class="lnt"&gt;202
&lt;/span&gt;&lt;span class="lnt"&gt;203
&lt;/span&gt;&lt;span class="lnt"&gt;204
&lt;/span&gt;&lt;span class="lnt"&gt;205
&lt;/span&gt;&lt;span class="lnt"&gt;206
&lt;/span&gt;&lt;span class="lnt"&gt;207
&lt;/span&gt;&lt;span class="lnt"&gt;208
&lt;/span&gt;&lt;span class="lnt"&gt;209
&lt;/span&gt;&lt;span class="lnt"&gt;210
&lt;/span&gt;&lt;span class="lnt"&gt;211
&lt;/span&gt;&lt;span class="lnt"&gt;212
&lt;/span&gt;&lt;span class="lnt"&gt;213
&lt;/span&gt;&lt;span class="lnt"&gt;214
&lt;/span&gt;&lt;span class="lnt"&gt;215
&lt;/span&gt;&lt;span class="lnt"&gt;216
&lt;/span&gt;&lt;span class="lnt"&gt;217
&lt;/span&gt;&lt;span class="lnt"&gt;218
&lt;/span&gt;&lt;span class="lnt"&gt;219
&lt;/span&gt;&lt;span class="lnt"&gt;220
&lt;/span&gt;&lt;span class="lnt"&gt;221
&lt;/span&gt;&lt;span class="lnt"&gt;222
&lt;/span&gt;&lt;span class="lnt"&gt;223
&lt;/span&gt;&lt;span class="lnt"&gt;224
&lt;/span&gt;&lt;span class="lnt"&gt;225
&lt;/span&gt;&lt;span class="lnt"&gt;226
&lt;/span&gt;&lt;span class="lnt"&gt;227
&lt;/span&gt;&lt;span class="lnt"&gt;228
&lt;/span&gt;&lt;span class="lnt"&gt;229
&lt;/span&gt;&lt;span class="lnt"&gt;230
&lt;/span&gt;&lt;span class="lnt"&gt;231
&lt;/span&gt;&lt;span class="lnt"&gt;232
&lt;/span&gt;&lt;span class="lnt"&gt;233
&lt;/span&gt;&lt;span class="lnt"&gt;234
&lt;/span&gt;&lt;span class="lnt"&gt;235
&lt;/span&gt;&lt;span class="lnt"&gt;236
&lt;/span&gt;&lt;span class="lnt"&gt;237
&lt;/span&gt;&lt;span class="lnt"&gt;238
&lt;/span&gt;&lt;span class="lnt"&gt;239
&lt;/span&gt;&lt;span class="lnt"&gt;240
&lt;/span&gt;&lt;span class="lnt"&gt;241
&lt;/span&gt;&lt;span class="lnt"&gt;242
&lt;/span&gt;&lt;span class="lnt"&gt;243
&lt;/span&gt;&lt;span class="lnt"&gt;244
&lt;/span&gt;&lt;span class="lnt"&gt;245
&lt;/span&gt;&lt;span class="lnt"&gt;246
&lt;/span&gt;&lt;span class="lnt"&gt;247
&lt;/span&gt;&lt;span class="lnt"&gt;248
&lt;/span&gt;&lt;span class="lnt"&gt;249
&lt;/span&gt;&lt;span class="lnt"&gt;250
&lt;/span&gt;&lt;span class="lnt"&gt;251
&lt;/span&gt;&lt;span class="lnt"&gt;252
&lt;/span&gt;&lt;span class="lnt"&gt;253
&lt;/span&gt;&lt;span class="lnt"&gt;254
&lt;/span&gt;&lt;span class="lnt"&gt;255
&lt;/span&gt;&lt;span class="lnt"&gt;256
&lt;/span&gt;&lt;span class="lnt"&gt;257
&lt;/span&gt;&lt;span class="lnt"&gt;258
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Configuration type to deploy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;configType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Connectivity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create AU East Hub VNet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEasthubVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyHubVNet-AUEast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;HubNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Spoke VNets&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEastspokeVnet01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySpokeVNet01-AUEast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create AU Southeast Hub VNet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auSoutheastHubVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyHubVNet-AUSouth&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiasoutheast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.10.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;HubNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiasoutheast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Spoke VNets&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auSoutheastspokeVnet01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySpokeVNet01-AUSouth&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiasoutheast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.11.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiasoutheast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create AVNM in each region&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUEastavnm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mynetworkManager-AUEast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopeAccesses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;configType&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUSouthavnm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mynetworkManager-AUSouth&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiasoutheast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopeAccesses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;configType&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Network Groups&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEasthubGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUEastavnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AUEast-HubGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AU East Hub VNet group&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auSoutheasthubGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUSouthavnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AUSouth-HubGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AU Southeast Hub VNet group&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Static Network Groups for Hubs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUEastStaticNetworkGroupHub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups/staticMembers@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEasthubGroup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AVNM-AUEast-HubGroup-Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEasthubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUSouthStaticNetworkGroupHub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups/staticMembers@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auSoutheasthubGroup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AVNM-AUSouth-HubGroup-Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auSoutheastHubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Dynamic Network Groups for Spokes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEastSpokeGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUEastavnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AUEast-prod-vnets&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Production VNets tagged environment=production &amp;amp; region=australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dynamicMembershipDefinition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;criteria&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;memberType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tag.environment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Equals&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;memberType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tag.region&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Equals&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Dynamic Network Groups for Spokes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auSouthSpokeGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUSouthavnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AUSouth-prod-vnets&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Production VNets tagged environment=production &amp;amp; region=australiasoutheast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dynamicMembershipDefinition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;criteria&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;memberType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tag.environment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Equals&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;memberType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tag.region&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Equals&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiasoutheast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Azure Policy for dynamic network group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmAUEastDynamicProductionNetworkGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnm-policy-networkgroup-aueast.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnm-dynamic-production-aueast-network-group-policy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mynetworkManager-AUEast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEasthubGroup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmAUSouthDynamicProductionNetworkGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnm-policy-networkgroup-ausouth.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnm-dynamic-production-ausouth-network-group-policy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mynetworkManager-AUSouth&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auSoutheasthubGroup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Connectivity Configuration (Hub-and-Spoke)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUEastconnectivityConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/connectivityConfigurations@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUEastavnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hubAndSpokeConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectivityTopology&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;HubAndSpoke&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEasthubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appliesToGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupConnectivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;None&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkGroupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auEastSpokeGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useHubGateway&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;True&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isGlobal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;False&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Hub-and-spoke connectivity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUSouthconnectivityConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/connectivityConfigurations@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AUSouthavnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hubAndSpokeConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectivityTopology&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;HubAndSpoke&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auSoutheastHubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appliesToGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupConnectivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;None&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkGroupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;auSouthSpokeGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useHubGateway&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;True&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isGlobal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;False&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Hub-and-spoke connectivity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Latency between regional hubs&lt;/strong&gt;: Avoid cross-region mesh unless you&amp;rsquo;re really sure—firewall packet inspection adds rub.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic group membership&lt;/strong&gt;: Based on tags or names—great until someone renames things.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVA scenarios&lt;/strong&gt;: Injected routes or third-party appliances must have mirrored configs too. AVNM won’t fix asymmetric routing hell.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy deployments&lt;/strong&gt;: AVNM config changes can take minutes to fully propagate—be patient with failovers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Align regional DR VNets with matching naming and tagging standards&lt;/li&gt;
&lt;li&gt;Use dynamic network groups for easy inclusion of new VNets&lt;/li&gt;
&lt;li&gt;Validate AVNM configuration in both regions as part of DR tests&lt;/li&gt;
&lt;li&gt;Pair with Azure Policy to enforce required AVNM configuration&lt;/li&gt;
&lt;li&gt;Version-control AVNM definitions via IaC (Bicep, Terraform)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Too many DR setups assume “we’ll just replicate the app and connect stuff later”—but if your network isn’t aligned, failover equals facepalm. AVNM gets rid of tedious, error-prone per-region setups and gives you a DR network as predictable as a long black on Monday morning.&lt;/p&gt;
&lt;p&gt;Don’t wait until the outage.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Virtual Network Manager Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-connectivity-configuration?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Connectivity configurations in Azure Virtual Network Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/well-architected/reliability/disaster-recovery?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Architecture strategies for disaster recovery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/example-scenario/infrastructure/multi-tier-app-disaster-recovery?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Multi-tier web application built for HA/DR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Virtual Network Manager in Enterprise Landing Zones</title><link>https://blog.brewedinthecloud.com/p/azure-avnm-landing-zone/</link><pubDate>Thu, 24 Jul 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-avnm-landing-zone/</guid><description>&lt;p&gt;If you’ve ever tried wrangling networking in a landing zone deployment — half a dozen subscriptions, three environments, shared DNS, and a security team breathing down your neck — you already know: the pain’s real.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enter Azure Virtual Network Manager (AVNM)&lt;/strong&gt; — your new central control plane for enterprise-grade network governance.&lt;/p&gt;
&lt;h2 id="azure-landing-zones-a-quick-refresher"&gt;Azure Landing Zones: A Quick Refresher
&lt;/h2&gt;&lt;p&gt;Azure Landing Zones (ALZ) are the enterprise implementation of Microsoft’s &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Cloud Adoption Framework (CAF)&lt;/a&gt;. Think of them as blueprints for scaling cloud platforms in a secure-by-default, governed-by-design way.&lt;/p&gt;
&lt;p&gt;Key components often include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hub-and-spoke network topologies&lt;/li&gt;
&lt;li&gt;Central shared services (e.g. DNS, firewalls, logging)&lt;/li&gt;
&lt;li&gt;CI/CD-delivered connectivity and policy&lt;/li&gt;
&lt;li&gt;Split responsibilities between platform and application teams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But here’s the kicker — landing zones scale fast. And with speed comes complexity, especially in your network layer.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s where AVNM slips neatly into the picture.&lt;/p&gt;
&lt;h2 id="where-avnm-fits-in"&gt;Where AVNM Fits In
&lt;/h2&gt;&lt;p&gt;AVNM gives platform teams a way to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Define topology once&lt;/strong&gt; and apply it across subscriptions and environments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Centralise security enforcement&lt;/strong&gt; without duplicating NSG rules&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control peering and rule scoping&lt;/strong&gt; even in a multi-region, multi-team model&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplify change audits&lt;/strong&gt; all AVNM configs are declarative, tracked, and enforceable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of spending hours scripting peerings and distributing “golden” NSGs via ARM or Bicep templates, you define:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connectivity configurations&lt;/strong&gt; for hub-and-spoke or mesh topologies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security admin configurations&lt;/strong&gt; for egress lockdowns, segmentation walls, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network groups&lt;/strong&gt; scoped by tags to dynamically assign VNets to policies&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="avnm-as-a-platform-service-in-your-org-chart"&gt;AVNM as a Platform Service (in Your Org Chart)
&lt;/h2&gt;&lt;p&gt;Landing zones often divide responsibility like this:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;What They Deploy&lt;/th&gt;
&lt;th&gt;What They Should Own in AVNM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platform Team&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hub, firewalls, monitoring, base NSGs&lt;/td&gt;
&lt;td&gt;AVNM resource + all topology/security configs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Teams&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Spokes (VNets), subnets, workloads&lt;/td&gt;
&lt;td&gt;VNet deployment; inherit AVNM configs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security Team&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logging, SIEM, network policy&lt;/td&gt;
&lt;td&gt;Define security rule strategy, review rule collections&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;AVNM lets you enforce &lt;em&gt;connectivity guardrails and baseline security&lt;/em&gt; — without stopping apps from shipping.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;By deploying AVNM at the management group level, platform teams can apply topology + protections org-wide without taking away flexibility from application developers.&lt;/p&gt;
&lt;h2 id="network-group-strategy-in-landing-zones"&gt;Network Group Strategy in Landing Zones
&lt;/h2&gt;&lt;p&gt;Your AVNM Network Groups become the key scoping unit for applying rules and peering policies.&lt;/p&gt;
&lt;p&gt;Effective patterns include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;By environment:&lt;/strong&gt;&lt;br&gt;
Use tags like &lt;code&gt;environment=dev&lt;/code&gt;, &lt;code&gt;environment=prod&lt;/code&gt;&lt;br&gt;
→ Useful for applying per-environment egress rules and segmenting tiers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;By workload or platform zone:&lt;/strong&gt;&lt;br&gt;
Tags like &lt;code&gt;app=billing&lt;/code&gt;, &lt;code&gt;tier=data&lt;/code&gt;, &lt;code&gt;zone=shared&lt;/code&gt;&lt;br&gt;
→ Use this to isolate specific data-sensitive workloads&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;By function:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;role=core&lt;/code&gt; or &lt;code&gt;function=trusted-services&lt;/code&gt;&lt;br&gt;
→ For shared DNS zones, Active Directory, or jump boxes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Combine this with Azure Policy and tags and you’ve got scalable, human-readable, code-driven scoping with dynamic membership baked in.&lt;/p&gt;
&lt;h2 id="real-enterprise-use-cases"&gt;Real Enterprise Use Cases
&lt;/h2&gt;&lt;h3 id="1-perimeter-guardrails-for-every-vnet"&gt;1. Perimeter Guardrails for Every VNet
&lt;/h3&gt;&lt;p&gt;Stop egress to the internet across all VNets &lt;em&gt;except&lt;/em&gt; what’s explicitly allowed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DenyOutboundRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations/ruleCollections/rules@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecurityRuleCollection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DenyAllOutbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Custom&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny All outbound traffic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0-65535&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IPPrefix&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0-65535&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This rule lives in a Security Admin Configuration applied to a network group that matches all tagged VNets in dev and test environments. Simple, controlled, repeatable.&lt;/p&gt;
&lt;h3 id="2-hub-and-spoke-topology-as-a-service"&gt;2. Hub-and-Spoke Topology as a Service
&lt;/h3&gt;&lt;p&gt;In your Bicep module:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Network Manager&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myNetworkManager&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopeAccesses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Connectivity&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;managementGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/providers/Microsoft.Management/managementGroups/mg-platform&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;AVNM then auto-peers new spokes into the correct topology without scripts, with dynamic entitlement via tag-based Network Groups like &lt;code&gt;zone=shared-hub&lt;/code&gt; or &lt;code&gt;zone=app-spoke&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="3-zero-trust-segmentation-between-app-tiers"&gt;3. Zero Trust Segmentation Between App Tiers
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Create network groups for each trust zone (e.g. &lt;code&gt;tier=frontend&lt;/code&gt;, &lt;code&gt;tier=backend&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Use admin rules to deny cross-tier traffic by default&lt;/li&gt;
&lt;li&gt;Allow application-specific paths via NSGs or dedicated allow rules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach matches the &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/security/fundamentals/zero-trust?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;CAF Zero Trust strategy&lt;/a&gt; and avoids lateral movement with a single policy.&lt;/p&gt;
&lt;h3 id="4-spoke-isolation--shared-access"&gt;4. Spoke Isolation + Shared Access
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Apply connectivity config that links spokes to hub&lt;/li&gt;
&lt;li&gt;Apply admin rule that denies spoke-to-spoke traffic&lt;/li&gt;
&lt;li&gt;Hub implements central inspection/firewall/logging&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This pattern’s critical in regulated industries and helps with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Audit compliance&lt;/li&gt;
&lt;li&gt;Network simplicity&lt;/li&gt;
&lt;li&gt;Reduced blast radius&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="monitoring-and-azure-service-integration"&gt;Monitoring and Azure Service Integration
&lt;/h2&gt;&lt;p&gt;AVNM plays nicely with the rest of the Azure stack:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NSGs &amp;amp; ASGs:&lt;/strong&gt; Still valid — now layered beneath AVNM rules&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defender for Cloud:&lt;/strong&gt; Reports on AVNM rule misalignments + security insights&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log Analytics:&lt;/strong&gt; Use diagnostic settings on AVNM resources for audit trails&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Policy:&lt;/strong&gt; Enforce tagging and AVNM config presence using policy-as-code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="avnm-in-alz-topology-snapshot"&gt;AVNM in ALZ: Topology Snapshot
&lt;/h2&gt;&lt;div class="mermaid"&gt;%% AVNM in a Landing Zone Architecture
graph TD
MG[Management Group: Platform] --&gt; AVNM(Azure Virtual Network Manager)
AVNM --&gt; NGProd[Network Group: Prod VNets]
AVNM --&gt; NGDev[Network Group: Dev VNets]
AVNM --&gt; AVNMRules(Security Admin + Conn Configs)
subgraph Subscriptions
HubSub(Hub Subscription)
DevSub(Dev Subscription)
ProdSub(Prod Subscription)
HubVNet(Hub VNet)
DevVNet(Dev VNet)
ProdVNet(Prod VNet)
end
AVNMRules --&gt; DevVNet
AVNMRules --&gt; ProdVNet
HubVNet --&gt; DevVNet
HubVNet --&gt; ProdVNet
MG --&gt; HubSub
MG --&gt; DevSub
MG --&gt; ProdSub
&lt;/div&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deploy AVNM at the management group level&lt;/strong&gt; for complete coverage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use consistent tagging strategy&lt;/strong&gt; to simplify group scoping&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document rule intention&lt;/strong&gt; in Bicep descriptions or Git repositories&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delegate access clearly&lt;/strong&gt; because AVNM config should be owned like a platform product&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start with ReadOnly mode&lt;/strong&gt; when previewing admin rules impact&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Landing Zones without AVNM are like a good café with a terrible till — everything’s made with care, but no one’s quite sure who’s paid for what.&lt;/p&gt;
&lt;p&gt;AVNM solves the governance gap between thoughtful architecture and consistent enforcement. Define your network policy once, encode it in infrastructure, and let dev teams focus on shipping — not debugging peerings from last sprint.&lt;/p&gt;
&lt;p&gt;Golden topology. Guardrails enforced. Coffee not required (but strongly encouraged).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;CAF: Azure Landing Zones documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Virtual Network Manager documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-landing-zone-network-segmentation?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Enterprise-scale network segmentation strategies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/security/zero-trust/azure-infrastructure-networking?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploying Zero Trust in Azure networks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AVNM Security Admin Rules in the Real World</title><link>https://blog.brewedinthecloud.com/p/azure-avnm-secadmin-vs-nsg/</link><pubDate>Tue, 22 Jul 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-avnm-secadmin-vs-nsg/</guid><description>&lt;p&gt;When it comes to using Security Admin Rules in AVNM, the most common question I hear is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“How do I actually use AVNM’s security admin rules to improve my organisation’s network security posture without breaking apps or creating policy gridlock?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s where &lt;strong&gt;AVNM Security Admin Rules&lt;/strong&gt; shine. These aren’t your old-school NSGs rebadged. Think of them as &lt;strong&gt;centralised enforcement points&lt;/strong&gt; that help you lock down traffic behaviour across your network estate with surgical intent.&lt;/p&gt;
&lt;p&gt;In this post, you’ll learn how AVNM security rules actually work, how they play with NSGs, where to apply them, and a few patterns that’ll keep your auditors happy and your apps unbroken.&lt;/p&gt;
&lt;h2 id="what-do-avnm-security-admin-rules-actually-do"&gt;What Do AVNM Security Admin Rules Actually Do?
&lt;/h2&gt;&lt;p&gt;Security Admin Rules sit &lt;strong&gt;above&lt;/strong&gt; your NSGs in the evaluation flow. They’re designed for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Org-wide guardrails&lt;/li&gt;
&lt;li&gt;Environment-level isolation&lt;/li&gt;
&lt;li&gt;Clean separation between network security policy and application-level NSGs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They define:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Direction:&lt;/strong&gt; inbound or outbound&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocol:&lt;/strong&gt; TCP, UDP, or all&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP ranges or prefixes:&lt;/strong&gt; typically service endpoints or outbound limits&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allow, Deny behaviour&lt;/strong&gt; — and “deny” means deny, no matter your NSG&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They&amp;rsquo;re ideal for enforcing egress lockdowns, VNet segmentation, and that sweet combo of zero trust and operational sanity.&lt;/p&gt;
&lt;h2 id="avnm-vs-nsg-rule-evaluation-order-matters"&gt;AVNM vs NSG: Rule Evaluation Order Matters
&lt;/h2&gt;&lt;p&gt;AVNM Security Admin Rules &lt;strong&gt;don’t replace&lt;/strong&gt; NSGs — they &lt;strong&gt;precede&lt;/strong&gt; them.&lt;/p&gt;
&lt;h3 id="avnm-security-rule-evaluation-flow"&gt;AVNM Security Rule Evaluation Flow
&lt;/h3&gt;&lt;p&gt;The following diagram shows how traffic is evaluated by AVNM Security Admin Rules before any NSG rules or UDRs are applied.&lt;/p&gt;
&lt;div class="mermaid"&gt;%% AVNM + NSG Rule Evaluation Order
flowchart TD
A[Network Traffic] --&gt; B{AVNM Admin Rules}
B -- Deny --&gt; X[Blocked Immediately]
B -- Allow --&gt; C{Network Security Groups}
C -- Deny --&gt; X
C -- Allow --&gt; D[Route Table Evaluation]
D --&gt; E[Traffic Delivered]
&lt;/div&gt;
&lt;h3 id="order-of-operations"&gt;Order of operations
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;AVNM evaluates first&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;If traffic is &lt;strong&gt;DENIED by AVNM&lt;/strong&gt;, it’s blocked outright&lt;/li&gt;
&lt;li&gt;If it’s &lt;strong&gt;ALLOWED by AVNM&lt;/strong&gt;, then &lt;strong&gt;NSGs still apply&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Only if NSG allows it too, does traffic proceed&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This lets you set &lt;strong&gt;org-level no-go zones&lt;/strong&gt; (e.g. &amp;ldquo;no internet access from dev VNets&amp;rdquo;) and still allow service-specific access via NSGs.&lt;/p&gt;
&lt;h2 id="use-case-patterns"&gt;Use Case Patterns
&lt;/h2&gt;&lt;p&gt;Here are some brewed-in-the-wild patterns that work:&lt;/p&gt;
&lt;h3 id="1-devtest-egress-lockdown"&gt;1. Dev/Test Egress Lockdown
&lt;/h3&gt;&lt;p&gt;Use AVNM to deny all outbound &lt;em&gt;except&lt;/em&gt; key services:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Deny all outbound traffic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DenyOutboundRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations/ruleCollections/rules@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecurityRuleCollection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DenyAllOutbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Custom&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny All outbound traffic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0-65535&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IPPrefix&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0-65535&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Allow DNS to Azure resolver&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AllowDNSRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations/ruleCollections/rules@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecurityRuleCollection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllowDNS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Custom&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow outbound DNS traffic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UDP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0-65535&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IPPrefix&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;168.63.129.16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;53&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Great for Dev/Test environments that shouldn’t be calling home or downloading packages outside approved endpoints.&lt;/p&gt;
&lt;h3 id="2-production-outbound-allow-list"&gt;2. Production Outbound Allow-list
&lt;/h3&gt;&lt;p&gt;Rather than deny-first, define &lt;em&gt;only&lt;/em&gt; what’s allowed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow outbound to Windows Update (20.190.128.0/18, Azure FrontDoor Frontend &amp;amp; Backend)&lt;/li&gt;
&lt;li&gt;Allow CRL/OCSP traffic&lt;/li&gt;
&lt;li&gt;Allow Azure AD, DNS, logging endpoints&lt;/li&gt;
&lt;li&gt;Deny everything else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Helps enforce compliance while keeping patching and identity flows running.&lt;/p&gt;
&lt;h3 id="3-prevent-cross-environment-access"&gt;3. Prevent Cross-Environment Access
&lt;/h3&gt;&lt;p&gt;Use rule scoping + group segmentation to &lt;strong&gt;stop VNet-to-VNet traffic&lt;/strong&gt; between tiers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a rule collection that explicitly denies traffic between:
&lt;ul&gt;
&lt;li&gt;Dev &amp;lt;-&amp;gt; Prod VNets&lt;/li&gt;
&lt;li&gt;Non-critical apps &amp;lt;-&amp;gt; Core internal services&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This avoids blind spots caused by transit rules baked into peerings or NSG misconfigurations.&lt;/p&gt;
&lt;h2 id="built-in-vs-custom-rules"&gt;Built-In vs Custom Rules
&lt;/h2&gt;&lt;p&gt;AVNM supports both Microsoft-managed built-in rule sets (e.g. common DNS/DHCP firewall baselines) and custom rule collections.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Built-in rules are currently limited in scope and can’t be modified, but might grow in the future. For now, most orgs stick to custom rule sets for policy enforcement.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Built-in:&lt;/strong&gt; Good starting point, but you can’t customise them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom:&lt;/strong&gt; Maximum control, required for serious policy enforcement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When in doubt, start with built-in deployment in &lt;strong&gt;ReadOnly mode&lt;/strong&gt; to see its effect. Then grow into custom security rule sets over time.&lt;/p&gt;
&lt;h2 id="designing-for-real-world-impact"&gt;Designing for Real-World Impact
&lt;/h2&gt;&lt;p&gt;Before you go full lockdown and set ten thousand fire rules ablaze, slow down and consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ReadOnly Mode:&lt;/strong&gt; AVNM supports starting with rule simulations — always test before deploying hard Deny&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flow Logs:&lt;/strong&gt; Keep NSG flow logs turned on during rollout to verify what&amp;rsquo;s really happening on the wire&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring:&lt;/strong&gt; Use Azure Monitor with AVNM diagnostic settings to keep an eye on rule enforcement and drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy Incrementally:&lt;/strong&gt; Avoid rolling out to every region from day one — start with one or two controlled environments&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No FQDNs:&lt;/strong&gt; AVNM rules can’t match domains — only IPs or CIDR prefixes. Use IP ranges and service tags where possible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rule Priorities:&lt;/strong&gt; Numbering matters — AVNM rules use &lt;strong&gt;priority ordering&lt;/strong&gt;, just like NSGs. Lower number = higher priority.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implicit Deny at the End:&lt;/strong&gt; Unspecified traffic is dropped by default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overlapping Rules:&lt;/strong&gt; A VNet in two Network Groups with conflicting rules will still get &lt;strong&gt;both&lt;/strong&gt; sets evaluated. Be deliberate with group design.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bicep-example-custom-admin-rule-collection"&gt;Bicep Example: Custom Admin Rule Collection
&lt;/h2&gt;&lt;p&gt;Here’s how to define an AVNM Security Admin Configuration and a rule collection in Bicep:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;span class="lnt"&gt;127
&lt;/span&gt;&lt;span class="lnt"&gt;128
&lt;/span&gt;&lt;span class="lnt"&gt;129
&lt;/span&gt;&lt;span class="lnt"&gt;130
&lt;/span&gt;&lt;span class="lnt"&gt;131
&lt;/span&gt;&lt;span class="lnt"&gt;132
&lt;/span&gt;&lt;span class="lnt"&gt;133
&lt;/span&gt;&lt;span class="lnt"&gt;134
&lt;/span&gt;&lt;span class="lnt"&gt;135
&lt;/span&gt;&lt;span class="lnt"&gt;136
&lt;/span&gt;&lt;span class="lnt"&gt;137
&lt;/span&gt;&lt;span class="lnt"&gt;138
&lt;/span&gt;&lt;span class="lnt"&gt;139
&lt;/span&gt;&lt;span class="lnt"&gt;140
&lt;/span&gt;&lt;span class="lnt"&gt;141
&lt;/span&gt;&lt;span class="lnt"&gt;142
&lt;/span&gt;&lt;span class="lnt"&gt;143
&lt;/span&gt;&lt;span class="lnt"&gt;144
&lt;/span&gt;&lt;span class="lnt"&gt;145
&lt;/span&gt;&lt;span class="lnt"&gt;146
&lt;/span&gt;&lt;span class="lnt"&gt;147
&lt;/span&gt;&lt;span class="lnt"&gt;148
&lt;/span&gt;&lt;span class="lnt"&gt;149
&lt;/span&gt;&lt;span class="lnt"&gt;150
&lt;/span&gt;&lt;span class="lnt"&gt;151
&lt;/span&gt;&lt;span class="lnt"&gt;152
&lt;/span&gt;&lt;span class="lnt"&gt;153
&lt;/span&gt;&lt;span class="lnt"&gt;154
&lt;/span&gt;&lt;span class="lnt"&gt;155
&lt;/span&gt;&lt;span class="lnt"&gt;156
&lt;/span&gt;&lt;span class="lnt"&gt;157
&lt;/span&gt;&lt;span class="lnt"&gt;158
&lt;/span&gt;&lt;span class="lnt"&gt;159
&lt;/span&gt;&lt;span class="lnt"&gt;160
&lt;/span&gt;&lt;span class="lnt"&gt;161
&lt;/span&gt;&lt;span class="lnt"&gt;162
&lt;/span&gt;&lt;span class="lnt"&gt;163
&lt;/span&gt;&lt;span class="lnt"&gt;164
&lt;/span&gt;&lt;span class="lnt"&gt;165
&lt;/span&gt;&lt;span class="lnt"&gt;166
&lt;/span&gt;&lt;span class="lnt"&gt;167
&lt;/span&gt;&lt;span class="lnt"&gt;168
&lt;/span&gt;&lt;span class="lnt"&gt;169
&lt;/span&gt;&lt;span class="lnt"&gt;170
&lt;/span&gt;&lt;span class="lnt"&gt;171
&lt;/span&gt;&lt;span class="lnt"&gt;172
&lt;/span&gt;&lt;span class="lnt"&gt;173
&lt;/span&gt;&lt;span class="lnt"&gt;174
&lt;/span&gt;&lt;span class="lnt"&gt;175
&lt;/span&gt;&lt;span class="lnt"&gt;176
&lt;/span&gt;&lt;span class="lnt"&gt;177
&lt;/span&gt;&lt;span class="lnt"&gt;178
&lt;/span&gt;&lt;span class="lnt"&gt;179
&lt;/span&gt;&lt;span class="lnt"&gt;180
&lt;/span&gt;&lt;span class="lnt"&gt;181
&lt;/span&gt;&lt;span class="lnt"&gt;182
&lt;/span&gt;&lt;span class="lnt"&gt;183
&lt;/span&gt;&lt;span class="lnt"&gt;184
&lt;/span&gt;&lt;span class="lnt"&gt;185
&lt;/span&gt;&lt;span class="lnt"&gt;186
&lt;/span&gt;&lt;span class="lnt"&gt;187
&lt;/span&gt;&lt;span class="lnt"&gt;188
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Network Manager&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myNetworkManager&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create the Azure Virtual Network Manager (AVNM)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopeAccesses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Connectivity&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SecurityAdmin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Dynamic Network Group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmDevGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;dev-vnets&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Development VNets tagged environment=development&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dynamicMembershipDefinition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;criteria&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;memberType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tag.environment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Equals&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;development&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Security Admin Configuration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecureAdminConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;prod-security-admin&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appliesToGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkGroupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmDevGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Security admin configuration for production VNets&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Security Admin Rule Collection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecurityRuleCollection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations/ruleCollections@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecureAdminConfig&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;prod-egress-rules&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appliesToGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkGroupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmDevGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Security Admin Rule to Deny Outbound Traffic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DenyOutboundRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations/ruleCollections/rules@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecurityRuleCollection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DenyAllOutbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Custom&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny All outbound traffic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0-65535&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IPPrefix&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0-65535&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Allow DNS to Azure resolver&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AllowDNSRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations/ruleCollections/rules@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecurityRuleCollection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllowDNS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Custom&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow outbound DNS traffic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UDP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0-65535&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IPPrefix&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;168.63.129.16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;53&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Azure Policy for dynamic network group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmDynamicDevNetworkGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnm-policy-networkgroup.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnm-dynamic-development-network-group-policy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmDevGroup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a Deployment Script resource to perform the commit/deployment of the Network Manager connectivity configuration.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.ManagedIdentity/userAssignedIdentities@2024-11-30&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnmDeploymentScriptIdentity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkContributorRoleAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/roleAssignments@2022-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;guid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;NetworkContributor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscriptionResourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/roleDefinitions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;4d97b98b-1d4f-4787-a291-c67834d212e7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Network Contributor built-in role&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ServicePrincipal&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a deployment Script to deploy the Security Admin configuration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;deploymentScriptSecurityAdmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Resources/deploymentScripts@2023-08-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DeployAVNMSecurityAdminConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzurePowerShell&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UserAssigned&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azPowerShellVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;8.3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-networkManagerName &amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34; -targetLocations &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -configIds &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SecureAdminConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -subscriptionId &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;subscriptionId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -configType SecurityAdmin -resourceGroupName &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scriptContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; param (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM subscription id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$subscriptionId,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM resource name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$networkManagerName,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # config ids to deploy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string[]]$configIds,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # deployment target region
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string[]]$targetLocations,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # configuration type to deploy. must be either connectivity or securityadmin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][ValidateSet(&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;Connectivity&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;SecurityAdmin&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;)][string]$configType,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM resource group name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$resourceGroupName
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; $null = Login-AzAccount -Identity -Subscription $subscriptionId
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; try {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Deploy-AzNetworkManagerCommit -Name $networkManagerName -ResourceGroupName $resourceGroupName -ConfigurationId $configIds -TargetLocation $targetLocations -CommitType $configType -ErrorAction Stop
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; catch {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Write-Error &amp;#34;Deployment failed with error: $_&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; throw &amp;#34;Deployment failed with error: $_&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start in ReadOnly mode:&lt;/strong&gt; test your policy impact before enforcing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use separate rule collections:&lt;/strong&gt; for each environment or use case&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stick to clear tagging conventions:&lt;/strong&gt; for your VNet groups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limit scope per deployment:&lt;/strong&gt; deploy configurations only where needed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document intent:&lt;/strong&gt; inline good policy-as-code habits make a big difference two months in&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Security Admin Rules aren’t here to replace NSGs — they’re here to &lt;em&gt;protect you from yourself&lt;/em&gt;. Most AVNM value comes from stopping accidental exposure, not catching malicious insiders.&lt;/p&gt;
&lt;p&gt;Think of it like this: NSGs are espresso shots per workload — fast, strong, tailored. AVNM rules are the double-walled mug that makes sure it all stays inside the cup.&lt;/p&gt;
&lt;p&gt;Brew both well, and you’ll never spill into the wrong subnet again.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-security-admins?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Security admin rules in Azure Virtual Network Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-enforcement#network-traffic-enforcement-and-exceptions-with-security-admin-rules?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Network traffic enforcement and exceptions with security admin rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/powershell/module/az.network/deploy-aznetworkmanagercommit?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploy-AzNetworkManagerCommit documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Building Blocks of Azure Virtual Network Manager</title><link>https://blog.brewedinthecloud.com/p/azure-avnm-building-blocks/</link><pubDate>Thu, 17 Jul 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-avnm-building-blocks/</guid><description>&lt;p&gt;If the first post in this series &lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-avnm-why" target="_blank" rel="noopener"
&gt;Why Azure Virtual Network Manager is Your New Best Mate&lt;/a&gt; was about &lt;em&gt;why&lt;/em&gt; you need Azure Virtual Network Manager (AVNM), this one’s about &lt;em&gt;how&lt;/em&gt; to build it right — with the proper blocks, scopes, and rules.&lt;/p&gt;
&lt;p&gt;Think of AVNM like a grown-up box of Lego Technic: it’s got power, flexibility, and some very pointy edges if you don’t assemble it properly. In this post, we’ll break down the core constructs and the way they interconnect, so your network policies don’t come crashing down like a poorly clipped wing on a cargo chopper.&lt;/p&gt;
&lt;h2 id="whats-in-the-box"&gt;What’s in the Box?
&lt;/h2&gt;&lt;p&gt;There are three main building blocks in any AVNM deployment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Network Groups:&lt;/strong&gt; Collections of VNets that act as the target for your configuration (static or dynamic membership)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configurations:&lt;/strong&gt; The actual rules and topology logic you want to apply (Connectivity or Security Admin)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployments:&lt;/strong&gt; How and where those configurations are applied (per region)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These parts live under your &lt;strong&gt;Network Manager resource&lt;/strong&gt;, which serves as the orchestrator for network state across regions and environments.&lt;/p&gt;
&lt;h2 id="avnm-components-overview"&gt;AVNM Components Overview
&lt;/h2&gt;&lt;div class="mermaid"&gt;graph TD
AVNM[Azure Virtual Network Manager] --&gt; NG[Network Groups]
AVNM --&gt; CC[Connectivity Configs]
AVNM --&gt; SC[Security Admin Configs]
CC --&gt;|Assigns to| NG
SC --&gt;|Assigns to| NG
NG --&gt;|Includes| VNet1[VNet A]
NG --&gt;|Includes| VNet2[VNet B]
Deployment[Region Deployment] --&gt; CC
Deployment --&gt; SC
&lt;/div&gt;
&lt;h2 id="1-network-groups"&gt;1. Network Groups
&lt;/h2&gt;&lt;p&gt;Network Groups define &lt;em&gt;who gets what&lt;/em&gt;. They’re the target for both connectivity and security configurations.&lt;/p&gt;
&lt;p&gt;You can build groups using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Static members&lt;/strong&gt; – you manually assign VNets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic members&lt;/strong&gt; – matched automatically via tag-based rules (using Azure Policy behind the scenes)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dynamic grouping is a real time-saver for scale — spinning up a new VNet with a &lt;code&gt;tag: environment=production&lt;/code&gt;? AVNM will assign it into the correct Network Group automatically.&lt;/p&gt;
&lt;h2 id="2-configurations-connectivity-vs-security-admin"&gt;2. Configurations: Connectivity vs Security Admin
&lt;/h2&gt;&lt;p&gt;AVNM supports two config types, and they serve different missions.&lt;/p&gt;
&lt;h3 id="connectivity-configs"&gt;Connectivity Configs
&lt;/h3&gt;&lt;p&gt;Use them to automate peering and route control:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Topologies&lt;/strong&gt;: Mesh or Hub-and-Spoke&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope&lt;/strong&gt;: Can connect VNets within and across regions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gateways&lt;/strong&gt;: Optionally share hub gateway with peers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think of it as defining the transport layer of your network — who can see whom, and how.&lt;/p&gt;
&lt;h3 id="security-admin-configs"&gt;Security Admin Configs
&lt;/h3&gt;&lt;p&gt;Think higher-level traffic enforcement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define &lt;strong&gt;global allow/deny rules&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Evaluate &lt;em&gt;before&lt;/em&gt; NSG rules&lt;/li&gt;
&lt;li&gt;Override inconsistent or missing NSGs without reconfiguring every VNet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They&amp;rsquo;re ideal for enforcing org-wide traffic standards. (e.g. force-deny egress to public IPs in dev, or allow DNS to Azure resolver in prod).&lt;/p&gt;
&lt;h2 id="3-deployments-and-region-scope"&gt;3. Deployments and Region Scope
&lt;/h2&gt;&lt;p&gt;Here’s a crucial AVNM detail: configs don’t apply until you &lt;strong&gt;explicitly deploy them into regions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So even if you build your perfect topology or rule set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nothing happens until you &lt;strong&gt;deploy that config&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Each config needs to be scoped to &lt;strong&gt;a region + network group&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You’ll have &lt;strong&gt;multiple deployments&lt;/strong&gt; per config for multi-region rollouts&lt;/li&gt;
&lt;li&gt;Each regional deployment independently enforces the configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s a powerful model, but easy to miss during initial rollout.&lt;/p&gt;
&lt;h2 id="avnm--nsgs"&gt;AVNM &amp;amp; NSGs
&lt;/h2&gt;&lt;p&gt;AVNM’s &lt;strong&gt;Security Admin Rules&lt;/strong&gt; work alongside, not instead of, your NSGs.&lt;/p&gt;
&lt;p&gt;Here’s how the rule chain flows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AVNM’s rules are enforced &lt;strong&gt;first&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;If AVNM &lt;strong&gt;allows&lt;/strong&gt; traffic, it can still be denied by NSG&lt;/li&gt;
&lt;li&gt;If AVNM &lt;strong&gt;denies&lt;/strong&gt; traffic, NSG rules are irrelevant the packet’s already been blocked&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use AVNM for broad-brush, org-level control. Use NSGs for workload-specific filtering.&lt;/p&gt;
&lt;p&gt;And no — AVNM doesn’t delete or override existing NSGs or peerings. It just enforces a central layer you can trust.&lt;/p&gt;
&lt;h2 id="role-based-access-who-gets-to-touch-what"&gt;Role-Based Access: Who Gets To Touch What?
&lt;/h2&gt;&lt;p&gt;AVNM impacts infrastructure and security, so set your roles carefully:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Contributor on AVNM resource:&lt;/strong&gt; Can deploy configs, change topology&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Contributor:&lt;/strong&gt; Needed for managing peerings and VNet joins&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy Contributor:&lt;/strong&gt; Useful for managing tag-based dynamic groups&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Separate concerns where possible. For example: let infra teams manage topology configs, while security teams handle rule definitions in their own admin config sets.&lt;/p&gt;
&lt;h2 id="bicep-resource-structure"&gt;Bicep Resource Structure
&lt;/h2&gt;&lt;p&gt;Here’s what a real-world AVNM deployment might look like, using dynamic network groups, a mesh topology, and a simple security rule.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;In the below example we are deploying a Virtual Network Manager with 3 virtual networks in a mesh configuration set using Azure Policy to find Virtual Networks with the Tag environment=production to automatically added to the network group. Then creating a User Assigned Identity and a deployment script to deploy the Connectivity &amp;amp; Security Configurations&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;span class="lnt"&gt;127
&lt;/span&gt;&lt;span class="lnt"&gt;128
&lt;/span&gt;&lt;span class="lnt"&gt;129
&lt;/span&gt;&lt;span class="lnt"&gt;130
&lt;/span&gt;&lt;span class="lnt"&gt;131
&lt;/span&gt;&lt;span class="lnt"&gt;132
&lt;/span&gt;&lt;span class="lnt"&gt;133
&lt;/span&gt;&lt;span class="lnt"&gt;134
&lt;/span&gt;&lt;span class="lnt"&gt;135
&lt;/span&gt;&lt;span class="lnt"&gt;136
&lt;/span&gt;&lt;span class="lnt"&gt;137
&lt;/span&gt;&lt;span class="lnt"&gt;138
&lt;/span&gt;&lt;span class="lnt"&gt;139
&lt;/span&gt;&lt;span class="lnt"&gt;140
&lt;/span&gt;&lt;span class="lnt"&gt;141
&lt;/span&gt;&lt;span class="lnt"&gt;142
&lt;/span&gt;&lt;span class="lnt"&gt;143
&lt;/span&gt;&lt;span class="lnt"&gt;144
&lt;/span&gt;&lt;span class="lnt"&gt;145
&lt;/span&gt;&lt;span class="lnt"&gt;146
&lt;/span&gt;&lt;span class="lnt"&gt;147
&lt;/span&gt;&lt;span class="lnt"&gt;148
&lt;/span&gt;&lt;span class="lnt"&gt;149
&lt;/span&gt;&lt;span class="lnt"&gt;150
&lt;/span&gt;&lt;span class="lnt"&gt;151
&lt;/span&gt;&lt;span class="lnt"&gt;152
&lt;/span&gt;&lt;span class="lnt"&gt;153
&lt;/span&gt;&lt;span class="lnt"&gt;154
&lt;/span&gt;&lt;span class="lnt"&gt;155
&lt;/span&gt;&lt;span class="lnt"&gt;156
&lt;/span&gt;&lt;span class="lnt"&gt;157
&lt;/span&gt;&lt;span class="lnt"&gt;158
&lt;/span&gt;&lt;span class="lnt"&gt;159
&lt;/span&gt;&lt;span class="lnt"&gt;160
&lt;/span&gt;&lt;span class="lnt"&gt;161
&lt;/span&gt;&lt;span class="lnt"&gt;162
&lt;/span&gt;&lt;span class="lnt"&gt;163
&lt;/span&gt;&lt;span class="lnt"&gt;164
&lt;/span&gt;&lt;span class="lnt"&gt;165
&lt;/span&gt;&lt;span class="lnt"&gt;166
&lt;/span&gt;&lt;span class="lnt"&gt;167
&lt;/span&gt;&lt;span class="lnt"&gt;168
&lt;/span&gt;&lt;span class="lnt"&gt;169
&lt;/span&gt;&lt;span class="lnt"&gt;170
&lt;/span&gt;&lt;span class="lnt"&gt;171
&lt;/span&gt;&lt;span class="lnt"&gt;172
&lt;/span&gt;&lt;span class="lnt"&gt;173
&lt;/span&gt;&lt;span class="lnt"&gt;174
&lt;/span&gt;&lt;span class="lnt"&gt;175
&lt;/span&gt;&lt;span class="lnt"&gt;176
&lt;/span&gt;&lt;span class="lnt"&gt;177
&lt;/span&gt;&lt;span class="lnt"&gt;178
&lt;/span&gt;&lt;span class="lnt"&gt;179
&lt;/span&gt;&lt;span class="lnt"&gt;180
&lt;/span&gt;&lt;span class="lnt"&gt;181
&lt;/span&gt;&lt;span class="lnt"&gt;182
&lt;/span&gt;&lt;span class="lnt"&gt;183
&lt;/span&gt;&lt;span class="lnt"&gt;184
&lt;/span&gt;&lt;span class="lnt"&gt;185
&lt;/span&gt;&lt;span class="lnt"&gt;186
&lt;/span&gt;&lt;span class="lnt"&gt;187
&lt;/span&gt;&lt;span class="lnt"&gt;188
&lt;/span&gt;&lt;span class="lnt"&gt;189
&lt;/span&gt;&lt;span class="lnt"&gt;190
&lt;/span&gt;&lt;span class="lnt"&gt;191
&lt;/span&gt;&lt;span class="lnt"&gt;192
&lt;/span&gt;&lt;span class="lnt"&gt;193
&lt;/span&gt;&lt;span class="lnt"&gt;194
&lt;/span&gt;&lt;span class="lnt"&gt;195
&lt;/span&gt;&lt;span class="lnt"&gt;196
&lt;/span&gt;&lt;span class="lnt"&gt;197
&lt;/span&gt;&lt;span class="lnt"&gt;198
&lt;/span&gt;&lt;span class="lnt"&gt;199
&lt;/span&gt;&lt;span class="lnt"&gt;200
&lt;/span&gt;&lt;span class="lnt"&gt;201
&lt;/span&gt;&lt;span class="lnt"&gt;202
&lt;/span&gt;&lt;span class="lnt"&gt;203
&lt;/span&gt;&lt;span class="lnt"&gt;204
&lt;/span&gt;&lt;span class="lnt"&gt;205
&lt;/span&gt;&lt;span class="lnt"&gt;206
&lt;/span&gt;&lt;span class="lnt"&gt;207
&lt;/span&gt;&lt;span class="lnt"&gt;208
&lt;/span&gt;&lt;span class="lnt"&gt;209
&lt;/span&gt;&lt;span class="lnt"&gt;210
&lt;/span&gt;&lt;span class="lnt"&gt;211
&lt;/span&gt;&lt;span class="lnt"&gt;212
&lt;/span&gt;&lt;span class="lnt"&gt;213
&lt;/span&gt;&lt;span class="lnt"&gt;214
&lt;/span&gt;&lt;span class="lnt"&gt;215
&lt;/span&gt;&lt;span class="lnt"&gt;216
&lt;/span&gt;&lt;span class="lnt"&gt;217
&lt;/span&gt;&lt;span class="lnt"&gt;218
&lt;/span&gt;&lt;span class="lnt"&gt;219
&lt;/span&gt;&lt;span class="lnt"&gt;220
&lt;/span&gt;&lt;span class="lnt"&gt;221
&lt;/span&gt;&lt;span class="lnt"&gt;222
&lt;/span&gt;&lt;span class="lnt"&gt;223
&lt;/span&gt;&lt;span class="lnt"&gt;224
&lt;/span&gt;&lt;span class="lnt"&gt;225
&lt;/span&gt;&lt;span class="lnt"&gt;226
&lt;/span&gt;&lt;span class="lnt"&gt;227
&lt;/span&gt;&lt;span class="lnt"&gt;228
&lt;/span&gt;&lt;span class="lnt"&gt;229
&lt;/span&gt;&lt;span class="lnt"&gt;230
&lt;/span&gt;&lt;span class="lnt"&gt;231
&lt;/span&gt;&lt;span class="lnt"&gt;232
&lt;/span&gt;&lt;span class="lnt"&gt;233
&lt;/span&gt;&lt;span class="lnt"&gt;234
&lt;/span&gt;&lt;span class="lnt"&gt;235
&lt;/span&gt;&lt;span class="lnt"&gt;236
&lt;/span&gt;&lt;span class="lnt"&gt;237
&lt;/span&gt;&lt;span class="lnt"&gt;238
&lt;/span&gt;&lt;span class="lnt"&gt;239
&lt;/span&gt;&lt;span class="lnt"&gt;240
&lt;/span&gt;&lt;span class="lnt"&gt;241
&lt;/span&gt;&lt;span class="lnt"&gt;242
&lt;/span&gt;&lt;span class="lnt"&gt;243
&lt;/span&gt;&lt;span class="lnt"&gt;244
&lt;/span&gt;&lt;span class="lnt"&gt;245
&lt;/span&gt;&lt;span class="lnt"&gt;246
&lt;/span&gt;&lt;span class="lnt"&gt;247
&lt;/span&gt;&lt;span class="lnt"&gt;248
&lt;/span&gt;&lt;span class="lnt"&gt;249
&lt;/span&gt;&lt;span class="lnt"&gt;250
&lt;/span&gt;&lt;span class="lnt"&gt;251
&lt;/span&gt;&lt;span class="lnt"&gt;252
&lt;/span&gt;&lt;span class="lnt"&gt;253
&lt;/span&gt;&lt;span class="lnt"&gt;254
&lt;/span&gt;&lt;span class="lnt"&gt;255
&lt;/span&gt;&lt;span class="lnt"&gt;256
&lt;/span&gt;&lt;span class="lnt"&gt;257
&lt;/span&gt;&lt;span class="lnt"&gt;258
&lt;/span&gt;&lt;span class="lnt"&gt;259
&lt;/span&gt;&lt;span class="lnt"&gt;260
&lt;/span&gt;&lt;span class="lnt"&gt;261
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Network Manager&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myNetworkManager&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Number of spoke VNets to create&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Address prefixes for each VNet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetPrefixes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.2.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Spoke VNets using a numbered loop&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetCount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySpokeVNet&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;padLeft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnetPrefixes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create the Azure Virtual Network Manager (AVNM)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopeAccesses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Connectivity&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SecurityAdmin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Dynamic Network Group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prodGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;prod-vnets&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Production VNets tagged environment=production&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dynamicMembershipDefinition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;criteria&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;memberType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;tag.environment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Equals&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Mesh Topology Config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectivityConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/connectivityConfigurations@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;prod-full-mesh&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectivityTopology&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Mesh&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appliesToGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkGroupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prodGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isGlobal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupConnectivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DirectlyConnected&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useHubGateway&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;False&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Full mesh across prod VNets&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Security Admin Configuration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecureAdminConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;prod-security-admin&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appliesToGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkGroupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prodGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Security admin configuration for production VNets&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Security Admin Rule Collection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecurityRuleCollection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations/ruleCollections@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecureAdminConfig&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;prod-egress-rules&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appliesToGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkGroupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prodGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Security Admin Rule to allow outbound traffic to Azure DNS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;RuleCollectionAllowDNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/securityAdminConfigurations/ruleCollections/rules@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SecurityRuleCollection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllowDNS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Custom&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow outbound DNS traffic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UDP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0-65535&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IPPrefix&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;168.63.129.16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;53&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Azure Policy for dynamic network group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnmDynamicProductionNetworkGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnm-policy-networkgroup.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnm-dynamic-production-network-group-policy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prodGroup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a User Assigned Identity for the Deployment Scripts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.ManagedIdentity/userAssignedIdentities@2024-11-30&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnmDeploymentScriptIdentity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Assign the User Assigned Identity the Network Contributor role on the resource group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkContributorRoleAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/roleAssignments@2022-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;guid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;NetworkContributor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscriptionResourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/roleDefinitions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;4d97b98b-1d4f-4787-a291-c67834d212e7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Network Contributor built-in role&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ServicePrincipal&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a Deployment Script resource to perform the commit/deployment of the Network Manager connectivity configuration.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;deploymentScriptConnectivity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Resources/deploymentScripts@2023-08-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DeployAVNMConnectivityConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzurePowerShell&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UserAssigned&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azPowerShellVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;8.3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-networkManagerName &amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34; -targetLocations &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -configIds &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;connectivityConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -subscriptionId &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;subscriptionId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -configType Connectivity -resourceGroupName &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scriptContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; param (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM subscription id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$subscriptionId,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM resource name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$networkManagerName,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # config ids to deploy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string[]]$configIds,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # deployment target region
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string[]]$targetLocations,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # configuration type to deploy. must be either connectivity or securityadmin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][ValidateSet(&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;Connectivity&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;SecurityAdmin&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;)][string]$configType,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM resource group name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$resourceGroupName
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; $null = Login-AzAccount -Identity -Subscription $subscriptionId
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; try {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Deploy-AzNetworkManagerCommit -Name $networkManagerName -ResourceGroupName $resourceGroupName -ConfigurationId $configIds -TargetLocation $targetLocations -CommitType $configType -ErrorAction Stop
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; catch {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Write-Error &amp;#34;Deployment failed with error: $_&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; throw &amp;#34;Deployment failed with error: $_&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a Deployment Script resource to perform the commit/deployment of the Network Manager Security configuration.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;deploymentScriptSecurityAdmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Resources/deploymentScripts@2023-08-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DeployAVNMSecurityAdminConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzurePowerShell&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UserAssigned&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azPowerShellVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;8.3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-networkManagerName &amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34; -targetLocations &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -configIds &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SecureAdminConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -subscriptionId &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;subscriptionId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -configType SecurityAdmin -resourceGroupName &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scriptContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; param (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM subscription id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$subscriptionId,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM resource name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$networkManagerName,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # config ids to deploy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string[]]$configIds,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # deployment target region
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string[]]$targetLocations,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # configuration type to deploy. must be either connectivity or securityadmin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][ValidateSet(&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;Connectivity&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;SecurityAdmin&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;)][string]$configType,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM resource group name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$resourceGroupName
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; $null = Login-AzAccount -Identity -Subscription $subscriptionId
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; try {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Deploy-AzNetworkManagerCommit -Name $networkManagerName -ResourceGroupName $resourceGroupName -ConfigurationId $configIds -TargetLocation $targetLocations -CommitType $configType -ErrorAction Stop
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; catch {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Write-Error &amp;#34;Deployment failed with error: $_&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; throw &amp;#34;Deployment failed with error: $_&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tag early, tag often&lt;/strong&gt; – Dynamic groups make expansion painless&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy per region&lt;/strong&gt; – Don’t assume configs are global unless you tell them to be&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep configs modular&lt;/strong&gt; – Avoid overloading a single deployment or group&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor rule conflict&lt;/strong&gt; – Document which rules are AVNM vs NSG where it counts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review RBAC regularly&lt;/strong&gt; – Limit config changes to authorised teams only&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;AVNM’s layered model is deceptively simple. But once you&amp;rsquo;re deep into cross-region topologies and layered admin rules, things can get real complex, real fast.&lt;/p&gt;
&lt;p&gt;Master the structure now, and you’ll avoid the tangled mess of duplicated peerings, mystery firewall blocks, and Spaghetti-as-a-Service.&lt;/p&gt;
&lt;p&gt;It takes good clean network governance, brewed slow and served right.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-network-groups?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Network groups in Virtual Network Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-connectivity-configuration?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Connectivity configuration concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-enforcement?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Virtual network enforcement with security admin rules in Azure Virtual Network Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/templates/microsoft.network/networkmanagers?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Virtual Network Manager Bicep reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Why Azure Virtual Network Manager is Your New Best Mate</title><link>https://blog.brewedinthecloud.com/p/azure-avnm-why/</link><pubDate>Tue, 15 Jul 2025 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-avnm-why/</guid><description>&lt;p&gt;Picture this: you’re knee-deep in JSON, juggling network peering scripts across dozens of virtual networks, double-checking NSG rules between prod and dev. One rogue IP rule and suddenly someone&amp;rsquo;s staging environment is blocking critical telemetry. Sound familiar? That&amp;rsquo;s the smell of burnt-out engineers and overcooked infrastructure.&lt;/p&gt;
&lt;p&gt;Enter Azure Virtual Network Manager (AVNM) your new best mate when it comes to sorting out network complexity, without losing sight of policy or scalability. This blog series breaks down what it is, why you’ll want it in your toolbox, and how it’s changing the game for Azure environments with more than a few VNets to their name.&lt;/p&gt;
&lt;h2 id="the-problem-too-many-vnets-not-enough-control"&gt;The Problem: Too Many VNets, Not Enough Control
&lt;/h2&gt;&lt;p&gt;Before AVNM, managing network topology and security rules across large environments was&amp;hellip; let’s say “hands-on”:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Manual VNet peering&lt;/strong&gt; across subscriptions or regions is error-prone and hard to scale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy-pasting NSGs&lt;/strong&gt; like it’s 2015 which is inconsistent, hard to audit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lack of centralised visibility or enforcement&lt;/strong&gt; no easy way to ensure a baseline security posture is consistent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource sprawl&lt;/strong&gt; managing dev, test, and prod with entirely separate rule sets or different peering requirements&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The bigger your Azure estate, the more brittle your network governance becomes.&lt;/p&gt;
&lt;h2 id="what-is-azure-virtual-network-manager-avnm"&gt;What is Azure Virtual Network Manager (AVNM)?
&lt;/h2&gt;&lt;p&gt;Azure Virtual Network Manager is a centralised service that lets you orchestrate and enforce network topology and security policies across all your virtual networks—regardless of region or subscription.&lt;/p&gt;
&lt;p&gt;Key capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connectivity configuration&lt;/strong&gt;: Automatically create fully-meshed or hub-and-spoke peering across VNets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security admin rules&lt;/strong&gt;: Define organisation-wide inbound/outbound rules that override individual NSGs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope policies with network groups&lt;/strong&gt;: Easily apply configs to sets of VNets by tag or name&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment modes&lt;/strong&gt;: Choose between ‘Connectivity’ and ‘Security Admin’ configuration modes—use either or both&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bottom line: AVNM lets you define once, apply everywhere.&lt;/p&gt;
&lt;h2 id="soundbite-use-cases"&gt;Soundbite Use Cases
&lt;/h2&gt;&lt;p&gt;Here’s where AVNM goes from nice to have to a absolute weapon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hub-and-spoke at scale&lt;/strong&gt;&lt;br&gt;
Automatically set up and maintain peering across hundreds of VNets with a single connectivity config. Perfect for centralised routing models.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multi-region security guardrails&lt;/strong&gt;&lt;br&gt;
Enforce consistent egress/ingress rules across all VNets no matter what some rogue DevSecOps engineer deploys via Bicep.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dev/test environment firewalls&lt;/strong&gt;&lt;br&gt;
Apply dev-specific outbound restrictions or block known risky destinations without touching per-VNet NSGs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="before--after-avnms-impact-on-network-management"&gt;Before &amp;amp; After: AVNM’s Impact on Network Management
&lt;/h2&gt;&lt;div class="mermaid"&gt;graph TD
subgraph Before AVNM
A[VNet A]
B[VNet B]
C[VNet C]
NSG1[NSG Copy 1]
NSG2[NSG Copy 2]
NSG3[NSG Copy 3]
A --&gt; B
B --&gt; C
A --&gt; C
A --&gt; NSG1
B --&gt; NSG2
C --&gt; NSG3
end
subgraph After AVNM
AVNM[Azure Virtual Network Manager]
VNet1[VNet A]
VNet2[VNet B]
VNet3[VNet C]
VNet1 --&gt; AVNM
VNet2 --&gt; AVNM
VNet3 --&gt; AVNM
AVNM --&gt;|Peering| VNet1
AVNM --&gt;|Peering| VNet2
AVNM --&gt;|Peering| VNet3
AVNM --&gt;|Admin Rules| VNet1
AVNM --&gt;|Admin Rules| VNet2
AVNM --&gt;|Admin Rules| VNet3
end
&lt;/div&gt;
&lt;h2 id="avnm-vs-existing-approaches"&gt;AVNM vs Existing Approaches
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Manual Management&lt;/th&gt;
&lt;th&gt;Azure Virtual Network Manager&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VNet Peering&lt;/td&gt;
&lt;td&gt;Manual, per-VNet&lt;/td&gt;
&lt;td&gt;Auto via Connectivity Config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NSGs&lt;/td&gt;
&lt;td&gt;Scoped per subnet/VNet&lt;/td&gt;
&lt;td&gt;Global admin rules override&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-region&lt;/td&gt;
&lt;td&gt;DIY pain&lt;/td&gt;
&lt;td&gt;First-class native support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditing&lt;/td&gt;
&lt;td&gt;Custom scripts/logs&lt;/td&gt;
&lt;td&gt;Centralised policy view&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy Drift&lt;/td&gt;
&lt;td&gt;High risk&lt;/td&gt;
&lt;td&gt;Low — single source of truth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;Teams using AVNM are seeing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faster onboarding&lt;/strong&gt; of new environments (no more peering scripts)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduced blast radius&lt;/strong&gt; through enforced isolation policies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplified audits&lt;/strong&gt; — centralised view of security posture&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cleaner GitOps&lt;/strong&gt; — define rules once in code, apply via configuration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It&amp;rsquo;s not free&lt;/strong&gt; — bear in mind AVNM comes at a cost &lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/virtual-network-manager/?cdn=disable#pricing" target="_blank" rel="noopener"
&gt;Azure Virtual Network Manager pricing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementation-sneak-peek"&gt;Implementation Sneak Peek
&lt;/h2&gt;&lt;h3 id="in-the-azure-portal"&gt;In the Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Azure Virtual Network Manager&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Create a new manager scoped to your management group or subscription&lt;/li&gt;
&lt;li&gt;Define &lt;strong&gt;Network Groups&lt;/strong&gt; and add static vnet members (you can also add dynamic members using tags and Azure Policy)&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;Connectivity Configuration&lt;/strong&gt; for your hub-and-spoke or mesh topology&lt;/li&gt;
&lt;li&gt;Define &lt;strong&gt;Security Admin Rules&lt;/strong&gt; as needed (allow, deny, override NSG rules)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="using-bicep"&gt;Using Bicep
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;In the below example we are deploying a Virtual Network Manager with 3 virtual networks (1 Hub and 2 Spokes) then connecting them in a hub-n-spoke configuration set. Then creating a User Assigned Identity and a deployment script to deploy the Connectivity Configuration&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;span class="lnt"&gt;127
&lt;/span&gt;&lt;span class="lnt"&gt;128
&lt;/span&gt;&lt;span class="lnt"&gt;129
&lt;/span&gt;&lt;span class="lnt"&gt;130
&lt;/span&gt;&lt;span class="lnt"&gt;131
&lt;/span&gt;&lt;span class="lnt"&gt;132
&lt;/span&gt;&lt;span class="lnt"&gt;133
&lt;/span&gt;&lt;span class="lnt"&gt;134
&lt;/span&gt;&lt;span class="lnt"&gt;135
&lt;/span&gt;&lt;span class="lnt"&gt;136
&lt;/span&gt;&lt;span class="lnt"&gt;137
&lt;/span&gt;&lt;span class="lnt"&gt;138
&lt;/span&gt;&lt;span class="lnt"&gt;139
&lt;/span&gt;&lt;span class="lnt"&gt;140
&lt;/span&gt;&lt;span class="lnt"&gt;141
&lt;/span&gt;&lt;span class="lnt"&gt;142
&lt;/span&gt;&lt;span class="lnt"&gt;143
&lt;/span&gt;&lt;span class="lnt"&gt;144
&lt;/span&gt;&lt;span class="lnt"&gt;145
&lt;/span&gt;&lt;span class="lnt"&gt;146
&lt;/span&gt;&lt;span class="lnt"&gt;147
&lt;/span&gt;&lt;span class="lnt"&gt;148
&lt;/span&gt;&lt;span class="lnt"&gt;149
&lt;/span&gt;&lt;span class="lnt"&gt;150
&lt;/span&gt;&lt;span class="lnt"&gt;151
&lt;/span&gt;&lt;span class="lnt"&gt;152
&lt;/span&gt;&lt;span class="lnt"&gt;153
&lt;/span&gt;&lt;span class="lnt"&gt;154
&lt;/span&gt;&lt;span class="lnt"&gt;155
&lt;/span&gt;&lt;span class="lnt"&gt;156
&lt;/span&gt;&lt;span class="lnt"&gt;157
&lt;/span&gt;&lt;span class="lnt"&gt;158
&lt;/span&gt;&lt;span class="lnt"&gt;159
&lt;/span&gt;&lt;span class="lnt"&gt;160
&lt;/span&gt;&lt;span class="lnt"&gt;161
&lt;/span&gt;&lt;span class="lnt"&gt;162
&lt;/span&gt;&lt;span class="lnt"&gt;163
&lt;/span&gt;&lt;span class="lnt"&gt;164
&lt;/span&gt;&lt;span class="lnt"&gt;165
&lt;/span&gt;&lt;span class="lnt"&gt;166
&lt;/span&gt;&lt;span class="lnt"&gt;167
&lt;/span&gt;&lt;span class="lnt"&gt;168
&lt;/span&gt;&lt;span class="lnt"&gt;169
&lt;/span&gt;&lt;span class="lnt"&gt;170
&lt;/span&gt;&lt;span class="lnt"&gt;171
&lt;/span&gt;&lt;span class="lnt"&gt;172
&lt;/span&gt;&lt;span class="lnt"&gt;173
&lt;/span&gt;&lt;span class="lnt"&gt;174
&lt;/span&gt;&lt;span class="lnt"&gt;175
&lt;/span&gt;&lt;span class="lnt"&gt;176
&lt;/span&gt;&lt;span class="lnt"&gt;177
&lt;/span&gt;&lt;span class="lnt"&gt;178
&lt;/span&gt;&lt;span class="lnt"&gt;179
&lt;/span&gt;&lt;span class="lnt"&gt;180
&lt;/span&gt;&lt;span class="lnt"&gt;181
&lt;/span&gt;&lt;span class="lnt"&gt;182
&lt;/span&gt;&lt;span class="lnt"&gt;183
&lt;/span&gt;&lt;span class="lnt"&gt;184
&lt;/span&gt;&lt;span class="lnt"&gt;185
&lt;/span&gt;&lt;span class="lnt"&gt;186
&lt;/span&gt;&lt;span class="lnt"&gt;187
&lt;/span&gt;&lt;span class="lnt"&gt;188
&lt;/span&gt;&lt;span class="lnt"&gt;189
&lt;/span&gt;&lt;span class="lnt"&gt;190
&lt;/span&gt;&lt;span class="lnt"&gt;191
&lt;/span&gt;&lt;span class="lnt"&gt;192
&lt;/span&gt;&lt;span class="lnt"&gt;193
&lt;/span&gt;&lt;span class="lnt"&gt;194
&lt;/span&gt;&lt;span class="lnt"&gt;195
&lt;/span&gt;&lt;span class="lnt"&gt;196
&lt;/span&gt;&lt;span class="lnt"&gt;197
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Network Manager&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myNetworkManager&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Configuration type to deploy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;configType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Connectivity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create AVNM&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopeAccesses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;configType&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkManagerScopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Hub VNet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyHubVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Spoke VNets&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySpokeVNet01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySpokeVNet02&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.2.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Network Groups&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;HubGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Hub VNet group&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SpokeGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Spoke VNets group&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Add VNets to Network Groups&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups/staticMembers@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubGroup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;HubVNetMember&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeGroupMember01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups/staticMembers@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeGroup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SpokeVNet01Member&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet01&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeGroupMember02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/networkGroups/staticMembers@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeGroup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SpokeVNet02Member&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeVnet02&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Connectivity Configuration (Hub-and-Spoke)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectivityConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkManagers/connectivityConfigurations@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avnm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hubAndSpokeConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectivityTopology&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;HubAndSpoke&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hubVnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appliesToGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupConnectivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;None&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkGroupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;spokeGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useHubGateway&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;True&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isGlobal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;False&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Hub-and-spoke connectivity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Creating a User Assigned Identity and giving it the &amp;#34;Network Contributor&amp;#34; Role in my resource group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.ManagedIdentity/userAssignedIdentities@2024-11-30&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;avnmDeploymentScriptIdentity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkContributorRoleAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/roleAssignments@2022-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;guid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;NetworkContributor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscriptionResourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/roleDefinitions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;4d97b98b-1d4f-4787-a291-c67834d212e7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Network Contributor built-in role&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ServicePrincipal&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a Deployment Script resource to perform the commit/deployment of the Network Manager connectivity configuration.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;deploymentScript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Resources/deploymentScripts@2023-08-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DeployAVNMConnectivityConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzurePowerShell&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UserAssigned&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;userAssignedIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azPowerShellVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;8.3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-networkManagerName &amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;networkManagerName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34; -targetLocations &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -configIds &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;connectivityConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -subscriptionId &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;subscriptionId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -configType &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;configType&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -resourceGroupName &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scriptContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; param (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM subscription id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$subscriptionId,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM resource name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$networkManagerName,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # config ids to deploy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string[]]$configIds,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # deployment target region
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string[]]$targetLocations,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # configuration type to deploy. must be either connectivity or securityadmin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][ValidateSet(&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;Connectivity&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;SecurityAdmin&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;)][string]$configType,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # AVNM resource group name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [parameter(mandatory=$true)][string]$resourceGroupName
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; $null = Login-AzAccount -Identity -Subscription $subscriptionId
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; try {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Deploy-AzNetworkManagerCommit -Name $networkManagerName -ResourceGroupName $resourceGroupName -ConfigurationId $configIdList -TargetLocation $targetLocations -CommitType $configType -ErrorAction Stop
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; catch {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Write-Error &amp;#34;Deployment failed with error: $_&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; throw &amp;#34;Deployment failed with error: $_&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;More implementation examples will be throughout the blog series.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start with ReadOnly mode&lt;/strong&gt; to see the impact of your security rules before enforcing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Tags&lt;/strong&gt; to dynamically manage Network Groups. This does require you to deploy an Azure Policy but for those in large scale should be well versed with Azure Policy already.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test regionally&lt;/strong&gt; before deploying global configurations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treat AVNM like IaC&lt;/strong&gt; define all configs via Bicep for repeatability&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;AVNM isn’t just a new product — it’s a shift in how we think about &lt;em&gt;network governance&lt;/em&gt;. Put bluntly: if you’re managing more than ten VNets, you’re wasting time without it. We’ve seen teams replace dozens of lines of infra code and hours of config audits with one AVNM deployment.&lt;/p&gt;
&lt;p&gt;Do it once, roll it everywhere — just like a good batch brew.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Docs: Azure Virtual Network Manager overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-connectivity-configuration?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Connectivity configurations in Azure Virtual Network Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/concept-security-admins?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Security admin rules in Azure Virtual Network Manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Observability on Tap - End-to-End Azure Monitoring - Part 5</title><link>https://blog.brewedinthecloud.com/p/azure-monitor-appinsights/</link><pubDate>Thu, 10 Jul 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-monitor-appinsights/</guid><description>&lt;h2 id="why-app-insights-matters"&gt;Why App Insights Matters
&lt;/h2&gt;&lt;p&gt;Most platform metrics &amp;amp; logs only get you down to the host, container, or connection level.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Application Insights&lt;/strong&gt; takes you deeper:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In code performance&lt;/li&gt;
&lt;li&gt;Custom events&lt;/li&gt;
&lt;li&gt;End-to-end distributed traces&lt;/li&gt;
&lt;li&gt;Real user monitoring (RUM)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the layer where Dev meets Ops true full-stack observability.&lt;/p&gt;
&lt;h2 id="connecting-app-insights-into-the-pipeline"&gt;Connecting App Insights into the Pipeline
&lt;/h2&gt;&lt;h3 id="two-options"&gt;Two options
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Autoinstrumentation&lt;/strong&gt; via App Service, .NET, Java&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual SDK init&lt;/strong&gt; for custom apps (Node.js, Python, etc.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once wired in, App Insights connects into Azure Monitor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sends logs to Log Analytics&lt;/li&gt;
&lt;li&gt;Shows in Application Map&lt;/li&gt;
&lt;li&gt;Correlates to trace IDs and transaction flows&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="portal-walkthrough-app-insights"&gt;Portal Walkthrough: App Insights
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Application Insights&lt;/strong&gt; (create if needed)&lt;/li&gt;
&lt;li&gt;In your App Service:
&lt;ul&gt;
&lt;li&gt;Monitoring → Application Insights&lt;/li&gt;
&lt;li&gt;Link to existing or create new&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;View the &lt;strong&gt;Application Map&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Check:
&lt;ul&gt;
&lt;li&gt;Server Response Time&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Failures&lt;/li&gt;
&lt;li&gt;Exceptions (with stack trace!)&lt;/li&gt;
&lt;li&gt;Request Drilldown&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="querying-app-insights-via-kql"&gt;Querying App Insights via KQL
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;requests
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where success == false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project timestamp, name, resultCode, duration, cloud_RoleName
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where type == &amp;#34;http&amp;#34; and duration &amp;gt; 1000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project timestamp, target, name, duration
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="use-case-performance-bottleneck-in-web-app"&gt;Use Case: Performance Bottleneck in Web App
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Alert fires: increase in 5xx HTTP&lt;/li&gt;
&lt;li&gt;Jump into App Insights → Trace affected request&lt;/li&gt;
&lt;li&gt;View context:
&lt;ul&gt;
&lt;li&gt;Which dependency failed?&lt;/li&gt;
&lt;li&gt;Which method threw?&lt;/li&gt;
&lt;li&gt;Which DB call took longest?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You’ll also see correlation IDs that link back to activity in Log Analytics.&lt;/p&gt;
&lt;h2 id="bicep-connect-app-insights-to-app-service"&gt;Bicep: Connect App Insights to App Service
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appServiceName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appInsightsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ai&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/components@2020-02-02&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appInsightsName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;web&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Application_Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;web&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Web/sites@2023-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appServiceName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;insightsLink&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Web/sites/extensions@2023-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;appService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/applicationInsights&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;InstrumentationKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;InstrumentationKey&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas"&gt;Gotchas
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sampling&lt;/strong&gt; enabled by default – can miss some traces (adjust if needed)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cold starts&lt;/strong&gt; in Functions skew performance data&lt;/li&gt;
&lt;li&gt;Not everything emits by default—opt into custom events where needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use App Map to visualise distributed transactions&lt;/li&gt;
&lt;li&gt;Always include custom dimensions in telemetry to enrich logs by env, tenant, user ID&lt;/li&gt;
&lt;li&gt;Export logs to Log Analytics Workspace for unified querying&lt;/li&gt;
&lt;li&gt;Test lifecycle: App Insights can detect startup times and deployment regressions&lt;/li&gt;
&lt;li&gt;Use end-to-end Transaction Search it’s underrated gold&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; You don’t need to instrument everything but you should instrument what matters. Application Insights is the difference between “The app is slow” and “That SQL query in Line 43 is the problem.”
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-monitor/app/app-insights-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;What is Application Insights?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-monitor/app/platforms?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Language SDKs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-monitor/app/azure-web-apps?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Connect App Service to App Insights&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Observability on Tap - End-to-End Azure Monitoring - Part 4</title><link>https://blog.brewedinthecloud.com/p/azure-monitor-metrics/</link><pubDate>Tue, 08 Jul 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-monitor-metrics/</guid><description>&lt;h2 id="why-performance-tuning-matters"&gt;Why Performance Tuning Matters
&lt;/h2&gt;&lt;p&gt;You’ve got visibility, alerts, and dashboards. But when things slow down, or start acting weird, you need deeper data-driven troubleshooting—not guesswork.&lt;/p&gt;
&lt;p&gt;Azure Monitor churns through a stream of telemetry, and this post is all about turning that raw data into actionable performance insights. We’ll focus on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigating and querying Azure Metrics&lt;/li&gt;
&lt;li&gt;Using Log Analytics for correlation and hunting&lt;/li&gt;
&lt;li&gt;Pinpointing performance bottlenecks before alerts fire&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="metrics-vs-logs-quick-compare"&gt;Metrics vs Logs: Quick Compare
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Metrics&lt;/th&gt;
&lt;th&gt;Logs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Granularity&lt;/td&gt;
&lt;td&gt;Near real-time&lt;/td&gt;
&lt;td&gt;Minutes to 5-minute delay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use cases&lt;/td&gt;
&lt;td&gt;Threshold-based monitoring&lt;/td&gt;
&lt;td&gt;Root cause, correlation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Billing model&lt;/td&gt;
&lt;td&gt;Free for many common signals&lt;/td&gt;
&lt;td&gt;Pay-per-GB ingested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format&lt;/td&gt;
&lt;td&gt;Structured time-series&lt;/td&gt;
&lt;td&gt;Semi-structured/full text&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You’ll often use both together metrics raise the flag, logs explain why.&lt;/p&gt;
&lt;h2 id="tools-youll-use"&gt;Tools You’ll Use
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Monitor Metrics Explorer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log Analytics (KQL)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workbooks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Built-in &lt;strong&gt;metrics + diagnostic logs&lt;/strong&gt; on services like:
&lt;ul&gt;
&lt;li&gt;App Services&lt;/li&gt;
&lt;li&gt;AKS&lt;/li&gt;
&lt;li&gt;SQL Database&lt;/li&gt;
&lt;li&gt;Application Gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="log-query-examples-for-performance-investigation"&gt;Log Query Examples for Performance Investigation
&lt;/h2&gt;&lt;h3 id="cpu-bottleneck-on-vms"&gt;CPU Bottleneck on VMs
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Perf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where ObjectName == &amp;#34;Processor&amp;#34; and CounterName == &amp;#34;% Processor Time&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize avg(CounterValue) by bin(TimeGenerated, 5m), Computer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by avg_CounterValue desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="web-app-latency-analysis"&gt;Web App Latency Analysis
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AppRequests
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where DurationMs &amp;gt; 1000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize SlowRequests=count() by bin(TimeGenerated, 5m), Name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by SlowRequests desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="app-gateway-backend-errors"&gt;App Gateway Backend Errors
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AzureDiagnostics
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where ResourceType == &amp;#34;APPLICATIONGATEWAYS&amp;#34; and BackendStatusCode startswith &amp;#34;5&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize count() by TimeGenerated, BackendPoolName
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Pair these queries with dashboards or surface them in Workbooks for fast visibility during high load.&lt;/p&gt;
&lt;h2 id="metrics-deep-dive-metrics-explorer"&gt;Metrics Deep Dive: Metrics Explorer
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Go to a resource (e.g. App Service)&lt;/li&gt;
&lt;li&gt;Select ➡️ &lt;strong&gt;Monitoring&lt;/strong&gt; &amp;gt; &lt;strong&gt;Metrics&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Choose:
&lt;ul&gt;
&lt;li&gt;Signal (e.g. Requests, Response time, 5xx errors)&lt;/li&gt;
&lt;li&gt;Time range, aggregation, and split by dimension&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pin charts directly to your dashboard or export as alert condition.&lt;/p&gt;
&lt;h2 id="use-case-tuning-app-service-performance"&gt;Use Case: Tuning App Service Performance
&lt;/h2&gt;&lt;p&gt;Example signals to monitor in tandem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU Time&lt;/strong&gt; (metric)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server Errors (5xx)&lt;/strong&gt; (metric or log)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exceptions&lt;/strong&gt; (App Insights log)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outgoing dependencies&lt;/strong&gt; (App Insights + Log Analytics)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Correlate a performance slowdown by stacking &lt;code&gt;DurationMs&lt;/code&gt;, &lt;code&gt;5xx errors&lt;/code&gt;, and infrastructure metrics in the same workbook.&lt;/p&gt;
&lt;h2 id="bicep-add-on-log-analytics-query-pack-preview-feature"&gt;Bicep Add-On: Log Analytics Query Pack (Preview Feature)
&lt;/h2&gt;&lt;p&gt;Want to standardise performance queries across environments?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;queryPack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/queryPacks@2022-10-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;standard-performance-queries&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logQuery&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/queryPacks/queries@2022-10-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;queryPack&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;cpu-usage-by-vm&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;CPU usage by VM (Top Offenders)&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Shows VMs with high average CPU usage&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Perf
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; | where ObjectName == &amp;#34;Processor&amp;#34; and CounterName == &amp;#34;% Processor Time&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; | summarize avg(CounterValue) by bin(TimeGenerated, 5m), Computer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; | order by avg_CounterValue desc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Metrics are your heartbeat, logs are your vitals. Use both clearly, together, and you’ll spend less time trial-and-erroring your way through bad nights and more time optimising good days.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-monitor/essentials/metrics-explorer?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Using Metrics Explorer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-monitor/logs/log-query-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Log queries in Azure Monitor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/app-service/app-service-best-practices?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Performance best practices for App Service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Observability on Tap - End-to-End Azure Monitoring - Part 3</title><link>https://blog.brewedinthecloud.com/p/azure-monitor-alerting/</link><pubDate>Thu, 03 Jul 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-monitor-alerting/</guid><description>&lt;h2 id="why-alerts-matter"&gt;Why Alerts Matter
&lt;/h2&gt;&lt;p&gt;Setting up dashboards and logging is great—but it won’t help much at 2am if no one’s watching.&lt;/p&gt;
&lt;p&gt;Azure Monitor alerts are your line of defence between quiet systems and production chaos. Combined with Action Groups, they make sure the right people (or scripts) get notified and take action ASAP.&lt;/p&gt;
&lt;p&gt;With this post, you&amp;rsquo;ll learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to create metric and log-based alerts&lt;/li&gt;
&lt;li&gt;How Action Groups work—and what’s “in an alert”&lt;/li&gt;
&lt;li&gt;Bonus tips for noise reduction and targeting alerts by environment or team&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-are-azure-alerts--action-groups"&gt;What Are Azure Alerts &amp;amp; Action Groups?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Azure Monitor Alerts&lt;/strong&gt; let you trigger notifications or automated actions when a signal crosses a threshold or matches a query.&lt;/p&gt;
&lt;p&gt;There are three common types:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Triggered By&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Metric alert&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time metrics&lt;/td&gt;
&lt;td&gt;CPU &amp;gt; 80% for 5 mins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Log alert&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;KQL query results from Log Analytics&lt;/td&gt;
&lt;td&gt;HTTP 500 errors &amp;gt; 10 in 5 mins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Activity log alert&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Azure resource event&lt;/td&gt;
&lt;td&gt;VM deleted or NSG updated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Action Groups&lt;/strong&gt; define &lt;strong&gt;what happens&lt;/strong&gt;—like sending email/SMS, calling a webhook, or triggering automation.&lt;/p&gt;
&lt;h2 id="azure-portal-walkthrough"&gt;Azure Portal Walkthrough
&lt;/h2&gt;&lt;h3 id="step-1-create-an-action-group-notification-recipient"&gt;Step 1: Create an Action Group (Notification Recipient)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Azure Monitor&lt;/strong&gt; → &lt;em&gt;Alerts&lt;/em&gt; → &lt;strong&gt;Action Groups&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+ Create&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Choose:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt; &amp;amp; short name (used in alert UI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group&lt;/strong&gt; &amp;amp; Region&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Notifications&lt;/strong&gt;, pick:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Email&lt;/strong&gt;, &lt;strong&gt;SMS&lt;/strong&gt;, &lt;strong&gt;Push notification&lt;/strong&gt;, or &lt;strong&gt;ITSM&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Actions&lt;/strong&gt;, choose:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Webhook&lt;/strong&gt;, &lt;strong&gt;Azure Function&lt;/strong&gt;, &lt;strong&gt;Logic App&lt;/strong&gt;, &lt;strong&gt;Automation Runbook&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Give it a tag like &lt;code&gt;env = production&lt;/code&gt; or &lt;code&gt;team = ops&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Review + Create&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-create-a-metric-alert-rule"&gt;Step 2: Create a Metric Alert Rule
&lt;/h3&gt;&lt;p&gt;Let’s alert on something common, like high CPU on a VM:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Azure Monitor → &lt;em&gt;Alerts&lt;/em&gt; → &lt;strong&gt;+ Create&lt;/strong&gt; → &lt;strong&gt;Alert rule&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Scope&lt;/em&gt;, choose a &lt;strong&gt;VM or App Service&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Condition&lt;/em&gt;, choose a &lt;strong&gt;signal&lt;/strong&gt; (e.g. &lt;code&gt;Percentage CPU&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Hit &lt;strong&gt;More options&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Set &lt;strong&gt;threshold&lt;/strong&gt; (e.g. Above 80%)&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;aggregation&lt;/strong&gt; (e.g. average over last 5 mins)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Actions&lt;/em&gt;, select the &lt;strong&gt;Action Group&lt;/strong&gt; you created&lt;/li&gt;
&lt;li&gt;Name it clearly (e.g. &lt;code&gt;vm-cpu-prod-high&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Review + Create&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-step-3-create-a-log-based-alert-eg-http-5xx-from-app-service"&gt;🔎 Step 3: Create a Log-Based Alert (e.g. HTTP 5xx from App Service)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Same flow → but choose &lt;strong&gt;Log Analytics Workspace&lt;/strong&gt; for &lt;em&gt;Scope&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Condition → &lt;strong&gt;Custom log search&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example KQL query:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AppRequests
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where ResultCode startswith &amp;#39;5&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize count() by bin(TimeGenerated, 5m)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where count_ &amp;gt; 10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set frequency (5m) and lookback (5m)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attach your Action Group&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finish and test&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="bicep-create-alert-rule-and-action-group-via-iac"&gt;Bicep: Create Alert Rule and Action Group via IaC
&lt;/h2&gt;&lt;p&gt;Here’s an example setup for a dynamic metric-based alert + action group:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Action Group Name for alert notifications&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;actionGroupName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyMonitoringActionGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Email //address to notify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;emailToNotify&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;someone@something.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Target VM Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVM&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Resource Group Name for the target VM&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetVmResourceGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVMResourceGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Metric Name which will be prepended by VM Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metricName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-HighCPU&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Reference the existing Virtual Machine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetVm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines@2024-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmname&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;targetVmResourceGroup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Action Group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;actionGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/actionGroups@2024-10-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;actionGroupName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;global&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupShortName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ProdAlerts&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;emailReceivers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PrimaryOpsContact&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;emailAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;emailToNotify&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a Metric Alert Rule for High CPU using dynamic threshold with low sensitivity&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metricAlerts_myVM_HighCPU_name_resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;microsoft.insights/metricAlerts@2018-03-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmname&lt;/span&gt;&lt;span class="si"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;metricName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;global&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetVm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;evaluationFrequency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT5M&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;windowSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT5M&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;criteria&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allOf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;alertSensitivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Low&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;failingPeriods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;numberOfEvaluationPeriods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;minFailingPeriodsToAlert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Metric1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metricNamespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;microsoft.compute/virtualmachines&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metricName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Percentage CPU&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;GreaterOrLessThan&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeAggregation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Average&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;criterionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DynamicThresholdCriterion&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;odata.type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Azure.Monitor.MultipleResourceMultipleMetricCriteria&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;autoMitigate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetResourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetResourceRegion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;actionGroupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;actionGroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="architecture-overview"&gt;Architecture Overview
&lt;/h2&gt;&lt;div class="mermaid"&gt;graph TD
AlertRule1[CPU Alert Rule] --&gt; AG1[Action Group]
AlertRule2[Log KQL Alert Rule] --&gt; AG1
AG1 --&gt; Email[Email Notification]
LogSearch --&gt; AlertRule2
MetricCPU --&gt; AlertRule1
&lt;/div&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;You can also have an action for WebHook which can send alert details (like severity, resource ID, timestamp, description) in a structured JSON payload to a monitoring/incident management system (e.g., PagerDuty, Splunk, ServiceNow, Slack via middleware)&lt;/p&gt;
&lt;p&gt;The receiving endpoint can then trigger custom logic such as automatically creating tickets or incidents, kick-off a remediation script, logging or auditing alert events&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="gotchas--guidance"&gt;Gotchas &amp;amp; Guidance
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Alerts on ephemeral resources&lt;/strong&gt;: Avoid alerting on short-lived services unless scoped by tag or app layer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid duplicates&lt;/strong&gt;: Azure doesn’t deduplicate alert rules automatically. Be strict with naming conventions like &lt;code&gt;app-env-metric-type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log alerts = delayed reaction&lt;/strong&gt; (~5m+ latency). Use &lt;strong&gt;metric alerts&lt;/strong&gt; for near real-time scenarios.&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re alerting on App Gateway or Firewall logs? Watch out for &lt;strong&gt;high volume&lt;/strong&gt;, and &lt;strong&gt;sample/summarise&lt;/strong&gt; in KQL.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Always name alerts like you name functions: clear, consistent, lowercase (&lt;code&gt;apigw-5xx-prod&lt;/code&gt;, &lt;code&gt;vm-cpu-east1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Assign &lt;strong&gt;owners via tags&lt;/strong&gt; (e.g. &lt;code&gt;team = sre&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;severity levels&lt;/strong&gt; with meaning (e.g. Sev 0 = page ops, Sev 3 = Slack-only)&lt;/li&gt;
&lt;li&gt;Collect and track alerts into a &lt;strong&gt;central Log Analytics workspace&lt;/strong&gt; if doing alert fatigue analysis&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;alert suppression&lt;/strong&gt; and &lt;strong&gt;smart groups&lt;/strong&gt; to reduce noise&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If you&amp;rsquo;re looking to do Azure Monitor at a larger scale check out Cloud Clarity&amp;rsquo;s Azure Monitor Script in the Learn More section below, built from the team at cubesys &amp;amp; cloud clarity its about deploying azure monitor metric alerts at scale, and managing exceptions through Tags! If you add some DevOps pipelines you can then deploy this on a schedule to make sure all new resources get the metric alerts you&amp;rsquo;ve defined in a control and consistent way.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-monitor/alerts/alerts-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create and manage Azure Monitor alerts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-monitor/alerts/action-groups?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Action Groups documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-monitor/alerts/alerts-metric-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Metric alert best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://github.com/cloudclarity-app/Azure-Monitoring/" target="_blank" rel="noopener"
&gt;Cloud Clarity Azure Monitor Script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Observability on Tap - End-to-End Azure Monitoring - Part 2</title><link>https://blog.brewedinthecloud.com/p/azure-monitor-dashboards/</link><pubDate>Tue, 01 Jul 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-monitor-dashboards/</guid><description>&lt;h2 id="why-this-matters"&gt;Why This Matters
&lt;/h2&gt;&lt;p&gt;A dashboard should be your cockpit not an art gallery. Yes, pretty graphs are nice, but you’re here for insights.&lt;/p&gt;
&lt;p&gt;In this post, you&amp;rsquo;ll learn how to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create dashboards with purpose&lt;/li&gt;
&lt;li&gt;Visualise data from Log Analytics and metrics&lt;/li&gt;
&lt;li&gt;Combine resource-level tiles with workspace insights&lt;/li&gt;
&lt;li&gt;Share dashboards across teams without the noise&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think of it as putting visibility on tap—because no one wants to fly blind in production.&lt;/p&gt;
&lt;h2 id="what-are-azure-monitor-dashboards"&gt;What are Azure Monitor Dashboards?
&lt;/h2&gt;&lt;p&gt;Azure dashboards are fully customisable canvases where you can display:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Metrics from Azure Monitor&lt;/li&gt;
&lt;li&gt;Log Analytics queries&lt;/li&gt;
&lt;li&gt;Alerts, events, and health data&lt;/li&gt;
&lt;li&gt;External data via markdown, HTML, or Power BI snippets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can mix data across subscriptions and regions, and even pin charts directly from Resource Groups or workbooks.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The goal? One screen that tells you &lt;em&gt;what you need to know, when you need to know it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="hands-on-azure-portal-steps"&gt;Hands-On: Azure Portal Steps
&lt;/h2&gt;&lt;h3 id="step-1-start-a-new-dashboard"&gt;Step 1: Start a New Dashboard
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Azure Portal&lt;/strong&gt; → &lt;em&gt;Dashboard&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+ New dashboard&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Name it something useful (e.g. &lt;code&gt;My-Production-Ops-Dashboard&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You’ll get a blank template, but don’t panic we’re going to fill it with useful tiles, not just eye candy.&lt;/p&gt;
&lt;h3 id="step-2-add-resource-metric-charts"&gt;Step 2: Add Resource Metric Charts
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Edit&lt;/strong&gt; → &lt;strong&gt;+ Add&lt;/strong&gt; → &lt;strong&gt;Metrics chart&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select a target resource (e.g., App Service, VM, Function App)&lt;/li&gt;
&lt;li&gt;Choose metrics to visualise (e.g., CPU %, HTTP 5xx, Disk IOPS)&lt;/li&gt;
&lt;li&gt;Customise time range and chart style&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Done Customising&lt;/strong&gt; → Save your dashboard&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Pin directly from a resource’s &lt;strong&gt;Metrics&lt;/strong&gt; blade when you find a useful view that is meaningful to what you are trying to monitor.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="step-3-add-log-analytics-query-visuals"&gt;Step 3: Add Log Analytics Query Visuals
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Add a tile with custom logs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edit dashboard → &lt;strong&gt;+ Add tile&lt;/strong&gt; → &lt;em&gt;&amp;ldquo;Log Analytics&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose your Log Analytics workspace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter your &lt;a class="link" href="https://learn.microsoft.com/en-au/azure/data-explorer/kusto/query/" target="_blank" rel="noopener"
&gt;KQL query&lt;/a&gt;&lt;br&gt;
Example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AzureDiagnostics
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where ResourceType == &amp;#34;APPLICATIONGATEWAYS&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize TotalRequests = count() by bin(TimeGenerated, 1h)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pick a visualisation (time chart, bar, grid)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Apply&lt;/strong&gt;, and rename the tile for clarity&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-4-group--share-wisely"&gt;Step 4: Group &amp;amp; Share Wisely
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Use sections or naming to group tiles by resource type (e.g., Compute, Network, App Layer)&lt;/li&gt;
&lt;li&gt;Share via RBAC roles or link access if dashboards need broader visibility&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bicep-dashboard-as-code"&gt;Bicep: Dashboard as Code
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;span class="lnt"&gt;127
&lt;/span&gt;&lt;span class="lnt"&gt;128
&lt;/span&gt;&lt;span class="lnt"&gt;129
&lt;/span&gt;&lt;span class="lnt"&gt;130
&lt;/span&gt;&lt;span class="lnt"&gt;131
&lt;/span&gt;&lt;span class="lnt"&gt;132
&lt;/span&gt;&lt;span class="lnt"&gt;133
&lt;/span&gt;&lt;span class="lnt"&gt;134
&lt;/span&gt;&lt;span class="lnt"&gt;135
&lt;/span&gt;&lt;span class="lnt"&gt;136
&lt;/span&gt;&lt;span class="lnt"&gt;137
&lt;/span&gt;&lt;span class="lnt"&gt;138
&lt;/span&gt;&lt;span class="lnt"&gt;139
&lt;/span&gt;&lt;span class="lnt"&gt;140
&lt;/span&gt;&lt;span class="lnt"&gt;141
&lt;/span&gt;&lt;span class="lnt"&gt;142
&lt;/span&gt;&lt;span class="lnt"&gt;143
&lt;/span&gt;&lt;span class="lnt"&gt;144
&lt;/span&gt;&lt;span class="lnt"&gt;145
&lt;/span&gt;&lt;span class="lnt"&gt;146
&lt;/span&gt;&lt;span class="lnt"&gt;147
&lt;/span&gt;&lt;span class="lnt"&gt;148
&lt;/span&gt;&lt;span class="lnt"&gt;149
&lt;/span&gt;&lt;span class="lnt"&gt;150
&lt;/span&gt;&lt;span class="lnt"&gt;151
&lt;/span&gt;&lt;span class="lnt"&gt;152
&lt;/span&gt;&lt;span class="lnt"&gt;153
&lt;/span&gt;&lt;span class="lnt"&gt;154
&lt;/span&gt;&lt;span class="lnt"&gt;155
&lt;/span&gt;&lt;span class="lnt"&gt;156
&lt;/span&gt;&lt;span class="lnt"&gt;157
&lt;/span&gt;&lt;span class="lnt"&gt;158
&lt;/span&gt;&lt;span class="lnt"&gt;159
&lt;/span&gt;&lt;span class="lnt"&gt;160
&lt;/span&gt;&lt;span class="lnt"&gt;161
&lt;/span&gt;&lt;span class="lnt"&gt;162
&lt;/span&gt;&lt;span class="lnt"&gt;163
&lt;/span&gt;&lt;span class="lnt"&gt;164
&lt;/span&gt;&lt;span class="lnt"&gt;165
&lt;/span&gt;&lt;span class="lnt"&gt;166
&lt;/span&gt;&lt;span class="lnt"&gt;167
&lt;/span&gt;&lt;span class="lnt"&gt;168
&lt;/span&gt;&lt;span class="lnt"&gt;169
&lt;/span&gt;&lt;span class="lnt"&gt;170
&lt;/span&gt;&lt;span class="lnt"&gt;171
&lt;/span&gt;&lt;span class="lnt"&gt;172
&lt;/span&gt;&lt;span class="lnt"&gt;173
&lt;/span&gt;&lt;span class="lnt"&gt;174
&lt;/span&gt;&lt;span class="lnt"&gt;175
&lt;/span&gt;&lt;span class="lnt"&gt;176
&lt;/span&gt;&lt;span class="lnt"&gt;177
&lt;/span&gt;&lt;span class="lnt"&gt;178
&lt;/span&gt;&lt;span class="lnt"&gt;179
&lt;/span&gt;&lt;span class="lnt"&gt;180
&lt;/span&gt;&lt;span class="lnt"&gt;181
&lt;/span&gt;&lt;span class="lnt"&gt;182
&lt;/span&gt;&lt;span class="lnt"&gt;183
&lt;/span&gt;&lt;span class="lnt"&gt;184
&lt;/span&gt;&lt;span class="lnt"&gt;185
&lt;/span&gt;&lt;span class="lnt"&gt;186
&lt;/span&gt;&lt;span class="lnt"&gt;187
&lt;/span&gt;&lt;span class="lnt"&gt;188
&lt;/span&gt;&lt;span class="lnt"&gt;189
&lt;/span&gt;&lt;span class="lnt"&gt;190
&lt;/span&gt;&lt;span class="lnt"&gt;191
&lt;/span&gt;&lt;span class="lnt"&gt;192
&lt;/span&gt;&lt;span class="lnt"&gt;193
&lt;/span&gt;&lt;span class="lnt"&gt;194
&lt;/span&gt;&lt;span class="lnt"&gt;195
&lt;/span&gt;&lt;span class="lnt"&gt;196
&lt;/span&gt;&lt;span class="lnt"&gt;197
&lt;/span&gt;&lt;span class="lnt"&gt;198
&lt;/span&gt;&lt;span class="lnt"&gt;199
&lt;/span&gt;&lt;span class="lnt"&gt;200
&lt;/span&gt;&lt;span class="lnt"&gt;201
&lt;/span&gt;&lt;span class="lnt"&gt;202
&lt;/span&gt;&lt;span class="lnt"&gt;203
&lt;/span&gt;&lt;span class="lnt"&gt;204
&lt;/span&gt;&lt;span class="lnt"&gt;205
&lt;/span&gt;&lt;span class="lnt"&gt;206
&lt;/span&gt;&lt;span class="lnt"&gt;207
&lt;/span&gt;&lt;span class="lnt"&gt;208
&lt;/span&gt;&lt;span class="lnt"&gt;209
&lt;/span&gt;&lt;span class="lnt"&gt;210
&lt;/span&gt;&lt;span class="lnt"&gt;211
&lt;/span&gt;&lt;span class="lnt"&gt;212
&lt;/span&gt;&lt;span class="lnt"&gt;213
&lt;/span&gt;&lt;span class="lnt"&gt;214
&lt;/span&gt;&lt;span class="lnt"&gt;215
&lt;/span&gt;&lt;span class="lnt"&gt;216
&lt;/span&gt;&lt;span class="lnt"&gt;217
&lt;/span&gt;&lt;span class="lnt"&gt;218
&lt;/span&gt;&lt;span class="lnt"&gt;219
&lt;/span&gt;&lt;span class="lnt"&gt;220
&lt;/span&gt;&lt;span class="lnt"&gt;221
&lt;/span&gt;&lt;span class="lnt"&gt;222
&lt;/span&gt;&lt;span class="lnt"&gt;223
&lt;/span&gt;&lt;span class="lnt"&gt;224
&lt;/span&gt;&lt;span class="lnt"&gt;225
&lt;/span&gt;&lt;span class="lnt"&gt;226
&lt;/span&gt;&lt;span class="lnt"&gt;227
&lt;/span&gt;&lt;span class="lnt"&gt;228
&lt;/span&gt;&lt;span class="lnt"&gt;229
&lt;/span&gt;&lt;span class="lnt"&gt;230
&lt;/span&gt;&lt;span class="lnt"&gt;231
&lt;/span&gt;&lt;span class="lnt"&gt;232
&lt;/span&gt;&lt;span class="lnt"&gt;233
&lt;/span&gt;&lt;span class="lnt"&gt;234
&lt;/span&gt;&lt;span class="lnt"&gt;235
&lt;/span&gt;&lt;span class="lnt"&gt;236
&lt;/span&gt;&lt;span class="lnt"&gt;237
&lt;/span&gt;&lt;span class="lnt"&gt;238
&lt;/span&gt;&lt;span class="lnt"&gt;239
&lt;/span&gt;&lt;span class="lnt"&gt;240
&lt;/span&gt;&lt;span class="lnt"&gt;241
&lt;/span&gt;&lt;span class="lnt"&gt;242
&lt;/span&gt;&lt;span class="lnt"&gt;243
&lt;/span&gt;&lt;span class="lnt"&gt;244
&lt;/span&gt;&lt;span class="lnt"&gt;245
&lt;/span&gt;&lt;span class="lnt"&gt;246
&lt;/span&gt;&lt;span class="lnt"&gt;247
&lt;/span&gt;&lt;span class="lnt"&gt;248
&lt;/span&gt;&lt;span class="lnt"&gt;249
&lt;/span&gt;&lt;span class="lnt"&gt;250
&lt;/span&gt;&lt;span class="lnt"&gt;251
&lt;/span&gt;&lt;span class="lnt"&gt;252
&lt;/span&gt;&lt;span class="lnt"&gt;253
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the existing virtual machine to show in the dashboard&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVM&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the resource group that contains the virtual machine&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVMResourceGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Static Site to show in the dashboard&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticSiteName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyStaticSite&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the resource group that contains the static site&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticSiteResourceGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyStaticSiteRG&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Subscription ID for the static site resource group&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticSiteSubscriptionId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0000-0000-0000-0000-0000&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the dashboard to display in Azure portal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dashboardDisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Simple Dashboard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticSite&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Web/staticSites@2023-12-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticSiteName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;staticSiteSubscriptionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;staticSiteResourceGroup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Portal/dashboards@2020-09-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dashboardDisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hidden-title&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dashboardDisplayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lenses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rowSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;colSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;11&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;queryInputs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timespan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chartType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Percentage CPU&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Extension/Microsoft_Azure_Monitoring/PartType/MetricsChartPart&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rowSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;colSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;queryInputs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timespan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chartType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Disk Read Operations/Sec&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Disk Write Operations/Sec&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Extension/Microsoft_Azure_Monitoring/PartType/MetricsChartPart&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rowSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;colSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;queryInputs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timespan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chartType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Disk Read Bytes&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Disk Write Bytes&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Extension/Microsoft_Azure_Monitoring/PartType/MetricsChartPart&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;6&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rowSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;colSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;queryInputs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timespan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PT1H&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chartType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Network In Total&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Network Out Total&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Extension/Microsoft_Azure_Monitoring/PartType/MetricsChartPart&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;9&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rowSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;colSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualMachineResourceGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Extension/Microsoft_Azure_Compute/PartType/VirtualMachinePart&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;asset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;idInputName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualMachine&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;colSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;6&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rowSpan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;options&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isOptional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;sharedTimeRange&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isOptional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Extension/HubsExtension/PartType/MonitorChartPart&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceMetadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticSite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SiteHits&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;aggregationType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;microsoft.web/staticsites&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metricVisualization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SiteHits&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceDisplayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticSiteName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Sum SiteHits for &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;staticSiteName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;titleKind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;visualization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chartType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;legendVisualization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isVisible&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hideHoverCard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hideLabelNames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;axisVisualization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isVisible&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;axisType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isVisible&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;axisType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;disablePinning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="real-world-observability-strategy"&gt;Real-World Observability Strategy
&lt;/h2&gt;&lt;p&gt;Good dashboards are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Role-based&lt;/strong&gt; (What do SREs/Apps/Security care about?)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context-aware&lt;/strong&gt; (Show logs &lt;em&gt;and&lt;/em&gt; metrics in the same view)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actionable&lt;/strong&gt; (Add alerts links, drill-through links to logs)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avoid the &amp;ldquo;wall of graphs&amp;rdquo; syndrome. Each tile should answer:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What’s happening now, and is it affecting things I care about?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="dashboard-architecture-example"&gt;Dashboard Architecture Example
&lt;/h2&gt;&lt;div class="mermaid"&gt;graph TD
DSH[Azure Dashboard] --&gt; MetricChart[Resource Metrics]
DSH --&gt; LAQuery[Log Analytics Tiles]
DSH --&gt; Alerts[Alert Summary/Status]
LAQuery --&gt; LA[Log Analytics Workspace]
MetricChart --&gt; AzureVM[Azure VMs]
MetricChart --&gt; AppService[App Service]
MetricChart --&gt; AKS[AKS Metrics]
Alerts --&gt; AzureMonitor[Azure Monitor Alerts]
&lt;/div&gt;
&lt;h2 id="gotchas--guidance"&gt;Gotchas &amp;amp; Guidance
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Time ranges vary&lt;/strong&gt;: Log tiles and metric charts respect different default timeframes. Align them for clarity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Too many queries = slower dashboards&lt;/strong&gt;: Especially if you’re visualising multiple LA queries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RBAC complexity&lt;/strong&gt;: Users need access to both the dashboard and the underlying resources/data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don’t duplicate Workbooks&lt;/strong&gt;: Use Workbooks for rich visuals with interactivity. Use Dashboards for quick-glance health/status.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Standardise dashboard &lt;strong&gt;layout&lt;/strong&gt; across environments&lt;/li&gt;
&lt;li&gt;Show &lt;strong&gt;leading indicators&lt;/strong&gt; (not just lagging events)&lt;/li&gt;
&lt;li&gt;Combine metrics + logs together to tell the full story&lt;/li&gt;
&lt;li&gt;Save key KQL tiles as shared queries for reusability&lt;/li&gt;
&lt;li&gt;Tag dashboards with owner/team for easy triage&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;A dashboard is only as good as the decisions it enables. I usually build separate boards for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Infra health&lt;/strong&gt; (CPU, Disk, Memory, Networking)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App behaviour&lt;/strong&gt; (errors, exceptions, response codes)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security posture&lt;/strong&gt; (sign-ins, alerts, threat intel hits)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That way, each team gets their own console—and no one’s re-living the bad old days of the Big Red Wall of False Positives.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-monitor/visualize/tutorial-logs-dashboards?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Monitor Dashboards Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-portal/azure-portal-dashboards?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Build Dashboards in the Azure Portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/data-explorer/kusto/query/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;KQL Query Language Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Observability on Tap - End-to-End Azure Monitoring - Part 1</title><link>https://blog.brewedinthecloud.com/p/azure-monitor-setup/</link><pubDate>Thu, 26 Jun 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-monitor-setup/</guid><description>&lt;h2 id="why-this-matters"&gt;Why This Matters
&lt;/h2&gt;&lt;p&gt;Observability isn&amp;rsquo;t just turning on metrics and logs it&amp;rsquo;s about setting up a system that can &lt;em&gt;answer questions you haven&amp;rsquo;t asked yet&lt;/em&gt;. Azure Monitor gives you that engine, but Log Analytics is the brain that makes it actionable.&lt;/p&gt;
&lt;p&gt;In this post, we’re setting up the foundation for the entire “Azure Observability on Tap” series:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable Azure Monitor and connect it with Log Analytics&lt;/li&gt;
&lt;li&gt;Define a workspace structure that scales&lt;/li&gt;
&lt;li&gt;Tear into data sources: VMs, PaaS, AKS, more&lt;/li&gt;
&lt;li&gt;Keep costs predictable while capturing enough signal&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-is-azure-monitor--log-analytics"&gt;What is Azure Monitor + Log Analytics?
&lt;/h2&gt;&lt;p&gt;Azure Monitor is the native observability platform baked into Azure. It collects and organises:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Metrics&lt;/strong&gt; (numerical, structured)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logs&lt;/strong&gt; (structured/semi-structured, often from agents or control planes)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traces&lt;/strong&gt;, &lt;strong&gt;alerts&lt;/strong&gt;, &lt;strong&gt;dashboards&lt;/strong&gt;, and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Log Analytics is the data engine underneath the “Logs” portion—it’s where you query, correlate, and visualise log data using Kusto Query Language (KQL). It all lives inside a Log Analytics workspace.&lt;/p&gt;
&lt;p&gt;Think of Azure Monitor as your barista, and Log Analytics as the espresso machine. Everything routes through that workspace if you want detail, precision, and flavour.&lt;/p&gt;
&lt;h2 id="key-concepts"&gt;Key Concepts
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Summary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Log Analytics Workspace&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Central hub for ingesting and querying logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Sources&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VMs, containers, apps, PaaS services, diagnostic settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Diagnostic Settings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Route platform logs/metrics to Log Analytics, Storage, or Event Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing Tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pay-as-you-go (GB/month ingested), with cost management via sampling/filtering&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="azure-portal-walkthrough"&gt;Azure Portal Walkthrough
&lt;/h2&gt;&lt;p&gt;Let’s set up Azure Monitor + Log Analytics step by step:&lt;/p&gt;
&lt;h3 id="step-1-create-a-log-analytics-workspace"&gt;Step 1: Create a Log Analytics Workspace
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;strong&gt;Azure Portal&lt;/strong&gt; → &lt;em&gt;Search: Log Analytics workspaces&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;+ Create&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource group&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workspace name&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region&lt;/strong&gt; (&lt;em&gt;ideally same as your resources&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Review + Create&lt;/strong&gt; → then &lt;strong&gt;Create&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-connect-data-sources"&gt;Step 2: Connect Data Sources
&lt;/h3&gt;&lt;h4 id="connect-a-vm"&gt;Connect a VM
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Navigate to the VM → &lt;strong&gt;Monitoring&lt;/strong&gt; → &lt;em&gt;Insights&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Enable&lt;/strong&gt; → Select your &lt;strong&gt;Workspace&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Azure installs the &lt;strong&gt;Log Analytics agent&lt;/strong&gt; automatically&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="connect-a-paas-resource-eg-app-service"&gt;Connect a PaaS Resource (e.g., App Service)
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Go to the App Service → &lt;strong&gt;Monitoring&lt;/strong&gt; → &lt;em&gt;Diagnostic settings&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+ Add diagnostic setting&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;logs &amp;amp; metrics&lt;/strong&gt; to push&lt;/li&gt;
&lt;li&gt;Route them to the &lt;strong&gt;Log Analytics workspace&lt;/strong&gt; you created&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
Repeat this for resources like Azure Firewall, Application Gateway, Key Vault, etc.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="step-3-configure-retention-settings-optional"&gt;Step 3: Configure Retention Settings (Optional)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Log Analytics Workspace → &lt;strong&gt;Usage and estimated costs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Adjust &lt;strong&gt;data retention&lt;/strong&gt; (default is 30 days, up to 730 days)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="bicep-infrastructure-as-code"&gt;Bicep: Infrastructure as Code
&lt;/h2&gt;&lt;p&gt;Here’s a basic Bicep snippet to provision the Log Analytics workspace:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name the log analytics workspace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyLogAnalyticsWorkspace&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalytics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.OperationalInsights/workspaces@2025-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionInDays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;60&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PerGB2018&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Add VM onboarding with a VM extension or automate diagnostic settings using &lt;code&gt;Microsoft.Insights/diagnosticSettings&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Log Analytics Workspace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsWorkspaceName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyLogAnalyticsWorkspace&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Resource Group Name for Log Analytics Workspace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsResourceGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyLogAnalyticsRG&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Machine to monitor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVM&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Reference the existing Log Analytics Workspace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalytics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.OperationalInsights/workspaces@2025-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsWorkspaceName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsResourceGroup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Ensure the diagnostic settings are applied to all VMs in the resource group &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmResources&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines@2024-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmname&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create diagnostic settings for each VM to send logs to Log Analytics Workspace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmDiagnosticSettings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/diagnosticSettings@2021-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmname&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-diagnosticSettings&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmResources&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalytics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualMachineInsights&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllMetrics&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="architecture-overview"&gt;Architecture Overview
&lt;/h2&gt;&lt;p&gt;Here is a brief overview diagram to demonstrate what kind of resources and how they talk to Azure Log Analytics Workspaces&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
VM1[Azure VM] --&gt; LA[Log Analytics Workspace]
AppService[App Service] --&gt; DS1[Diagnostic Settings] --&gt; LA
AKS[AKS Cluster] --&gt; DS2 --&gt; LA
AzureFunction[Function App] --&gt; DS3 --&gt; LA
LogAnalyticsAgent[Log Analytics Agent] --&gt; LA
LA --&gt; AzureMonitor[Azure Monitor Insights]
AzureMonitor --&gt; Dashboards
AzureMonitor --&gt; Alerts
&lt;/div&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agent sunset&lt;/strong&gt;: The legacy &lt;em&gt;Log Analytics agent (MMA)&lt;/em&gt; is being replaced by &lt;strong&gt;Azure Monitor Agent (AMA)&lt;/strong&gt;. Plan migration now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data volume&lt;/strong&gt;: Be careful with PaaS logs (especially App Service HTTP logs). Hook into &lt;strong&gt;Diagnostic Settings sampling&lt;/strong&gt; or filtering to reduce noise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency&lt;/strong&gt;: Logs may take a few minutes to appear. Not real-time—always validate latency in design.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-region costs&lt;/strong&gt;: Sending logs from one region to a workspace in another? Expect egress costs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Centralise to fewer workspaces where RBAC and data sovereignty allows&lt;/li&gt;
&lt;li&gt;Apply naming standards (&lt;code&gt;&amp;lt;env&amp;gt;-observability-la&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Align workspace region with workload&lt;/li&gt;
&lt;li&gt;Set retention to match compliance &amp;amp; usage (often 30–90 days unless required longer)&lt;/li&gt;
&lt;li&gt;Pull in Diagnostics + platform metrics especially for network resources&lt;/li&gt;
&lt;li&gt;Use Resource Diagnostic Settings over legacy agents when possible&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Log Analytics isn’t just for performance dashboards it’s your front line for security signals too. I usually deploy a dedicated management workspace to capture tenant level logs like Entra ID Sign-ins, Risky Users, and Azure Activity Logs.&lt;/p&gt;
&lt;p&gt;Yes, the “fewer workspaces” rule can get messy in the wild but it’s still worth the effort. Nothing drains your day faster than chasing a log across five workspaces just to track down a single issue.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/logs/log-analytics-workspace-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Log Analytics Workspace Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/agents/azure-monitor-agent-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Monitor Agent migration guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/diagnostic-settings?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Diagnostic settings documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>From Rack to Cloud: Part 5 – Post-Migration Power Up</title><link>https://blog.brewedinthecloud.com/p/azure-migrate-post/</link><pubDate>Tue, 24 Jun 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migrate-post/</guid><description>&lt;h3 id="opening"&gt;Opening
&lt;/h3&gt;&lt;p&gt;You’ve made it to Azure, congrats! But the work doesn’t end at the migration cutover. Just like brewing the perfect beer, making the most of your cloud involves a few finishing touches.&lt;/p&gt;
&lt;p&gt;In this post, we’ll explore the best practices for optimising your resources post-migration, ensuring your workloads are not only running but thriving in Azure.&lt;/p&gt;
&lt;h2 id="post-migration-optimisation-strategies"&gt;Post-Migration Optimisation Strategies
&lt;/h2&gt;&lt;p&gt;Once your workloads are running in Azure, it’s vital to evaluate their performance, security, and cost implications. Here are key strategies for maintaining optimal operations.&lt;/p&gt;
&lt;h3 id="1-cost-management-and-optimization"&gt;1. Cost Management and Optimization
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Utilise the Azure Cost Management Tool&lt;/strong&gt;&lt;br&gt;
Implement Azure Cost Management to monitor spending and budget effectively. Set alerts for unused or under-utilised resources to avoid surprises.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FinOps&lt;/strong&gt;
You&amp;rsquo;ve probably heard about FinOps, if you haven&amp;rsquo;t then you should checkout &lt;a class="link" href="https://www.finops.org/" target="_blank" rel="noopener"
&gt;FinOps.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Show Back or Charge Back&lt;/strong&gt;
Many organisations consider implementing show back or charge back models after migrating to Azure, providing clearer visibility into consumption and costs. While not suited for every business, it can be valuable for understanding service usage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Right-Sizing Resources&lt;/strong&gt;&lt;br&gt;
Use Azure Advisor to analyse VM sizes based on historical usage data. Adjust VM types and sizes to avoid over-provisioning or under-utilisation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Reserved Instances&lt;/strong&gt;&lt;br&gt;
For critical workloads that will run continuously, consider purchasing reserved instances for a cost-efficient pricing model. This reduces overall expenditure significantly compared to pay-as-you-go pricing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-performance-monitoring"&gt;2. Performance Monitoring
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Monitor and Application Insights&lt;/strong&gt;&lt;br&gt;
Leverage Azure Monitor and Application Insights to track application performance and identify bottlenecks. Implement alerts to proactively address issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deployment Slots for App Services&lt;/strong&gt;&lt;br&gt;
Use deployment slots to conduct application testing in a staging environment, ensuring performance remains smooth during updates or new deployments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SQL Performance&lt;/strong&gt;
Just as with on-prem SQL, you still need to monitor performance in Azure. Closely track query lengths, execution times, and overall optimization through the Azure portal for better efficiency.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-security-improvements"&gt;3. Security Improvements
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Security Center&lt;/strong&gt;&lt;br&gt;
Enable Azure Security Center to get continuous security assessments and recommendations. Ensure security policies are configured, and alerts set for any suspicious activities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implement Role-Based Access Control (RBAC)&lt;/strong&gt;&lt;br&gt;
Regularly review RBAC settings in Entra ID to ensure users have the minimum permissions required for their roles. This enhances security by following the principle of least privilege.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Defender for Cloud&lt;/strong&gt;
Now you&amp;rsquo;ve migrated you should investigate uplifting your security to be aligned with your new environment this includes security of resources, resource manager, VM&amp;rsquo;s and SQL vulnerabilities etc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-backup-and-disaster-recovery"&gt;4. Backup and Disaster Recovery
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Backup Solution&lt;/strong&gt;&lt;br&gt;
Implement Azure Backup for critical workloads to ensure data protection. Regularly test recovery processes to ensure you can restore key applications in case of incidents.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Design for resilience&lt;/strong&gt;
If you have completed a lift-n-shift to get into Azure and plan on rebuilding some of your environment design with resilience in mind ensuring that you design for failure which ensures when failure occurs you&amp;rsquo;re already covered.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Site Recovery for Business Continuity&lt;/strong&gt;&lt;br&gt;
Utilize Azure Site Recovery to replicate workloads to ensure business continuity and minimize downtime in the event of a system failure.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-continuous-improvement"&gt;5. Continuous Improvement
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Regularly Review Resource Utilization&lt;/strong&gt;&lt;br&gt;
Set a cadence for regular reviews of resource usage and performance metrics. Adjust your cloud architecture based on evolving organisational needs and user feedback.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure as Code (IaC)&lt;/strong&gt;
We can now leverage a more DevOps centric environment as cloud and platform engineers and move away from Click-Ops to IaC to ensure we deploy new resources or re-deploy existing resources consistently. This allows for better operational management and enhances change control within a cloud environment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feedback Loops&lt;/strong&gt;&lt;br&gt;
Encourage feedback from your teams working on migrated applications, and iterate based on their input for further optimization.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="real-world-case-study-not-for-profit-organisation"&gt;Real-World Case Study: Not-for-Profit Organisation
&lt;/h2&gt;&lt;p&gt;Our ongoing example of the Sydney-based not-for-profit showcases the impact of post-migration optimisation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cost changes&lt;/strong&gt; were immediately tracked using Azure Cost Management; they reclaimed over 15% in unnecessary expenses through more efficient VM sizing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Using Azure Security Center&lt;/strong&gt;, they identified and resolved several potential vulnerabilities within weeks of migration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Show back&lt;/strong&gt; was implemented by implementing a clear and consistent resource tagging structure. Now they have been able to demonstrate the cost of IT back to the business for more clarity and transparency from IT back to the business.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hidden Costs&lt;/strong&gt;: Even with reserved instances, data egress charges can surprise organisations. Monitor these costs closely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slow Adoption of Changes&lt;/strong&gt;: Teams may resist shifting from on-premises mindsets to cloud-native operational practices, leading to slower adoption of cloud features.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Infrequent Backups&lt;/strong&gt;: Regularly validate your backup and disaster recovery solution; neglecting checks can lead to data loss.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Sprawl&lt;/strong&gt;: Without a systematic approach, it’s easy to accumulate unused resources over time, driving costs up unnecessarily.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="brewed-take-"&gt;Brewed Take ☕
&lt;/h2&gt;&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; Post-migration is just the beginning.&lt;br&gt;
Optimisation is part art, part science — continuously refining workloads, tuning performance, and ensuring security in a dynamic landscape.&lt;br&gt;
Commit to the journey, and you’ll unlock lasting value from Azure.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cost-management-billing/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Cost Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/overview/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Monitor Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/security-center/security-center-introduction?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Security Center&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>From Rack to Cloud: Part 4 – Bridging the Worlds: Networking and Identity in Azure</title><link>https://blog.brewedinthecloud.com/p/azure-migrate-hybrid/</link><pubDate>Thu, 19 Jun 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migrate-hybrid/</guid><description>&lt;p&gt;As you navigate the journey to the cloud, you&amp;rsquo;ll often face a tug-of-war between what stays on-prem and what shifts to Azure. Balancing these demands makes the integrity of your networking and identity systems paramount.&lt;/p&gt;
&lt;p&gt;In this post, we’ll uncover the best practices for hybrid connectivity and identity management, with insights from our ongoing migration story of a Sydney-based not-for-profit transitioning 300 VMs within a tight deadline.&lt;/p&gt;
&lt;h2 id="networking-in-a-hybrid-environment"&gt;Networking in a Hybrid Environment
&lt;/h2&gt;&lt;p&gt;When organisations transition to Azure, two primary networking models often come into play: &lt;strong&gt;Hybrid networking&lt;/strong&gt; and &lt;strong&gt;cloud-only networking&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="key-connectivity-options"&gt;Key Connectivity Options
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;VPN Gateway: Connecting Securely&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connects your on-premises network securely to Azure via Site-to-Site VPN.&lt;/li&gt;
&lt;li&gt;Best for workloads needing an extended environment without incurring high costs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ideal Use Case&lt;/strong&gt;: Temporary setups during migrations or infrequent workloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ExpressRoute: For the Heavy Lifters&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A dedicated, private connection to Azure that bypasses the public internet for added reliability and performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ideal Use Case&lt;/strong&gt;: Consistent high-throughput workloads, like data transfer-heavy applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Virtual WAN: Comprehensive Networking&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Centralises network resources like VPNs, ExpressRoute, and Azure Firewall in a single framework.&lt;/li&gt;
&lt;li&gt;Useful for enterprises with many geographic locations or branch offices.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="network-security-considerations"&gt;Network Security Considerations
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Ensure NSGs (Network Security Groups) are properly configured to allow necessary traffic while blocking unwanted exposure.&lt;/li&gt;
&lt;li&gt;Centralising your connectivity for inbound and outbound by utilising an Azure Firewall or Network Virtual Appliance (NVA) Firewall will provide you with more insight and logging capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; In 2025, Internet Direct for Azure IaaS Virtual Machines will be discontinued. Ensure you deploy either an Azure Network Address Translation (NAT) Gateway, an Azure Firewall or Network Virtual Appliance (NVA) firewall solution to maintain connectivity.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="implementing-networking-a-real-world-example"&gt;Implementing Networking: A Real-World Example
&lt;/h3&gt;&lt;p&gt;For our not-for-profit organisation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They opted for &lt;strong&gt;Site-to-Site VPN&lt;/strong&gt; during the migration due to its speed and low initial cost.&lt;/li&gt;
&lt;li&gt;Once more cloud resources were assessed, they could evaluate the need for &lt;strong&gt;ExpressRoute&lt;/strong&gt; for data-heavy processing applications, ensuring secure real-time connections with lower latency.&lt;/li&gt;
&lt;li&gt;They had an on-prem Fortigate Firewall after reviewing the Azure Firewall functionality they decided to go with Azure Firewall Premium for the cloud.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="identity-management-in-azure"&gt;Identity Management in Azure
&lt;/h2&gt;&lt;p&gt;With networking sorted, you can’t neglect identity. Entra ID (Formerly Azure Active Directory) is the backbone of identity management in a hybrid environment.&lt;/p&gt;
&lt;h3 id="key-components-of-identity-management-in-azure"&gt;Key Components of Identity Management in Azure
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Single Sign-On (SSO) with Entra ID&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable SSO to help users access both on-prem and cloud applications without repeated logins. This reduces friction and improves overall experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conditional Access Policies for Security&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set policies that allow administrators to enforce restrictions based on user location, device compliance, or risk level, ensuring only the right users access sensitive applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Real-Time Vulnerability Detection with Identity Protection&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use Entra ID Identity Protection to detect vulnerabilities and respond in real-time, protecting your organisation from potential threats.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="implementing-identity-approach-of-our-nfp"&gt;Implementing Identity: Approach of our NFP
&lt;/h3&gt;&lt;p&gt;In practice for our not-for-profit, they already had Entra Connect running for M365 Services from their existing Active Directory (AD):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All users were synchronised to ensure no service disruptions during the cloud transition.&lt;/li&gt;
&lt;li&gt;Policies were set up so staff accessing sensitive systems from outside the corporate office were prompted for MFA (Multi-Factor Authentication).&lt;/li&gt;
&lt;li&gt;Active Directory still required as legacy applications still dependant on AD Authentication&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cost Awareness&lt;/strong&gt;: Be aware of ExpressRoute costs. This choice might be ideal, but budget impacts must align with operational needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overlapping IP Spaces&lt;/strong&gt;: Ensure both on-prem and Azure have non-overlapping IP ranges to avoid routing issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS Configuration&lt;/strong&gt;: Mixed environments may require both Azure and on-prem DNS strategies. Test resolution paths before cutover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Experience&lt;/strong&gt;: Users may face confusion if they aren&amp;rsquo;t adequately trained on new SSO practices or if some applications haven’t fully transitioned to the cloud identity model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potential Latency Issues&lt;/strong&gt;: Hybrid configurations may create a performance latency if not properly architected, especially during peak usage times.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Insufficient Bandwidth&lt;/strong&gt;: Lack of adequate bandwidth may hamper data-intensive applications during peak loads, especially when connecting Azure services with on-premises infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance Gaps&lt;/strong&gt;: Hybrid setups must adhere to organisational and regulatory standards that might shift throughout a cloud transition. Regular audits can help ensure ongoing compliance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use Azure Monitor and Network Watcher to keep an eye on traffic flows and potential bottlenecks.&lt;/li&gt;
&lt;li&gt;Regularly review and adjust network security rules and identity policies as new resources are added.&lt;/li&gt;
&lt;li&gt;Validate connectivity paths before actual cutovers to identify potential issues.&lt;/li&gt;
&lt;li&gt;Create clear documentation and runbooks for ongoing operations under the new hybrid model.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="brewed-take-"&gt;Brewed Take ☕
&lt;/h2&gt;&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;In hybrid cloud environments, networking and identity are not mere technical details — they are the lifeblood of seamless operations.&lt;/p&gt;
&lt;p&gt;Smart integrations between Azure and on-premises systems fortify your infrastructure. Neglect them, and your migration efforts could stumble over easily avoidable hurdles.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/networking/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Networking Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/active-directory/hybrid/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Hybrid Identity Solutions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>From Rack to Cloud: Part 3 – Lift, Shift, or Take the Scenic Route?</title><link>https://blog.brewedinthecloud.com/p/azure-migrate-methods/</link><pubDate>Tue, 17 Jun 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migrate-methods/</guid><description>&lt;h2 id="opening"&gt;Opening
&lt;/h2&gt;&lt;p&gt;Not every workload needs a redesign. Some just need a new postcode. Others? It’s time to retire them.&lt;/p&gt;
&lt;p&gt;Cloud migrations often stall at a deceptively simple decision:&lt;br&gt;
&lt;em&gt;Do we lift it as-is, or modernise it on the way?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this post, we’ll help you decide when to rehost, refactor, or rebuild — and how the 300-VM not-for-profit did it, under pressure and on a deadline.&lt;/p&gt;
&lt;h2 id="migration-strategies-know-your-options"&gt;Migration Strategies: Know Your Options
&lt;/h2&gt;&lt;p&gt;When moving to Azure, most workloads land in one of three lanes:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example Azure Services&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rehost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lift and shift with minimal or no changes&lt;/td&gt;
&lt;td&gt;Azure VMs, Azure VMware Solution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Refactor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minor config/code updates to unlock cloud features&lt;/td&gt;
&lt;td&gt;App Services, Azure SQL MI, Logic Apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rebuild&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Re-architected using PaaS or SaaS&lt;/td&gt;
&lt;td&gt;Azure SQL DB, Serverless Functions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each one has a trade-off: time, cost, control, and complexity.&lt;/p&gt;
&lt;h2 id="real-world-impact-triage-under-pressure"&gt;Real-World Impact: Triage Under Pressure
&lt;/h2&gt;&lt;p&gt;Back to our 300-VM migration story.&lt;/p&gt;
&lt;p&gt;This Sydney-based not-for-profit had a 90-day deadline to vacate their co-location facility. They didn’t have time to modernise everything, but they didn’t want to reproduce years of technical debt in the cloud either.&lt;/p&gt;
&lt;h3 id="rehost-240-vms-fastest-path-lowest-change"&gt;Rehost (~240 VMs): Fastest path, lowest change
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why&lt;/strong&gt;: These systems were functional and stable. No major dependencies blocking a straight move.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target&lt;/strong&gt;: Azure IaaS VMs + storage accounts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Win&lt;/strong&gt;: Fast migration path, time saved on rework.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="refactor-40-vms-small-tweaks-big-wins"&gt;Refactor (~40 VMs): Small tweaks, big wins
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why&lt;/strong&gt;: Some apps benefited from better scalability, backup automation, or simpler hosting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target&lt;/strong&gt;: Azure App Services and Azure SQL Managed Instance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Win&lt;/strong&gt;: Cut licensing, improved operational efficiency.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rebuild-20-vms-platform-shift-for-long-term-gain"&gt;Rebuild (~20 VMs): Platform shift for long-term gain
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why&lt;/strong&gt;: Legacy on-prem PostgreSQL and SQL Server workloads were brittle, tightly scoped, and overdue for rationalisation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target&lt;/strong&gt;: Rebuilt as PaaS data platforms using Azure SQL Database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Win&lt;/strong&gt;: Simplified management, improved performance, and tighter cost control.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-to-decide"&gt;How to Decide
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Time constraints&lt;/strong&gt; – Is this a quick win or an anchor best left behind?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team capabilities&lt;/strong&gt; – Is your team ready to manage PaaS or re-architected systems?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risk and reliability&lt;/strong&gt; – Will changes introduce new risk for key workloads?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency complexity&lt;/strong&gt; – Is the app isolated or tied into legacy systems?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future-fit&lt;/strong&gt; – Does rehosting block cleaner modernisation later on?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="azure-portal"&gt;Azure Portal
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rehost&lt;/strong&gt;: Use Azure Migrate with replication + cutover&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refactor&lt;/strong&gt;: Use App Service Migration Assistant and Database Migration Service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rebuild&lt;/strong&gt;: Create new Azure SQL DB instances and move schema + data&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bicep-sample--iaas-virtual-machine-within-availability-set-for-ha"&gt;Bicep Sample – IaaS Virtual Machine within Availability Set for HA
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Prefix for the Virtual Machine names&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmNamePrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myvm&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Admin username for the Virtual Machines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azadmin&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Admin password for the Virtual Machines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Number of Virtual Machines to deploy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Subnet&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mySubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Network Interface Prefix Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterfaceName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create an Availability Set to support high availability&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;availabilitySet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/availabilitySets@2024-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmNamePrefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-avset&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;platformUpdateDomainCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;platformFaultDomainCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Aligned&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetRef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkInterfaces@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmCount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;networkInterfaceName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmNamePrefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ipconfig1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Dynamic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetRef&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Loop to deploy multiple Virtual Machines within the Availability Set&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines@2024-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmCount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmNamePrefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hardwareProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_DS1_v2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;computerName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmNamePrefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;imageReference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publisher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MicrosoftWindowsServer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;WindowsServer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;2025-Datacenter&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osDisk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;createOption&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FromImage&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterfaces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterface&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;availabilitySet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;availabilitySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Legacy Licensing Surprises&lt;/strong&gt;: Some OS and SQL Server versions can&amp;rsquo;t be brought to Azure without extra licensing or re-platforming. Do the homework.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hard-coded Infrastructure Assumptions&lt;/strong&gt;: Apps with fixed IPs, server names, or outdated DNS references can break silently after a rehost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Model Drift&lt;/strong&gt;: Group policies, local service accounts, or on-host firewall rules may not behave the same way in Azure — especially in locked-down workloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RBAC Gaps and Identity Mismatches&lt;/strong&gt;: Teams assume the same local admin rights apply in the cloud — but Azure RBAC changes that model. Plan for it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readiness ≠ Priority&lt;/strong&gt;: A workload might be easy to move but not critical to your business. Balance technical simplicity with business impact.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Use your &lt;strong&gt;Azure Migrate discovery output&lt;/strong&gt; to flag easy wins&lt;/li&gt;
&lt;li&gt;Mix models: rehost what’s stable, refactor what’s ready, rebuild what’s broken&lt;/li&gt;
&lt;li&gt;Avoid the all-or-nothing trap, modernisation doesn’t have to block progress&lt;/li&gt;
&lt;li&gt;Reassess post-migration: Some workloads will be easier to modernise after they’re stable in Azure&lt;/li&gt;
&lt;li&gt;Track everything in a shared backlog with clear ownership&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="brewed-take-"&gt;Brewed Take ☕
&lt;/h2&gt;&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Lift-and-shift buys you time. Refactor buys you efficiency. Rebuild buys you tomorrow.&lt;/p&gt;
&lt;p&gt;The best migrations aren’t all-in on one model they mix tactics based on risk, value, and readiness.&lt;/p&gt;
&lt;p&gt;Not everything belongs in a VM, but not everything is ready for PaaS either.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/modernize/plan-cloud-modernization?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Plan your cloud modernization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/migrate/tutorial-migrate-vmware?view=migrate?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Migrate VMware VMs to Azure (agentless)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/data-migration/sql-server/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Migration overview: From SQL Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>From Rack to Cloud: Part 2 - Know Your Beans Before You Brew</title><link>https://blog.brewedinthecloud.com/p/azure-migrate-discovery/</link><pubDate>Thu, 12 Jun 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migrate-discovery/</guid><description>&lt;h2 id="opening"&gt;Opening
&lt;/h2&gt;&lt;p&gt;Migrating to Azure without assessing your workloads is like pouring mystery beans into your espresso machine. It&amp;rsquo;s noisy, messy and the result won&amp;rsquo;t be pretty.&lt;/p&gt;
&lt;p&gt;Visibility is non-negotiable. Without it, you’re flying blind and potentially dragging deadweight into your shiny new cloud. Let&amp;rsquo;s fix that.&lt;/p&gt;
&lt;p&gt;Before you migrate even a single workload, you need visibility.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What’s running?&lt;/li&gt;
&lt;li&gt;What talks to what?&lt;/li&gt;
&lt;li&gt;What actually needs to move (and what doesn&amp;rsquo;t)?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this post, we’ll break down how to confidently discover, assess, and categorise your private cloud environments using Azure native tools.&lt;/p&gt;
&lt;h2 id="what-is-discovery--assessment"&gt;What is Discovery &amp;amp; Assessment?
&lt;/h2&gt;&lt;p&gt;In the cloud migration game, discovery and assessment help you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identify all existing workloads (VMs, apps, databases)&lt;/li&gt;
&lt;li&gt;Understand workload interdependencies and communication paths&lt;/li&gt;
&lt;li&gt;Evaluate sizing, utilisation, and readiness for Azure&lt;/li&gt;
&lt;li&gt;Build migration groups (e.g., dev/test, app tiers, supporting infra)&lt;/li&gt;
&lt;li&gt;Choose migration paths (rehost, refactor, or retire)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-it-works-azure-migrate"&gt;How it Works: Azure Migrate
&lt;/h2&gt;&lt;p&gt;The key player here is &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/migrate/migrate-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Migrate&lt;/a&gt; Microsoft’s free migration hub for discovery, assessment, and planning.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Discover and map workloads from VMware, Hyper-V, or bare metal&lt;/li&gt;
&lt;li&gt;Assess based on performance, right-sizing, and Azure SKU mapping&lt;/li&gt;
&lt;li&gt;Understand cost implications&lt;/li&gt;
&lt;li&gt;Identify dependent services during scoping phase&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tool-capabilities"&gt;Tool Capabilities
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Discovery appliance&lt;/strong&gt; runs as a lightweight VM in your environment, collecting real-time data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency mapping&lt;/strong&gt; helps you visualise app-to-app communication&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assessment reports&lt;/strong&gt; guide you on sizing and compatibility (including readiness for Azure Hybrid Benefits)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; The Migrate Appliance has native integration capabilities for Hyper-V environments (and Hyper-V running SCVMM) or VMWare (version 5.5+) all other environments will require an agent-based discovery and migration essentially treating all other environments as &amp;ldquo;bare metal&amp;rdquo;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="real-world-impact-knowing-before-moving"&gt;Real-World Impact: Knowing Before Moving
&lt;/h2&gt;&lt;p&gt;Our not-for-profit organisation — the same one we met in Part 1 — had just 90 days before their co-location contract expired. With 300 VMs to move, they knew guessing wasn’t an option.&lt;/p&gt;
&lt;p&gt;Before touching a single workload, they deployed Azure Migrate and ran a thorough discovery process over two weeks.&lt;/p&gt;
&lt;p&gt;Here’s what they uncovered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Around 40 VMs were underutilised or no longer needed&lt;/li&gt;
&lt;li&gt;Several production systems were quietly dependent on a legacy print management app&lt;/li&gt;
&lt;li&gt;Core application tiers were more interdependent than documentation suggested&lt;/li&gt;
&lt;li&gt;A few critical services were still running on legacy OS versions flagged as unsupported in Azure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By grouping VMs based on functional roles and real dependency chains, they avoided risky one-shot cutover plans. Instead, they took a phased approach:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Internal tools and dev environments&lt;/li&gt;
&lt;li&gt;App servers with isolated backends&lt;/li&gt;
&lt;li&gt;Shared services (storage, databases, web front-ends)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This up-front investment in discovery meant fewer surprises, cleaner change windows, and improved stakeholder confidence throughout the project.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;p&gt;Ready to get stuck into it let&amp;rsquo;s deploy an Azure Migrate project in Azure&lt;/p&gt;
&lt;h3 id="azure-portal"&gt;Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In Azure, go to &lt;strong&gt;Azure Migrate&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+ Add Tool&lt;/strong&gt; &amp;gt; Choose &lt;strong&gt;Discovery and assessment&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Download and deploy the appliance in your on-prem environment&lt;/li&gt;
&lt;li&gt;Start Discovery — allow time for data to build (typically 24–72 hrs)&lt;/li&gt;
&lt;li&gt;Organise machines into groups for assessment&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Dependency Visualisation&lt;/strong&gt; to map flows&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-example-azure-migrate-project"&gt;Bicep Example (Azure Migrate project)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;migrateProject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Migrate/migrationProjects@2022-02-15-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;rack-to-cloud-project&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;projectTier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="required-ports-for-connectivity"&gt;Required ports for connectivity
&lt;/h2&gt;&lt;p&gt;Here’s a single comprehensive table combining &lt;strong&gt;all required ports for Azure Migrate&lt;/strong&gt; discovery across different environments:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source/Direction&lt;/th&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Port(s)&lt;/th&gt;
&lt;th&gt;Purpose / Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → Azure (All Scenarios)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;Communication with Azure Migrate services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → vCenter Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;Access vSphere API for VMware discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → ESXi Hosts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;Optional – validation during discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → vCenter/ESXi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Optional – Linux collector appliances (command/script execution)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → VMware VMs&lt;/strong&gt; (optional)&lt;/td&gt;
&lt;td&gt;ICMP&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Optional ping to validate connectivity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → Hyper-V Hosts/SCVMM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WMI/DCOM&lt;/td&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;td&gt;Initial connection for agentless Hyper-V discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → Hyper-V Hosts/SCVMM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RPC&lt;/td&gt;
&lt;td&gt;1024–65535&lt;/td&gt;
&lt;td&gt;Dynamic ports for WMI/DCOM communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → Hyper-V Hosts/SCVMM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SMB&lt;/td&gt;
&lt;td&gt;445&lt;/td&gt;
&lt;td&gt;Script and file transfer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent (on physical/other VMs) → Azure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;Communication from agent-based discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → Domain Controller&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LDAP&lt;/td&gt;
&lt;td&gt;389&lt;/td&gt;
&lt;td&gt;AD authentication (if domain-joined)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → Domain Controller&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kerberos&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;Authentication ticket exchange&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Appliance → DNS Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;Name resolution for Azure and on-prem resources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;strong&gt;Dynamic RPC Ports (1024–65535)&lt;/strong&gt; on Hyper-V can be narrowed using Windows registry if needed.
For &lt;strong&gt;agent-based discovery&lt;/strong&gt;, appliance ports are not relevant – the agent communicates directly with Azure.
For secure environments, ensure a firewall rule or NSG rule set allows these specific flows.
&lt;strong&gt;Azure endpoints&lt;/strong&gt; include &lt;code&gt;*.servicebus.windows.net&lt;/code&gt;, &lt;code&gt;*.azure-automation.net&lt;/code&gt;, &lt;code&gt;*.blob.core.windows.net&lt;/code&gt;, etc., and are region-specific.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Discovery won&amp;rsquo;t succeed without proper firewall rule allowances&lt;/li&gt;
&lt;li&gt;You need &lt;strong&gt;read access&lt;/strong&gt; to the clusters you&amp;rsquo;re targeting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency mapping&lt;/strong&gt; requires longer collection windows (up to 30 days for full flow accuracy)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start early:&lt;/strong&gt; Run discovery at least one month before migration&amp;hellip;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Group by dependencies:&lt;/strong&gt; Avoid grouping purely by app names&amp;hellip;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tag everything:&lt;/strong&gt; Use Azure tags to pre-classify workloads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validate stakeholders:&lt;/strong&gt; Confirm ownership before cutovers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use cost models early:&lt;/strong&gt; Run pricing estimates on intended SKUs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="brewed-take-"&gt;Brewed Take ☕
&lt;/h2&gt;&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;Discovery isn’t a checkbox it’s your safety net.&lt;/p&gt;
&lt;p&gt;Rushing it is like skipping the espresso grind and hoping for good coffee it&amp;rsquo;s not gonna happen.&lt;/p&gt;
&lt;p&gt;Every smooth migration we’ve seen had one thing in common: clarity up front.
When you know your workloads, dependencies, and downtime risks before lift-off, everything downstream gets easier. Testing, phasing, even stakeholder buy-in.&lt;/p&gt;
&lt;p&gt;Azure Migrate helps you map your real workload DNA not just what’s documented or in the heads of System Admins and Application Owners.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/migrate/tutorial-discover-vmware?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Migrate Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/migrate/how-to-create-group-machine-dependencies-agentless?view=migrate?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Dependency Visualisation Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/calculator?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Pricing Calculator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>From Rack to Cloud: Part 1 - Breaking Up with your Data Centre</title><link>https://blog.brewedinthecloud.com/p/azure-migrate-whyazure/</link><pubDate>Tue, 10 Jun 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-migrate-whyazure/</guid><description>&lt;h2 id="why-migrate"&gt;Why Migrate?
&lt;/h2&gt;&lt;p&gt;If your ageing private cloud feels more like a second job than a strategic asset, you’re not alone. Managing racks, fighting with legacy virtualisation platforms, and babysitting on-prem workloads can leave even the best ops teams wondering: is there a better way to brew this?&lt;/p&gt;
&lt;p&gt;Spoiler: there is. Microsoft Azure offers a modern cloud platform that scales with your needs, cuts down on undifferentiated heavy lifting, and unlocks access to a wide range of PaaS and security services that simply weren’t built for on-prem.&lt;/p&gt;
&lt;p&gt;In this post, we’re kicking off the series with a reality check. Why do so many teams get stuck in private cloud purgatory and what’s making Azure the platform of choice for enterprises exiting the server room?&lt;/p&gt;
&lt;h2 id="what-is-private-cloud-anyway"&gt;What is “Private Cloud” Anyway?
&lt;/h2&gt;&lt;p&gt;Private cloud generally refers to infrastructure environments where your team owns (or leases) the hardware but uses cloud-like tools often things like VMware, Hyper-V, or Nutanix — to build and manage virtualised resources.&lt;/p&gt;
&lt;p&gt;Key characteristics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Still operates from your data centre (or co-location providers like Equinix, NextDC etc)&lt;/li&gt;
&lt;li&gt;Offers some automation and self-service, but limited elasticity&lt;/li&gt;
&lt;li&gt;Requires boots-on-the-ground support from physical installation, firmware to firewalls&lt;/li&gt;
&lt;li&gt;Big upfront costs, ongoing maintenance, slower innovation cycles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In contrast, Azure delivers infrastructure, platform, and software services at global scale without the overhead of owning the kit.&lt;/p&gt;
&lt;h2 id="how-azure-changes-the-game"&gt;How Azure Changes the Game
&lt;/h2&gt;&lt;p&gt;Here’s how Azure flips the traditional private cloud model:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Private Cloud&lt;/th&gt;
&lt;th&gt;Azure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Capacity &amp;amp; Scale&lt;/td&gt;
&lt;td&gt;Bound by available physical hardware&lt;/td&gt;
&lt;td&gt;Global capacity, scale-out in minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elasticity&lt;/td&gt;
&lt;td&gt;Manual provisioning, slow to adjust workloads&lt;/td&gt;
&lt;td&gt;Autoscale with resource-level granularity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High Availability &amp;amp; DR&lt;/td&gt;
&lt;td&gt;Build and maintain your own redundancy and backup stack&lt;/td&gt;
&lt;td&gt;Built-in redundancy across zones and regions, automated backup &amp;amp; recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operating Responsibility&lt;/td&gt;
&lt;td&gt;You manage and maintain hardware, hypervisor, networking, storage all end to end&lt;/td&gt;
&lt;td&gt;Shared responsibility: Microsoft manages the infra, you manage the workload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost Model&lt;/td&gt;
&lt;td&gt;High CapEx with sunk infrastructure and licensing costs&lt;/td&gt;
&lt;td&gt;Pay-as-you-go, optimise with reserved instances and auto-shutdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed to Innovation&lt;/td&gt;
&lt;td&gt;Limited to vendor upgrades and internal cycles&lt;/td&gt;
&lt;td&gt;Immediate access to new services: AI, serverless, PaaS, security tooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Baseline&lt;/td&gt;
&lt;td&gt;Often ad hoc, reliant on third-party tools and patch cycles&lt;/td&gt;
&lt;td&gt;Cloud-native security (Defender for Cloud, Sentinel) with global threat intelligence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tooling &amp;amp; Automation&lt;/td&gt;
&lt;td&gt;Tooling varies, often heavily customised or manual&lt;/td&gt;
&lt;td&gt;API-first design, ARM/Bicep/IaC + deep DevOps/GitHub integration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Azure reduces operational overhead and unlocks capabilities that are often impossible or cost-prohibitive to implement in a private environment. Things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Defender for Cloud for built-in workload protection&lt;/li&gt;
&lt;li&gt;Azure Machine Learning and OpenAI integrations&lt;/li&gt;
&lt;li&gt;Services like Cosmos DB (global databases), Azure Front Door (geo-routing and performance), and Azure Machine Learning give you tools to build modern, resilient applications not just run legacy ones in the cloud.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="real-world-impact-300-vms-3-months-one-deadline"&gt;Real-World Impact: 300 VMs, 3 Months, One Deadline
&lt;/h2&gt;&lt;p&gt;Let’s look at a not-for-profit organisation based in Sydney. They were facing two major pressures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An urgent co-location exit with the hosting agreement ending in 90 days&lt;/li&gt;
&lt;li&gt;A looming VMware licensing renewal that would significantly bump up their operating costs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These combined constraints lit a fire under their modernisation plans. Over 300 virtual machines needed to find a new home — fast.&lt;/p&gt;
&lt;h3 id="their-approach"&gt;Their Approach
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Phased migration: Started with dev/test workloads to validate the patterns&lt;/li&gt;
&lt;li&gt;Controlled cutovers: Production workloads were grouped logically to minimise risk&lt;/li&gt;
&lt;li&gt;Hands-on engagement: Internal teams led change coordination, comms, and testing&lt;/li&gt;
&lt;li&gt;Tooling: They used Azure Migrate for discovery, dependency mapping, and lift-and-shift execution&lt;/li&gt;
&lt;li&gt;Landing zone prepared in advance: With networking, identity, monitoring, and cost governance in place&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="outcome"&gt;Outcome
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;All 300+ VMs were successfully moved to Azure in under three months&lt;/li&gt;
&lt;li&gt;No need for renewed VMware enterprise licensing or new hardware purchases&lt;/li&gt;
&lt;li&gt;Ops teams now rely on Azure Monitor, Defender for Cloud, and auto-shutdown policies to optimise post-migration&lt;/li&gt;
&lt;li&gt;The organisation gained flexibility to modernise key workloads over time — starting with databases and file services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This wasn’t an outsourcing story. It was a joint effort between the business and IT, with strong internal ownership. The key was aligning the timeline with a clear, well-sequenced plan — and putting change management on equal footing with tech execution.&lt;/p&gt;
&lt;h2 id="gotchas--mindset-shifts"&gt;Gotchas &amp;amp; Mindset Shifts
&lt;/h2&gt;&lt;p&gt;Moving from private cloud to Azure isn’t just a platform shift — it’s a mindset one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control vs Trust:&lt;/strong&gt; You give up some control (no more “log into the hypervisor”) but gain reliability and consistency&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills Drift:&lt;/strong&gt; Infrastructure teams may need to upskill in areas like Identity, Cost operations, Infrastructure as Code (Bicep) and Security operations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared Responsibility Model:&lt;/strong&gt; Azure handles the infrastructure; you still own the configuration, access, and data&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices-before-moving"&gt;Best Practices Before Moving
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Audit your private cloud footprint:&lt;/strong&gt; Understand what’s worth lifting, modernising, or retiring. Another key element here is to understand your private cloud costs from hosting (co-lo or rent if your self hosted), power, licensing, hardware purchase (or leasing) and staff skilling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Define your business drivers:&lt;/strong&gt; Cost, agility, compliance, global expansion or region redundancy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get leadership buy-in:&lt;/strong&gt; Start with pilot workloads tied to measurable success (e.g., cost per transaction)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consider a landing zone:&lt;/strong&gt; Set up an Azure environment with guardrails from day 1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upskill early:&lt;/strong&gt; Give your ops team time to get hands-on with Azure Certifications help, but nothing beats real workloads&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="brewed-take-"&gt;Brewed Take ☕
&lt;/h2&gt;&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; &lt;p&gt;If you’re waiting on a hardware refresh, you’re already behind. The real driver isn’t just cost it’s capability. While private cloud has you patching firmware, Azure has you deploying platforms. Migration doesn’t just reduce lift it increases lift-off.&lt;/p&gt;
&lt;p&gt;No two migrations are the same, but a few benefits show up every time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Teams spend less time maintaining, more time improving&lt;/li&gt;
&lt;li&gt;Systems Engineers evolve into Cloud and Platform Engineers&lt;/li&gt;
&lt;li&gt;Application teams finally get to modernise using the services they’ve been asking for&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The move is technical, yes — but the transformation is cultural.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Cloud Adoption Framework for Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/migrate/migrate-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Migrate Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;What is Azure Landing Zone?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mastering Azure DNS Solutions - Part 5 - Azure Firewall DNS Proxy</title><link>https://blog.brewedinthecloud.com/p/azure-dns-custom/</link><pubDate>Thu, 05 Jun 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-dns-custom/</guid><description>&lt;p&gt;DNS is often called the &amp;ldquo;first step of every network connection.&amp;rdquo;&lt;br&gt;
Because of that, DNS traffic represents a critical opportunity to &lt;strong&gt;secure&lt;/strong&gt;, &lt;strong&gt;monitor&lt;/strong&gt;, and &lt;strong&gt;control&lt;/strong&gt; communications across your cloud infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Azure Firewall&lt;/strong&gt; can act as a &lt;strong&gt;DNS Proxy&lt;/strong&gt;, giving you centralized DNS visibility, policy enforcement, and logging — without relying on external appliances or custom scripts.&lt;/p&gt;
&lt;p&gt;In this blog, we&amp;rsquo;ll explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What it means to use Azure Firewall as a DNS Proxy&lt;/li&gt;
&lt;li&gt;Why it’s beneficial&lt;/li&gt;
&lt;li&gt;How it fits into typical architectures (with a diagram)&lt;/li&gt;
&lt;li&gt;How to configure it via the &lt;strong&gt;Azure Portal&lt;/strong&gt; and &lt;strong&gt;Bicep&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Security tips and best practices&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-is-azure-firewall-dns-proxy"&gt;What is Azure Firewall DNS Proxy?
&lt;/h2&gt;&lt;p&gt;When you enable DNS Proxy on &lt;strong&gt;Azure Firewall&lt;/strong&gt;, the firewall intercepts DNS queries from your Azure resources, forwards them to your designated DNS server (private or public), and returns the responses.&lt;/p&gt;
&lt;p&gt;This offers a powerful point of &lt;strong&gt;inspection&lt;/strong&gt;, &lt;strong&gt;logging&lt;/strong&gt;, and &lt;strong&gt;control&lt;/strong&gt; over all DNS traffic.&lt;/p&gt;
&lt;h2 id="benefits-of-using-azure-firewall-as-a-dns-proxy"&gt;Benefits of Using Azure Firewall as a DNS Proxy
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;Benefit&lt;/th&gt;
&lt;th style="text-align: left"&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Centralized DNS Logging&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Capture DNS query logs through Azure Monitor.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Policy Enforcement&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Allow/deny traffic based on DNS names, not just IPs (FQDN tags).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Security Hardening&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;DNS queries stay inside Azure without direct external exposure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Simplified Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;No need for separate DNS proxy VMs or appliances.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Supports Private and Public Resolution&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Forward DNS queries to Private DNS Zones, on-premises DNS servers, or Internet DNS servers.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="where-azure-firewall-dns-proxy-adds-value"&gt;Where Azure Firewall DNS Proxy Adds Value
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero-trust network designs&lt;/strong&gt; needing DNS visibility at every boundary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hybrid environments&lt;/strong&gt; where Azure resources resolve both private and public domains securely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environments requiring DNS query logging for compliance&lt;/strong&gt; (e.g., PCI DSS, ISO 27001).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reducing operational complexity&lt;/strong&gt; versus managing dedicated DNS forwarders.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="visualizing-azure-firewall-as-a-dns-proxy"&gt;Visualizing Azure Firewall as a DNS Proxy
&lt;/h2&gt;&lt;p&gt;Here’s a diagram illustrating how Azure Firewall sits between VMs and external/internal DNS servers:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TB
subgraph AzureVNet ["Azure Virtual Network (myVNet)"]
AzureVM["Azure VM (10.1.0.4)"]
AzureFirewall["Azure Firewall (DNS Proxy enabled)"]
end
subgraph ExternalDNS ["DNS Resolution Targets"]
PrivateDNS["Azure Private DNS Zone / On-Prem DNS Server"]
InternetDNS["Public Internet DNS Servers"]
end
AzureVM -- "DNS Query" --&gt; AzureFirewall
AzureFirewall -- "DNS Forwarding" --&gt; PrivateDNS
AzureFirewall -- "DNS Forwarding" --&gt; InternetDNS
PrivateDNS -- "DNS Response" --&gt; AzureFirewall
InternetDNS -- "DNS Response" --&gt; AzureFirewall
AzureFirewall -- "Response" --&gt; AzureVM
&lt;/div&gt;
&lt;h2 id="configuring-azure-firewall-dns-proxy-using-the-azure-portal"&gt;Configuring Azure Firewall DNS Proxy Using the Azure Portal
&lt;/h2&gt;&lt;h3 id="step-1-deploy-azure-firewall-if-not-already-deployed"&gt;Step 1: Deploy Azure Firewall (if not already deployed)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;, navigate to &lt;strong&gt;Create a resource&lt;/strong&gt; &amp;gt; &lt;strong&gt;Networking&lt;/strong&gt; &amp;gt; &lt;strong&gt;Azure Firewall&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Follow the deployment wizard to deploy the Firewall into your Virtual Network.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-enable-dns-proxy-on-azure-firewall"&gt;Step 2: Enable DNS Proxy on Azure Firewall
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Open your deployed &lt;strong&gt;Azure Firewall&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, select &lt;strong&gt;DNS Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;DNS Proxy&lt;/strong&gt; to &lt;strong&gt;Enabled&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Custom DNS servers&lt;/strong&gt;, enter:
&lt;ul&gt;
&lt;li&gt;Your internal DNS IP (e.g., Private DNS Resolver inbound endpoint IP, or On-prem DNS IP accessible via VPN/ExpressRoute).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Save the settings.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-configure-vm-dns-settings"&gt;Step 3: Configure VM DNS Settings
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Configure your VM NIC settings or VNet DNS settings to point to &lt;strong&gt;Azure Firewall’s Private IP Address&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;This ensures that all VM DNS queries go through the firewall.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Test the Setup&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH or RDP into a VM.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;nslookup&lt;/code&gt; or &lt;code&gt;dig&lt;/code&gt; against a private domain (e.g., &lt;code&gt;internal.contoso.com&lt;/code&gt;) and a public domain (e.g., &lt;code&gt;www.microsoft.com&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Verify that the response is successful and logged in Azure Firewall diagnostics.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="deploying-azure-firewall-dns-proxy-using-bicep"&gt;Deploying Azure Firewall DNS Proxy Using Bicep
&lt;/h2&gt;&lt;p&gt;Here’s a &lt;strong&gt;Bicep template&lt;/strong&gt; to configure Azure Firewall with DNS Proxy enabled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Azure Firewall&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myFirewall&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Network and Subnet IDs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;List of custom DNS server IPs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;customDnsServers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;array&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.2.0.4&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Example Private Resolver IP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewall&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/azureFirewalls@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AZFW_VNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;firewall-ipconfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// If using a public IP; optional for internal-only&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsSettings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;customDnsServers&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enableDnsProxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
Make sure to link the VM NICs or VNet DNS settings to the Firewall’s private IP separately after deployment!
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;p&gt;We discussed this in the previous blog article &lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-dns-custom" target="_blank" rel="noopener"
&gt;Mastering Azure DNS Solutions - Part 4 - Custom DNS&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="security-considerations"&gt;Security Considerations
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Use NSGs and Firewall policies&lt;/strong&gt; to restrict who can send DNS queries to Azure Firewall.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor DNS logs&lt;/strong&gt; through Azure Monitor to detect anomalies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid recursive loops&lt;/strong&gt;: Make sure the custom DNS servers you configure don’t forward back to the Firewall.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High Availability&lt;/strong&gt;: Azure Firewall is highly available by design, but monitor and alert on performance metrics.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="design-guidance"&gt;Design Guidance
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Centralize all VNet DNS queries&lt;/strong&gt; through the Azure Firewall for full visibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pair with Azure DNS Private Resolver&lt;/strong&gt; to handle private Azure zone resolutions efficiently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Firewall Policy for DNS Filtering&lt;/strong&gt;: Block/allow specific domains based on your organization&amp;rsquo;s security policies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document fallback behavior&lt;/strong&gt;: Ensure VMs fail gracefully if DNS resolution is interrupted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Using &lt;strong&gt;Azure Firewall as a DNS Proxy&lt;/strong&gt; gives you centralized DNS security, control, and auditing without introducing extra infrastructure complexity.&lt;br&gt;
Whether protecting cloud-native environments or extending hybrid DNS visibility, this pattern improves observability and enforces corporate policies at a critical layer of the networking stack.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DNS is your first line of network defense — make sure you can see and control it properly!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/dns-settings?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Firewall DNS Proxy Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/tutorial-firewall-deploy-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploy Azure Firewall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Firewall Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/logs-and-metrics?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Monitor Azure Firewall Logs and Metrics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mastering Azure DNS Solutions - Part 4 - Custom DNS Configuration</title><link>https://blog.brewedinthecloud.com/p/azure-dns-custom/</link><pubDate>Tue, 03 Jun 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-dns-custom/</guid><description>&lt;p&gt;While &lt;strong&gt;Azure-provided DNS&lt;/strong&gt; offers a simple and effective default for many workloads, some environments require more advanced DNS setups — including custom zones, internal domain resolution, or integration with on-premises DNS infrastructures.&lt;/p&gt;
&lt;p&gt;This is where &lt;strong&gt;Customer-managed DNS servers&lt;/strong&gt; come into play in Azure.&lt;br&gt;
They give you &lt;strong&gt;full control&lt;/strong&gt; over DNS behavior across your Azure VNets and hybrid connections — without giving up on flexibility or security.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What customer-managed DNS means in Azure&lt;/li&gt;
&lt;li&gt;How DNS flow works in hybrid setups (with a visual &lt;strong&gt;Mermaid diagram&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;How to configure it through the &lt;strong&gt;Azure Portal&lt;/strong&gt; and using &lt;strong&gt;Bicep&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Best practices and integration with &lt;strong&gt;Azure DNS Private Resolver&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-are-customer-managed-dns-servers"&gt;What Are Customer-managed DNS Servers?
&lt;/h2&gt;&lt;p&gt;Customer-managed DNS means you override the Azure default DNS service and specify your own DNS servers for name resolution inside a VNet.&lt;br&gt;
These servers can be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure-based (e.g., VMs running Windows DNS or Linux BIND)&lt;/li&gt;
&lt;li&gt;On-premises DNS servers (connected via &lt;strong&gt;VPN&lt;/strong&gt; or &lt;strong&gt;ExpressRoute&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your VMs and resources will use the IP addresses you specify instead of Azure’s default &lt;code&gt;168.63.129.16&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="when-should-you-use-customer-managed-dns"&gt;When Should You Use Customer-managed DNS?
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;Scenario&lt;/th&gt;
&lt;th style="text-align: left"&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Integrate with on-premises AD or DNS zones&lt;/td&gt;
&lt;td style="text-align: left"&gt;Extend Active Directory seamlessly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Advanced forwarding or filtering&lt;/td&gt;
&lt;td style="text-align: left"&gt;Apply custom DNS policies, inspection, or split-horizon DNS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Internal-only zones not hosted in Azure&lt;/td&gt;
&lt;td style="text-align: left"&gt;Resolve legacy or third-party private DNS zones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;DNS logging and auditing&lt;/td&gt;
&lt;td style="text-align: left"&gt;Capture all internal DNS queries centrally&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="visualizing-dns-flow-with-customer-managed-dns"&gt;Visualizing DNS Flow with Customer-managed DNS
&lt;/h2&gt;&lt;p&gt;Here’s a diagram that shows how DNS queries move in a hybrid environment using custom DNS servers:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TB
subgraph OnPremises ["On-Premises Network"]
OnPremDNS["On-Premises DNS Server (10.0.0.5)"]
ClientOnPrem["On-Prem Client (10.0.0.10)"]
end
subgraph AzureVNet ["Azure Virtual Network (myVNet)"]
AzureVM1["Azure VM (10.1.0.4)"]
AzureDNSVM["Custom DNS Server in Azure (10.1.0.5)"]
end
AzureVM1 -- "DNS Query" --&gt; AzureDNSVM
AzureDNSVM -- "Forward query (unresolved)" --&gt; OnPremDNS
OnPremDNS -- "Response" --&gt; AzureDNSVM
AzureDNSVM -- "Response" --&gt; AzureVM1
&lt;/div&gt;
&lt;h3 id="what-this-shows"&gt;What This Shows
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure VMs&lt;/strong&gt; forward DNS queries to a &lt;strong&gt;custom DNS server&lt;/strong&gt; hosted in Azure.&lt;/li&gt;
&lt;li&gt;The Azure DNS server forwards any queries it can&amp;rsquo;t resolve to the &lt;strong&gt;on-premises DNS server&lt;/strong&gt; over a secure VPN or ExpressRoute connection.&lt;/li&gt;
&lt;li&gt;Full DNS control stays within the customer-managed architecture.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuring-customer-managed-dns-using-the-azure-portal"&gt;Configuring Customer-managed DNS Using the Azure Portal
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Step 1: Set Custom DNS Servers on the VNet&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Virtual Networks&lt;/strong&gt; and select your target VNet (e.g., &lt;code&gt;myVNet&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, select &lt;strong&gt;DNS Servers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Custom&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter the IP addresses of your DNS servers (e.g., &lt;code&gt;10.1.0.5&lt;/code&gt; for an Azure VM, or on-premises IPs reachable via VPN/ExpressRoute).&lt;/li&gt;
&lt;li&gt;Save the configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Restart VMs (if needed)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing VMs might need to be restarted to pick up the new DNS settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;🔹 &lt;strong&gt;Tip&lt;/strong&gt;: You can override DNS settings &lt;strong&gt;per subnet&lt;/strong&gt; too, but by default, VMs inherit the VNet-level settings.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="configuring-customer-managed-dns-using-bicep"&gt;Configuring Customer-managed DNS Using Bicep
&lt;/h2&gt;&lt;p&gt;Here’s a &lt;strong&gt;Bicep template&lt;/strong&gt; to configure a custom DNS server IP for a VNet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;List of custom DNS server IP addresses&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsServers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;array&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.5&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Example: Azure DNS VM&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dhcpOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsServers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsServers&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnet1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;strong&gt;Notice&lt;/strong&gt;: The &lt;code&gt;dhcpOptions.dnsServers&lt;/code&gt; block is how you apply custom DNS settings at the VNet level.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="best-practices-for-customer-managed-dns-in-azure"&gt;Best Practices for Customer-managed DNS in Azure
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Design for high availability&lt;/strong&gt;: Deploy at least two DNS servers in Azure or ensure reachability to two on-prem servers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor DNS servers&lt;/strong&gt;: Use Azure Monitor, logs, or Syslog to track availability and performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combine with Azure DNS Private Resolver (optional)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inbound Endpoints&lt;/strong&gt;: Accept queries from on-prem to resolve Azure Private DNS zones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outbound Endpoints&lt;/strong&gt;: Forward queries from Azure VMs to external DNS servers without manual DNS servers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure your DNS servers&lt;/strong&gt;: Apply NSGs, patch regularly, and monitor for unusual behavior.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plan for growth&lt;/strong&gt;: DNS query volume can increase quickly with service scaling.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Customer-managed DNS in Azure gives you the flexibility and control needed for complex, hybrid, and secure environments.&lt;br&gt;
When paired thoughtfully with services like &lt;strong&gt;Azure DNS Private Resolver&lt;/strong&gt;, it offers a seamless, scalable DNS architecture without the operational overhead of maintaining your own large DNS fleets.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As your environments grow more sophisticated, DNS should grow with it — and in Azure, you have the tools to make that happen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances?tabs=redhat#name-resolution-that-uses-your-own-dns-server?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Configure DNS settings for a virtual network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/dns/dns-private-resolver-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure DNS Private Resolver Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/dns/dns-private-resolver-overview#dns-forwarding?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Configure DNS forwarding using Azure DNS Private Resolver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mastering Azure DNS Solutions - Part 3 - Azure Native DNS</title><link>https://blog.brewedinthecloud.com/p/azure-dns-azurenativedns/</link><pubDate>Thu, 29 May 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-dns-azurenativedns/</guid><description>&lt;p&gt;When you deploy resources into Azure Virtual Networks (VNets), one of the first critical services they rely on is &lt;strong&gt;DNS&lt;/strong&gt;. Without proper name resolution, services can’t communicate, authenticate, or scale dynamically.&lt;/p&gt;
&lt;p&gt;By default, every Azure VNet is configured with &lt;strong&gt;Azure-provided DNS&lt;/strong&gt;, a fully managed, highly available service that just works — but it&amp;rsquo;s important to understand how it functions, where it shines, and when you might need something more advanced.&lt;/p&gt;
&lt;p&gt;In this blog, we&amp;rsquo;ll explore how Azure-provided DNS works, where it fits into your network architecture, and how to visualize and test it. We&amp;rsquo;ll also walk through deploying a VM using &lt;strong&gt;Bicep&lt;/strong&gt;, and include a helpful &lt;strong&gt;Mermaid diagram&lt;/strong&gt; to make the DNS resolution process clear.&lt;/p&gt;
&lt;h2 id="what-is-azure-provided-dns"&gt;What is Azure-provided DNS?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Azure-provided DNS&lt;/strong&gt; is a free, built-in DNS service automatically enabled for all Azure VNets. It allows resources inside a VNet to resolve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Internal Azure names&lt;/strong&gt; (e.g., VMs in the same VNet or peered VNets)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Public internet names&lt;/strong&gt; via recursive lookup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure’s DNS service runs at a well-known virtual IP address:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;168.63.129.16&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;All Azure VMs automatically configure this IP as their DNS server unless you override it with custom settings.&lt;/p&gt;
&lt;h2 id="how-azure-provided-dns-works"&gt;How Azure-provided DNS Works
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dynamic DNS Suffix Assignment&lt;/strong&gt;: Every VNet gets a default DNS suffix (e.g., &lt;code&gt;xyz.internal.cloudapp.net&lt;/code&gt;) automatically. Azure VMs registered to that VNet are reachable by their hostname plus this suffix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internal Name Resolution&lt;/strong&gt;: VMs in the same VNet can resolve each other&amp;rsquo;s hostnames automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recursive Internet Name Resolution&lt;/strong&gt;: Azure forwards public DNS queries to external authoritative servers for you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatic Updates&lt;/strong&gt;: If a VM’s IP changes (e.g., deallocated/reallocated), Azure updates its internal records automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="limitations-of-azure-provided-dns"&gt;Limitations of Azure-provided DNS
&lt;/h2&gt;&lt;p&gt;While Azure-provided DNS is simple and effective for many scenarios, it has limitations:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;Limitation&lt;/th&gt;
&lt;th style="text-align: left"&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;No zone-level control&lt;/td&gt;
&lt;td style="text-align: left"&gt;You cannot create custom DNS zones or records.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;No query logging&lt;/td&gt;
&lt;td style="text-align: left"&gt;DNS query logs are not available.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;No conditional forwarding&lt;/td&gt;
&lt;td style="text-align: left"&gt;You cannot forward specific domains to on-premises DNS servers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Static suffix only&lt;/td&gt;
&lt;td style="text-align: left"&gt;You can&amp;rsquo;t change or customize the VNet DNS suffix.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;No cross-region/global resolution&lt;/td&gt;
&lt;td style="text-align: left"&gt;Name resolution across regions requires peering or Private DNS.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="visualizing-azure-provided-dns-resolution"&gt;Visualizing Azure-provided DNS Resolution
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s a diagram showing a simple DNS flow for VMs using Azure-provided DNS:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TB
subgraph AzureVNet ["Azure Virtual Network (myVNet)"]
VM1["VM1 (10.0.0.4)"]
VM2["VM2 (10.0.0.5)"]
AzureDNS["Azure-provided DNS (168.63.129.16)"]
end
VM1 -- "Query: vm2.internal.cloudapp.net" --&gt; AzureDNS
AzureDNS -- "Response: 10.0.0.5" --&gt; VM1
VM1 -- "Query: microsoft.com" --&gt; AzureDNS
AzureDNS -- "Recursive Resolution" --&gt; InternetDNS["Internet DNS Servers"]
InternetDNS -- "Response IP" --&gt; AzureDNS --&gt; VM1
&lt;/div&gt;
&lt;h2 id="viewing-and-testing-azure-provided-dns-in-the-portal"&gt;Viewing and Testing Azure-provided DNS in the Portal
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Step 1: View DNS Settings in a VNet&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Virtual Networks&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select your VNet (e.g., &lt;code&gt;myVNet&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, choose &lt;strong&gt;DNS Servers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Verify that the setting is set to &lt;strong&gt;Default (Azure-provided)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Deploy a Test VM&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a new VM inside the same VNet (&lt;code&gt;myVNet&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;SSH or RDP into the VM once deployed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Test DNS Resolution&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Open a terminal or PowerShell session.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nslookup &amp;lt;another-vm-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The DNS server should show as &lt;code&gt;168.63.129.16&lt;/code&gt;, and you should receive an internal IP address.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also test external resolution:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nslookup microsoft.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="deploying-a-vnet-and-vm-using-bicep"&gt;Deploying a VNet and VM Using Bicep
&lt;/h2&gt;&lt;p&gt;Here’s a simple &lt;strong&gt;Bicep&lt;/strong&gt; file to create a VNet and VM relying on Azure-provided DNS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Machine&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVM&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Username for the Virtual Machine&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azureuser&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Password for the Virtual Machine&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;P@ssword1234!&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVMsubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkInterfaces@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-nic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ipconfig1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Dynamic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines@2024-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hardwareProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_B1s&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;computerName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;imageReference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publisher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Canonical&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UbuntuServer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;18.04-LTS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osDisk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;createOption&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FromImage&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterfaces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
We didn’t specify custom DNS servers — the VM will use the default Azure-provided DNS!
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="pros-and-cons-of-azure-provided-dns"&gt;Pros and Cons of Azure-provided DNS
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;Pros&lt;/th&gt;
&lt;th style="text-align: left"&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Easy to use, zero configuration needed&lt;/td&gt;
&lt;td style="text-align: left"&gt;No custom records or zones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Highly available and resilient&lt;/td&gt;
&lt;td style="text-align: left"&gt;No DNS query logging for auditing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Supports internal and external resolution&lt;/td&gt;
&lt;td style="text-align: left"&gt;No fine-grained control over forwarding behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Free&lt;/td&gt;
&lt;td style="text-align: left"&gt;No multi-region/global VNet name resolution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="common-scenarios-for-azure-provided-dns"&gt;Common Scenarios for Azure-provided DNS
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Small to medium workloads&lt;/strong&gt;: Where internal resolution of VM names is sufficient.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Development and test environments&lt;/strong&gt;: Quick setup without worrying about DNS infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple hub-and-spoke networks&lt;/strong&gt;: As long as VNet peering is configured correctly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Starting point for hybrid networks&lt;/strong&gt;: Before moving to Private DNS and Private Resolver.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Name resolution for VMs and role instances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-faq#dns?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Virtual Network DNS settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Configure DNS settings for a virtual network&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mastering Azure DNS Solutions - Part 2 - Private Resolver</title><link>https://blog.brewedinthecloud.com/p/azure-dns-privateresolver/</link><pubDate>Tue, 27 May 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-dns-privateresolver/</guid><description>&lt;p&gt;As enterprises move more workloads into Azure, hybrid networking scenarios — where on-premises and cloud environments coexist — have become the norm. Reliable DNS name resolution across these environments is critical for application connectivity, security, and management.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Azure DNS Private Resolver&lt;/strong&gt; was designed specifically to address this challenge, enabling seamless, secure DNS resolution between Azure and external environments — without deploying and managing your own DNS servers.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll explore what Azure DNS Private Resolver is, its architecture, common use cases, and walk through how you can deploy it using both the Azure Portal and Bicep templates. A visual diagram will also help illustrate how DNS flows between environments.&lt;/p&gt;
&lt;h2 id="what-is-azure-dns-private-resolver"&gt;What is Azure DNS Private Resolver?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Azure DNS Private Resolver&lt;/strong&gt; is a fully managed, highly available service that allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resolve DNS queries from Azure to external DNS servers&lt;/strong&gt; (e.g., on-premises, third-party providers) via &lt;em&gt;outbound endpoints&lt;/em&gt; and &lt;em&gt;forwarding rules&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accept DNS queries from on-premises networks into Azure&lt;/strong&gt; to resolve private DNS zones hosted in Azure via &lt;em&gt;inbound endpoints&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It essentially bridges Azure and external DNS infrastructures — without the need for self-hosted DNS forwarders, virtual appliances, or load balancers.&lt;/p&gt;
&lt;h2 id="core-architecture-components"&gt;Core Architecture Components
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;Component&lt;/th&gt;
&lt;th style="text-align: left"&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Inbound Endpoints&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Allow on-premises or external clients to query Azure Private DNS zones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Outbound Endpoints&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Enable Azure resources to forward DNS queries to on-premises or external DNS servers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Forwarding Rules&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Define domain-based rules to forward specific DNS queries to specific target servers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Rulesets&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Group multiple forwarding rules together for easier management and application across VNets.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="where-is-azure-dns-private-resolver-most-useful"&gt;Where is Azure DNS Private Resolver Most Useful?
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hybrid Cloud Environments&lt;/strong&gt;: Connect DNS resolution between on-premises and Azure securely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom DNS Scenarios&lt;/strong&gt;: Integrate Azure workloads with third-party DNS providers (e.g., Infoblox, AWS Route53 Private Hosted Zones).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplified Management&lt;/strong&gt;: Avoid running custom DNS virtual machines in Azure for forwarding or resolution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resilient Design&lt;/strong&gt;: Azure manages high availability and scaling automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="visualizing-dns-query-flows-with-azure-dns-private-resolver"&gt;Visualizing DNS Query Flows with Azure DNS Private Resolver
&lt;/h2&gt;&lt;p&gt;Here’s a simplified &lt;strong&gt;Mermaid architecture-beta diagram&lt;/strong&gt; that illustrates how DNS queries flow using inbound and outbound endpoints:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TB
subgraph OnPrem ["On-Premises Network"]
Client["On-Prem Client (10.0.0.5)"]
OnPremDNS["On-Prem DNS Server (10.0.0.2)"]
end
subgraph Azure ["Azure Virtual Network (VNet)"]
VM1["Azure VM (10.1.0.4)"]
PrivateDNS["Azure Private DNS Zone (internal.contoso.com)"]
InboundEP["DNS Private Resolver - Inbound Endpoint"]
OutboundEP["DNS Private Resolver - Outbound Endpoint"]
end
Client -- "Query: app.internal.contoso.com" --&gt; InboundEP
InboundEP -- "Resolves via Private DNS Zone" --&gt; PrivateDNS
VM1 -- "Query: contoso.com (external domain)" --&gt; OutboundEP
OutboundEP -- "Forwards query to On-Prem DNS" --&gt; OnPremDNS
OnPremDNS -- "Response" --&gt; OutboundEP
OutboundEP -- "Response" --&gt; VM1
&lt;/div&gt;
&lt;h2 id="deploying-azure-dns-private-resolver-step-by-step-azure-portal"&gt;Deploying Azure DNS Private Resolver: Step-by-Step (Azure Portal)
&lt;/h2&gt;&lt;p&gt;Let’s walk through setting up a basic Private Resolver:&lt;/p&gt;
&lt;h3 id="step-1-create-dns-private-resolver"&gt;Step 1: Create DNS Private Resolver
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for &lt;strong&gt;DNS Private Resolver&lt;/strong&gt; and select &lt;strong&gt;+ Create&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fill out the basics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;: Choose or create a new one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Example &lt;code&gt;myDNSResolver&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region&lt;/strong&gt;: Must match your VNets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-create-an-inbound-endpoint"&gt;Step 2: Create an Inbound Endpoint
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;inbound-endpoint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;VNet: Select your Virtual Network.&lt;/li&gt;
&lt;li&gt;Subnet: Choose a dedicated subnet (must be empty, e.g., &lt;code&gt;dns-inbound-subnet&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This will allow &lt;strong&gt;on-premises clients&lt;/strong&gt; to resolve Azure-hosted private domains.&lt;/p&gt;
&lt;h3 id="step-3-create-an-outbound-endpoint"&gt;Step 3: Create an Outbound Endpoint
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;outbound-endpoint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;VNet: Select the same (or another) Virtual Network.&lt;/li&gt;
&lt;li&gt;Subnet: Choose another dedicated subnet (e.g., &lt;code&gt;dns-outbound-subnet&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This will allow &lt;strong&gt;Azure resources&lt;/strong&gt; to forward queries to external DNS servers.&lt;/p&gt;
&lt;h3 id="step-4-create-forwarding-ruleset"&gt;Step 4: Create Forwarding Ruleset
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;ruleset&lt;/strong&gt; that includes a &lt;strong&gt;forwarding rule&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domain name&lt;/strong&gt;: e.g., &lt;code&gt;corp.contoso.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target DNS servers&lt;/strong&gt;: e.g., &lt;code&gt;10.0.0.2&lt;/code&gt; (on-premises DNS IP)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linked Outbound Endpoint&lt;/strong&gt;: Select &lt;code&gt;outbound-endpoint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linked Virtual Network&lt;/strong&gt;: Select the VNet you want this rule to apply to.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-5-review-and-create"&gt;Step 5: Review and Create
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Validate and deploy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bicep-deployment-example"&gt;Bicep Deployment Example
&lt;/h2&gt;&lt;p&gt;Here’s a &lt;strong&gt;Bicep template&lt;/strong&gt; to deploy a basic DNS Private Resolver with inbound and outbound endpoints:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the DNS Private Resolver&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resolverName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myDNSResolver&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Resource Deployment Location&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Virtual Network Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Subnet IDs for Inbound and Outbound Endpoints&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inboundSubnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myDNSResolverInboundSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Subnet IDs for Inbound and Outbound Endpoints&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;outboundSubnedName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myDNSResolverOutboundSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the DNS Forwarding Ruleset&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;forwardingRulesetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myForwardingRuleset&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the DNS Forwarding Rule&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;forwardingRuleName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myForwardingRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Domain Name for the Forwarding Rule&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DomainName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;corp.contoso.com.&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//Requires a TRAILING .&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Target DNS Servers for the Forwarding Rule&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetDNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;array&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipaddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.4&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//Ip Address of my Azure DNS Server&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//UDP Port used for DNS queries&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Network Link&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resolvervnetlink&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNetLink&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Get the existing Virtual Network resource&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Get the existing Virtual Network Inbound &amp;amp; Outbound Sunbets&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inboundSubnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inboundSubnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;outboundSubnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;outboundSubnedName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a DNS Private Resolver&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsResolver&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/dnsResolvers@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resolverName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Inbound and Outbound Endpoints&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inboundEndpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/dnsResolvers/inboundEndpoints@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;inbound-endpoint&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsResolver&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inboundSubnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;outboundEndpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/dnsResolvers/outboundEndpoints@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;outbound-endpoint&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsResolver&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;outboundSubnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create DNS Forwarding Ruleset&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fwruleSet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/dnsForwardingRulesets@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;forwardingRulesetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsResolverOutboundEndpoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;outboundEndpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a Virtual Network Link for the Forwarding Ruleset&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resolverLink&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/dnsForwardingRulesets/virtualNetworkLinks@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fwruleSet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resolvervnetlink&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Add a Rule to the Forwarding Ruleset&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fwRules&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/dnsForwardingRulesets/forwardingRules@2022-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fwruleSet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;forwardingRuleName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;domainName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DomainName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetDnsServers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetDNS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
You would separately create the &lt;strong&gt;Forwarding Ruleset&lt;/strong&gt; and &lt;strong&gt;Rules&lt;/strong&gt; using additional resources or manual configuration.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="key-takeaways"&gt;Key Takeaways
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure DNS Private Resolver&lt;/strong&gt; is ideal for hybrid and multi-cloud name resolution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inbound Endpoints&lt;/strong&gt; allow external systems to resolve Azure-hosted private zones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outbound Endpoints&lt;/strong&gt; forward Azure DNS queries to external DNS servers based on rules.&lt;/li&gt;
&lt;li&gt;Infrastructure as Code with &lt;strong&gt;Bicep&lt;/strong&gt; makes deployments repeatable and scalable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/dns/dns-private-resolver-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure DNS Private Resolver Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/dns/dns-private-resolver-get-started-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploy DNS Private Resolver with the Azure Portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.azure.cn/en-us/dns/dns-private-resolver-get-started-bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure DNS Private Resolver Bicep Templates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mastering Azure DNS Solutions - Part 1 - Private DNS</title><link>https://blog.brewedinthecloud.com/p/azure-dns-privatedns/</link><pubDate>Thu, 22 May 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-dns-privatedns/</guid><description>&lt;p&gt;In modern cloud architectures, name resolution plays a critical role in connecting services reliably and securely. Traditionally, managing DNS within private networks required manual configuration of DNS servers, zone files, and integration across environments. Azure Private DNS offers a native solution to this challenge, delivering a simple, scalable, and highly available service for private DNS management without the complexity of deploying and maintaining custom DNS infrastructure.&lt;/p&gt;
&lt;p&gt;In this post, we’ll introduce &lt;strong&gt;Azure Private DNS&lt;/strong&gt;, explain its core capabilities, walk through a real-world deployment example, and share best practices to help you get the most from this essential Azure networking service.&lt;/p&gt;
&lt;h2 id="what-is-azure-private-dns"&gt;What is Azure Private DNS?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Azure Private DNS&lt;/strong&gt; enables you to host DNS zones within your virtual networks without exposing them to the internet. This service provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Private Name Resolution&lt;/strong&gt;: Devices within virtual networks (VNets) can resolve domain names to internal IP addresses without needing internet-based DNS queries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zone Linking&lt;/strong&gt;: You can link Private DNS zones across multiple VNets, allowing shared name resolution without redundant zone management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Record Management&lt;/strong&gt;: Easily manage A, AAAA, PTR, CNAME, and other DNS record types directly through the Azure Portal, CLI, PowerShell, or ARM/Bicep templates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By using Private DNS, you avoid the operational overhead of deploying custom DNS servers, while benefiting from Azure’s built-in redundancy, scalability, and security.&lt;/p&gt;
&lt;h2 id="common-use-cases"&gt;Common Use Cases
&lt;/h2&gt;&lt;p&gt;Azure Private DNS is an essential service in scenarios such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hybrid Cloud Deployments&lt;/strong&gt;: Resolve Azure resources by hostname from on-premises networks via VPN or ExpressRoute with Private DNS Zones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-VNet Architectures&lt;/strong&gt;: Centralize DNS management across hub-and-spoke network topologies by linking zones to multiple VNets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service Discovery&lt;/strong&gt;: Enable internal applications and services to discover each other by friendly DNS names without requiring public DNS records.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure DNS Operations&lt;/strong&gt;: Ensure name resolution remains private within your organization’s network perimeter.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="visualizing-private-dns-resolution"&gt;Visualizing Private DNS Resolution
&lt;/h2&gt;&lt;p&gt;To better understand how DNS resolution flows once a Private DNS Zone is linked to a Virtual Network, here’s a simple architecture diagram:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TB
subgraph Azure VNet ["Azure Virtual Network (myVnet)"]
VM1["VM1 (10.0.0.4)"]
VM2["VM2 (10.0.0.5)"]
end
subgraph PrivateDNS ["Azure Private DNS Zone (private.contoso.com)"]
RecordA1["A Record: app.private.contoso.com -&gt; 10.0.0.4"]
RecordA2["A Record: db.private.contoso.com -&gt; 10.0.0.5"]
end
VM1 -- "DNS Query: app.private.contoso.com" --&gt; PrivateDNS
VM2 -- "DNS Query: db.private.contoso.com" --&gt; PrivateDNS
PrivateDNS --&gt; VM1["Response: 10.0.0.4"]
PrivateDNS --&gt; VM2["Response: 10.0.0.5"]
&lt;/div&gt;
&lt;h2 id="deploying-azure-private-dns-zone-and-vnet-link-step-by-step"&gt;Deploying Azure Private DNS Zone and VNet Link (Step-by-Step)
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s walk through a simple example:&lt;br&gt;
We&amp;rsquo;ll create a &lt;strong&gt;Private DNS Zone&lt;/strong&gt; named &lt;code&gt;private.contoso.com&lt;/code&gt; and link it to an existing Virtual Network &lt;code&gt;myVnet&lt;/code&gt; in the Azure Portal.&lt;/p&gt;
&lt;h3 id="step-1-create-a-private-dns-zone"&gt;Step 1: Create a Private DNS Zone
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Sign in to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;Private DNS Zones&lt;/strong&gt; and select &lt;strong&gt;+ Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription&lt;/strong&gt;: Select your subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;: Choose or create a new resource group.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;private.contoso.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Review + Create&lt;/strong&gt;, then &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-create-a-virtual-network-link"&gt;Step 2: Create a Virtual Network Link
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Once the zone is created, open it and select &lt;strong&gt;Virtual Network Links&lt;/strong&gt; &amp;gt; &lt;strong&gt;+ Add&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Provide:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Link Name&lt;/strong&gt;: &lt;code&gt;myVnetLink&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscription&lt;/strong&gt;: Same as your VNet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Virtual Network&lt;/strong&gt;: Select &lt;code&gt;myVnet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable auto registration&lt;/strong&gt;: (Optional) Turn on if you want VMs in the VNet to automatically register their DNS records.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt; to create the link.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-add-dns-records-optional"&gt;Step 3: Add DNS Records (Optional)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Within the Private DNS Zone, you can now add records such as A records pointing internal services to private IPs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="deploying-the-same-setup-with-bicep"&gt;Deploying the Same Setup with Bicep
&lt;/h2&gt;&lt;p&gt;If you prefer Infrastructure as Code (IaC), here&amp;rsquo;s the equivalent &lt;strong&gt;Bicep&lt;/strong&gt; code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Private DNS Zone&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsZoneName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;private.contoso.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Resource Deployment Location&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Virtual Network Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Virtual Network Resource Group Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkResourceGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNETResourceGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Get the existing Virtual Network resource&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkResourceGroup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a Private DNS Zone&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateDnsZone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/privateDnsZones@2024-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsZoneName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a Virtual Network Link for the Private DNS Zone&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetLink&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/privateDnsZones/virtualNetworkLinks@2024-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateDnsZone&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;privateDnsZone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-vnetLink&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;registrationEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Set to false if auto-registration is not needed&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
Customize &lt;code&gt;registrationEnabled: true&lt;/code&gt; if you want automatic VM DNS record registration.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="best-practices-for-azure-private-dns"&gt;Best Practices for Azure Private DNS
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Plan your DNS hierarchy carefully&lt;/strong&gt;: Avoid conflicts by segmenting zone names logically across environments (dev, test, prod).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use auto-registration strategically&lt;/strong&gt;: Enable it on VNets where VM lifecycles are dynamic, but disable it where strict record control is needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leverage Role-Based Access Control (RBAC)&lt;/strong&gt;: Protect DNS zones and record management operations using Azure RBAC policies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor DNS metrics&lt;/strong&gt;: Use Azure Monitor to track DNS query volumes, error rates, and performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrate with hybrid environments thoughtfully&lt;/strong&gt;: When integrating with on-premises DNS, consider using &lt;strong&gt;Azure DNS Private Resolver&lt;/strong&gt; for bi-directional resolution.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/dns/private-dns-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Private DNS Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/dns/private-dns-getstarted-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create a Private DNS Zone using Azure Portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/templates/microsoft.network/privatednszones?pivots=deployment-language-bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploy Private DNS Zones with Bicep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/dns/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure DNS Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/dns/secure-dns?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Best practices for Azure DNS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Understanding Azure Service Level Agreements and the Resource Requirements Part 4 – Azure WebApps</title><link>https://blog.brewedinthecloud.com/p/azure-slas-webapps/</link><pubDate>Tue, 20 May 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-slas-webapps/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In today’s digital world, ensuring that your web application remains available and performant—even in the face of failures or sudden traffic spikes—is critical. Azure App Service is a fully managed platform that offers built‑in resiliency features such as auto‑scaling, multi‑instance deployments, deployment slots for zero‑downtime releases, and integrated health monitoring. These architectural capabilities help Azure App Service achieve its Service Level Agreements (SLAs), offering uptime guarantees often around 99.95% or higher when deployed correctly.&lt;/p&gt;
&lt;p&gt;In this post, we explore how these resiliency features contribute to meeting the SLA for Azure App Service. We will detail the requirements for deploying a highly available web application, including strategies for scaling out, traffic routing using Azure Traffic Manager or Front Door, and staging deployments with slots. Whether using the Azure Portal or deploying through Infrastructure-as-Code with Bicep, you will learn how to design, deploy, and monitor a resilient App Service setup.&lt;/p&gt;
&lt;h2 id="focus-areas"&gt;Focus Areas
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Built‑in resiliency features that drive the SLA:&lt;/strong&gt;&lt;br&gt;
Azure App Service achieves its high availability through several key features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auto‑scaling:&lt;/strong&gt; Automatically adjusts the number of instances based on demand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi‑instance deployments:&lt;/strong&gt; Distributes your application across multiple compute instances to avoid a single point of failure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment slots:&lt;/strong&gt; Allows for seamless staging and zero‑downtime updates by hosting multiple versions of your application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrated health monitoring:&lt;/strong&gt; Continuously monitors application performance and availability, enabling rapid response to issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Key requirements for a robust, highly available web application:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scaling Out:&lt;/strong&gt; Deploy your app on multiple instances so that if one instance fails, others can handle the load.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic Routing:&lt;/strong&gt; Use Azure Traffic Manager or Azure Front Door to intelligently route user requests to the healthiest endpoint and provide global load balancing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Staging Deployments:&lt;/strong&gt; Leverage deployment slots to test new features in production-like environments without affecting live traffic.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="example-implementation"&gt;Example Implementation
&lt;/h2&gt;&lt;h3 id="a-high-availability-with-azure-portal"&gt;A. High Availability with Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an App Service Plan and Web App:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Sign in to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt; and click &lt;strong&gt;Create a resource&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Search for and select &lt;strong&gt;App Service&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; In the Basics tab, enter your App name, select a subscription and resource group, and choose a region.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Under &lt;strong&gt;App Service Plan&lt;/strong&gt;, either create a new plan or select an existing one. For high availability, choose a plan in a supported tier (e.g., Standard or Premium) and ensure you set the instance count to at least two.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Auto-scaling and Multi-instance Settings:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Once your App Service is deployed, navigate to your App Service and then to &lt;strong&gt;Scale out (App Service plan)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Configure an auto‑scale rule based on metrics such as CPU usage or HTTP queue length. This ensures your app can scale out dynamically during high load.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Deployment Slots:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Step 7:&lt;/strong&gt; In your App Service settings, select &lt;strong&gt;Deployment slots&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 8:&lt;/strong&gt; Click &lt;strong&gt;Add Slot&lt;/strong&gt;, name it (for example, “staging”), and clone the configuration from the production slot. This permits zero‑downtime swaps between staging and production.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integrate Traffic Routing:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Step 9:&lt;/strong&gt; If global or regional traffic management is required, navigate to &lt;strong&gt;Create a resource&lt;/strong&gt; and select &lt;strong&gt;Traffic Manager profile&lt;/strong&gt; or &lt;strong&gt;Azure Front Door&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 10:&lt;/strong&gt; Configure the traffic distribution rules to route users to the healthiest endpoint based on geographic latency and load.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="b-high-availability-with-bicep"&gt;B. High Availability with Bicep
&lt;/h3&gt;&lt;p&gt;Below is an example Bicep template that deploys an App Service Plan configured for multi-instance scaling and sets up a web app with a deployment slot.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;span class="lnt"&gt;87
&lt;/span&gt;&lt;span class="lnt"&gt;88
&lt;/span&gt;&lt;span class="lnt"&gt;89
&lt;/span&gt;&lt;span class="lnt"&gt;90
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters for Azure App Service deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the App Service Plan&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appServicePlanName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myAppServicePlan&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Web App&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webAppName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myResilientWebApp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Deployment Slot&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;slotName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;staging&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the App Service Plan SKU Tier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;skuTier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the App Service Plan SKU&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;skuName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;S1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DNS Name for the Traffic Manager Profile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;trafficManagerDnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myTrafficManagerDnsName&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Must be globally unique and will be prepended with .trafficmanager.net&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Traffic Manager Endpoint&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;trafficManagerEndpointName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webAppName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Resource Location&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy an App Service Plan with a Standard tier (supports auto-scaling and multi-instance)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appServicePlan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Web/serverfarms@2024-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appServicePlanName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;skuName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;skuTier&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Ensures multiple instances are running&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy the main Web App&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webApp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Web/sites@2024-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webAppName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;serverFarmId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appServicePlan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;siteConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;alwaysOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Keeps the app running continuously&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy a Deployment Slot for staging&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;deploymentSlot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Web/sites/slots@2024-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webApp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;slotName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;serverFarmId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appServicePlan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy a Traffic Manager for routing your traffic to the Web App based on performance&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;trafficmanager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/trafficmanagerprofiles@2022-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;trafficManagerDnsName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;global&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;profileStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Enabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;trafficRoutingMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Performance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;relativeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;trafficManagerDnsName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;endpoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;trafficManagerEndpointName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/trafficmanagerprofiles/azureEndpoints&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;endpointStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Enabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetResourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;webApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;monitorConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;HTTPS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;intervalInSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeoutInSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;15&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;toleratedNumberOfFailures&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Instructions:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the template as &lt;code&gt;appServiceHighAvailability.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal and ensure you’re logged in using:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the template to your resource group:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file appServiceHighAvailability.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This Bicep template provisions an App Service Plan with a Standard tier, ensuring it runs on at least two instances, deploys a web app with “always on” configuration, and creates a deployment slot for staging updates.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Designing a resilient web application in Azure begins with understanding how Azure App Service’s built‑in capabilities contribute to its SLAs. By deploying your application on a multi-instance App Service Plan, configuring auto‑scaling, creating deployment slots, and, if needed, integrating advanced traffic routing solutions, you can achieve robust availability—often meeting or exceeding the SLA benchmark of 99.95% uptime. Whether you’re using the intuitive controls of the Azure Portal or the automation capabilities of Bicep, these best practices ensure your applications remain consistently reliable and performant.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure App Service SLAs:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/app-service/sla" target="_blank" rel="noopener"
&gt;Azure App Service SLA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overview of Azure App Service:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/app-service/overview" target="_blank" rel="noopener"
&gt;Azure App Service Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-Scaling in Azure App Service:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/app-service/manage-scale-out" target="_blank" rel="noopener"
&gt;Scale out in Azure App Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep Documentation:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/" target="_blank" rel="noopener"
&gt;Bicep Language Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Understanding Azure Service Level Agreements and the Resource Requirements Part 3 – Azure SQL</title><link>https://blog.brewedinthecloud.com/p/azure-slas-sql/</link><pubDate>Thu, 15 May 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-slas-sql/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Reliable, high-performance databases are essential for modern applications, and uptime is critical for maintaining business continuity. Azure SQL Database is built with high availability in mind, incorporating features like geo-replication, auto-failover groups, and built‑in redundancy that help deliver SLAs of up to 99.99% uptime. However, achieving such performance involves understanding and implementing specific deployment practices.&lt;/p&gt;
&lt;p&gt;In this post, we explore how Azure SQL Database’s SLA is achieved through its high availability features. We will discuss the key requirements—such as geo-replication and auto‑failover groups—that help protect your database service against outages. You’ll also find practical, step‑by‑step implementation examples using both the Azure Portal and Bicep, giving you a comprehensive blueprint for building a resilient SQL Database environment.&lt;/p&gt;
&lt;h2 id="focus-areas"&gt;Focus Areas
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;High Availability through Built-in SQL Database Features:&lt;/strong&gt;&lt;br&gt;
Understand how Azure SQL Database meets its SLAs using features like automatic backups, geo-replication, and availability groups that are natively integrated into the service.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Key Deployment Requirements for Resiliency:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Geo-Replication:&lt;/strong&gt;&lt;br&gt;
Extend your database across regions to ensure data is available even if one region experiences downtime.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-Failover Groups:&lt;/strong&gt;&lt;br&gt;
Configure automatic failover between primary and secondary databases to maintain continuity during planned or unplanned events.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database-Specific Best Practices:&lt;/strong&gt;&lt;br&gt;
Learn how proper configuration (such as performance tiers and redundancy settings) directly influences the SLA achievement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="example-implementation"&gt;Example Implementation
&lt;/h2&gt;&lt;h3 id="a-using-the-azure-portal"&gt;A. Using the Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a SQL Server and Database:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Sign in to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt; and select &lt;strong&gt;Create a resource&lt;/strong&gt;. Search for &lt;strong&gt;SQL Database&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; In the SQL Database creation wizard, fill out the basics:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription, Resource Group, &amp;amp; Database Name:&lt;/strong&gt; Provide appropriate values.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select a SQL Server:&lt;/strong&gt; Either choose an existing one or create a new server with a unique name, admin credentials, and a desired region.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compute + Storage:&lt;/strong&gt; Choose an appropriate service tier (e.g., &lt;em&gt;Business Critical&lt;/em&gt; for high availability).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Geo-Replication:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; After your SQL Database is deployed, navigate to the SQL server hosting it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Under the &lt;strong&gt;Geo-Replication&lt;/strong&gt; settings, click on &lt;strong&gt;Add secondary&lt;/strong&gt;. Select a secondary region where you want your database to be replicated.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Review the settings and create the replication. This process ensures that your database’s data will be available even if your primary region becomes unavailable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up an Auto-Failover Group:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Return to the SQL server’s overview and select &lt;strong&gt;Failover groups&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 7:&lt;/strong&gt; Create a new failover group, add your primary and secondary databases, and configure the automatic failover policy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 8:&lt;/strong&gt; Save the configuration to enable automatic failover in the event of an outage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="b-using-bicep"&gt;B. Using Bicep
&lt;/h3&gt;&lt;p&gt;Below is a sample Bicep template that deploys an SQL server, a database, and configures geo-replication and an auto-failover group.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters for SQL server and database deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Primary SQL Server&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlPrimaryServerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mySqlServer-AUE&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Secondary SQL Server&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlSecondaryServerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mySqlServer-AUSE&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the SQL Database&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlDbName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myDatabase&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for primary resources.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Admin username for the SQL Server&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azsqladmin&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Admin password for the SQL Server&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Secondary location for geo-replication&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;secondaryLocation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiasoutheast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy the Primary SQL Server&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlServerprimary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Sql/servers@2024-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlPrimaryServerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;administratorLogin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;administratorLoginPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy the Secondary SQL Server&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlServersecondary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Sql/servers@2024-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlSecondaryServerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;secondaryLocation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;administratorLogin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;administratorLoginPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy the primary SQL Database&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlDatabase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Sql/servers/databases@2024-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlServerprimary&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlDbName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;collation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SQL_Latin1_General_CP1_CI_AS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;maxSizeBytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2147483648&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 2GB for sample purposes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;S0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a Failover Group for automatic geo-replication&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;failoverGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Sql/servers/failoverGroups@2024-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlServerprimary&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myfailovergroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;readWriteEndpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;failoverPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Automatic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;failoverWithDataLossGracePeriodMinutes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;60&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 1 hour minimum&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;partnerServers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Sql/servers&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlSecondaryServerName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sqlDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Instructions:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the above Bicep file as &lt;code&gt;sqlDatabaseHighAvailability.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal and log in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy to your resource group:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file sqlDatabaseHighAvailability.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; The above template assumes that a secondary SQL server (with a corresponding name in the secondary region) is available. In a full implementation, you would include both the primary and secondary SQL server deployments and then configure the failover group.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Achieving high availability for your SQL Database is critical to maintaining the reliability and performance levels that modern applications demand. By leveraging Azure SQL Database’s built‑in high availability features—such as geo‑replication and auto‑failover groups—you can create deployments that adhere to SLAs as high as 99.99% uptime. Whether you choose the comprehensive, guided steps available within the Azure Portal or prefer the automation and consistency of Infrastructure-as-Code with Bicep, the strategies detailed in this post provide a solid foundation for resilient database design.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;High Availability in Azure SQL Database:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-sql/database/high-availability-disaster-recovery-checklist?view=azuresql?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;High Availability and Disaster Recovery for SQL Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure SQL Platform Overview:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-sql/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Overview of Azure SQL Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep Documentation:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep Language Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Understanding Azure Service Level Agreements and the Resource Requirements Part 2 – Storage Accounts</title><link>https://blog.brewedinthecloud.com/p/azure-slas-sa/</link><pubDate>Tue, 13 May 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-slas-sa/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Data is the lifeblood of modern applications, and ensuring its durability and availability is paramount. Azure Storage Accounts provide a robust and scalable solution for data storage, with multiple replication options designed to protect your data even in the event of hardware or data center failures. In this post, we examine the different replication models—Locally Redundant Storage (LRS), Zone-Redundant Storage (ZRS), Geo-Redundant Storage (GRS), and Read-Access Geo-Redundant Storage (RA-GRS)—and discuss how each impacts the Storage Account SLA. Whether you are a developer, architect, or IT professional, understanding these configurations will empower you to design storage solutions that meet or exceed SLA requirements, often achieving 99.9% or higher availability.&lt;/p&gt;
&lt;h3 id="a-architecture-diagram"&gt;A Architecture Diagram
&lt;/h3&gt;&lt;p&gt;I have always find it best to understand these concepts using diagrams&lt;/p&gt;
&lt;p&gt;Here is an example of Local Redundant Storage
&lt;img src="https://learn.microsoft.com/en-us/azure/storage/common/media/storage-redundancy/locally-redundant-storage.png"
loading="lazy"
alt="Local Redundancy Storage"
&gt;&lt;/p&gt;
&lt;p&gt;Here is an example of Zone Redundant Storage
&lt;img src="https://learn.microsoft.com/en-us/azure/storage/common/media/storage-redundancy/locally-redundant-storage.png"
loading="lazy"
alt="Zone Redundant Storage"
&gt;&lt;/p&gt;
&lt;p&gt;Here is an example of Geo and Read Access Geo Redundant Storage
&lt;img src="https://learn.microsoft.com/en-us/azure/storage/common/media/storage-redundancy/geo-redundant-storage.png"
loading="lazy"
alt="Geo-Redundant Storage"
&gt;&lt;/p&gt;
&lt;p&gt;Here is an example of Geo Zonal Redundant Storage
&lt;img src="https://learn.microsoft.com/en-us/azure/storage/common/media/storage-redundancy/geo-zone-redundant-storage.png"
loading="lazy"
alt="Geo And Zone-Redundant Storage"
&gt;&lt;/p&gt;
&lt;h2 id="focus-areas"&gt;Focus Areas
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage Replication Options and Their Impact on SLA:&lt;/strong&gt;&lt;br&gt;
Azure Storage offers multiple replication strategies, and each one carries its own availability and durability guarantees:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Locally Redundant Storage (LRS):&lt;/strong&gt;&lt;br&gt;
LRS stores your data within a single data center and typically provides an SLA of around &lt;strong&gt;99.9%&lt;/strong&gt;. While this option is cost-effective, its availability is lower because it does not protect against data center-wide failures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zone-Redundant Storage (ZRS):&lt;/strong&gt;&lt;br&gt;
ZRS replicates data synchronously across multiple availability zones within the same region. This configuration can elevate the storage SLA to approximately &lt;strong&gt;99.99%&lt;/strong&gt; by mitigating the risk of a single zone failure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geo-Redundant Storage (GRS):&lt;/strong&gt;&lt;br&gt;
GRS asynchronously replicates your data to a secondary region, ensuring data durability in the event of a full regional outage. Due to the inherent delay in replication and the absence of read access in the secondary region by default, GRS generally offers an SLA around &lt;strong&gt;99.9%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read-Access Geo-Redundant Storage (RA-GRS):&lt;/strong&gt;&lt;br&gt;
RA-GRS builds upon GRS by enabling read access to the data in the secondary region. This extra accessibility can enhance overall availability, often providing an SLA of up to &lt;strong&gt;99.99%&lt;/strong&gt; for read operations and improved service continuity during regional failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deployment Considerations for Data Protection:&lt;/strong&gt;&lt;br&gt;
An effective storage solution not only depends on picking the right replication model but also on deploying it appropriately:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Selecting the Right Replication Option:&lt;/strong&gt;&lt;br&gt;
Choose a replication strategy based on your application’s resilience requirements and data locality needs. For mission-critical applications needing maximum availability, ZRS or RA-GRS can be ideal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planning for Region-Based Failover:&lt;/strong&gt;&lt;br&gt;
Ensure your architecture supports seamless failover between the primary and secondary regions, particularly if using GRS or RA-GRS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost and Performance Trade-Offs:&lt;/strong&gt;&lt;br&gt;
Evaluate the balance between higher SLA availability and the associated costs or latency implications—determining the best fit for your application’s operational needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="example-implementation"&gt;Example Implementation
&lt;/h2&gt;&lt;h3 id="a-configuring-a-resilient-storage-account-using-the-azure-portal"&gt;A. Configuring a Resilient Storage Account Using the Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a New Storage Account:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sign in to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create a resource&lt;/strong&gt; and select &lt;strong&gt;Storage Account&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Basics&lt;/strong&gt; tab, enter a unique Storage Account name, choose your subscription, resource group, and region.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Select Replication Option:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;Basics&lt;/strong&gt; or &lt;strong&gt;Replication&lt;/strong&gt; tab, choose your desired replication option:
&lt;ul&gt;
&lt;li&gt;To maximize data durability and availability, select &lt;strong&gt;Read-Access Geo-Redundant Storage (RA-GRS)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RA-GRS replicates your data to a secondary region and provides read access in case the primary region becomes unavailable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Additional Settings and Review:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure networking, performance, and access tiers according to your application’s requirements.&lt;/li&gt;
&lt;li&gt;Review your configuration and create the Storage Account.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verification:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After the Storage Account is deployed, navigate to its &lt;strong&gt;Configuration&lt;/strong&gt; settings to verify that RA-GRS is active.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="b-configuring-a-resilient-storage-account-using-bicep"&gt;B. Configuring a Resilient Storage Account Using Bicep
&lt;/h3&gt;&lt;p&gt;Below is a sample Bicep template that deploys a Storage Account with RA-GRS enabled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters for the Storage Account deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Storage Account. This needs to be globally unique. I have used a unique set of characters based on resource group id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mystorageacct&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;uniqueString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Replication type for the Storage Account&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_LRS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_ZRS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_GRS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_RAGRS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;skuName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_RAGRS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Kind of Storage Account&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;StorageV2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;BlobStorage&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;StorageV2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy the Storage Account with RA-GRS replication for maximum durability and availability&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Storage/storageAccounts@2024-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;skuName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;supportsHttpsTrafficOnly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Instructions:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the above template as &lt;code&gt;storageAccountDeployment.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal and log in to Azure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the template with the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file storageAccountDeployment.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This Bicep template deploys a Storage Account with RA-GRS, ensuring that your data is not only protected within your primary region but is also available for read operations if needed during an outage.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Configuring a resilient Storage Account is a crucial step in meeting Azure’s SLA requirements for data durability and availability. By carefully selecting the appropriate replication strategy—whether LRS, ZRS, GRS, or RA-GRS—and implementing additional deployment considerations, you can ensure that your data remains both accessible and durable even during adverse events. Whether you opt for the guided experience of the Azure Portal or opt for automated deployments with Bicep, the strategies discussed in this post will help you maintain high availability, often achieving 99.9% or higher.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/storage/common/storage-redundancy?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Storage Replication Options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/storage/common/storage-account-overview#availability?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Storage SLA Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1&amp;amp;msockid=176fff6e400b61ff00f0ea38419b60ae?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Service Level Agreements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep Language Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Understanding Azure Service Level Agreements and the Resource Requirements Part 1 – Virtual Machines</title><link>https://blog.brewedinthecloud.com/p/azure-slas-vms/</link><pubDate>Thu, 08 May 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-slas-vms/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In today’s mission-critical environments, uptime is non-negotiable. Azure’s Service Level Agreements (SLAs) for Virtual Machines are designed to guarantee 99.95% (or higher) availability—but meeting these promises depends on smart architectural choices. In this installment, we explore the requirements for achieving high availability with Azure Virtual Machines. We’ll dive into the importance of deploying VMs within Availability Sets or across Availability Zones, setting up load-balancing configurations, and implementing redundancy and auto-scaling. Whether you prefer a hands-on approach using the Azure Portal or an Infrastructure-as-Code solution with Bicep, we’ve got you covered with step-by-step guidance.&lt;/p&gt;
&lt;h2 id="focus-areas"&gt;Focus Areas
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Understanding the Baseline SLA for Virtual Machines:&lt;/strong&gt;&lt;br&gt;
The storage type used for a Virtual Machine directly impacts its baseline SLA. For instance, a VM running on Standard HDD has a minimum SLA of 95%. Upgrading to Standard SSD improves that guarantee significantly—to around 99.5%—and with Premium SSDs, the SLA can reach up to 99.9%. These figures represent the fundamental reliability provided by the underlying hardware alone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enhancing SLAs Through Deployment Strategies:&lt;/strong&gt;&lt;br&gt;
Beyond storage selection, the overall architecture can further elevate uptime:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Availability Sets vs. Availability Zones:&lt;/strong&gt;&lt;br&gt;
Deploying VMs within an Availability Set ensures that instances are spread across multiple fault and update domains, typically achieving an SLA of 99.95%. Taking it a step further, distributing your VMs across Availability Zones—where each zone is a physically separate data center—can push availability even higher, often approaching 99.99%. This minimizes the risk of a single point of failure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Load-Balancing Configurations:&lt;/strong&gt;&lt;br&gt;
Implementing a load balancer to distribute traffic among multiple VM instances ensures that if one instance goes offline due to maintenance or unexpected failure, the service remains uninterrupted. When combined with either Availability Sets or Zones, load balancing helps maintain continuous operation and bolsters the overall SLA.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Redundancy and Auto-Scaling:&lt;/strong&gt;&lt;br&gt;
Building redundancy by deploying multiple VM instances and enabling auto-scaling ensures that your system dynamically adjusts to demand and recovers from outages. This additional layer of resiliency further solidifies the high availability of your services.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For Example:&lt;/strong&gt;
A single VM on Standard HDD might only deliver a 95% SLA. However, if you upgrade to Premium SSD, that baseline improves to 99.9%. Now, if you deploy multiple such VMs across Availability Zones and front them with a load balancer, your SLA can reach up to 99.99%, providing a significantly more resilient solution.&lt;/p&gt;
&lt;h2 id="example-implementation"&gt;Example Implementation
&lt;/h2&gt;&lt;h3 id="a-using-the-azure-portal"&gt;A. Using the Azure Portal
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Deploy VMs in an Availability Set:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Sign in to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Click &lt;strong&gt;Create a resource&lt;/strong&gt; and select &lt;strong&gt;Virtual Machine&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; In the &lt;strong&gt;Basics&lt;/strong&gt; tab, fill in your VM details (name, region, image, size, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Under &lt;strong&gt;Availability options&lt;/strong&gt;, select &lt;strong&gt;Availability set&lt;/strong&gt; and either choose an existing set or create a new one. (A typical configuration may include 2 fault domains and 5 update domains.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Complete your settings and deploy the VM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Repeat to deploy additional VM instances to achieve redundancy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="b-using-bicep"&gt;B. Using Bicep
&lt;/h3&gt;&lt;p&gt;For repeatable and automated deployments, consider using this sample Bicep template to build a highly available Virtual Machine setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Prefix for the Virtual Machine names&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmNamePrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myvm&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Admin username for the Virtual Machines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azadmin&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Admin password for the Virtual Machines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Number of Virtual Machines to deploy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Subnet&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mySubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Network Interface Prefix Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterfaceName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create an Availability Set to support high availability&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;availabilitySet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/availabilitySets@2024-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmNamePrefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-avset&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;platformUpdateDomainCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;platformFaultDomainCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Aligned&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetRef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkInterfaces@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmCount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;networkInterfaceName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmNamePrefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ipconfig1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Dynamic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetRef&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Loop to deploy multiple Virtual Machines within the Availability Set&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines@2024-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmCount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmNamePrefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hardwareProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_DS1_v2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;computerName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmNamePrefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;imageReference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publisher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MicrosoftWindowsServer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;WindowsServer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;2025-Datacenter&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osDisk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;createOption&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FromImage&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterfaces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterface&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;availabilitySet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;availabilitySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Instructions (Bicep):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the above code as &lt;code&gt;vmHighAvailability.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal, log in with Azure CLI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the template:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file vmHighAvailability.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This template provisions an Availability Set and deploys the specified number of Virtual Machines in that set, providing a strong foundation for high availability in alignment with Azure’s SLAs.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Understanding and meeting Azure’s SLA requirements for Virtual Machines is vital for building resilient, mission-critical applications. By deploying VMs within Availability Sets (or across Availability Zones), implementing load balancers, and incorporating redundancy and auto-scaling, you can achieve the 99.95% uptime and even surpass it. Whether you choose the hands-on approach of the Azure Portal or the efficiency of Infrastructure-as-Code with Bicep, informed architectural decisions pave the way for reliable and high-performing systems.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Service Level Agreements:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/availability/azure-sla" target="_blank" rel="noopener"
&gt;Azure SLA Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High Availability for Virtual Machines:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-machines/availability" target="_blank" rel="noopener"
&gt;High Availability for Virtual Machines&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/resiliency/availability" target="_blank" rel="noopener"
&gt;Designing for High Availability in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep Documentation:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/" target="_blank" rel="noopener"
&gt;Bicep Language Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Architecture Center:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/" target="_blank" rel="noopener"
&gt;Azure Architecture Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Building Resilient Networks with Azure Networking Services Part 5: Implementing VNet Service Endpoints &amp; Private Link Services</title><link>https://blog.brewedinthecloud.com/p/azure-networks-privatelinkandserviceendpoints/</link><pubDate>Tue, 06 May 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-networks-privatelinkandserviceendpoints/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;As organisations increasingly adopt cloud services, securing connectivity to Azure services becomes paramount. In many scenarios, public endpoints are not sufficient when sensitive data and workload integrity are involved. Azure offers two powerful capabilities to provide secure, private access to its services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Private Link:&lt;/strong&gt; This enables the connection of your Virtual Network directly with Azure services (or your own PaaS offerings) via a private endpoint. With Private Link, your traffic remains on the Microsoft backbone, ensuring that communication never traverses the public internet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service Endpoints:&lt;/strong&gt; These extend your virtual network’s private address space to Azure service resources. They provide a straightforward way to secure your direct connectivity back to Azure while still using the native public endpoint of the service.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this post, we compare these two approaches, discuss their differences and appropriate use cases, and provide hands-on examples—both using the Azure Portal and Bicep templates—to help you integrate your network with Azure services securely.&lt;/p&gt;
&lt;h2 id="private-link-vs-service-endpoints-key-differences-and-use-cases"&gt;Private Link vs. Service Endpoints: Key Differences and Use Cases
&lt;/h2&gt;&lt;h3 id="private-link"&gt;Private Link
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;How It Works:&lt;/strong&gt;&lt;br&gt;
Private Link provisions a private IP address in your virtual network. This private endpoint acts as a network interface, mapping to the Azure service resource (for example, an Azure Storage account). Traffic between your VNet and the service flows entirely over the Microsoft backbone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provides granular control and enhanced security by isolating the service endpoint within your VNet.&lt;/li&gt;
&lt;li&gt;Supports scenarios where connectivity must bypass the public internet entirely, which may be a compliance requirement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you need to consume services such as Azure Storage, SQL Database, or your own custom PaaS, without exposing them to the public internet.&lt;/li&gt;
&lt;li&gt;When you require integration with on-premises networks over VPN/ExpressRoute with minimal exposure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="service-endpoints"&gt;Service Endpoints
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;How It Works:&lt;/strong&gt;&lt;br&gt;
Service endpoints extend your VNet’s identity to Azure services over optimized routes, but the service itself still retains its public endpoint. Rules are enforced on the service side to ensure that only traffic from your VNet (or subnets) is accepted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simpler to set up and manage in many situations.&lt;/li&gt;
&lt;li&gt;Provides improved network performance using the Microsoft backbone, with minimal configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you want to secure access to Azure services with a minimal footprint and configuration overhead.&lt;/li&gt;
&lt;li&gt;Situations where direct exposure to the service’s public endpoint is acceptable provided that traffic is restricted based on VNet or subnet membership.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementing-private-link-and-service-endpoints"&gt;Implementing Private Link and Service Endpoints
&lt;/h2&gt;&lt;p&gt;In the sections below, we provide example implementations using both the Azure Portal and Bicep.&lt;/p&gt;
&lt;h3 id="azure-portal-implementation"&gt;Azure Portal Implementation
&lt;/h3&gt;&lt;h4 id="enabling-private-link-for-an-azure-storage-account"&gt;Enabling Private Link for an Azure Storage Account
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Private Endpoint:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sign in to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt; and navigate to your Azure Storage Account.&lt;/li&gt;
&lt;li&gt;Under the &lt;strong&gt;Settings&lt;/strong&gt; section, select &lt;strong&gt;Private endpoint connections&lt;/strong&gt;. Click &lt;strong&gt;+ Private endpoint&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Provide a name (e.g., &lt;code&gt;StoragePrivateEndpoint&lt;/code&gt;), select your subscription, resource group, and region.&lt;/li&gt;
&lt;li&gt;Choose the Virtual Network and subnet where the endpoint should reside.&lt;/li&gt;
&lt;li&gt;Select the target sub-resource (e.g., &lt;strong&gt;blob&lt;/strong&gt; for a Storage Account).&lt;/li&gt;
&lt;li&gt;Configure DNS integration if needed, and review + create the private endpoint.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Post-Deployment Verification:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Once deployed, review that the Storage Account now has a private endpoint. Direct traffic from your VNet to the Storage Account now happens over that private link.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="enabling-service-endpoints-for-an-azure-storage-account"&gt;Enabling Service Endpoints for an Azure Storage Account
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Configure Service Endpoints in Your VNet:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to your Virtual Network in the Azure Portal.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, select &lt;strong&gt;Subnets&lt;/strong&gt; and then select the subnet to which you wish to add the service endpoint.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Service endpoints&lt;/strong&gt; and then &lt;strong&gt;+ Add&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose the service type (e.g., &lt;strong&gt;Microsoft.Storage&lt;/strong&gt;) and save the configuration.&lt;/li&gt;
&lt;li&gt;Optionally, configure firewall rules on the Storage Account to accept connections only from the specified virtual network/subnets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bicep-implementation"&gt;Bicep Implementation
&lt;/h3&gt;&lt;p&gt;Below are two Bicep templates: one to deploy a private endpoint to secure access to an Azure Storage account, and another to enable service endpoints on a subnet.&lt;/p&gt;
&lt;h4 id="bicep-template-for-private-link-private-endpoint"&gt;Bicep Template for Private Link (Private Endpoint)
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters for Private Endpoint&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the existing Storage Account&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mystorageacct&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Private Endpoint&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateEndpointName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-pe&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the existing Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the existing Subnet&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PrivateEndpointSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Reference storage account (assumed to exist)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Storage/storageAccounts@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Reference existing virtual network and subnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2021-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2021-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create Private Endpoint for the Storage Account (Blob Service)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateEndpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/privateEndpoints@2021-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateEndpointName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateLinkServiceConnections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-connection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateLinkServiceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupIds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;blob&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the template as &lt;code&gt;privateEndpoint.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy using:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file privateEndpoint.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="bicep-template-for-service-endpoints"&gt;Bicep Template for Service Endpoints
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters for enabling service endpoints on a subnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Subnet&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;EndpointSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Reference the virtual network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2021-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Update the subnet to enable Service Endpoints (e.g., for Microsoft.Storage)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetUpdate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2021-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;serviceEndpoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Storage&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save this template as &lt;code&gt;serviceEndpoints.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy using:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file serviceEndpoints.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This template updates a subnet in your existing Virtual Network to enable service endpoints for Microsoft.Storage, allowing secure and optimized connectivity to the Storage Account’s public endpoint.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Integrating with Azure services securely is a critical component of a resilient network architecture. With Private Link, you ensure that traffic remains completely private and isolated within your Virtual Network, while service endpoints offer a simpler method to secure your access to Azure resources by extending your VNet’s reach. Both approaches offer distinct advantages depending on your security, performance, and compliance requirements.&lt;/p&gt;
&lt;p&gt;By implementing these solutions using either the intuitive Azure Portal or through Infrastructure-as-Code with Bicep, you can enhance the security and reliability of your network integrations with Azure services.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Private Link:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/private-link/private-link-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Private Link Overview&lt;/a&gt; | &lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/private-link/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Private Link Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service Endpoints:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-service-endpoints-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Service Endpoints Overview&lt;/a&gt; | &lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/virtual-network/#service-endpoints?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Service Endpoints Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep Documentation:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep Language Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;General Networking and Security in Azure:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/networking/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Networking Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Building Resilient Networks with Azure Networking Services Part 4: Implementing DDoS Protection</title><link>https://blog.brewedinthecloud.com/p/azure-networks-vnetprotection/</link><pubDate>Thu, 01 May 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-networks-vnetprotection/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Distributed denial-of-service (DDoS) attacks have become increasingly sophisticated and pose a serious risk to the availability of online services. High-traffic events—whether driven by legitimate demand or malicious intent—can overwhelm network resources if not properly mitigated. Azure DDoS Protection Standard offers an enhanced defense mechanism by continuously monitoring traffic patterns, automatically applying mitigation strategies, and integrating seamlessly with Azure Monitor for alerting and analysis.&lt;/p&gt;
&lt;p&gt;In this post, we’ll explore how to deploy and configure Azure DDoS Protection Standard using both the Azure Portal and Bicep templates. By leveraging these tools, you can preemptively protect your resources and ensure the uninterrupted availability of your applications and services.&lt;/p&gt;
&lt;h2 id="implementing-ddos-protection-using-the-azure-portal"&gt;Implementing DDoS Protection Using the Azure Portal
&lt;/h2&gt;&lt;h3 id="step-1-create-a-ddos-protection-plan"&gt;Step 1: Create a DDoS Protection Plan
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Sign in to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Create a resource&lt;/strong&gt; and in the search box, type &lt;strong&gt;DDoS Protection Plan&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;DDoS Protection Plan&lt;/strong&gt; from the results and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Basics&lt;/strong&gt; tab:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; Enter a unique name (e.g., &lt;code&gt;MyDdosPlan&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscription and Resource Group:&lt;/strong&gt; Choose your subscription and either select an existing resource group or create a new one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region:&lt;/strong&gt; Select the region where you manage your network resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Review + create&lt;/strong&gt; after filling in the required fields and then &lt;strong&gt;Create&lt;/strong&gt; once validation passes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-associate-the-ddos-protection-plan-with-a-virtual-network"&gt;Step 2: Associate the DDoS Protection Plan with a Virtual Network
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Navigate to your existing &lt;strong&gt;Virtual Network&lt;/strong&gt; resource.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Settings&lt;/strong&gt; section, select &lt;strong&gt;DDoS protection&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Configure&lt;/strong&gt; and set &lt;strong&gt;DDoS Protection&lt;/strong&gt; to &lt;strong&gt;Standard&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the DDoS Protection Plan you created (e.g., &lt;code&gt;MyDdosPlan&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt; to associate the plan with your Virtual Network.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By enabling DDoS Protection Standard and associating it with your Virtual Network, your resources benefit from automatic traffic monitoring, mitigation strategies, and enhanced alerts during potential attacks.&lt;/p&gt;
&lt;h2 id="implementing-ddos-protection-using-bicep"&gt;Implementing DDoS Protection Using Bicep
&lt;/h2&gt;&lt;p&gt;For automated, repeatable deployments, the following Bicep template creates a DDoS Protection Plan and associates it with an existing Virtual Network.&lt;/p&gt;
&lt;h3 id="bicep-template-ddos-protection-deployment"&gt;Bicep Template: DDoS Protection Deployment
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters for DDoS Protection setup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the DDoS Protection Plan&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ddosPlanName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyDdosProtectionPlan&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySecureVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy the DDoS Protection Plan&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ddosPlan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/ddosProtectionPlans@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ddosPlanName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Reference the existing Virtual Network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Associate the DDoS Protection Plan with the Virtual Network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetUpdate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ddosProtectionPlan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ddosPlan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="deployment-instructions"&gt;Deployment Instructions
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Save the Template:&lt;/strong&gt;&lt;br&gt;
Save the above code as &lt;code&gt;ddosProtectionDeployment.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy via Azure CLI:&lt;/strong&gt;
Open your terminal, log in, and execute the deployment command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file ddosProtectionDeployment.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This Bicep template automates the process of creating a DDoS Protection Plan and associating it with your Virtual Network, ensuring that your infrastructure is protected against DDoS attacks as soon as it is deployed.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Ensuring service availability in the face of escalating DDoS threats is essential for modern network resilience. Azure DDoS Protection Standard provides an effective, automatic defense against such attacks, allowing you to maintain the performance and reliability of your services. Whether you utilize the Azure Portal for a guided setup or employ Bicep for automated deployments, integrating DDoS Protection is a proactive step toward securing your network environment.&lt;/p&gt;
&lt;p&gt;By implementing these solutions, you fortify your infrastructure against volatile network conditions and unexpected surges in traffic, safeguarding critical applications and ensuring business continuity.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure DDoS Protection Standard:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/ddos-protection/ddos-protection-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;DDoS Protection Standard Overview&lt;/a&gt; | &lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/ddos-protection/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;DDoS Protection Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep Documentation:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep Language Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Networking:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/networking/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Networking Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Building Resilient Networks with Azure Networking Services Part 3: Understanding Azure Load Balancing Solutions</title><link>https://blog.brewedinthecloud.com/p/azure-networks-loadbalancing/</link><pubDate>Tue, 29 Apr 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-networks-loadbalancing/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In modern cloud architectures, effective load balancing is crucial for ensuring high availability and optimal performance. Azure provides a suite of load balancing solutions that address different layers of the OSI model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Load Balancer&lt;/strong&gt; operates at layer 4 (TCP/UDP), ideal for fast, high-throughput distribution of network traffic among virtual machines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Application Gateway&lt;/strong&gt;, on the other hand, operates at layer 7 (HTTP/HTTPS) and is specifically designed for web applications, offering advanced features like SSL termination, cookie-based session affinity, and URL-based routing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Traffic Manager&lt;/strong&gt; is a DNS-based traffic distribution solution that directs users to the most appropriate endpoint globally—it’s particularly useful for multi-region deployments and optimizing user experience via geographic routing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll walk you through the practical aspects of deploying load balancing solutions for both layer 4 and layer 7 traffic. You’ll see how to set these up using the Azure Portal and using Infrastructure-as-Code (IaC) via Bicep.&lt;/p&gt;
&lt;h2 id="comparing-azure-load-balancing-solutions"&gt;Comparing Azure Load Balancing Solutions
&lt;/h2&gt;&lt;h3 id="azure-load-balancer-layer-4"&gt;Azure Load Balancer (Layer 4)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What It Does:&lt;/strong&gt;&lt;br&gt;
Operates at the transport layer to efficiently distribute incoming TCP/UDP traffic among healthy backend instances.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;br&gt;
Ideal for scalable, high-performance workloads where low latency is required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;br&gt;
Configure frontend IPs, backend pools, health probes, and load balancing rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="azure-application-gateway-layer-7"&gt;Azure Application Gateway (Layer 7)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What It Does:&lt;/strong&gt;&lt;br&gt;
Inspects traffic at the HTTP/HTTPS level and provides features like URL-based routing, SSL offloading, and session affinity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;br&gt;
Best suited for web application scenarios where you need to load balance and secure HTTP traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;br&gt;
Define configurations for frontend IPs, listeners, HTTP settings, backend pools, and request routing rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="azure-traffic-manager"&gt;Azure Traffic Manager
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What It Does:&lt;/strong&gt;&lt;br&gt;
Uses DNS-based routing to direct clients to optimal endpoints based on performance, geographic location, or failover policies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;br&gt;
Excellent for global distribution scenarios, disaster recovery, and performance optimization across regions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;br&gt;
Managed at the DNS level, with health checks and endpoint monitoring.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;em&gt;Note:&lt;/em&gt; While Traffic Manager is not directly “in-path” like Load Balancer or Application Gateway, it ensures that users reach the right endpoint before the traffic even enters your Azure environment.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="setting-up-load-balancing-for-layer-4-traffic"&gt;Setting Up Load Balancing for Layer 4 Traffic
&lt;/h2&gt;&lt;h3 id="using-the-azure-portal"&gt;Using the Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Public Load Balancer:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sign in to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create a resource&lt;/strong&gt; and search for &lt;strong&gt;Load Balancer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Public&lt;/strong&gt; as the SKU.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Basics&lt;/strong&gt; tab, provide a unique name (e.g., &lt;code&gt;MyPublicLB&lt;/code&gt;), select your subscription and resource group, and specify your region.&lt;/li&gt;
&lt;li&gt;Configure the &lt;strong&gt;Frontend IP Configuration&lt;/strong&gt; by selecting or creating a new Public IP.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Review + create&lt;/strong&gt; and then &lt;strong&gt;Create&lt;/strong&gt; once validation passes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure the Backend Pool and Health Probe:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After deployment, navigate to your Load Balancer resource.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, select &lt;strong&gt;Backend pools&lt;/strong&gt;; add your virtual machines or scale set instances.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Health Probes&lt;/strong&gt;, define a probe (e.g., TCP on port 80) to monitor the health of your backend resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Load Balancing Rules:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Under &lt;strong&gt;Load balancing rules&lt;/strong&gt;, create a rule that associates the frontend configuration and the backend pool, specifying ports and protocols (e.g., forwarding TCP port 80).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="using-bicep"&gt;Using Bicep
&lt;/h3&gt;&lt;p&gt;Below is a sample Bicep template that provisions an Azure Load Balancer for layer 4 traffic along with a virtual network and backend linux server.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;span class="lnt"&gt;127
&lt;/span&gt;&lt;span class="lnt"&gt;128
&lt;/span&gt;&lt;span class="lnt"&gt;129
&lt;/span&gt;&lt;span class="lnt"&gt;130
&lt;/span&gt;&lt;span class="lnt"&gt;131
&lt;/span&gt;&lt;span class="lnt"&gt;132
&lt;/span&gt;&lt;span class="lnt"&gt;133
&lt;/span&gt;&lt;span class="lnt"&gt;134
&lt;/span&gt;&lt;span class="lnt"&gt;135
&lt;/span&gt;&lt;span class="lnt"&gt;136
&lt;/span&gt;&lt;span class="lnt"&gt;137
&lt;/span&gt;&lt;span class="lnt"&gt;138
&lt;/span&gt;&lt;span class="lnt"&gt;139
&lt;/span&gt;&lt;span class="lnt"&gt;140
&lt;/span&gt;&lt;span class="lnt"&gt;141
&lt;/span&gt;&lt;span class="lnt"&gt;142
&lt;/span&gt;&lt;span class="lnt"&gt;143
&lt;/span&gt;&lt;span class="lnt"&gt;144
&lt;/span&gt;&lt;span class="lnt"&gt;145
&lt;/span&gt;&lt;span class="lnt"&gt;146
&lt;/span&gt;&lt;span class="lnt"&gt;147
&lt;/span&gt;&lt;span class="lnt"&gt;148
&lt;/span&gt;&lt;span class="lnt"&gt;149
&lt;/span&gt;&lt;span class="lnt"&gt;150
&lt;/span&gt;&lt;span class="lnt"&gt;151
&lt;/span&gt;&lt;span class="lnt"&gt;152
&lt;/span&gt;&lt;span class="lnt"&gt;153
&lt;/span&gt;&lt;span class="lnt"&gt;154
&lt;/span&gt;&lt;span class="lnt"&gt;155
&lt;/span&gt;&lt;span class="lnt"&gt;156
&lt;/span&gt;&lt;span class="lnt"&gt;157
&lt;/span&gt;&lt;span class="lnt"&gt;158
&lt;/span&gt;&lt;span class="lnt"&gt;159
&lt;/span&gt;&lt;span class="lnt"&gt;160
&lt;/span&gt;&lt;span class="lnt"&gt;161
&lt;/span&gt;&lt;span class="lnt"&gt;162
&lt;/span&gt;&lt;span class="lnt"&gt;163
&lt;/span&gt;&lt;span class="lnt"&gt;164
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Azure Virtual Network Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Azure Virtual Network Subnet Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mySubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Load Balancer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myOutboundLoadBalancer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Azure LoadBalancer Public IP Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lbPublicIPName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myOutboundLB-PublicIP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Backend Pool&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendPoolName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myBackendPool&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azureuser&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// 1. Virtual Network with a default subnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// 2. Public IP for the Load Balancer frontend&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lbPublicIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lbPublicIPName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// 3. Load Balancer for outbound access with a backend pool and outbound rule&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/loadBalancers@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Frontend configuration referencing the public IP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;LoadBalancerFrontEnd&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lbPublicIP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Define the backend pool&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendAddressPools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendPoolName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Outbound rule so VMs in the backend pool can access the internet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;outboundRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;LBOutboundRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/loadBalancers/frontendIPConfigurations&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;LoadBalancerFrontend&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendAddressPool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/loadBalancers/backendAddressPools&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendPoolName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;All&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;idleTimeoutInMinutes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allocatedOutboundPorts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1024&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// 4. Network Interface attached to the vNet and associated with the LB backend pool&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkInterfaces@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vmNic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ipconfig1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Dynamic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/subnets/default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Associate NIC with the Load Balancer backend pool for outbound connectivity&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancerBackendAddressPools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;loadBalancer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/backendAddressPools/backendPool&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// 5. Linux Virtual Machine attached to the NIC&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;linuxVM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vm-linux-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hardwareProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_DS1_v2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;computerName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vm&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;linuxConfiguration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;disablePasswordAuthentication&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;imageReference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publisher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Canonical&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UbuntuServer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;18.04-LTS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osDisk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;createOption&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FromImage&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterfaces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the template as &lt;code&gt;loadBalancerDeployment.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal and run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file loadBalancerDeployment.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="setting-up-load-balancing-for-layer-7-traffic"&gt;Setting Up Load Balancing for Layer 7 Traffic
&lt;/h2&gt;&lt;h3 id="using-the-azure-portal-1"&gt;Using the Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an Application Gateway:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the Azure Portal, click &lt;strong&gt;Create a resource&lt;/strong&gt; and search for &lt;strong&gt;Application Gateway&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Basics&lt;/strong&gt; tab, enter details like the name (e.g., &lt;code&gt;MyAppGateway&lt;/code&gt;), resource group, region, and select the appropriate SKU (e.g., Standard_v2).&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, configure the Virtual Network and subnet dedicated for the gateway.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Frontend IP configurations&lt;/strong&gt;, assign a Public IP (create one if necessary).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Review + create&lt;/strong&gt;, and then &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure HTTP Settings and Listeners:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After deployment, navigate to your Application Gateway resource.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Backend pools&lt;/strong&gt;, define the pool of servers (or VMs) where your application resides.&lt;/li&gt;
&lt;li&gt;Configure an &lt;strong&gt;HTTP setting&lt;/strong&gt; (including port, protocol, and session affinity settings).&lt;/li&gt;
&lt;li&gt;Create an &lt;strong&gt;HTTP Listener&lt;/strong&gt; that binds the frontend IP, port, and protocol.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Rules&lt;/strong&gt;, create a request routing rule to map the listener to the backend pool and HTTP settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="using-bicep-1"&gt;Using Bicep
&lt;/h3&gt;&lt;p&gt;Below is a sample Bicep template that deploys a basic Application Gateway for layer 7 load balancing. (Note: Replace the &lt;code&gt;&amp;lt;subnetResourceId&amp;gt;&lt;/code&gt; placeholder with your subnet’s resource ID.)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Application Gateway&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyAppGateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Public IP Name for the Application Gateway&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIpName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyAppGwPublicIP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Virtual Network Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Subnet Name for the Application Gateway&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyAppGwSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Virtual Network and Subnet pre-existing for your Application Gateway&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetname&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetname&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Public IP for the Application Gateway&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIpAppGw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIpName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Application Gateway Resource&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/applicationGateways@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_v2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_v2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwIpConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwFrontend&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIpAppGw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendPorts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwFrontendPort&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendAddressPools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwBackendPool&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendHttpSettingsCollection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwHttpSettings&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Http&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cookieBasedAffinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Disabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;httpListeners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwHttpListener&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfiguration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/applicationGateways/frontendIPConfigurations&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwFrontend&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/applicationGateways/frontendPorts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwFrontendPort&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Http&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;requestRoutingRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwRoutingRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Basic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;httpListener&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/applicationGateways/httpListeners&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwHttpListener&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendAddressPool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/applicationGateways/backendAddressPools&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwBackendPool&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendHttpSettings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/applicationGateways/backendHttpSettingsCollection&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwHttpSettings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the template as &lt;code&gt;appGatewayDeployment.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the template with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file appGatewayDeployment.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="setting-up-global-load-balancing-traffic"&gt;Setting Up Global Load Balancing Traffic
&lt;/h2&gt;&lt;h3 id="using-the-azure-portal-2"&gt;Using the Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an Traffic Manager:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In the Azure Portal, click &lt;strong&gt;Create a resource&lt;/strong&gt; and search for &lt;strong&gt;Traffic Manager&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the &lt;strong&gt;Basics&lt;/strong&gt; tab, enter details like the name (e.g., &lt;code&gt;MyExternalApp&lt;/code&gt;) which needs to be globally unique, resource group, region (This is for the resource element only, the configuration is global), and select the routing method (choose from the below options)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Performance: Distributes traffic requests to the origin with the lowest network latency, rather than the closest geographic location, ensuring optimal performance&lt;/li&gt;
&lt;li&gt;Weighted: Distributes traffic based on assigned weights to each origin. This allows you to control the proportion of traffic sent to different origins, which can be useful for load balancing and testing new deployments.&lt;/li&gt;
&lt;li&gt;Priority: Routes traffic to the primary origin by default. If the primary origin becomes unavailable, traffic is routed to the secondary origin. This ensures high availability and failover capabilities.&lt;/li&gt;
&lt;li&gt;Geographic: Routes traffic based on the geographic location of the user. This method ensures that users are directed to the nearest origin, reducing latency and improving performance.&lt;/li&gt;
&lt;li&gt;Multivalue: Returns multiple IP addresses for a single DNS query. This method allows clients to choose the best IP address to connect to, enhancing redundancy and load distribution.&lt;/li&gt;
&lt;li&gt;Subnet: Routes traffic based on the user&amp;rsquo;s IP address subnet. This method is useful for directing traffic from specific subnets to designated origins, providing more granular control over traffic routing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, configure the Virtual Network and subnet dedicated for the gateway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;strong&gt;Frontend IP configurations&lt;/strong&gt;, assign a Public IP (create one if necessary).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Review + create&lt;/strong&gt;, and then &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure HTTP Settings and Listeners:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After deployment, navigate to your Application Gateway resource.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Backend pools&lt;/strong&gt;, define the pool of servers (or VMs) where your application resides.&lt;/li&gt;
&lt;li&gt;Configure an &lt;strong&gt;HTTP setting&lt;/strong&gt; (including port, protocol, and session affinity settings).&lt;/li&gt;
&lt;li&gt;Create an &lt;strong&gt;HTTP Listener&lt;/strong&gt; that binds the frontend IP, port, and protocol.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Rules&lt;/strong&gt;, create a request routing rule to map the listener to the backend pool and HTTP settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="using-bicep-2"&gt;Using Bicep
&lt;/h3&gt;&lt;p&gt;Below is a sample Bicep template that deploys a basic Application Gateway for layer 7 load balancing. (Note: Replace the &lt;code&gt;&amp;lt;subnetResourceId&amp;gt;&lt;/code&gt; placeholder with your subnet’s resource ID.)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyAppGateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIpName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyAppGwPublicIP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Provide the resource ID of the subnet for the Application Gateway&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Public IP for the Application Gateway&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIpAppGw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2020-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIpName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Application Gateway Resource&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/applicationGateways@2020-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGwName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_v2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_v2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwIpConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwFrontend&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIpAppGw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendPorts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwFrontendPort&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendAddressPools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwBackendPool&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendHttpSettingsCollection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwHttpSettings&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Http&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cookieBasedAffinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Disabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;httpListeners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwHttpListener&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfiguration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;frontendPorts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Http&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;requestRoutingRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appGwRoutingRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Basic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;httpListener&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;httpListeners&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendAddressPool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;backendAddressPools&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendHttpSettings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appGw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;backendHttpSettingsCollection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the template as &lt;code&gt;appGatewayDeployment.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the template with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file appGatewayDeployment.bicep &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --parameters &lt;span class="nv"&gt;subnetId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/subscriptions/&amp;lt;sub-id&amp;gt;/resourceGroups/&amp;lt;rg-name&amp;gt;/providers/Microsoft.Network/virtualNetworks/&amp;lt;vnet-name&amp;gt;/subnets/&amp;lt;subnet-name&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;In this post, we explored a range of load balancing solutions available in Azure—from the low-level, high-performance Azure Load Balancer to the feature-rich, application-aware Azure Application Gateway, and the globally distributed Azure Traffic Manager. By examining their differences and deploying examples for both layer 4 and layer 7 traffic, you now have a clearer understanding of how to tailor Azure’s load balancing solutions to meet your application’s needs.&lt;/p&gt;
&lt;p&gt;Whether you prefer the hands-on approach using the Azure Portal or a repeatable deployment via Bicep, these tools enhance your network’s resilience and scalability.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Load Balancer:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/load-balancer/load-balancer-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Load Balancer Overview&lt;/a&gt; | &lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/load-balancer/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Load Balancer Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Application Gateway:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/application-gateway/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Application Gateway Overview&lt;/a&gt; | &lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/application-gateway/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Application Gateway Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Traffic Manager:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/traffic-manager/traffic-manager-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Traffic Manager Overview&lt;/a&gt; | &lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/traffic-manager/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Traffic Manager Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep Documentation:&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep Language Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Building Resilient Networks with Azure Networking Services Part 2: Understanding Azure Virtual Networks Peering</title><link>https://blog.brewedinthecloud.com/p/azure-networks-peering/</link><pubDate>Thu, 24 Apr 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-networks-peering/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In today’s cloud-first landscape, resilient network architectures not only enhance security but also facilitate seamless connectivity between distributed resources. In this installment, we explore two essential capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VNet Peering:&lt;/strong&gt; Enabling seamless, low-latency connectivity between Virtual Networks within the same region and across different regions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subnet Peering:&lt;/strong&gt; Taking VNet peering to a lower level deeper, allowing specific subnets within Virtual Networks to be peered to over Virtual Network subnets, increasing security by not having broad networks connected but specific subnets instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will demonstrate how to implement this solution using both the Azure Portal and Bicep templates. Whether you prefer the intuitive UI or automated, repeatable deployments via Infrastructure-as-Code, you&amp;rsquo;ll find practical steps and code samples to guide your setup.&lt;/p&gt;
&lt;h2 id="vnet-peering-connecting-virtual-networks"&gt;VNet Peering: Connecting Virtual Networks
&lt;/h2&gt;&lt;h3 id="concept-overview"&gt;Concept Overview
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;VNet peering&lt;/strong&gt; allows you to connect two virtual networks in Azure so that resources in different VNets can communicate with each other via the Microsoft backbone network. Peering can be done:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Within the same region:&lt;/strong&gt; For low latency, high-bandwidth connectivity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Across regions:&lt;/strong&gt; Enabling global networking scenarios, though take note that data transfer costs may apply.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This connectivity model is ideal for building resilient architectures that span multiple deployments, environments, or even geographic locations.&lt;/p&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;p&gt;&lt;strong&gt;Importance of Planning with IPAM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Extending your on-premises infrastructure to the cloud requires plenty of advanced planning, no more so than in networking. When you being the planning stages of your cloud adoption you need to allocate a IP address range that does not overlap with your internal ranges to avoid the costly re-work required to fix the problem in future.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="subnet-peering-connecting-subnets-across-virtual-networks"&gt;Subnet Peering: Connecting Subnets across Virtual Networks
&lt;/h2&gt;&lt;h3 id="concept-overview-1"&gt;Concept Overview
&lt;/h3&gt;&lt;p&gt;Subnet peering enables more granular connectivity by allowing you to peer selected subnets between virtual networks instead of merging the entire address space, as is the case with standard VNet peering. This extra level of control is particularly beneficial in scenarios such as micro-segmentation, where you may want only specific tiers or service components to communicate across virtual networks while keeping other parts isolated for security or network management purposes.&lt;/p&gt;
&lt;p&gt;With subnet peering, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Selectively Share IP Space:&lt;/strong&gt; Rather than exposing all subnets within a virtual network, you can specify which subnets should be privy to traffic from a remote network. This reduces the attack surface and maintains clearer security boundaries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimise IP Space Allocation:&lt;/strong&gt; For organisations facing IP address exhaustion, subnet peering allows the sharing of only parts of the IP space that are needed for inter-VNet communication, rather than requiring a large, contiguous block of addresses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhance Security and Compliance:&lt;/strong&gt; By limiting connectivity to only designated subnets, you can implement internal segmentation strategies that better align with your organisational security policies and regulatory requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
Subnet peering is currently in public preview. This means it’s available through the Azure CLI, PowerShell, API, and ARM templates—but not yet via the Azure Portal.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;p&gt;To enable subnet peering, you must set parameters such as &lt;code&gt;--peer-complete-vnets&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt; and specify the local and remote subnet names you wish to peer.&lt;/p&gt;
&lt;p&gt;Before using subnet level peering you need to ensure that Microsoft.Network/AllowMultiplePeeringLinksBetweenVnets preview feature is enabled in your subscription&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Set-AzContext&lt;/span&gt; &lt;span class="n"&gt;-Subscription&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Subscription Name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Register-AzProviderFeature&lt;/span&gt; &lt;span class="n"&gt;-FeatureName&lt;/span&gt; &lt;span class="n"&gt;AllowMultiplePeeringLinksBetweenVnets&lt;/span&gt; &lt;span class="n"&gt;-ProviderNamespace&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="a-architecture-diagram"&gt;A Architecture Diagram
&lt;/h3&gt;&lt;p&gt;I have always find it best to understand these concepts using diagrams&lt;/p&gt;
&lt;p&gt;Here is an example of Geo Peering where the peering happens across regions&lt;/p&gt;
&lt;div class="mermaid"&gt;architecture-beta
group azure(cloud)[Azure]
group clouda(cloud)[Australia Southeast] in azure
service vnet01(fluent:virtual-network-20-filled)[MyVnet01] in clouda
service vm01(fluent:server-20-filled)[Virtual Machine] in clouda
group cloudb(cloud)[Australia East] in azure
service vnet02(fluent:virtual-network-20-filled)[MyVnet02] in cloudb
service vm02(fluent:server-20-filled)[Virtual Machine] in cloudb
vm01:T -- B:vnet01
vnet02:B -- T:vm02
vnet01:R &lt;--&gt; L:vnet02
&lt;/div&gt;
&lt;p&gt;Here is an example of local vnet peering&lt;/p&gt;
&lt;div class="mermaid"&gt;architecture-beta
group clouda(cloud)[Azure Australia East]
service vnet01(fluent:virtual-network-20-regular)[MyVnet01] in clouda
service vm01(fluent:server-20-filled)[Virtual Machine] in clouda
service vnet02(fluent:virtual-network-20-regular)[MyVnet02] in clouda
service vm02(fluent:server-20-filled)[Virtual Machine] in clouda
vm01:T -- B:vnet01
vnet02:B -- T:vm02
vnet01:R &lt;--&gt; L:vnet02
&lt;/div&gt;
&lt;p&gt;Here is an example where using Gateway Traversal allows connectivity back to on-prem&lt;/p&gt;
&lt;div class="mermaid"&gt;architecture-beta
group clouda(cloud)[Azure Australia East]
group rghub(cloud)[Hub Resource Group] in clouda
group rgvm(cloud)[Workload Resource Group] in clouda
service vnet01(fluent:virtual-network-20-regular)[MyVnet01] in rghub
service vnet03(fluent:virtual-network-20-regular)[MyVnet02] in rgvm
service vm01(fluent:server-20-filled)[Virtual Machine] in rgvm
service gateway(mdi:vpn)[VPN Gateway] in rghub
group onprem(cloud)[On Prem]
service vnet02(fluent:virtual-network-20-regular)[Network] in onprem
service vm02(fluent:server-20-filled)[Virtual Machine] in onprem
service firewall(mdi:firewall)[OnPrem Firewall] in onprem
vm01:L -- R:vnet03
vnet01:B &lt;--&gt; T:vnet03
vnet02:B -- T:vm02
vnet01:R -- L:gateway
gateway:R &lt;--&gt; L:firewall
firewall:R -- L:vnet02
&lt;/div&gt;
&lt;p&gt;And finally here is a conceptual diagram of subnet peering where we will create bidrectional routing between MySubnetB in MyVnet01 and MySubnetD and MySubnetF in MyVnet02. This will allow for VM 02 to be able to communicate with VM 04 &amp;amp; 06 without allowing other VM&amp;rsquo;s to communicate between these Virtual Networks.&lt;/p&gt;
&lt;div class="mermaid"&gt;architecture-beta
group azure(cloud)[Azure]
group clouda(cloud)[Australia East] in azure
group vnet01(fluent:virtual-network-20-filled)[MyVnet01] in clouda
service subneta(fluent:virtual-network-20-filled)[MySubnetA] in vnet01
service subnetb(fluent:virtual-network-20-filled)[MySubnetB] in vnet01
service subnetc(fluent:virtual-network-20-filled)[MySubnetC] in vnet01
service vm01(fluent:server-20-filled)[VM 01] in vnet01
service vm02(fluent:server-20-filled)[VM 02] in vnet01
service vm03(fluent:server-20-filled)[VM 03] in vnet01
vm01:L &lt;--&gt; R:subneta
vm02:L &lt;--&gt; R:subnetb
vm03:L &lt;--&gt; R:subnetc
group vnet02(fluent:virtual-network-20-filled)[MyVnet02] in clouda
service subnetd(fluent:virtual-network-20-filled)[MySubnetD] in vnet02
service subnete(fluent:virtual-network-20-filled)[MySubnetE] in vnet02
service subnetf(fluent:virtual-network-20-filled)[MySubnetF] in vnet02
service vm04(fluent:server-20-filled)[VM 04] in vnet02
service vm05(fluent:server-20-filled)[VM 05] in vnet02
service vm06(fluent:server-20-filled)[VM 06] in vnet02
vm04:R &lt;--&gt; L:subnetd
vm05:R &lt;--&gt; L:subnete
vm06:R &lt;--&gt; L:subnetf
subnetb:L &lt;--&gt; R:subnetd
subnetb:L &lt;--&gt; R:subnetf
&lt;/div&gt;
&lt;h3 id="implementing-vnet-peering-via-the-azure-portal"&gt;Implementing VNet Peering via the Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sign In and Navigate to Virtual Networks:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt; and go to your Virtual Networks.&lt;/li&gt;
&lt;li&gt;Select the first VNet (e.g., &lt;strong&gt;MyVNet1&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add a Peering Connection:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;Settings&lt;/strong&gt; section, click on &lt;strong&gt;Peerings&lt;/strong&gt; and then &lt;strong&gt;+ Add&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Name the peering (e.g., &lt;strong&gt;MyVNet1-to-MyVNet2&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Peering link&lt;/strong&gt;, select the remote Virtual Network (e.g., &lt;strong&gt;MyVNet2&lt;/strong&gt;) and confirm the configuration options:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Allow virtual network access:&lt;/strong&gt; Enabled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allow forwarded traffic:&lt;/strong&gt; As per your requirement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use remote gateways / Allow gateway transit:&lt;/strong&gt; Configure if a VPN gateway on the remote side needs to be shared.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt; to create the peering.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Repeat for Reverse Peering:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that the remote VNet (MyVNet2) also has a peering configuration pointing back to MyVNet1.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="implementing-vnet-peering-via-bicep"&gt;Implementing VNet Peering via Bicep
&lt;/h3&gt;&lt;p&gt;Use the following Bicep snippet to deploy a VNet peering between two existing VNets. Adjust the resource names and IDs as needed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters for flexible deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNet-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;address1Prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet1Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySubnet-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet1Prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNet-02&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;address2Prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet2Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySubnet-02&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet2Prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;address1Prefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet1Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet1Prefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;address2Prefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet2Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet2Prefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetPeering1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-To-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowGatewayTransit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useRemoteGateways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetPeering2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-To-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowGatewayTransit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useRemoteGateways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the template as &lt;code&gt;VirtualNetworkPeeringDeployment.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal and run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file VirtualNetworkPeeringDeployment.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="implementing-subnet-peering-via-bicep"&gt;Implementing Subnet Peering via Bicep
&lt;/h3&gt;&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
At the time of writting this article there is currently no ability to complete subnet peering within the Azure Portal
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;p&gt;Use the following Bicep snippet to deploy a Subnet peering between two existing VNets. Adjust the resource names and IDs as needed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// This Bicep template creates two virtual networks with multiple subnets and sets up peering between them.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location of the Resources to be created&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the first Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVnet01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Address prefix for the first Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1AddressPrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Subnets for the first Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1Subnets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subneta&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnetb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.2.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnetc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.3.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the second Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVnet02&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Address prefix for the second Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2AddressPrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Subnets for the second Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2Subnets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnetd&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnete&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.2.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnetf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.3.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create the first Virtual Network with subnets&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;vnet1AddressPrefix&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1Subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create the second Virtual Network with subnets&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;vnet2AddressPrefix&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2Subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// This peering allows access from SubnetA and SubnetC of VNet1 to SubnetD and SubnetF of VNet2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;peering1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet1Name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-to-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet2Name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-SubnetB-to-SubnetD-and-SubnetF&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;peerCompleteVnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localSubnetNames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnetb&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteSubnetNames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnetd&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnetf&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowGatewayTransit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useRemoteGateways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// This peering allows access from SubnetD and SubnetF of VNet2 to SubnetB of VNet1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;peering2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet2Name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-to-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet1Name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-SubnetF-and-SubnetD-to-SubnetB&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;peerCompleteVnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localSubnetNames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnetf&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnetd&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteSubnetNames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnetb&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowForwardedTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowGatewayTransit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;useRemoteGateways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the template as &lt;code&gt;SubnetPeeringDeployment.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal and run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file SubnetPeeringDeployment.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Building resilient networks in Azure means ensuring that connectivity isn’t just robust but also flexible enough to span both cloud and on-premises resources. VNet Peering provides the ability to interconnect VNets within and across regions to enable seamless communication.&lt;/p&gt;
&lt;p&gt;Implementing robust networking strategies using both the Azure Portal and Bicep provides you with the versatility to manage and automate your deployments according to your organisational needs.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-peering-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Overview and Peering Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/virtual-network/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;VNet Pricing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Building Resilient Networks with Azure Networking Services Part 1: Understanding Azure Virtual Networks (VNets)</title><link>https://blog.brewedinthecloud.com/p/azure-networks-vnets/</link><pubDate>Tue, 22 Apr 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-networks-vnets/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In today&amp;rsquo;s dynamic cloud environments, resilient and secure network architectures are critical to business success. Virtual Networks (VNets) form the backbone of Azure&amp;rsquo;s networking services, providing a secure, isolated space where your resources can communicate. In this first part of our five-part series, we will dive deep into the fundamentals of VNets, including subnets and IP addressing schemes, and show you how to establish a basic network topology with Network Security Groups (NSGs).&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll guide you through two implementation methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Portal:&lt;/strong&gt; A point-and-click approach for a visual and intuitive setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep Template:&lt;/strong&gt; An Infrastructure-as-Code (IaC) method that brings automation and repeatability to your deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="understanding-vnets-subnets-and-ip-addressing-schemes"&gt;Understanding VNets, Subnets, and IP Addressing Schemes
&lt;/h2&gt;&lt;h3 id="what-are-vnets"&gt;What Are VNets?
&lt;/h3&gt;&lt;p&gt;An &lt;strong&gt;Azure Virtual Network (VNet)&lt;/strong&gt; is a logical representation of your network in the cloud. It emulates a traditional network that you would operate in your own datacenter but brings the additional benefits of Azure&amp;rsquo;s flexibility, scalability, and robust security features.&lt;/p&gt;
&lt;h3 id="subnets"&gt;Subnets
&lt;/h3&gt;&lt;p&gt;Within a VNet, you can carve out &lt;strong&gt;subnets&lt;/strong&gt;. Subnets help you segment the network into smaller, manageable sections. This segmentation enables you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Isolate workloads,&lt;/li&gt;
&lt;li&gt;Organize your resources, and&lt;/li&gt;
&lt;li&gt;Enforce security boundaries with NSGs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ip-addressing-schemes"&gt;IP Addressing Schemes
&lt;/h3&gt;&lt;p&gt;When designing your VNets, choosing an appropriate IP address range is critical. Azure VNets require an IP address space in either IPv4 or IPv6. The commonly used private IPv4 address ranges are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;10.0.0.0/8&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;172.16.0.0/12&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;192.168.0.0/16&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;p&gt;&lt;strong&gt;Importance of Planning with IPAM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Extending your on-premises infrastructure to the cloud requires plenty of advanced planning, no more so than in networking. When you being the planning stages of your cloud adoption you need to allocate a IP address range that does not overlap with your internal ranges to avoid the costly re-work required to fix the problem in future.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="network-security-groups-nsgs"&gt;Network Security Groups (NSGs)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Network Security Groups (NSGs)&lt;/strong&gt; act as virtual firewalls that filter network traffic to and from Azure resources. NSGs define rules based on source/destination IP addresses, ports, and protocols. By associating an NSG with a subnet or individual network interface, you can control and secure the flow of inbound and outbound traffic.&lt;/p&gt;
&lt;h2 id="setting-up-a-basic-network-topology"&gt;Setting Up a Basic Network Topology
&lt;/h2&gt;&lt;p&gt;In this section, we outline a simple architecture that includes a VNet with at least one subnet and an associated NSG that contains basic security rules (for example, allowing RDP for management).&lt;/p&gt;
&lt;h3 id="example-network-topology"&gt;Example Network Topology
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Virtual Network (VNet):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Address Space:&lt;/strong&gt; 10.0.0.0/16&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Subnet:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; MySubnet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Address Prefix:&lt;/strong&gt; 10.0.1.0/24&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NSG:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Allow inbound RDP (TCP port 3389)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="implementation-via-azure-portal"&gt;Implementation via Azure Portal
&lt;/h2&gt;&lt;p&gt;For those who prefer a GUI-driven approach, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Virtual Network:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create a resource&lt;/strong&gt; and search for &lt;strong&gt;Virtual Network&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Basics&lt;/strong&gt; tab, fill in:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; e.g., &lt;code&gt;MyVNet&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region:&lt;/strong&gt; Select your preferred location.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Address Space:&lt;/strong&gt; Enter &lt;code&gt;10.0.0.0/16&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next: IP Addresses&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Subnets:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Under &lt;strong&gt;Subnet&lt;/strong&gt;, set the &lt;strong&gt;Subnet Name&lt;/strong&gt; (e.g., &lt;code&gt;MySubnet&lt;/code&gt;) and &lt;strong&gt;Subnet Address Range:&lt;/strong&gt; &lt;code&gt;10.0.1.0/24&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt; to review and then &lt;strong&gt;Create&lt;/strong&gt; the VNet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Network Security Group:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Create a resource&lt;/strong&gt; and search for &lt;strong&gt;Network Security Group&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter a name (e.g., &lt;code&gt;MySubnet-nsg&lt;/code&gt;), select the &lt;strong&gt;Resource Group&lt;/strong&gt;, and click &lt;strong&gt;Review + create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add a Security Rule:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Once the NSG is deployed, go to the NSG resource.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, select &lt;strong&gt;Inbound security rules&lt;/strong&gt; and click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure a rule to allow RDP traffic:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;Allow-RDP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;/strong&gt; &lt;code&gt;1000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;code&gt;Any&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destination:&lt;/strong&gt; &lt;code&gt;Any&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocol:&lt;/strong&gt; &lt;code&gt;TCP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destination Port:&lt;/strong&gt; &lt;code&gt;3389&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Associate NSG with the Subnet:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to your VNet, select &lt;strong&gt;Subnets&lt;/strong&gt;, and then click the subnet (&lt;code&gt;MySubnet&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Network security group&lt;/strong&gt; section, click &lt;strong&gt;Associate&lt;/strong&gt; and select your NSG (&lt;code&gt;MySubnet-nsg&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="implementation-via-bicep"&gt;Implementation via Bicep
&lt;/h2&gt;&lt;p&gt;For repeatable and automated deployments, the Bicep template below creates a VNet, a subnet, and an associated NSG with a basic rule.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters for flexible deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetPrefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nsgName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-nsg&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2021-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetPrefix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkSecurityGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nsg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nsgName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-RDP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Tcp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;3389&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Steps Using Bicep:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the template to a file (e.g., &lt;code&gt;vnetDeployment.bicep&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal and log in using Azure CLI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the template to your resource group:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file vnetDeployment.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This template creates a VNet named &lt;code&gt;MyVNet&lt;/code&gt; with an address space of &lt;code&gt;10.0.0.0/16&lt;/code&gt;, a subnet named &lt;code&gt;MySubnet&lt;/code&gt; with an address range of &lt;code&gt;10.0.1.0/24&lt;/code&gt;, and an NSG with a rule that allows inbound RDP traffic. Adjust the parameters as needed to suit your environment.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Understanding and effectively deploying Azure VNets is fundamental to building resilient cloud networks. This part of our series provided an in-depth exploration of VNets, subnets, and IP addressing schemes, and demonstrated how to secure your network using NSGs. Whether you choose the Azure Portal for a visual setup or a Bicep deployment for automation, the principles remain the same—ensure that your network is well-organized, secure, and scalable.&lt;/p&gt;
&lt;p&gt;As you continue to build out your resilient network infrastructure, these foundational skills will serve you well in creating more complex and secure environments.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Virtual Network Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/quick-create-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create and Configure Virtual Networks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/network-security-groups-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Network Security Groups Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Demystifying Azure VMware Solution: From Implementation to Workload Migration – Part 6</title><link>https://blog.brewedinthecloud.com/p/azure-vmware-future/</link><pubDate>Thu, 17 Apr 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vmware-future/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure VMware Solution (AVS) has matured rapidly, offering a powerful path for organisations to run VMware workloads natively in Azure without rearchitecting applications. For many IT leaders, the journey doesn’t stop at migration—it evolves into optimising, integrating, and future-proofing their AVS environment.&lt;/p&gt;
&lt;p&gt;As we look beyond implementation and workload migration, the focus turns to advanced use cases, service integrations, and preparing for changes in the VMware ecosystem.&lt;/p&gt;
&lt;p&gt;In this final instalment of our blog series, we explore what’s next for AVS—from advanced integrations to emerging roadmap features—helping you stay ahead of the curve and position your hybrid cloud strategy for long-term success.&lt;/p&gt;
&lt;h2 id="extending-avs-advanced-integration-scenarios"&gt;Extending AVS: Advanced Integration Scenarios
&lt;/h2&gt;&lt;p&gt;While AVS delivers a fully functional VMware stack, its true power is unlocked when extended with native Azure services. Let’s explore how organisations are pushing the boundaries of AVS:&lt;/p&gt;
&lt;h3 id="scenario-1-enhancing-security-with-azure-firewall-and-defender-for-cloud"&gt;Scenario 1: Enhancing Security with Azure Firewall and Defender for Cloud
&lt;/h3&gt;&lt;p&gt;By integrating AVS workloads with Azure Firewall Premium, organisations can apply TLS inspection, threat intelligence filtering, and centralised policy management across both AVS and native Azure networks. Additionally, Microsoft Defender for Cloud enables workload-level security posture management, even for VMs running in AVS.&lt;/p&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;strong&gt;Best practice:&lt;/strong&gt; Use NSX-T distributed firewalls for east-west traffic filtering within AVS, and Azure Firewall for north-south control across hybrid connections.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="scenario-2-business-continuity-with-azure-site-recovery-and-backup"&gt;Scenario 2: Business Continuity with Azure Site Recovery and Backup
&lt;/h3&gt;&lt;p&gt;AVS does not natively support Azure Site Recovery (ASR) as it does for Azure-native VMs, but integration is achievable via:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Veeam, Zerto, or Commvault running within AVS or natively in Azure&lt;/li&gt;
&lt;li&gt;Using AVS-native snapshots with policy-driven backups to Azure Blob Storage&lt;/li&gt;
&lt;li&gt;Cross-AVS region replication with HCX for DR strategies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Hypothetical case:&lt;/strong&gt; A financial services business replicates Production workloads across two AVS private clouds in different Azure regions, using Veeam for granular backup and Azure Traffic Manager for failover orchestration.&lt;/p&gt;
&lt;h3 id="scenario-3-automating-operations-with-azure-arc-and-infrastructure-as-code"&gt;Scenario 3: Automating Operations with Azure Arc and Infrastructure-as-Code
&lt;/h3&gt;&lt;p&gt;AVS supports Azure Arc, enabling centralised governance and policy management for AVS-hosted VMs alongside Azure-native workloads. Combine this with Bicep or Terraform to manage ExpressRoute, NSX segments, and AVS network configurations programmatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best practice:&lt;/strong&gt; Build automated runbooks with Azure Automation or GitHub Actions to handle AVS expansion, NSX policy updates, or ExpressRoute monitoring alerts.&lt;/p&gt;
&lt;h2 id="the-future-roadmap-of-azure-vmware-solution"&gt;The Future Roadmap of Azure VMware Solution
&lt;/h2&gt;&lt;p&gt;AVS is evolving rapidly in response to customer needs and changes in the VMware ecosystem. Here’s what the road ahead looks like:&lt;/p&gt;
&lt;h3 id="anticipated-feature-enhancements"&gt;Anticipated Feature Enhancements
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Support for vSAN Express Storage Architecture (ESA)&lt;/strong&gt;, offering lower latency and higher throughput&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deeper integration with Azure-native monitoring and backup tooling&lt;/strong&gt;, reducing reliance on third-party solutions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="responding-to-broadcoms-vmware-licensing-changes"&gt;Responding to Broadcom&amp;rsquo;s VMware Licensing Changes
&lt;/h3&gt;&lt;p&gt;The recent licensing model changes introduced by Broadcom have impacted how organisations can access traditional VMware features. AVS provides a predictable and fully licensed VMware stack, including vSphere, vSAN, and NSX-T—helping customers avoid sudden cost spikes or feature loss.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key advantage:&lt;/strong&gt; AVS subscriptions are managed by Microsoft, ensuring consistent support and compliance, even as VMware’s commercial model evolves.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Forward-looking recommendation:&lt;/strong&gt; Evaluate your current VMware licensing structure and consider transitioning to AVS to mitigate vendor lock-in risk while gaining access to scalable, integrated cloud services.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;As your AVS journey matures, embracing advanced integrations and anticipating future developments becomes essential. Whether it’s automating infrastructure, enhancing security, or preparing for licensing disruptions, staying agile and informed is the key to long-term cloud success.&lt;/p&gt;
&lt;p&gt;Azure VMware Solution is more than a destination for workloads—it’s a foundation for hybrid innovation. The future of AVS is bright, with continued investment from Microsoft and tight alignment with evolving enterprise needs.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-vmware/introduction?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure VMware Solution advanced scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-vmware/faq#can-workloads-running-in-an-azure-vmware-solution-instance-integrate-with-azure-services?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Integrate Azure services with AVS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-vmware/faq#vmware-licensing?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;VMware licensing changes: What they mean for AVS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-arc/servers/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Arc-enabled servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-vmware/azure-vmware-solution-platform-updates?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;AVS roadmap and release notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Demystifying Azure VMware Solution: From Implementation to Workload Migration – Part 5</title><link>https://blog.brewedinthecloud.com/p/azure-vmware-vmotionmigration/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vmware-vmotionmigration/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;When migrating workloads to Azure VMware Solution (AVS), minimizing application disruption is a top priority—especially for mission-critical systems. Among the various methods available, &lt;strong&gt;VMware HCX vMotion&lt;/strong&gt; stands out for its ability to move virtual machines &lt;strong&gt;live and without downtime&lt;/strong&gt;, maintaining application availability and reducing business risk.&lt;/p&gt;
&lt;p&gt;This post focuses solely on the &lt;strong&gt;vMotion migration method&lt;/strong&gt; with VMware HCX, detailing how to plan, configure, and execute live migrations from your on-premises VMware environment to AVS. Whether you&amp;rsquo;re transitioning a handful of critical VMs or scaling up to migrate production workloads, vMotion enables a seamless, zero-interruption path to the cloud.&lt;/p&gt;
&lt;h3 id="hcx-vmotion-migrations"&gt;HCX vMotion Migrations
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://github.com/Azure/Enterprise-Scale-for-AVS/blob/main/hcx/images/hcx-vMotion.gif"
loading="lazy"
alt="HCX vMotion migrations"
&gt;&lt;/p&gt;
&lt;h2 id="why-use-vmotion-for-avs-migration"&gt;Why Use vMotion for AVS Migration?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;VMware HCX vMotion&lt;/strong&gt; enables the live migration of running VMs from on-premises infrastructure to AVS &lt;strong&gt;without needing to power them off&lt;/strong&gt;. Key benefits include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero downtime&lt;/strong&gt; for end users and services&lt;/li&gt;
&lt;li&gt;No need to re-IP or reconfigure applications&lt;/li&gt;
&lt;li&gt;Minimal cutover planning&lt;/li&gt;
&lt;li&gt;Maintains stateful memory and CPU usage during transit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This method is ideal for applications that cannot tolerate downtime or when tight maintenance windows are in place.&lt;/p&gt;
&lt;h2 id="pre-migration-planning"&gt;Pre-Migration Planning
&lt;/h2&gt;&lt;h3 id="environment-assessment"&gt;Environment Assessment
&lt;/h3&gt;&lt;p&gt;Start by evaluating which workloads are eligible for vMotion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VM hardware version&lt;/strong&gt; must be compatible with AVS (v13 or higher recommended).&lt;/li&gt;
&lt;li&gt;Ensure that &lt;strong&gt;VMware Tools&lt;/strong&gt; are up-to-date.&lt;/li&gt;
&lt;li&gt;Validate that VM configurations are free of incompatible devices (e.g., USB passthrough).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use tools like &lt;strong&gt;RVTools&lt;/strong&gt; or &lt;strong&gt;vRealize Operations&lt;/strong&gt; to inventory and assess VMs.&lt;/p&gt;
&lt;h3 id="network-and-connectivity-readiness"&gt;Network and Connectivity Readiness
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;low-latency connection&lt;/strong&gt; (ideally &amp;lt;100 ms RTT) between on-prem and AVS is crucial. ExpressRoute is recommended.&lt;/li&gt;
&lt;li&gt;HCX Interconnect and Network Extension appliances must be deployed and paired.&lt;/li&gt;
&lt;li&gt;Ensure Layer 2 network segments are extended to AVS if retaining existing IPs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-by-step-performing-vmotion-with-vmware-hcx"&gt;Step-by-Step: Performing vMotion with VMware HCX
&lt;/h2&gt;&lt;h3 id="step-1-deploy-and-configure-hcx"&gt;Step 1: Deploy and Configure HCX
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;In Azure:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to your AVS Private Cloud in the Azure Portal.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;VMware HCX&lt;/strong&gt;, click &lt;strong&gt;Deploy HCX Manager&lt;/strong&gt; and follow the wizard.&lt;/li&gt;
&lt;li&gt;Once deployed, download the HCX Connector OVA for on-prem deployment.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Or use Bicep to deploy it&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters for HCX deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the AVS Private Cloud&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsPrivateCloudName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyPrivateCloud&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the HCX Enterprise Site&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hcxSiteName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyHCXSite&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Deploy HCX Enterprise Site in AVS Private Cloud&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsPrivateCloud&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.AVS/privateClouds@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsPrivateCloudName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hcxDeployment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.AVS/privateClouds/hcxEnterpriseSites@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsPrivateCloud&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hcxSiteName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;activationKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;xxxxx-xxxxxx-xxxxx&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;On-Premises:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Deploy the HCX Connector OVA into your on-prem vCenter Server.&lt;/li&gt;
&lt;li&gt;Activate using the license key provided via the AVS HCX Enterprise entitlement.&lt;/li&gt;
&lt;li&gt;Pair the on-prem HCX Connector with the AVS HCX Cloud Manager.&lt;/li&gt;
&lt;li&gt;Set up &lt;strong&gt;Compute Profiles&lt;/strong&gt;, &lt;strong&gt;Network Profiles&lt;/strong&gt;, and a &lt;strong&gt;Service Mesh&lt;/strong&gt; to connect both sites.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-prepare-for-vmotion-migration"&gt;Step 2: Prepare for vMotion Migration
&lt;/h3&gt;&lt;p&gt;Before starting a vMotion migration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extend the VM’s network to AVS via &lt;strong&gt;HCX Network Extension&lt;/strong&gt; if you wish to retain IP addresses.&lt;/li&gt;
&lt;li&gt;Ensure the &lt;strong&gt;VMware vMotion port group&lt;/strong&gt; is reachable between on-prem and AVS HCX Interconnect appliances.&lt;/li&gt;
&lt;li&gt;Confirm sufficient resources are available in AVS (CPU/RAM) to accommodate incoming VMs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-3-execute-the-vmotion-migration"&gt;Step 3: Execute the vMotion Migration
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Log in to the &lt;strong&gt;on-premises vCenter HCX plugin&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Migration&lt;/strong&gt; and select &lt;strong&gt;Migrate Virtual Machines&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;vMotion&lt;/strong&gt; as the migration type.&lt;/li&gt;
&lt;li&gt;Select the VMs to migrate, the destination cluster in AVS, and the destination datastore (typically vSAN).&lt;/li&gt;
&lt;li&gt;Optionally, assign tags or change folder locations.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Go&lt;/strong&gt; to initiate the live migration.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;During this process, the VM remains online and continues to serve traffic. Once the memory and CPU state are synchronized to AVS, the VM is automatically switched over in a matter of seconds.&lt;/p&gt;
&lt;h2 id="ensuring-success-best-practices-for-vmotion"&gt;Ensuring Success: Best Practices for vMotion
&lt;/h2&gt;&lt;h3 id="optimize-for-performance"&gt;Optimize for Performance
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Avoid scheduling large vMotion jobs during production peak hours.&lt;/li&gt;
&lt;li&gt;Monitor throughput and latency using &lt;strong&gt;HCX Dashboard&lt;/strong&gt; and &lt;strong&gt;vCenter Performance Charts&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="secure-and-verify-migration"&gt;Secure and Verify Migration
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;All vMotion traffic is tunneled through HCX Interconnect appliances using &lt;strong&gt;TLS encryption&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Validate post-migration health with:
&lt;ul&gt;
&lt;li&gt;VM console access&lt;/li&gt;
&lt;li&gt;Application response checks&lt;/li&gt;
&lt;li&gt;Updated monitoring integrations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Using &lt;strong&gt;VMware HCX vMotion&lt;/strong&gt; to migrate workloads to Azure VMware Solution offers a highly efficient, non-disruptive approach—especially for systems where even a brief outage is unacceptable. With the right planning, connectivity, and tooling, live migration becomes a routine part of your modernization strategy, not a risky gamble.&lt;/p&gt;
&lt;p&gt;By focusing on vMotion, organizations can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protect business continuity&lt;/li&gt;
&lt;li&gt;Avoid costly downtime&lt;/li&gt;
&lt;li&gt;Transition to AVS with greater confidence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After migration, administrators should validate system behavior, update documentation, and begin monitoring workloads through Azure Monitor or VMware vRealize Operations.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/migrate/tutorial-migrate-vmware?view=migrate?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Migrate VMs with VMware HCX vMotion to AVS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vmware.com/en/VMware-HCX/index.html" target="_blank" rel="noopener"
&gt;VMware HCX User Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/migrate/start-here-vmware?view=migrate?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Plan your AVS migration strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-vmware/configure-vmware-hcx?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploy and use HCX with Azure VMware Solution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Demystifying Azure VMware Solution: From Implementation to Workload Migration – Part 4</title><link>https://blog.brewedinthecloud.com/p/azure-vmware-manage/</link><pubDate>Thu, 10 Apr 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vmware-manage/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Implementing Azure VMware Solution (AVS) is only the beginning of your hybrid cloud journey. To ensure the long-term success of your environment, &lt;strong&gt;ongoing management, proactive monitoring, and continuous optimization&lt;/strong&gt; are critical. High availability, performance, and cost efficiency aren’t automatic—they require consistent effort, guided by tools and insights built into both Azure and VMware ecosystems.&lt;/p&gt;
&lt;p&gt;As workloads evolve and licensing models shift, IT administrators must adapt their operational practices to ensure SLAs are met and cloud investments deliver value. In this post, we’ll explore &lt;strong&gt;key strategies and tools&lt;/strong&gt; to manage, monitor, and optimize an AVS environment—equipping you with &lt;strong&gt;actionable insights&lt;/strong&gt; to maintain operational excellence.&lt;/p&gt;
&lt;h2 id="monitoring-strategies-for-avs-environments"&gt;Monitoring Strategies for AVS Environments
&lt;/h2&gt;&lt;p&gt;Effective monitoring is essential for identifying performance bottlenecks, managing capacity, and maintaining compliance. AVS administrators have access to both &lt;strong&gt;Azure-native tools&lt;/strong&gt; and &lt;strong&gt;VMware-native solutions&lt;/strong&gt; to achieve comprehensive visibility.&lt;/p&gt;
&lt;h3 id="azure-monitor-and-azure-log-analytics"&gt;Azure Monitor and Azure Log Analytics
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Monitor&lt;/strong&gt; collects telemetry data from AVS resources and integrates with &lt;strong&gt;Log Analytics&lt;/strong&gt; to provide rich dashboards and query capabilities.&lt;/li&gt;
&lt;li&gt;Enable diagnostic settings on &lt;strong&gt;AVS Private Clouds&lt;/strong&gt; to forward logs and metrics to Log Analytics workspaces.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;workbooks&lt;/strong&gt; to create visual dashboards for vSAN health, cluster CPU/memory usage, and NSX networking insights.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Monitor Cluster CPU Usage&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsMonitor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/diagnosticSettings@2021-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AVS-Diagnostics&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsPrivateCloud&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsWorkspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vCenter&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllMetrics&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="vmware-vrealize-operations-vrops-and-vrealize-log-insight"&gt;VMware vRealize Operations (vROps) and vRealize Log Insight
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;For admins familiar with the VMware stack, &lt;strong&gt;vRealize Operations Cloud&lt;/strong&gt; offers in-depth analytics and predictive capacity planning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log Insight Cloud&lt;/strong&gt; aggregates logs from vCenter, ESXi, and NSX-T for troubleshooting and auditing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Best Practice:&lt;/strong&gt; Leverage &lt;strong&gt;vROps Cloud&lt;/strong&gt; for AVS-specific dashboards while integrating with Azure Monitor for broader hybrid visibility.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="scaling-and-performance-optimization"&gt;Scaling and Performance Optimization
&lt;/h2&gt;&lt;p&gt;Workload demands fluctuate, and your AVS environment must scale accordingly. Right-sizing clusters and tuning workloads ensures you meet performance requirements without over-provisioning.&lt;/p&gt;
&lt;h3 id="scaling-strategies"&gt;Scaling Strategies
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vertical scaling&lt;/strong&gt;: Upgrade node types (e.g., from AV36 to AV52) to gain more CPU/RAM per host.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Horizontal scaling&lt;/strong&gt;: Add additional hosts to clusters for greater workload capacity and availability.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Azure policies&lt;/strong&gt; and automation via &lt;strong&gt;Bicep or ARM templates&lt;/strong&gt; to manage scaling events systematically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Automate Host Addition with Bicep&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsPrivateCloud&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.AVS/privateClouds@2021-12-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myAvsPrivateCloud&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.AVS/privateClouds/clusters@2021-12-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;cluster-1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsPrivateCloud&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;clusterSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// scaled from 3 to 6&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="performance-tuning"&gt;Performance Tuning
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Enable &lt;strong&gt;DRS (Distributed Resource Scheduler)&lt;/strong&gt; to balance workloads across hosts.&lt;/li&gt;
&lt;li&gt;Regularly review &lt;strong&gt;vSAN health&lt;/strong&gt; and &lt;strong&gt;network throughput&lt;/strong&gt; to identify bottlenecks.&lt;/li&gt;
&lt;li&gt;Monitor &lt;strong&gt;VM latency&lt;/strong&gt; and perform &lt;strong&gt;storage reclamation&lt;/strong&gt; for overused disks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Use vCenter&amp;rsquo;s &lt;strong&gt;Performance Charts&lt;/strong&gt; to visualize trends in memory ballooning, CPU ready time, and IOPS per datastore.&lt;/p&gt;
&lt;h2 id="cost-management-techniques"&gt;Cost Management Techniques
&lt;/h2&gt;&lt;p&gt;Azure VMware Solution is a premium service—so cost governance is vital.&lt;/p&gt;
&lt;h3 id="best-practices-for-cost-optimization"&gt;Best Practices for Cost Optimization
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Right-size workloads&lt;/strong&gt;: Avoid over-provisioned VMs and idle capacity.&lt;/li&gt;
&lt;li&gt;Utilize &lt;strong&gt;Azure Reservations&lt;/strong&gt; for 1- or 3-year commitments to save up to 50%.&lt;/li&gt;
&lt;li&gt;Implement &lt;strong&gt;tagging policies&lt;/strong&gt; to track usage by department or project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tools to Use:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Cost Management + Billing&lt;/strong&gt;: Analyze spend, forecast trends, and enforce budgets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Advisor&lt;/strong&gt;: Receive recommendations for underutilized resources or scaling suggestions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vROps Cost Analysis&lt;/strong&gt;: Detailed VMware-based insights into VM cost distribution.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="common-challenges-and-troubleshooting-tips"&gt;Common Challenges and Troubleshooting Tips
&lt;/h2&gt;&lt;h3 id="challenge-unexpected-host-failures"&gt;Challenge: Unexpected Host Failures
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Enable &lt;strong&gt;vSphere HA&lt;/strong&gt;, configure proper DRS affinity rules, and ensure NSX-T overlay health is green. Review ESXi logs using Log Insight for root cause analysis.&lt;/p&gt;
&lt;h3 id="challenge-performance-degradation"&gt;Challenge: Performance Degradation
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Check for noisy neighbors, VM sprawl, and vSAN contention. Use Azure Monitor alerts for thresholds on CPU/Memory saturation.&lt;/p&gt;
&lt;h3 id="challenge-license-compliance-and-drift"&gt;Challenge: License Compliance and Drift
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Maintain up-to-date vSphere and NSX license usage reports. Review AVS SKU constraints and monitor for non-compliant configurations via &lt;strong&gt;Azure Policy&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Managing an Azure VMware Solution environment requires a proactive, holistic approach. By leveraging &lt;strong&gt;Azure-native tools&lt;/strong&gt; like Azure Monitor and Cost Management in tandem with &lt;strong&gt;VMware-native capabilities&lt;/strong&gt; like vROps and Log Insight, administrators can ensure optimal performance, availability, and cost-efficiency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key takeaways:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automate routine tasks with &lt;strong&gt;Bicep templates&lt;/strong&gt; or ARM.&lt;/li&gt;
&lt;li&gt;Implement &lt;strong&gt;scaling strategies&lt;/strong&gt; aligned with workload patterns.&lt;/li&gt;
&lt;li&gt;Monitor and tune performance continuously using telemetry from both platforms.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;cost analysis&lt;/strong&gt; tools to drive efficient cloud consumption.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ongoing success with AVS hinges on &lt;strong&gt;continuous improvement&lt;/strong&gt;. As your workloads evolve, so must your operational strategies.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-vmware/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure VMware Solution Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/vm/monitor-virtual-machine?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Monitor Azure VMware Solution with Azure Monitor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.vmware.com/products/vrealize-operations.html" target="_blank" rel="noopener"
&gt;VMware vRealize Operations Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Monitor Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.azure.cn/en-us/cost-management-billing/cost-management-billing-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Best Practices for Cost Management in Azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Demystifying Azure VMware Solution: From Implementation to Workload Migration – Part 3</title><link>https://blog.brewedinthecloud.com/p/azure-vmware-initialsetup/</link><pubDate>Tue, 08 Apr 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vmware-initialsetup/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For any organisation embarking on a hybrid cloud journey, the initial implementation phase is critical to ensure a smooth transition and long-term operational success. Azure VMware Solution (AVS) offers a managed, scalable platform that allows you to run your VMware workloads on Azure’s dedicated infrastructure, while preserving the familiarity of your existing tools and processes. In this instalment, we guide you through the initial setup of an AVS environment—covering prerequisites, configuration steps, and architectural design considerations. We will also address important factors such as networking, provisioning dedicated hosts, storage configuration, and integrating on‑premises connectivity. Additionally, we discuss the recent Broadcom licensing changes, which increase the minimum core count for VMware licensing, and explore how these changes may affect deployment planning for smaller versus larger organisations.&lt;/p&gt;
&lt;h2 id="prerequisites-and-planning"&gt;Prerequisites and Planning
&lt;/h2&gt;&lt;p&gt;Before starting your AVS deployment, it’s important to gather and document critical information. Here are some key prerequisites and planning considerations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Subscription &amp;amp; Resource Group:&lt;/strong&gt;&lt;br&gt;
Ensure that your Azure subscription is eligible for AVS deployment and that you have a dedicated resource group for organising your AVS resources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Networking Requirements:&lt;/strong&gt;&lt;br&gt;
Plan your IP addressing and network configuration. You will need to prepare an Azure Virtual Network (VNet) that will integrate with the AVS environment. Consider connectivity options such as VPN or Azure ExpressRoute for bridging on‑premises environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dedicated Hosts &amp;amp; Clusters:&lt;/strong&gt;&lt;br&gt;
Determine the required number of dedicated hosts. Remember that AVS leverages dedicated hardware clusters to deliver performance and high availability. Planning your host count is vital, especially in view of the recent Broadcom announcement, which increases the minimum core count. Smaller organisations may face higher relative costs if on‑prem licensing is retained, so migrating to AVS can help avoid over‐provisioning issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage Configuration:&lt;/strong&gt;&lt;br&gt;
Consider the storage requirements of your workloads. AVS utilizes vSAN for shared storage, so ensure you plan for the right capacity and performance level for your applications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integration with On-Premises Connectivity:&lt;/strong&gt;&lt;br&gt;
Assess your current on‑premises environment and plan how to seamlessly integrate it with AVS using hybrid connectivity options. This integration is fundamental to maintain a consistent network policy across environments.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-by-step-guide-for-setting-up-an-avs-environment"&gt;Step-by-Step Guide for Setting Up an AVS Environment
&lt;/h2&gt;&lt;h3 id="a-using-the-azure-portal"&gt;A. Using the Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Register the Required Resource Providers:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sign in to the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Subscriptions&lt;/strong&gt; → &lt;strong&gt;Resource providers&lt;/strong&gt; and confirm that key providers such as &lt;code&gt;Microsoft.AVS&lt;/code&gt; are registered.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Provision Your AVS Private Cloud:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On the Azure Portal home page, select &lt;strong&gt;Create a resource&lt;/strong&gt; and search for &lt;strong&gt;Azure VMware Solution&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt; and fill out the Basics tab:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription &amp;amp; Resource Group:&lt;/strong&gt; Choose your designated subscription and resource group.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instance Name:&lt;/strong&gt; Provide a unique, descriptive name for your private cloud.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region:&lt;/strong&gt; Select an appropriate region (ideally one that best integrates with your on‑premises footprint).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;Hosts and Clusters&lt;/strong&gt; tab:
&lt;ul&gt;
&lt;li&gt;Choose the AVS host size (e.g. AV36, AV36P, etc.) based on your workload requirements.&lt;/li&gt;
&lt;li&gt;Specify the number of hosts (default is usually 3, which can be adjusted later).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;Networking&lt;/strong&gt; tab:
&lt;ul&gt;
&lt;li&gt;Specify your Azure Virtual Network, or create a new one if needed.&lt;/li&gt;
&lt;li&gt;Configure subnets for management and vMotion traffic.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Review the configuration and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integrate On-Premises Connectivity:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Once the AVS environment is provisioned, navigate to its networking configuration.&lt;/li&gt;
&lt;li&gt;Set up hybrid connectivity using Azure VPN Gateway or ExpressRoute to connect your on‑premises data centre to your AVS VNet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Additional Configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure monitoring and health settings through Azure Monitor.&lt;/li&gt;
&lt;li&gt;Validate the network connectivity and performance using Azure’s built‑in diagnostics.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="b-using-bicep-templates"&gt;B. Using Bicep Templates
&lt;/h3&gt;&lt;p&gt;Below is a sample Bicep template to automate the deployment of an AVS environment. You can adopt and modify this template to suit your deployment needs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters for AVS deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the AVS Private Cloud&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsPrivateCloudName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyPrivateCloud&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Resource Deployment Location&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Virtual Network for AVS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyAVSVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Number of hosts to deploy in AVS Private Cloud&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hostCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AVS Private Cloud SKU for deployment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsSku&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AV36&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Example SKU: AV36, AV36P, AV64, etc.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vCenter Password for AVS Private Cloud&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vcpassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Create a virtual network (if not already created)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Management&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vMotion&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Provision the AVS Private Cloud (simplified)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsPrivateCloud&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.AVS/privateClouds@2023-09-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsPrivateCloudName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SystemAssigned&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;avsSku&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hostCount&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;availability&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;secondaryZone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DualZone&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;zone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dnsZoneType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Private&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;internet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Enabled&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nsxtPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vcpassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;managementCluster&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;clusterSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hostCount&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vcenterPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vcpassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// (Additional configuration for connectivity, storage policies, etc., should be added here)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deployment Instructions:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Save the Bicep file as &lt;code&gt;avsDeployment.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal, log in using:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the template:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file avsDeployment.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; This is a simplified sample template. In a production scenario, you would include additional configuration for storage settings, dedicated host quotas, and hybrid connectivity interfaces.&lt;/p&gt;
&lt;h2 id="licensing-considerations-broadcoms-impact"&gt;Licensing Considerations: Broadcom&amp;rsquo;s Impact
&lt;/h2&gt;&lt;p&gt;It’s important to factor in the recent changes announced by Broadcom, which have increased the minimum core count for VMware licensing. For smaller organisations, previous on‑premises deployments might have operated efficiently on minimal core counts. With the new rules, however, these organisations may face disproportionately higher licensing costs if they continue to run on‑premises. Migrating to AVS can help alleviate these cost pressures, as the licensing is effectively bundled into the managed service offered by Azure—enabling smaller customers to scale efficiently without needing to over‑license hardware.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Setting up your first Azure VMware Solution environment is a crucial step towards modernising your IT infrastructure and embracing a hybrid cloud model. In this post, we covered the prerequisites, configuration steps, and architectural design considerations critical for a successful AVS deployment. From configuring your virtual network and provisioning dedicated hosts to integrating on‑premises connectivity and addressing licensing changes, these best practices lay the groundwork for a resilient, high‑availability environment.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-vmware/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure VMware Solution Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-vmware/plan-private-cloud-deployment?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Plan the AVS Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-vmware/deploy-azure-vmware-solution?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure VMware Solution: Deploy and Configure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://techcommunity.microsoft.com/blog/azuremigrationblog/broadcom-vmware-licensing-changes-what-azure-vmware-solution-customers-need-to-k/4448784?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Understanding VMware Licensing Changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-resource-manager/bicep/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Demystifying Azure VMware Solution: From Implementation to Workload Migration – Part 2</title><link>https://blog.brewedinthecloud.com/p/azure-vmware-deepdive/</link><pubDate>Thu, 03 Apr 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vmware-deepdive/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In a hybrid cloud strategy, a robust and resilient infrastructure is paramount to ensure that mission-critical workloads remain highly available and performant. Azure VMware Solution (AVS) enables organisations to seamlessly run their VMware-based workloads on Azure’s dedicated infrastructure. By integrating proven VMware technologies such as vSphere, vSAN, NSX, and vCenter with Azure’s global networking and security capabilities, AVS supports a truly hybrid environment that delivers enterprise‑grade reliability.&lt;/p&gt;
&lt;p&gt;In this post, we’ll take an in-depth look at the AVS architecture. We’ll break down the core components that make up AVS, explain how they work together to deliver high availability and resiliency, and examine how Azure’s SLAs for AVS are derived from its underlying architecture.&lt;/p&gt;
&lt;h2 id="deep-dive-into-the-avs-architecture"&gt;Deep Dive into the AVS Architecture
&lt;/h2&gt;&lt;p&gt;Azure VMware Solution brings together a robust set of VMware tools with Azure’s scalable, managed infrastructure. Let’s explore the key components:&lt;/p&gt;
&lt;h3 id="dedicated-hosts-and-clusters"&gt;Dedicated Hosts and Clusters
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dedicated Hosts:&lt;/strong&gt;&lt;br&gt;
Reserved physical servers whose exclusive use is allocated for your workloads. This not only ensures isolation and predictable performance but also simplifies compliance and security.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clusters:&lt;/strong&gt;&lt;br&gt;
Multiple dedicated hosts are organised into clusters that distribute workloads across several machines. This clustering provides inherent redundancy—if one host fails, the remaining hosts can continue supporting the application.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="vmware-core-components"&gt;VMware Core Components
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;vSphere:&lt;/strong&gt;&lt;br&gt;
The virtualisation platform that manages the creation and operation of Virtual Machines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;vSAN:&lt;/strong&gt;&lt;br&gt;
A software-defined storage solution that pools local storage across hosts to form a distributed datastore, ensuring data is resilient by replicating across multiple hosts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NSX:&lt;/strong&gt;&lt;br&gt;
The network virtualisation layer that provides advanced networking features such as micro-segmentation, load balancing, and dynamic routing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;vCenter:&lt;/strong&gt;&lt;br&gt;
The centralised management console that administers the entire VMware environment and integrates with Azure’s management tools.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="integration-with-azure-virtual-networks-and-on-premises-environments"&gt;Integration with Azure Virtual Networks and On-Premises Environments
&lt;/h3&gt;&lt;p&gt;AVS connects seamlessly to Azure Virtual Networks, extending your on‑premises network into Azure. This integration enables secure communications across environments, supporting both VPN Gateways and ExpressRoute. It allows you to protect data flows with policies, Network Security Groups, and firewalls while ensuring operational continuity.&lt;/p&gt;
&lt;h2 id="high-level-avs-architecture-diagram"&gt;High-Level AVS Architecture Diagram
&lt;/h2&gt;&lt;p&gt;Below is a high-level diagram that illustrates the key components of the AVS architecture:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://learn.microsoft.com/en-us/azure/azure-vmware/media/hub-spoke/azure-vmware-solution-hub-and-spoke-deployment.png"
loading="lazy"
alt="AVS HubAnd Spoke Architecture"
&gt;&lt;/p&gt;
&lt;p&gt;The architecture has the following main components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;On-premises site:&lt;/strong&gt; Customer on-premises datacenter(s) connected to Azure through an ExpressRoute connection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure VMware Solution private cloud:&lt;/strong&gt; Azure VMware Solution Software-Defined Data Center formed by one or more vSphere clusters, each one with a maximum of 16 hosts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ExpressRoute gateway:&lt;/strong&gt; Enables the communication between Azure VMware Solution private cloud, shared services on Hub virtual network, and workloads running on Spoke virtual networks via an ExpressRoute Connection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ExpressRoute Global Reach:&lt;/strong&gt; Enables the connectivity between on-premises and Azure VMware Solution private cloud. The connectivity between Azure VMware Solution and the Azure fabric is through ExpressRoute Global Reach only.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S2S VPN considerations:&lt;/strong&gt; Connectivity to Azure VMware Solution private cloud using Azure S2S VPN is supported as long as it meets the minimum network requirements for VMware HCX.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hub virtual network:&lt;/strong&gt; Acts as the central point of connectivity to your on-premises network and Azure VMware Solution private cloud.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Spoke virtual network&lt;/strong&gt;&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IaaS Spoke:&lt;/strong&gt; Hosts Azure IaaS based workloads, including VM availability sets and Virtual Machine Scale Sets, and the corresponding network components.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PaaS Spoke:&lt;/strong&gt; Hosts Azure PaaS services using private addressing thanks to Private Endpoint and Private Link.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Firewall:&lt;/strong&gt; Acts as the central piece to segment traffic between the Spokes and Azure VMware Solution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application Gateway:&lt;/strong&gt; Exposes and protects web apps that run either on Azure IaaS/PaaS or Azure VMware Solution virtual machines (VMs). It integrates with other services like API Management.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="achieving-high-availability-and-resiliency"&gt;Achieving High Availability and Resiliency
&lt;/h2&gt;&lt;p&gt;The interplay among these components delivers enterprise‑grade resiliency:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Redundancy:&lt;/strong&gt;&lt;br&gt;
Clustering dedicated hosts minimizes the risk of a single point of failure. Should one host or zone experience issues, another can take over without service disruption.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrated Management:&lt;/strong&gt;&lt;br&gt;
vCenter provides the centralised control necessary to monitor and manage the environment, while Azure Virtual Networks facilitate secure hybrid connectivity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Protection:&lt;/strong&gt;&lt;br&gt;
vSAN ensures that data is distributed and replicated across hosts, providing durability even when individual components fail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Resiliency:&lt;/strong&gt;&lt;br&gt;
NSX offers dynamic networking and advanced security, ensuring that network connectivity is maintained even under adverse conditions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Together, these elements underpin AVS’s ability to achieve the high SLAs promised by Azure.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;A deep understanding of the underlying architecture is critical to leveraging Azure VMware Solution effectively. AVS seamlessly integrates key VMware technologies with Azure’s robust infrastructure, delivering enhanced availability, resiliency, and security for your hybrid workloads. By deploying dedicated hosts in clusters, utilising vSphere, vSAN, NSX, and vCenter, and integrating with Azure Virtual Networks for hybrid connectivity, organisations can design environments that meet the rigorous SLAs demanded by modern enterprise applications.&lt;/p&gt;
&lt;p&gt;In our next instalment, we will discuss the initial implementation phase and provide a step‑by‑step guide to setting up your first AVS environment. Stay tuned as we continue our journey from deployment to workload migration.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/azure-vmware?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure VMware Solution Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/scenarios/azure-vmware?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Hybrid Cloud – Transitioning to AVS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-au/azure/virtual-network/virtual-networks-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deep Dive into Azure Virtual Networks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-vmware/configure-vsan?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;VMware vSAN Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-vmware/architecture-networking#azure-virtual-network-interconnectivity?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;VMware NSX Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Demystifying Azure VMware Solution: From Implementation to Workload Migration – Part 1</title><link>https://blog.brewedinthecloud.com/p/azure-vmware-overview/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vmware-overview/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In today’s evolving digital landscape, high availability and a robust hybrid cloud strategy are critical for modern enterprises. Azure VMware Solution (AVS) embodies these principles by enabling organisations to run their VMware-based workloads on Azure’s dedicated infrastructure. This approach allows businesses to extend their on‑premises environments to the cloud without sacrificing the familiarity of their existing VMware tools.&lt;/p&gt;
&lt;p&gt;Across this six-part series, we will guide you through every stage—from an introductory overview of AVS to the final migration of workloads into AVS. In this initial instalment, we introduce AVS, explain its purpose, outline its core components, and discuss recent licensing reforms that may affect deployment strategies.&lt;/p&gt;
&lt;h2 id="broadcom-licensing-changes-what-you-need-to-know"&gt;Broadcom Licensing Changes: What You Need to Know
&lt;/h2&gt;&lt;p&gt;A recent announcement by Broadcom has introduced significant changes to the minimum core count requirements for VMware licensing. Under the new rules, starting from April 10, organisations will face a dramatic increase in the minimum core count that must be licensed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;br&gt;
For a customer with a single-processor server hosting 8 cores, the new licensing requirements will mandate licensing for &lt;strong&gt;72 cores.&lt;/strong&gt; This steep increase has the potential to substantially drive up costs for smaller deployments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt;&lt;br&gt;
For larger organisations, consider a scenario with 5 dual-processor servers, each with 16 cores (totalling 160 cores). In this case, the new minimum core count may have a minimal relative impact since the total core count already exceeds the new threshold.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="implications-for-different-organisations"&gt;Implications for Different Organisations
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Smaller Organisations:&lt;/strong&gt;&lt;br&gt;
Smaller deployments may feel a pronounced cost impact as they transition from a modest core count to the new minimum licensing requirements. This change might drive smaller organisations to re-evaluate whether maintaining a traditional on‑premises deployment or migrating to AVS is more cost‑effective.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Larger Deployments:&lt;/strong&gt;&lt;br&gt;
Larger enterprises typically operate at a scale where the increased minimum counts have a relatively smaller impact on overall costs. This scenario allows them to leverage the cost‑efficient scalability and integrated cloud services that AVS offers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These licensing changes underscore the wider industry shift and provide a compelling reason for organisations—especially smaller ones—to adopt Azure VMware Solution as a flexible, scalable alternative.&lt;/p&gt;
&lt;h2 id="what-is-azure-vmware-solution-avs"&gt;What Is Azure VMware Solution (AVS)?
&lt;/h2&gt;&lt;p&gt;Azure VMware Solution is a fully managed service that allows you to run your VMware workloads natively in the Azure cloud. By leveraging AVS, organisations can seamlessly extend or migrate their on‑premises VMware environments into Azure, utilising the same familiar tools and operational practices. The key components of AVS include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;vSphere:&lt;/strong&gt;&lt;br&gt;
The industry‑leading virtualisation platform that underpins your cloud-based VMs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;vSAN:&lt;/strong&gt;&lt;br&gt;
A hyper‑converged, software‑defined storage solution that aggregates local storage for high‑performance, resilient data services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NSX:&lt;/strong&gt;&lt;br&gt;
A network virtualisation and security platform that provides micro‑segmentation, advanced load balancing, and network automation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;vCenter:&lt;/strong&gt;&lt;br&gt;
The centralised management tool that enables you to configure, monitor, and manage your VMware infrastructure just as you would on‑premises.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These components work together to offer an environment where existing VMware workloads can be deployed and managed on Azure, thereby delivering the benefits of both on‑premises and cloud worlds.&lt;/p&gt;
&lt;h2 id="azure-vmware-solutions-costs--licensing"&gt;Azure VMware Solutions Costs &amp;amp; Licensing
&lt;/h2&gt;&lt;p&gt;For up to date pricing visit the &lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/azure-vmware/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;AVS Pricing&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;At the time of writing this was the current pricing for AVS deployed in Australia East Region in Australian Dollars&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Instance size&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;CPU Cores&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;RAM&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;All Flash Capacity&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Hourly&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;1-year Reserved Promotion&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;3-year Reserved Promotion&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;5-year Reserved Promotion&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AV36&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;576 GB&lt;/td&gt;
&lt;td&gt;18.60 TB&lt;/td&gt;
&lt;td&gt;$15.87/hour&lt;/td&gt;
&lt;td&gt;$7.89/hour ~50% savings&lt;/td&gt;
&lt;td&gt;$6.31/hour ~60% savings&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AV36P&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;768 GB&lt;/td&gt;
&lt;td&gt;20.70 TB (all NVMe)&lt;/td&gt;
&lt;td&gt;$17.45/hour&lt;/td&gt;
&lt;td&gt;$9.90/hour ~43% savings&lt;/td&gt;
&lt;td&gt;$6.95/hour ~60% savings&lt;/td&gt;
&lt;td&gt;$6.95/hour ~60% savings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AV64&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;1.00 TB&lt;/td&gt;
&lt;td&gt;19.20 TB (all NVMe)&lt;/td&gt;
&lt;td&gt;$25.11/hour&lt;/td&gt;
&lt;td&gt;$14.26/hour ~43% savings&lt;/td&gt;
&lt;td&gt;$10.00/hour ~60% savings&lt;/td&gt;
&lt;td&gt;$10.00/hour ~60% savings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A minimum of three nodes are required to deploy Azure VMware Solutions Private Cloud. Pricing shown above reflects single-node pricing only. This pricing covers VMware costs of NSX-T, vSphere, vSAN and HCX Enterprise.&lt;/p&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;p&gt;Reserved Promotion Limited time offer: VMware Rapid Migration Plan &lt;a class="link" href="https://aka.ms/VMwareRapidMigrationPlan?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Learn more&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;1-year Reserved Instance now offered with an additional 20% off for a limited time, resulting in an overall 43% savings off the hourly rate. (expires June 30, 2025).&lt;/p&gt;
&lt;p&gt;3-year Reserved Instance now offered with an additional 20% off for a limited time in select regions, resulting in an overall 60% savings off the hourly rate. (expires June 30, 2025).&lt;/p&gt;
&lt;p&gt;5-year Reserved Instance now offered with an additional 20% off for a limited time in select regions, resulting in an overall 60% savings off the hourly rate. (expires June 30, 2025).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure VMware Solution presents a transformative opportunity for organisations seeking a hybrid cloud model without the need to abandon their existing VMware investments. By integrating well‑known VMware tools with Azure’s global, dedicated infrastructure, AVS delivers robust performance and high availability. However, with Broadcom’s recent licensing changes, the landscape is evolving—prompting smaller organisations to carefully consider the increased minimum core count against the benefits of cloud scalability and managed services.&lt;/p&gt;
&lt;p&gt;This instalment has introduced you to AVS, its main components, and the critical impact that licensing reforms will have on deployment strategies. In the next part of our series, we will take a deeper dive into the architecture of AVS and unravel the intricacies of its infrastructure.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-vmware/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure VMware Solution Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-machines/windows/hybrid-use-benefit-licensing?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Hybrid Cloud – Transitioning to AVS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://techcommunity.microsoft.com/blog/azuremigrationblog/broadcom-vmware-licensing-changes-what-azure-vmware-solution-customers-need-to-k/4448784?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Understanding VMware Licensing Changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Service Level Agreements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Navigating the End of Azure VM Direct Internet Access: Part 5 - Implementing Azure VPN Gateway with Site to Site VPN</title><link>https://blog.brewedinthecloud.com/p/azure-vminternet-s2svpngw/</link><pubDate>Thu, 27 Mar 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vminternet-s2svpngw/</guid><description>&lt;p&gt;Welcome to the final installment of our series addressing the deprecation of direct internet access for Azure Virtual Machines (VMs). Throughout this journey, we&amp;rsquo;ve explored several robust solutions to maintain and secure outbound internet connectivity:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Part 1&lt;/strong&gt;: Implemented a &lt;strong&gt;NAT Gateway&lt;/strong&gt; for scalable and simplified outbound connectivity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 2&lt;/strong&gt;: Deployed an &lt;strong&gt;Azure Firewall&lt;/strong&gt; to enhance security and control over network traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 3&lt;/strong&gt;: Leveraged &lt;strong&gt;Network Virtual Appliances (NVAs)&lt;/strong&gt; for advanced networking capabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 4&lt;/strong&gt;: Using &lt;strong&gt;Azure Load Balancer with Outbound Rules&lt;/strong&gt; as an method to provide outbound internet traffic.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In this final part we will explore the solution using VPN Gateways connected to an on-prem environment and leverage a default site configuration to send traffic back to on-prem for internet access.&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Modern enterprise connectivity is shifting. Today’s organisations are leaving behind the legacy of direct internet access on Azure VMs in favor of more secure, manageable, and scalable models. In this installment, we detail how to implement an Azure VPN Gateway using a Site-to-Site VPN approach—and equip you with the tools to configure a “default site” that streamlines your routing. Whether you prefer a hands-on GUI approach via the Azure Portal, an automated deployment using Bicep, or fine-tuning with PowerShell, this guide covers all bases. We’ve also included a diagram (in Mermaid) to visualize the network path as your traffic journeys from Azure, through the VPN Gateway, into your on-premises network, and finally out to the internet.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites
&lt;/h2&gt;&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resource Group:&lt;/strong&gt; A dedicated container for your Azure resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Virtual Network (VNet) &amp;amp; Gateway Subnet:&lt;/strong&gt; Your VNet should contain an appropriately sized gateway subnet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Public IP Address:&lt;/strong&gt; Provisioned and associated with the VPN Gateway.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access Tools:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Portal:&lt;/strong&gt; For GUI-based deployment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep:&lt;/strong&gt; For Infrastructure-as-Code deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PowerShell (Az Module):&lt;/strong&gt; For post-deployment configuration adjustments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="deployment-options"&gt;Deployment Options
&lt;/h2&gt;&lt;p&gt;In this guide, we’ll walk through three deployment methods:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Azure Portal Deployment&lt;/strong&gt; – A visual, step-by-step process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep Template Deployment&lt;/strong&gt; – Automated infrastructure-as-code for repeatable builds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PowerShell Configuration&lt;/strong&gt; – Post-deployment tweaks to set the default site property.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="azure-portal-deployment"&gt;Azure Portal Deployment
&lt;/h2&gt;&lt;p&gt;The Azure Portal provides an intuitive process to deploy your VPN Gateway. Follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sign In and Prepare:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log into the &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
&gt;Azure Portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Confirm that your Resource Group, Virtual Network, and Gateway Subnet are in place.&lt;/li&gt;
&lt;li&gt;Create a Public IP Address resource if it isn’t already available.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the Virtual Network Gateway:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Create a resource&lt;/strong&gt; and search for &lt;strong&gt;Virtual network gateway&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Basics&lt;/strong&gt; tab, provide:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription&lt;/strong&gt; and &lt;strong&gt;Resource Group:&lt;/strong&gt; Select your existing group.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; For example, &lt;code&gt;MyVpnGateway&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region:&lt;/strong&gt; Ensure it matches your VNet’s region.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gateway Type:&lt;/strong&gt; Choose &lt;strong&gt;VPN&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPN Type:&lt;/strong&gt; Select &lt;strong&gt;Route-based&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SKU:&lt;/strong&gt; Pick an option such as &lt;code&gt;VpnGw1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Networking:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Under &lt;strong&gt;Virtual Network&lt;/strong&gt;, select your preconfigured VNet.&lt;/li&gt;
&lt;li&gt;Confirm the correct &lt;strong&gt;Gateway Subnet&lt;/strong&gt; appears.&lt;/li&gt;
&lt;li&gt;Associate the &lt;strong&gt;Public IP Address&lt;/strong&gt; you prepared.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set the Default Site:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If provided in the deployment wizard, specify the default site name (e.g., &lt;code&gt;DefaultSite&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;If the option is missing from the GUI, you can adjust it later using PowerShell (see below).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Review and Create:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Review all settings and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;After creation, validate the gateway’s connectivity using Azure Monitor or Network Watcher.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="bicep-template-deployment"&gt;Bicep Template Deployment
&lt;/h2&gt;&lt;p&gt;For those seeking repeatable, automated deployments, the following Bicep template provisions an Azure VPN Gateway with the default site property configured.&lt;/p&gt;
&lt;p&gt;Save the content below as &lt;code&gt;deployVpnGateway.bicep&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VPN Gateway Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnGatewayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVpnGateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Resource Location is using the Resource Groups location&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VPN Gateway SKU https://learn.microsoft.com/en-us/azure/vpn-gateway/about-gateway-skus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;skuName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VpnGw1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Azure Virtual Network Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VPN Gateway Public IP Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIpName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNG-PublicIP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Local Network Gateway Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkGatewayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myLNG&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Local Network Gateway Shared Key for Authentication&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sharedKey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Site-to-Site Connection Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SiteToSiteConnectionName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myS2SConnection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Local Network Gateway IP Address&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkGatewayIpAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;111.111.222.222&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VPN Remote Side Network Address Space&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteNetworkAddressSpace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;192.168.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIpName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;GatewaySubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnGateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworkGateways@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnGatewayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Vpn&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RouteBased&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;skuName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;skuName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnGatewayGeneration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Generation1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enableBgp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnetGatewayConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Dynamic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkGateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/localNetworkGateways@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkGatewayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkAddressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteNetworkAddressSpace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayIpAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkGatewayIpAddress&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/connections@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SiteToSiteConnectionName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IPsec&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkGateway1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkGateway2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;routingWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sharedKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sharedKey&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;To deploy via the Azure CLI:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Sign in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the deployment command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group MyResourceGroup &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --template-file deployVpnGateway.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Monitor the output to confirm the VPN Gateway and the default site have been established correctly.&lt;/p&gt;
&lt;h2 id="powershell-configuration-for-the-default-site"&gt;PowerShell Configuration for the Default Site
&lt;/h2&gt;&lt;p&gt;If you didn’t set the default site during deployment (or need to modify it), the following PowerShell commands let you update the VPN Gateway configuration.&lt;/p&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
The DefaultSite is the name of the connection associated with the vpn gateway that you are going to define as the default site for traffic.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Establish Your Variables:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$resourceGroupName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyResourceGroup&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$gatewayName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyVpnGateway&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$defaultSiteName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;DefaultSite&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retrieve and Update the Gateway:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Retrieve the existing VPN Gateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$gateway&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-AzVirtualNetworkGateway&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroupName&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$gatewayName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Update the default site property&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$gateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DefaultSite&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$defaultSiteName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Apply the configuration update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Set-AzVirtualNetworkGateway&lt;/span&gt; &lt;span class="n"&gt;-VirtualNetworkGateway&lt;/span&gt; &lt;span class="nv"&gt;$gateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verify the Change:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-AzVirtualNetworkGateway&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroupName&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$gatewayName&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Select-Object&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DefaultSite&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This confirms that all unmatched traffic will follow the specified default path, simplifying your routing configuration.&lt;/p&gt;
&lt;h2 id="network-traffic-flow"&gt;Network Traffic Flow
&lt;/h2&gt;&lt;p&gt;To capture the journey of your traffic—from Azure workloads, through the VPN Gateway (configured with your default site), into your on-premises network, and finally out to the internet—consider the following Mermaid diagram:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph LR
A[Azure Workload]
B["Azure VPN Gateway&lt;br/&gt;(Default Site)"]
C[On-Premises Network]
D[Internet]
A --&gt;|Outbound Traffic| B
B --&gt;|Routes to| C
C --&gt; D
&lt;/div&gt;
&lt;p&gt;This diagram illustrates the complete network path: traffic leaves an Azure workload, is routed through the VPN Gateway configured with a default site, traverses your on-premises network, and ultimately exits to the internet.&lt;/p&gt;
&lt;h2 id="final-thoughts"&gt;Final Thoughts
&lt;/h2&gt;&lt;p&gt;Transitioning from direct Azure VM internet access to a centralized connectivity model via a VPN Gateway is not merely a technical upgrade—it’s a strategic evolution. By deploying an Azure VPN Gateway with a comprehensive Site-to-Site VPN configuration and a default site, you enhance security and simplify network management in a scalable manner. Whether you deploy via the Azure Portal, automate with Bicep, or fine-tune via PowerShell, you’re laying the foundation for a resilient and future-proof infrastructure.&lt;/p&gt;
&lt;p&gt;Have you faced challenges during your migration journey? Let’s discuss best practices, performance tuning, and monitoring enhancements as we continue navigating the complexities of modern cloud connectivity.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/azure/vpn-gateway/" target="_blank" rel="noopener"
&gt;Azure VPN Gateway Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/azure/azure-resource-manager/bicep/" target="_blank" rel="noopener"
&gt;Bicep Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/powershell/azure/" target="_blank" rel="noopener"
&gt;Azure PowerShell Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Navigating the End of Azure VM Direct Internet Access: Part 4 - Implementing Azure Load Balancer with Outbound Rules</title><link>https://blog.brewedinthecloud.com/p/azure-vminternet-lb/</link><pubDate>Tue, 25 Mar 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vminternet-lb/</guid><description>&lt;p&gt;Welcome to another installment of our series addressing the deprecation of direct internet access for Azure Virtual Machines (VMs). Throughout this journey, we&amp;rsquo;ve explored several robust solutions to maintain and secure outbound internet connectivity:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Part 1&lt;/strong&gt;: Implemented a &lt;strong&gt;NAT Gateway&lt;/strong&gt; for scalable and simplified outbound connectivity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 2&lt;/strong&gt;: Deployed an &lt;strong&gt;Azure Firewall&lt;/strong&gt; to enhance security and control over network traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 3&lt;/strong&gt;: Leveraged &lt;strong&gt;Network Virtual Appliances (NVAs)&lt;/strong&gt; for advanced networking capabilities.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In &lt;strong&gt;Part 4&lt;/strong&gt;, we&amp;rsquo;ll delve into using the &lt;strong&gt;Azure Load Balancer with Outbound Rules&lt;/strong&gt; as an effective method to manage outbound internet traffic for your Azure VMs. This solution not only provides outbound connectivity but also integrates seamlessly with your existing load balancing infrastructure.&lt;/p&gt;
&lt;h2 id="understanding-azure-load-balancer-with-outbound-rules"&gt;Understanding Azure Load Balancer with Outbound Rules
&lt;/h2&gt;&lt;p&gt;The &lt;strong&gt;Azure Load Balancer&lt;/strong&gt; is a Layer 4 (TCP, UDP) load balancing service that distributes incoming traffic among healthy instances of services in your backend pool. While it&amp;rsquo;s commonly used for inbound traffic distribution, it also possesses powerful capabilities for managing outbound connections through &lt;strong&gt;Outbound Rules&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="why-use-azure-load-balancer-for-outbound-connectivity"&gt;&lt;strong&gt;Why Use Azure Load Balancer for Outbound Connectivity?&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consolidated Management&lt;/strong&gt;: Manage inbound and outbound connectivity within a single load balancer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent Source IP&lt;/strong&gt;: Ensure that outbound traffic from your VMs appears to come from the same public IP address(es).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port Allocation Control&lt;/strong&gt;: Define how ports are allocated for outbound connections.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost-Effective&lt;/strong&gt;: Utilize existing load balancer configurations without incurring additional costs for separate NAT solutions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High Availability&lt;/strong&gt;: The service is built for high throughput and low latency, supporting high-performance scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="architecting-the-network-topology"&gt;&lt;strong&gt;Architecting the Network Topology&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Designing an effective network layout is crucial. Here&amp;rsquo;s an illustrative topology:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph LR;
A["Azure Virtual Network &amp; Virtual Machines"]
B["Load Balancer Backend Pool"]
C["Internet"]
A --&gt; B
B --&gt; C
&lt;/div&gt;
&lt;h2 id="implementation-overview"&gt;Implementation Overview
&lt;/h2&gt;&lt;p&gt;We&amp;rsquo;ll cover two scenarios:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Scenario A&lt;/strong&gt;: You have an existing Standard SKU Load Balancer used for inbound traffic and want to enable outbound connectivity for your VMs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scenario B&lt;/strong&gt;: You need outbound connectivity but don&amp;rsquo;t require inbound load balancing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In both cases, we&amp;rsquo;ll implement outbound rules using the Azure Portal and Azure Resource Manager (ARM) templates via Bicep.&lt;/p&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;p&gt;Prerequisites&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Subscription&lt;/strong&gt;: An active subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Virtual Network (VNet)&lt;/strong&gt;: A VNet with one or more subnets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Virtual Machines&lt;/strong&gt;: VMs deployed in the subnet that require outbound internet access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standard SKU Load Balancer&lt;/strong&gt;: Required for outbound rules; the Basic SKU does not support this feature.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="scenario-a-enabling-outbound-connectivity-on-an-existing-load-balancer"&gt;Scenario A: Enabling Outbound Connectivity on an Existing Load Balancer
&lt;/h2&gt;&lt;h3 id="step-1-verify-your-load-balancer-sku"&gt;&lt;strong&gt;Step 1: Verify Your Load Balancer SKU&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Ensure your load balancer is of the &lt;strong&gt;Standard SKU&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Load Balancers&lt;/strong&gt; in the Azure Portal.&lt;/li&gt;
&lt;li&gt;Select your load balancer.&lt;/li&gt;
&lt;li&gt;Check the &lt;strong&gt;SKU&lt;/strong&gt; under the &lt;strong&gt;Overview&lt;/strong&gt; section.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If you have a Basic SKU load balancer, you need to upgrade to Standard SKU or create a new one.&lt;/p&gt;
&lt;h3 id="step-2-configure-backend-pool"&gt;&lt;strong&gt;Step 2: Configure Backend Pool&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Ensure your VMs are part of the load balancer&amp;rsquo;s backend pool.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In your load balancer, select &lt;strong&gt;Backend pools&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add or verify that your VMs&amp;rsquo; network interfaces are associated with the backend pool.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-3-create-an-outbound-rule"&gt;&lt;strong&gt;Step 3: Create an Outbound Rule&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navigate to Outbound Rules&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;In the load balancer settings, select &lt;strong&gt;Outbound rules&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;+ Add&lt;/strong&gt; to create a new rule.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configure the Outbound Rule&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Enter a name, e.g., &lt;code&gt;OutboundRule1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outbound Rule Type&lt;/strong&gt;: Choose &lt;strong&gt;Load balancer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frontend IP Configuration&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Select your load balancer&amp;rsquo;s frontend IP.&lt;/li&gt;
&lt;li&gt;If you don&amp;rsquo;t have one, create a new Public IP address.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backend Pool&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Select the backend pool containing your VMs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocol&lt;/strong&gt;: Choose &lt;strong&gt;All&lt;/strong&gt; (or specify &lt;strong&gt;TCP&lt;/strong&gt; / &lt;strong&gt;UDP&lt;/strong&gt; as needed).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Idle Timeout&lt;/strong&gt;: Default is 4 minutes, adjust if necessary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SNAT Port Allocation&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic&lt;/strong&gt;: Azure manages port allocation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual&lt;/strong&gt;: Specify the number of SNAT ports per VM instance.
&lt;ul&gt;
&lt;li&gt;Useful for high-connection scenarios.&lt;/li&gt;
&lt;li&gt;Recommended to use automatic unless you have specific requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable TCP Reset on Idle Timeout&lt;/strong&gt;: Optionally enable for faster connection recovery.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review and Add&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Review your settings.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Add&amp;rdquo;&lt;/strong&gt; to create the outbound rule.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-4-verify-outbound-connectivity"&gt;&lt;strong&gt;Step 4: Verify Outbound Connectivity&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Connect to a VM&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Use RDP (Windows) or SSH (Linux) to access a VM in the backend pool.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check Outbound IP Address&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;From the VM, open a web browser (Windows) or curl (Linux).&lt;/li&gt;
&lt;li&gt;Navigate to &lt;a class="link" href="https://ifconfig.me/" target="_blank" rel="noopener"
&gt;ifconfig.me&lt;/a&gt; or &lt;a class="link" href="https://ident.me" target="_blank" rel="noopener"
&gt;ident.me&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Verify that the reported IP address matches the load balancer&amp;rsquo;s frontend public IP.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Congratulations!&lt;/strong&gt; Your VMs now have outbound internet access through the Azure Load Balancer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="scenario-b-configuring-outbound-only-load-balancer"&gt;Scenario B: Configuring Outbound-Only Load Balancer
&lt;/h2&gt;&lt;p&gt;If you don&amp;rsquo;t require inbound load balancing but need outbound internet connectivity with control over the source IP, you can create a load balancer solely for outbound purposes.&lt;/p&gt;
&lt;h3 id="step-1-create-a-standard-sku-public-ip-address"&gt;&lt;strong&gt;Step 1: Create a Standard SKU Public IP Address&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navigate to Public IP Addresses&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;In the Azure Portal, search for &lt;strong&gt;&amp;ldquo;Public IP addresses&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a New Public IP&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;quot;+ Create&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basics Tab&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription&lt;/strong&gt;: Your subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;: Select or create a new one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;myOutboundPublicIP&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region&lt;/strong&gt;: The same region as your VNet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SKU&lt;/strong&gt;: &lt;strong&gt;Standard&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP Version&lt;/strong&gt;: IPv4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assignment&lt;/strong&gt;: Static.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Review + Create&amp;rdquo;&lt;/strong&gt; and then &lt;strong&gt;&amp;ldquo;Create&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-create-a-standard-sku-load-balancer"&gt;&lt;strong&gt;Step 2: Create a Standard SKU Load Balancer&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navigate to Load Balancers&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Search for &lt;strong&gt;&amp;ldquo;Load balancers&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a New Load Balancer&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;quot;+ Create&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basics Tab&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription&lt;/strong&gt;: Your subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;: Same as above.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;myOutboundLoadBalancer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region&lt;/strong&gt;: Same as your VNet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SKU&lt;/strong&gt;: &lt;strong&gt;Standard&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: &lt;strong&gt;Public&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Public IP Address&lt;/strong&gt;: Select &lt;code&gt;myOutboundPublicIP&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Review + Create&amp;rdquo;&lt;/strong&gt; and then &lt;strong&gt;&amp;ldquo;Create&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-create-a-backend-pool"&gt;&lt;strong&gt;Step 3: Create a Backend Pool&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navigate to Your Load Balancer&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Load Balancers&lt;/strong&gt; and select &lt;code&gt;myOutboundLoadBalancer&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Backend Pool&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Backend pools&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;quot;+ Add&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;myBackendPool&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backend Pool Configuration&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Virtual Network&lt;/strong&gt;: Select your VNet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Associated to&lt;/strong&gt;: &lt;strong&gt;Virtual machines&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Virtual Machines&lt;/strong&gt;: Add your VMs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP Version&lt;/strong&gt;: IPv4.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Add&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-4-create-an-outbound-rule"&gt;&lt;strong&gt;Step 4: Create an Outbound Rule&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Follow the same steps as in &lt;strong&gt;Scenario A&lt;/strong&gt;, ensuring you select &lt;code&gt;myBackendPool&lt;/code&gt; and &lt;code&gt;myOutboundPublicIP&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="step-5-update-network-security-groups-nsgs"&gt;&lt;strong&gt;Step 5: Update Network Security Groups (NSGs)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Ensure that outbound internet traffic is allowed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Outbound Rules&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Default allows outbound internet traffic; if modified, ensure ports are open.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inbound Rules&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;If necessary, restrict inbound traffic since this load balancer is for outbound use only.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-6-verify-outbound-connectivity"&gt;&lt;strong&gt;Step 6: Verify Outbound Connectivity&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Repeat the verification steps from &lt;strong&gt;Scenario A&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="implementing-with-bicep"&gt;Implementing with Bicep
&lt;/h2&gt;&lt;p&gt;For those preferring Infrastructure as Code (IaC), here&amp;rsquo;s how to implement the outbound load balancer using a Bicep template.&lt;/p&gt;
&lt;h3 id="prerequisites"&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure CLI&lt;/strong&gt;: Latest version with Bicep support.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text Editor&lt;/strong&gt;: Visual Studio Code with Bicep extension recommended.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-1-write-the-bicep-template"&gt;&lt;strong&gt;Step 1: Write the Bicep Template&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Create a file named &lt;code&gt;outboundLoadBalancer.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;span class="lnt"&gt;127
&lt;/span&gt;&lt;span class="lnt"&gt;128
&lt;/span&gt;&lt;span class="lnt"&gt;129
&lt;/span&gt;&lt;span class="lnt"&gt;130
&lt;/span&gt;&lt;span class="lnt"&gt;131
&lt;/span&gt;&lt;span class="lnt"&gt;132
&lt;/span&gt;&lt;span class="lnt"&gt;133
&lt;/span&gt;&lt;span class="lnt"&gt;134
&lt;/span&gt;&lt;span class="lnt"&gt;135
&lt;/span&gt;&lt;span class="lnt"&gt;136
&lt;/span&gt;&lt;span class="lnt"&gt;137
&lt;/span&gt;&lt;span class="lnt"&gt;138
&lt;/span&gt;&lt;span class="lnt"&gt;139
&lt;/span&gt;&lt;span class="lnt"&gt;140
&lt;/span&gt;&lt;span class="lnt"&gt;141
&lt;/span&gt;&lt;span class="lnt"&gt;142
&lt;/span&gt;&lt;span class="lnt"&gt;143
&lt;/span&gt;&lt;span class="lnt"&gt;144
&lt;/span&gt;&lt;span class="lnt"&gt;145
&lt;/span&gt;&lt;span class="lnt"&gt;146
&lt;/span&gt;&lt;span class="lnt"&gt;147
&lt;/span&gt;&lt;span class="lnt"&gt;148
&lt;/span&gt;&lt;span class="lnt"&gt;149
&lt;/span&gt;&lt;span class="lnt"&gt;150
&lt;/span&gt;&lt;span class="lnt"&gt;151
&lt;/span&gt;&lt;span class="lnt"&gt;152
&lt;/span&gt;&lt;span class="lnt"&gt;153
&lt;/span&gt;&lt;span class="lnt"&gt;154
&lt;/span&gt;&lt;span class="lnt"&gt;155
&lt;/span&gt;&lt;span class="lnt"&gt;156
&lt;/span&gt;&lt;span class="lnt"&gt;157
&lt;/span&gt;&lt;span class="lnt"&gt;158
&lt;/span&gt;&lt;span class="lnt"&gt;159
&lt;/span&gt;&lt;span class="lnt"&gt;160
&lt;/span&gt;&lt;span class="lnt"&gt;161
&lt;/span&gt;&lt;span class="lnt"&gt;162
&lt;/span&gt;&lt;span class="lnt"&gt;163
&lt;/span&gt;&lt;span class="lnt"&gt;164
&lt;/span&gt;&lt;span class="lnt"&gt;165
&lt;/span&gt;&lt;span class="lnt"&gt;166
&lt;/span&gt;&lt;span class="lnt"&gt;167
&lt;/span&gt;&lt;span class="lnt"&gt;168
&lt;/span&gt;&lt;span class="lnt"&gt;169
&lt;/span&gt;&lt;span class="lnt"&gt;170
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Parameters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Azure Virtual Network Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Azure Virtual Network Subnet Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mySubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Load Balancer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myOutboundLoadBalancer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Azure LoadBalancer Public IP Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lbPublicIPName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myOutboundLB-PublicIP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Name of the Backend Pool&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendPoolName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myBackendPool&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Virtual Machine Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVirtualMachine&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Virtual Machine Login Username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azureuser&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Virtual Machine User Password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// 1. Virtual Network with a default subnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// 2. Public IP for the Load Balancer frontend&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lbPublicIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lbPublicIPName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// 3. Load Balancer for outbound access with a backend pool and outbound rule&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/loadBalancers@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Frontend configuration referencing the public IP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;LoadBalancerFrontEnd&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lbPublicIP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Define the backend pool&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendAddressPools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendPoolName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Outbound rule so VMs in the backend pool can access the internet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;outboundRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;LBOutboundRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frontendIPConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/loadBalancers/frontendIPConfigurations&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;LoadBalancerFrontend&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendAddressPool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/loadBalancers/backendAddressPools&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backendPoolName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;All&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;idleTimeoutInMinutes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allocatedOutboundPorts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1024&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// 4. Network Interface attached to the vNet and associated with the LB backend pool&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkInterfaces@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vmNic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ipconfig1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;privateIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Dynamic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/subnets/default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Associate NIC with the Load Balancer backend pool for outbound connectivity&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;loadBalancerBackendAddressPools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;loadBalancer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/backendAddressPools/backendPool&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// 5. Linux Virtual Machine attached to the NIC&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;linuxVM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines@2024-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vm&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;hardwareProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_DS1_v2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;computerName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualMachineName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;linuxConfiguration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;disablePasswordAuthentication&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;imageReference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publisher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Canonical&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UbuntuServer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;18.04-LTS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osDisk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;createOption&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FromImage&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkInterfaces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-2-deploy-the-bicep-template"&gt;&lt;strong&gt;Step 2: Deploy the Bicep Template&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Deploy&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; az deployment group create &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &lt;span class="s1"&gt;&amp;#39;YourResourceGroup&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --template-file outboundLoadBalancer.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-3-verify-deployment"&gt;&lt;strong&gt;Step 3: Verify Deployment&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Ensure that the load balancer, public IP, and backend pool are created.&lt;/li&gt;
&lt;li&gt;Check that the NICs are associated with the backend pool.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-4-verify-outbound-connectivity-1"&gt;&lt;strong&gt;Step 4: Verify Outbound Connectivity&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Repeat the verification steps as previously described.&lt;/p&gt;
&lt;h2 id="additional-considerations"&gt;Additional Considerations
&lt;/h2&gt;&lt;h3 id="snat-port-exhaustion"&gt;&lt;strong&gt;SNAT Port Exhaustion&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What is SNAT Port Exhaustion?&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;SNAT (Source Network Address Translation) ports are used to map internal private IP addresses and ports to the public IP address and ports.&lt;/li&gt;
&lt;li&gt;If the number of outbound connections exceeds the available SNAT ports, new connections may fail.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mitigation Strategies&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Use Multiple Frontend IPs&lt;/strong&gt;: Increases the number of available SNAT ports.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual Port Allocation&lt;/strong&gt;: Specify the number of ports per instance in the outbound rule.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use NAT Gateway&lt;/strong&gt;: For high-volume scenarios, consider using a NAT Gateway, which provides more SNAT ports.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="compatibility-with-virtual-machine-scale-sets-vmss"&gt;&lt;strong&gt;Compatibility with Virtual Machine Scale Sets (VMSS)&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic Backend Pool Association&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;When using VMSS, instances can be automatically added to the backend pool.&lt;/li&gt;
&lt;li&gt;Ensure the scale set is associated with the load balancer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="network-security-groups-nsgs"&gt;&lt;strong&gt;Network Security Groups (NSGs)&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Outbound Traffic&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Default NSG rules allow outbound internet traffic.&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;ve customized NSGs, ensure that outbound traffic to the internet is permitted.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="multi-region-deployments"&gt;&lt;strong&gt;Multi-Region Deployments&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;For high availability, consider deploying load balancers and resources across multiple regions and using Azure Traffic Manager or Front Door.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;By implementing an Azure Load Balancer with outbound rules, you&amp;rsquo;ve established a reliable and scalable method for managing outbound internet connectivity for your Azure VMs. This approach is particularly beneficial if you&amp;rsquo;re already utilizing load balancers for inbound traffic or seeking a cost-effective solution without introducing additional network components.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unified Solution&lt;/strong&gt;: Manage inbound and outbound connectivity within a single service.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control and Flexibility&lt;/strong&gt;: Customize outbound rules to suit your application&amp;rsquo;s needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost Efficiency&lt;/strong&gt;: Utilize existing infrastructure to minimize costs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High Availability&lt;/strong&gt;: Leverage Azure&amp;rsquo;s robust infrastructure for reliable connectivity.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Load Balancer Outbound Rules&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/load-balancer/load-balancer-outbound-rules-overview" target="_blank" rel="noopener"
&gt;Outbound Rules Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/load-balancer/load-balancer-outbound-connections" target="_blank" rel="noopener"
&gt;Configure Outbound Connections&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standard Load Balancer&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-overview" target="_blank" rel="noopener"
&gt;Standard Load Balancer Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/troubleshoot-outbound-connection-exhaustion" target="_blank" rel="noopener"
&gt;Outbound Connectivity Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/load-balancer/troubleshoot-outbound-connection" target="_blank" rel="noopener"
&gt;Diagnose SNAT Port Issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep Language&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-resource-manager/bicep/" target="_blank" rel="noopener"
&gt;Bicep Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Navigating the End of Azure VM Direct Internet Access: Part 3 - Implementing Network Virtual Appliance (NVA)</title><link>https://blog.brewedinthecloud.com/p/azure-vminternet-nva/</link><pubDate>Thu, 20 Mar 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vminternet-nva/</guid><description>&lt;p&gt;As we continue our journey to adapt to the deprecation of direct internet access for Azure Virtual Machines (VMs), we&amp;rsquo;ve explored the implementation of &lt;strong&gt;NAT Gateway&lt;/strong&gt; in &lt;strong&gt;Part 1&lt;/strong&gt; and &lt;strong&gt;Azure Firewall&lt;/strong&gt; in &lt;strong&gt;Part 2&lt;/strong&gt;. In this third installment, we&amp;rsquo;ll delve deep into &lt;strong&gt;Network Virtual Appliances (NVAs)&lt;/strong&gt; powerful, flexible solutions that offer advanced networking capabilities to meet complex enterprise requirements.&lt;/p&gt;
&lt;h2 id="understanding-network-virtual-appliances-nvas"&gt;Understanding Network Virtual Appliances (NVAs)
&lt;/h2&gt;&lt;p&gt;A &lt;strong&gt;Network Virtual Appliance&lt;/strong&gt; is a software image, often provided by third-party vendors, that performs network functions traditionally done by physical hardware appliances. NVAs can provide services such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firewalling and Security Filtering&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic Shaping and Load Balancing&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Routing and VPN Termination&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intrusion Detection and Prevention&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WAN Optimization&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Metaphorically speaking&lt;/strong&gt;, think of an NVA as a custom-built security checkpoint in your network highway, where you can enforce detailed inspections, rules, and controls that aren’t possible with standard toll booths.&lt;/p&gt;
&lt;h3 id="why-choose-an-nva"&gt;&lt;strong&gt;Why Choose an NVA?&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advanced Features&lt;/strong&gt;: When you require sophisticated network services beyond Azure&amp;rsquo;s native offerings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vendor Consistency&lt;/strong&gt;: To maintain uniformity with on-premises systems using the same vendor solutions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customizability&lt;/strong&gt;: For environments needing highly customized network configurations and policies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regulatory Compliance&lt;/strong&gt;: When specific compliance requirements mandate certain security controls or logging mechanisms.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Deploying an NVA involves several critical steps:&lt;/p&gt;
&lt;h2 id="implementing-nvas-for-outbound-connectivity"&gt;Implementing NVAs for Outbound Connectivity
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Selecting the Appropriate NVA Solution&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architecting the Network Topology&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploying the NVA&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuring User-Defined Routes (UDRs)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Setting Up Security Rules with NSGs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ensuring High Availability (Optional)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validating the Deployment&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let&amp;rsquo;s explore these steps in detail, considering both Azure Portal and Bicep implementation methods.&lt;/p&gt;
&lt;h3 id="1-selecting-the-appropriate-nva-solution"&gt;&lt;strong&gt;1. Selecting the Appropriate NVA Solution&lt;/strong&gt;
&lt;/h3&gt;&lt;h3 id="considerations"&gt;&lt;strong&gt;Considerations:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Functionality&lt;/strong&gt;: Does the NVA offer the network services you need?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Can it handle your expected traffic volume?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vendor Support&lt;/strong&gt;: Is there adequate documentation and support?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost&lt;/strong&gt;: Assess both licensing and operational expenses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatibility&lt;/strong&gt;: Ensure the NVA is certified for Azure and supports your required features.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="popular-vendors"&gt;&lt;strong&gt;Popular Vendors:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Palo Alto Networks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cisco&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fortinet&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F5 Networks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check Point&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Evaluate vendors based on existing expertise within your team to minimize the learning curve.&lt;/p&gt;
&lt;h3 id="2-architecting-the-network-topology"&gt;&lt;strong&gt;2. Architecting the Network Topology&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Designing an effective network layout is crucial. Here&amp;rsquo;s an illustrative topology:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph LR;
A["VM Subnet &lt;/br&gt;(User VMs without PIP)"] --&gt;|UDR points to NVA| B[NVA Subnet]; B --&gt;|NVA with PIP| C[Internet]
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Key Components:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VM Subnet&lt;/strong&gt;: Contains VMs that require outbound internet access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVA Subnet&lt;/strong&gt;: Dedicated subnet hosting the NVA.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User-Defined Route (UDR)&lt;/strong&gt;: Routes traffic from the VM Subnet to the NVA.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Public IP (PIP)&lt;/strong&gt;: Assigned to the NVA for outbound internet access.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Design Considerations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt;: Isolate the NVA in its own subnet to enforce strict access controls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Plan for scaling NVAs vertically or horizontally based on traffic demands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redundancy&lt;/strong&gt;: Use availability sets or zones to ensure high availability.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-deploying-the-nva"&gt;&lt;strong&gt;3. Deploying the NVA&lt;/strong&gt;
&lt;/h3&gt;&lt;h3 id="option-a-using-the-azure-portal"&gt;&lt;strong&gt;Option A: Using the Azure Portal&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Step-by-Step Guide:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deploy the NVA from Azure Marketplace:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Azure Marketplace&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Search for your chosen NVA (e.g., &amp;ldquo;FortiGate Next-Generation Firewall&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Create&amp;rdquo;&lt;/strong&gt; and follow the deployment wizard.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configure Basic Settings:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription &amp;amp; Resource Group&lt;/strong&gt;: Select appropriately.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instance Details&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Region&lt;/strong&gt;: Same as your Virtual Network.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VM Name&lt;/strong&gt;: Assign a logical name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VM Size&lt;/strong&gt;: Select based on performance needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authentication&lt;/strong&gt;: Set strong admin credentials.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configure Networking:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Virtual Network&lt;/strong&gt;: Select your existing VNet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subnets&lt;/strong&gt;: Assign the NVA to the &lt;code&gt;NVA-Subnet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Public IP&lt;/strong&gt;: Create or select a Public IP for the NVA.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firewall Settings (Vendor-Specific):&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Configure settings as required by the vendor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review and Create:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Validate your configurations.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Create&amp;rdquo;&lt;/strong&gt; to deploy the NVA.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="option-b-using-bicep-template"&gt;&lt;strong&gt;Option B: Using Bicep Template&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Advantages of Using Bicep:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure as Code (IaC)&lt;/strong&gt;: Enables version control and repeatable deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation&lt;/strong&gt;: Integrate with CI/CD pipelines for streamlined provisioning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: Ensures environments are consistently configured.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sample Bicep Template Snippet:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;span class="lnt"&gt;87
&lt;/span&gt;&lt;span class="lnt"&gt;88
&lt;/span&gt;&lt;span class="lnt"&gt;89
&lt;/span&gt;&lt;span class="lnt"&gt;90
&lt;/span&gt;&lt;span class="lnt"&gt;91
&lt;/span&gt;&lt;span class="lnt"&gt;92
&lt;/span&gt;&lt;span class="lnt"&gt;93
&lt;/span&gt;&lt;span class="lnt"&gt;94
&lt;/span&gt;&lt;span class="lnt"&gt;95
&lt;/span&gt;&lt;span class="lnt"&gt;96
&lt;/span&gt;&lt;span class="lnt"&gt;97
&lt;/span&gt;&lt;span class="lnt"&gt;98
&lt;/span&gt;&lt;span class="lnt"&gt;99
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Name of the NVA VM&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param nvaName string
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Admin username for the NVA&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param adminUsername string
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Admin password for the NVA&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@secure&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param adminPassword string
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;NVA VM size&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param vmSize &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Standard_D3_v2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Virtual Network name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param vnetName string
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;NVA Subnet name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param subnetName &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NVA-Subnet&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Address prefix for the NVA Subnet&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param subnetAddress &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// Check &lt;span class="k"&gt;for&lt;/span&gt; existing VNet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource vnet &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: vnetName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// Reference existing subnet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource nvaSubnet &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2023-05-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: subnetName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; parent: vnet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; addressPrefix: subnetAddress
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// Create Public IP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource nvaPublicIP &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2023-05-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;${nvaName}-publicIP&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location: resourceGroup&lt;span class="o"&gt;()&lt;/span&gt;.location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sku: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; publicIPAllocationMethod: &lt;span class="s1"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// Create Network Interface
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource nvaNic &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/networkInterfaces@2023-05-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;${nvaName}-nic&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location: resourceGroup&lt;span class="o"&gt;()&lt;/span&gt;.location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ipConfigurations: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;ipconfig1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; subnet: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; id: nvaSubnet.id
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; privateIPAllocationMethod: &lt;span class="s1"&gt;&amp;#39;Dynamic&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; publicIPAddress: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; id: nvaPublicIP.id
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// Deploy the NVA VM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource nvaVM &lt;span class="s1"&gt;&amp;#39;Microsoft.Compute/virtualMachines@2023-03-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: nvaName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location: resourceGroup&lt;span class="o"&gt;()&lt;/span&gt;.location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hardwareProfile: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vmSize: vmSize
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; storageProfile: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; imageReference: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; publisher: &lt;span class="s1"&gt;&amp;#39;vendor&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; offer: &lt;span class="s1"&gt;&amp;#39;nva-offer&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sku: &lt;span class="s1"&gt;&amp;#39;nva-sku&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; version: &lt;span class="s1"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; osProfile: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; computerName: nvaName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; adminUsername: adminUsername
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; adminPassword: adminPassword
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; networkProfile: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; networkInterfaces: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; id: nvaNic.id
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;em&gt;Replace &amp;lsquo;vendor&amp;rsquo;, &amp;rsquo;nva-offer&amp;rsquo;, and &amp;rsquo;nva-sku&amp;rsquo; with values specific to your chosen NVA.&lt;/em&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;p&gt;&lt;strong&gt;Deploy the Template:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &lt;span class="s1"&gt;&amp;#39;YourResourceGroup&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --template-file nvaDeployment.bicep &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --parameters &lt;span class="nv"&gt;nvaName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myNVA&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;adminUsername&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;azureuser&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;adminPassword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;YourStrongPassword!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="4-configuring-user-defined-routes-udrs"&gt;&lt;strong&gt;4. Configuring User-Defined Routes (UDRs)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Direct traffic from your VM Subnet to the NVA.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create a Route Table:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Route tables&lt;/strong&gt; in the Azure Portal.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;quot;+ Create&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure basic settings (name, region, resource group).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add a Route:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;In the route table, select &lt;strong&gt;&amp;ldquo;Routes&amp;rdquo;&lt;/strong&gt; &amp;gt; &lt;strong&gt;&amp;quot;+ Add&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Route Name&lt;/strong&gt;: &lt;code&gt;DefaultRoute&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Address Prefix&lt;/strong&gt;: &lt;code&gt;0.0.0.0/0&lt;/code&gt; (all traffic).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next Hop Type&lt;/strong&gt;: &lt;code&gt;Virtual Appliance&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next Hop Address&lt;/strong&gt;: Private IP of the NVA&amp;rsquo;s NIC.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Associate Route Table with VM Subnet:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;In the route table, select &lt;strong&gt;&amp;ldquo;Subnets&amp;rdquo;&lt;/strong&gt; &amp;gt; &lt;strong&gt;&amp;quot;+ Associate&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose the VM Subnet where your VMs reside.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; All outbound traffic from the VM Subnet is directed to the NVA.&lt;/p&gt;
&lt;h3 id="5-setting-up-security-rules-with-nsgs"&gt;&lt;strong&gt;5. Setting Up Security Rules with NSGs&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Network Security Groups (NSGs)&lt;/strong&gt; control inbound and outbound traffic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For VM Subnet:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Outbound Rules:&lt;/strong&gt; Allow traffic to the NVA subnet (e.g., allow all traffic to &lt;code&gt;10.0.2.0/24&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For NVA Subnet:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inbound Rules:&lt;/strong&gt; Allow traffic from the VM Subnet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outbound Rules:&lt;/strong&gt; Allow traffic to the internet (e.g., HTTP, HTTPS).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Best Practices:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Least Privilege Principle:&lt;/strong&gt; Only permit necessary traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log and Monitor NSG Flows:&lt;/strong&gt; Use NSG flow logs for auditing and troubleshooting.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-ensuring-high-availability-optional-but-recommended"&gt;&lt;strong&gt;6. Ensuring High Availability (Optional but Recommended)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Options:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Availability Sets:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Deploy multiple NVA instances within an availability set.&lt;/li&gt;
&lt;li&gt;Distributes VMs across fault and update domains.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Load Balancing NVAs:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Place an Azure Load Balancer in front of NVAs.&lt;/li&gt;
&lt;li&gt;Enable session persistence if required by the NVA.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Implementation Considerations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check if the NVA supports clustering or HA configurations.&lt;/li&gt;
&lt;li&gt;Ensure consistent configurations across NVA instances.&lt;/li&gt;
&lt;li&gt;Check how the failover especially in active/passive configurations which rely on a failover of IP from one device to another as this can cause delays and outages in the solution.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="7-configuring-the-nva"&gt;&lt;strong&gt;7. Configuring the NVA&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Access the NVA to apply your network policies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Secure Access:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Limit management access via NSGs (e.g., allow only your IP).&lt;/li&gt;
&lt;li&gt;Enable multi-factor authentication if supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apply Network Policies:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Configure firewall rules to permit or deny traffic.&lt;/li&gt;
&lt;li&gt;Set up NAT rules for outbound internet access.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logging and Monitoring:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Enable syslog or other logging mechanisms.&lt;/li&gt;
&lt;li&gt;Integrate with Azure Monitor or SIEM systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Vendor Documentation:&lt;/strong&gt; Refer to the NVA vendor&amp;rsquo;s documentation for specific configuration steps.&lt;/p&gt;
&lt;h3 id="8-validating-the-deployment"&gt;&lt;strong&gt;8. Validating the Deployment&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Testing Connectivity:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;From a VM in the VM Subnet:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ping External Addresses:&lt;/strong&gt; Ensure ICMP is allowed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access External Websites:&lt;/strong&gt; Test HTTP/HTTPS connectivity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify Outbound IP:&lt;/strong&gt; Open a web browser and navigate to &lt;a class="link" href="https://ifconfig.me/" target="_blank" rel="noopener"
&gt;ifconfig.me&lt;/a&gt; or &lt;a class="link" href="https://ident.me" target="_blank" rel="noopener"
&gt;ident.me&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Monitoring Traffic:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NVA Logs:&lt;/strong&gt; Check for expected traffic patterns and any anomalies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Monitor Metrics:&lt;/strong&gt; Monitor NVA&amp;rsquo;s CPU, memory, and network utilization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="additional-insights"&gt;Additional Insights
&lt;/h2&gt;&lt;h3 id="balancing-complexity-and-control"&gt;&lt;strong&gt;Balancing Complexity and Control&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;While NVAs offer granular control, they introduce complexity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Operational Overhead:&lt;/strong&gt; Requires expertise to manage and maintain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Updates and Patches:&lt;/strong&gt; Keep the NVA software updated to mitigate vulnerabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost Implications:&lt;/strong&gt; Consider the total cost of ownership, including licensing and VM costs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Implementing an NVA provides advanced networking capabilities, enabling you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Customize Network Policies&lt;/strong&gt;: Tailor security rules to specific needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintain Vendor Consistency&lt;/strong&gt;: Use familiar tools across environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhance Security Posture&lt;/strong&gt;: Leverage advanced features like intrusion prevention.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Strategic Choice&lt;/strong&gt;: NVAs are powerful but require thoughtful planning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vendor Expertise&lt;/strong&gt;: Leverage vendor support and training.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ongoing Management&lt;/strong&gt;: Factor in operational efforts for maintenance and monitoring.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Marketplace NVAs&lt;/strong&gt;: &lt;a class="link" href="https://azuremarketplace.microsoft.com/en-us/marketplace/apps?filters=virtual-machine-images%3Bnetworking" target="_blank" rel="noopener"
&gt;Explore NVAs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User-Defined Routes&lt;/strong&gt;: &lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Networking Best Practices&lt;/strong&gt;: &lt;a class="link" href="https://learn.microsoft.com/azure/architecture/best-practices/networking" target="_blank" rel="noopener"
&gt;Networking Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVA Deployment Scenarios&lt;/strong&gt;: &lt;a class="link" href="https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/nva-ha" target="_blank" rel="noopener"
&gt;Reference Architectures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Navigating the End of Azure VM Direct Internet Access: Part 2 - Implementing Azure Firewall</title><link>https://blog.brewedinthecloud.com/p/azure-vminternet-azfw/</link><pubDate>Tue, 18 Mar 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vminternet-azfw/</guid><description>&lt;p&gt;In &lt;strong&gt;Part 1&lt;/strong&gt; of this series, we explored how to implement a NAT Gateway to manage outbound internet connectivity for Azure VMs. Today, in &lt;strong&gt;Part 2&lt;/strong&gt;, we&amp;rsquo;ll dive into configuring &lt;strong&gt;Azure Firewall&lt;/strong&gt;, a robust security solution that provides both outbound and inbound network traffic control. Azure Firewall not only offers the required connectivity but also enhances your security posture.&lt;/p&gt;
&lt;h2 id="understanding-azure-firewall"&gt;Understanding Azure Firewall
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Azure Firewall&lt;/strong&gt; is a managed, cloud-based network security service that protects your Azure Virtual Network resources. It offers built-in high availability and scalability, as well as features like centralized policy management and dynamic filtering of outbound, inbound, and lateral network traffic.&lt;/p&gt;
&lt;h3 id="key-benefits-of-azure-firewall"&gt;&lt;strong&gt;Key Benefits of Azure Firewall:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comprehensive Threat Protection:&lt;/strong&gt; Intelligent, real-time threat detection and prevention.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Centralized Policy Management:&lt;/strong&gt; Manage firewall rules across multiple subscriptions and networks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High Availability and Scalability:&lt;/strong&gt; Automatically scales to meet your network needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application and Network Rules:&lt;/strong&gt; Control access based on fully qualified domain names (FQDNs), IP addresses, and port numbers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logging and Analytics:&lt;/strong&gt; Integrated with Azure Monitor for comprehensive logging and analytics.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="architecting-the-network-topology"&gt;&lt;strong&gt;Architecting the Network Topology&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Designing an effective network layout is crucial. Here&amp;rsquo;s an illustrative topology:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph LR;
A["VM Subnet &lt;/br&gt;(User VMs without PIP)"] --&gt;|UDR points to AzureFW| B[Azure Firewall Subnet]; B --&gt;|AZFW with PIP| C[Internet]
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public IP Addresses or Prefixes:&lt;/strong&gt; Assigns specific public IPs so your outbound connections use predictable and consistent IP addresses.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="warning"&gt;
&lt;div class="warning-icon"&gt;⚠️&lt;/div&gt;
&lt;div class="warning-content"&gt;
&lt;strong&gt;Warning:&lt;/strong&gt; Azure Firewall Public IP addresses: If you assign multiple front end public addresses then outbound traffic will round-robin between those addresses for outbound connectivity.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.warning {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #ffcc00;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.warning-icon {
font-size: 24px;
margin-right: 10px;
}
.warning-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="implementation-steps"&gt;Implementation Steps
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s set up Azure Firewall to provide secure and reliable outbound internet connectivity for your Azure VMs. We&amp;rsquo;ll cover both the Azure Portal and Bicep approaches.&lt;/p&gt;
&lt;h2 id="implementation-using-the-azure-portal"&gt;Implementation Using the Azure Portal
&lt;/h2&gt;&lt;h3 id="step-1-create-a-public-ip-address"&gt;&lt;strong&gt;Step 1: Create a Public IP Address&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navigate to Public IP Addresses:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;In the Azure Portal, search for &lt;strong&gt;&amp;ldquo;Public IP addresses&amp;rdquo;&lt;/strong&gt; and select it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a New Public IP:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;quot;+ Create&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basics Tab:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription:&lt;/strong&gt; Select your subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group:&lt;/strong&gt; Choose an existing one or create a new one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; Enter a name, e.g., &lt;code&gt;myFirewallPublicIP&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region:&lt;/strong&gt; Choose the region of your VNet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP Version:&lt;/strong&gt; IPv4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SKU:&lt;/strong&gt; Standard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assignment:&lt;/strong&gt; Static.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Review + Create&amp;rdquo;&lt;/strong&gt;, then &lt;strong&gt;&amp;ldquo;Create&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-create-the-azure-firewall"&gt;&lt;strong&gt;Step 2: Create the Azure Firewall&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navigate to Firewalls:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Search for &lt;strong&gt;&amp;ldquo;Firewalls&amp;rdquo;&lt;/strong&gt; and select it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a New Firewall:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;quot;+ Create&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basics Tab:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription:&lt;/strong&gt; Your subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group:&lt;/strong&gt; Same as above.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;myAzureFirewall&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region:&lt;/strong&gt; Same as your VNet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firewall Tier:&lt;/strong&gt; Standard (choose Premium for advanced features if needed).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Associate Public IP:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firewall Management:&lt;/strong&gt; Select &lt;strong&gt;Firewall public IP configuration&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add a New Public IP:&lt;/strong&gt; Use &lt;code&gt;myFirewallPublicIP&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Virtual Network Configuration:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Virtual Network:&lt;/strong&gt; Choose or create a VNet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subnets:&lt;/strong&gt; Ensure you have a subnet named &lt;code&gt;AzureFirewallSubnet&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review and Create:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Review + Create&amp;rdquo;&lt;/strong&gt;, ensure validation passes.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Create&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-configure-firewall-rules"&gt;&lt;strong&gt;Step 3: Configure Firewall Rules&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navigate to Your Firewall:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Firewalls&lt;/strong&gt; in the Azure Portal and select &lt;code&gt;myAzureFirewall&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Application Rules:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Application Rule Collection:&lt;/strong&gt; Click on &lt;strong&gt;&amp;ldquo;Rules&amp;rdquo;&lt;/strong&gt; &amp;gt; &lt;strong&gt;Application Rule Collection&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Rule Collection:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;AppRuleCollection1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;/strong&gt; 200.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action:&lt;/strong&gt; Allow.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Rule:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;AllowInternetAccess&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source IP Addresses:&lt;/strong&gt; Add the IP range of your subnet or VMs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target FQDNs:&lt;/strong&gt; e.g., `` for all internet access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocol:&lt;/strong&gt; HTTP, HTTPS.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Add&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Network Rules:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Network Rule Collection:&lt;/strong&gt; Click on &lt;strong&gt;&amp;ldquo;Rules&amp;rdquo;&lt;/strong&gt; &amp;gt; &lt;strong&gt;Network Rule Collection&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Rule Collection:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;NetRuleCollection1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority:&lt;/strong&gt; 100.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action:&lt;/strong&gt; Allow.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Rule:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;AllowOutboundAccess&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source IP Addresses:&lt;/strong&gt; Add the IP range of your subnet or VMs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destination IP Addresses:&lt;/strong&gt; Add `` for all internet access or specific IP ranges.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destination Ports:&lt;/strong&gt; Add ports like &lt;code&gt;80&lt;/code&gt; for HTTP, &lt;code&gt;443&lt;/code&gt; for HTTPS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocol:&lt;/strong&gt; TCP, UDP.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Add&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-4-verify-outbound-connectivity"&gt;&lt;strong&gt;Step 4: Verify Outbound Connectivity&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Connect to a VM in the Subnet:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Use Remote Desktop Protocol (RDP) or SSH.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check Outbound IP Address:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Open a web browser and navigate to &lt;a class="link" href="https://ifconfig.me/" target="_blank" rel="noopener"
&gt;ifconfig.me&lt;/a&gt; or &lt;a class="link" href="https://ident.me" target="_blank" rel="noopener"
&gt;ident.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Verify that the displayed IP matches &lt;code&gt;myFirewallPublicIP&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="implementation-using-bicep"&gt;Implementation Using Bicep
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s achieve the same deployment using a Bicep template.&lt;/p&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure CLI:&lt;/strong&gt; Ensure you have the latest version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep CLI:&lt;/strong&gt; Comes integrated with Azure CLI.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="step-1-write-the-bicep-template"&gt;&lt;strong&gt;Step 1: Write the Bicep Template&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Create a file named &lt;code&gt;azureFirewall.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;span class="lnt"&gt;125
&lt;/span&gt;&lt;span class="lnt"&gt;126
&lt;/span&gt;&lt;span class="lnt"&gt;127
&lt;/span&gt;&lt;span class="lnt"&gt;128
&lt;/span&gt;&lt;span class="lnt"&gt;129
&lt;/span&gt;&lt;span class="lnt"&gt;130
&lt;/span&gt;&lt;span class="lnt"&gt;131
&lt;/span&gt;&lt;span class="lnt"&gt;132
&lt;/span&gt;&lt;span class="lnt"&gt;133
&lt;/span&gt;&lt;span class="lnt"&gt;134
&lt;/span&gt;&lt;span class="lnt"&gt;135
&lt;/span&gt;&lt;span class="lnt"&gt;136
&lt;/span&gt;&lt;span class="lnt"&gt;137
&lt;/span&gt;&lt;span class="lnt"&gt;138
&lt;/span&gt;&lt;span class="lnt"&gt;139
&lt;/span&gt;&lt;span class="lnt"&gt;140
&lt;/span&gt;&lt;span class="lnt"&gt;141
&lt;/span&gt;&lt;span class="lnt"&gt;142
&lt;/span&gt;&lt;span class="lnt"&gt;143
&lt;/span&gt;&lt;span class="lnt"&gt;144
&lt;/span&gt;&lt;span class="lnt"&gt;145
&lt;/span&gt;&lt;span class="lnt"&gt;146
&lt;/span&gt;&lt;span class="lnt"&gt;147
&lt;/span&gt;&lt;span class="lnt"&gt;148
&lt;/span&gt;&lt;span class="lnt"&gt;149
&lt;/span&gt;&lt;span class="lnt"&gt;150
&lt;/span&gt;&lt;span class="lnt"&gt;151
&lt;/span&gt;&lt;span class="lnt"&gt;152
&lt;/span&gt;&lt;span class="lnt"&gt;153
&lt;/span&gt;&lt;span class="lnt"&gt;154
&lt;/span&gt;&lt;span class="lnt"&gt;155
&lt;/span&gt;&lt;span class="lnt"&gt;156
&lt;/span&gt;&lt;span class="lnt"&gt;157
&lt;/span&gt;&lt;span class="lnt"&gt;158
&lt;/span&gt;&lt;span class="lnt"&gt;159
&lt;/span&gt;&lt;span class="lnt"&gt;160
&lt;/span&gt;&lt;span class="lnt"&gt;161
&lt;/span&gt;&lt;span class="lnt"&gt;162
&lt;/span&gt;&lt;span class="lnt"&gt;163
&lt;/span&gt;&lt;span class="lnt"&gt;164
&lt;/span&gt;&lt;span class="lnt"&gt;165
&lt;/span&gt;&lt;span class="lnt"&gt;166
&lt;/span&gt;&lt;span class="lnt"&gt;167
&lt;/span&gt;&lt;span class="lnt"&gt;168
&lt;/span&gt;&lt;span class="lnt"&gt;169
&lt;/span&gt;&lt;span class="lnt"&gt;170
&lt;/span&gt;&lt;span class="lnt"&gt;171
&lt;/span&gt;&lt;span class="lnt"&gt;172
&lt;/span&gt;&lt;span class="lnt"&gt;173
&lt;/span&gt;&lt;span class="lnt"&gt;174
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Name of the Azure Firewall&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param firewallName &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;myAzureFirewall&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Name of the Azure Firewall Policy&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param firewallpolicyName &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;myAzureFirewallPolicy&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Location for all resources&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param location &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; resourceGroup&lt;span class="o"&gt;()&lt;/span&gt;.location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Name of the Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param vnetName &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;firewallVNet&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Address prefix for the Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param vnetAddressPrefix &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Address prefix for the Azure Firewall Subnet&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param firewallSubnetPrefix &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Public IP Name for Azure Firewall&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param firewallPublicIPName &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;${firewallName}-publicIP&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Virtual Network Name for AzureFirewall subnet&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param firewallSubnetName &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;AzureFirewallSubnet&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Array of IP Configurations for Azure Firewall&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;var &lt;span class="nv"&gt;firewallIpConfigurations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;${firewallName}-ipConfig&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; subnet: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; id: resourceId&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets&amp;#39;&lt;/span&gt;, vnetName, firewallSubnetName&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; publicIPAddress: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; id: resourceId&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Microsoft.Network/publicIPAddresses&amp;#39;&lt;/span&gt;, firewallPublicIPName&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Azure Firewall Policy&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource azureFWPolicy &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/firewallPolicies@2024-05-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: firewallpolicyName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location: location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource networkRuleCollectionGroup &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/firewallPolicies/ruleCollectionGroups@2022-01-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; parent: azureFWPolicy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;DefaultNetworkRuleCollectionGroup&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; priority: &lt;span class="m"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ruleCollections: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ruleCollectionType: &lt;span class="s1"&gt;&amp;#39;FirewallPolicyFilterRuleCollection&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; action: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; type: &lt;span class="s1"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;AllowAllExceptHTTPandHTTPS&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; priority: &lt;span class="m"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rules: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;AllowAllExcept80and443&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; description: &lt;span class="s1"&gt;&amp;#39;Allow all traffic except ports 80 and 443&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ruleType: &lt;span class="s1"&gt;&amp;#39;NetworkRule&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ipProtocols: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;Any&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sourceAddresses: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; destinationAddresses: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; destinationPorts: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;1-79&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;81-442&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;444-60000&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource applicationRuleCollectionGroup &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/firewallPolicies/ruleCollectionGroups@2022-01-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; parent: azureFWPolicy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;DefaultApplicationRuleCollectionGroup&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; priority: &lt;span class="m"&gt;300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ruleCollections: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ruleCollectionType: &lt;span class="s1"&gt;&amp;#39;FirewallPolicyFilterRuleCollection&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;AllowHTTPandHTTPS&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; priority: &lt;span class="m"&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; action: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; type: &lt;span class="s1"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rules: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ruleType: &lt;span class="s1"&gt;&amp;#39;ApplicationRule&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;AllowHTTPandHTTPS&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; protocols: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; protocolType: &lt;span class="s1"&gt;&amp;#39;Http&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; port: &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; protocolType: &lt;span class="s1"&gt;&amp;#39;Https&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; port: &lt;span class="m"&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sourceAddresses: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; targetFqdns: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Azure Firewall Resource&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource azureFirewall &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/azureFirewalls@2023-05-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: firewallName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location: location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ipConfigurations: firewallIpConfigurations
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; firewallPolicy: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; id: azureFWPolicy.id
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Public IP for Azure Firewall&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource firewallPublicIP &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2023-05-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: firewallPublicIPName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location: location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sku: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tier: &lt;span class="s1"&gt;&amp;#39;Regional&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; publicIPAllocationMethod: &lt;span class="s1"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Virtual Network for Azure Firewall&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource firewallVNet &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2023-05-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: vnetName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location: location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; addressSpace: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; addressPrefixes: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vnetAddressPrefix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; subnets: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: firewallSubnetName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; addressPrefix: firewallSubnetPrefix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; // AzureFirewall subnet requires &lt;span class="s1"&gt;&amp;#39;AzureFirewallSubnet&amp;#39;&lt;/span&gt; as the name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; // No network security groups are associated with this subnet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dependsOn: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; firewallPublicIP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-2-deploy-the-bicep-template"&gt;&lt;strong&gt;Step 2: Deploy the Bicep Template&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Login to Azure:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set the Subscription Context:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az account &lt;span class="nb"&gt;set&lt;/span&gt; --subscription &lt;span class="s1"&gt;&amp;#39;YourSubscriptionID&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy the Template:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &lt;span class="s1"&gt;&amp;#39;YourResourceGroup&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --template-file azureFirewall.bicep &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --parameters &lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myAzureFirewall&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;firewallpolicyName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myAzureFirewallPolicy&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;publicIPName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myFirewallPublicIP&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;vnetAddressPrefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;AzureFirewallSubnet&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;firewallSubnetPrefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-verify-deployment"&gt;&lt;strong&gt;Step 3: Verify Deployment&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Repeat the verification steps from the portal implementation to confirm that your VMs are using Azure Firewall for outbound traffic.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping Up
&lt;/h2&gt;&lt;p&gt;Implementing Azure Firewall provides enhanced security and centralized management for outbound internet access, ensuring your Azure VMs remain securely connected as direct internet access is deprecated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Firewall Enhances Security:&lt;/strong&gt; Comprehensive threat protection and policy management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible Implementation Options:&lt;/strong&gt; Use the Azure Portal for quick setups or Bicep for repeatable, infrastructure-as&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;Here are some additional resources to help you dive deeper into Azure Firewall:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/azure/firewall/overview" target="_blank" rel="noopener"
&gt;Azure Firewall Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/learn/modules/protect-network-resources-with-azure-firewall/" target="_blank" rel="noopener"
&gt;Protect Your Virtual Networks with Azure Firewall&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Navigating the End of Azure VM Direct Internet Access: Part 1 - Implementing NAT Gateway</title><link>https://blog.brewedinthecloud.com/p/azure-vminternet-natgw/</link><pubDate>Thu, 13 Mar 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vminternet-natgw/</guid><description>&lt;p&gt;As Azure transitions away from direct internet access for virtual machines, it&amp;rsquo;s essential to adapt and ensure our applications continue to communicate seamlessly with external resources. In this four-part series, we&amp;rsquo;ll explore robust solutions to maintain outbound internet connectivity for Azure VMs. Kicking off with &lt;strong&gt;Part 1&lt;/strong&gt;, we&amp;rsquo;ll dive deep into implementing &lt;strong&gt;Azure NAT Gateway&lt;/strong&gt; using both the Azure Portal and Bicep templates.&lt;/p&gt;
&lt;h2 id="understanding-the-shift-why-nat-gateway"&gt;Understanding the Shift: Why NAT Gateway?
&lt;/h2&gt;&lt;p&gt;Direct internet access for Azure VMs is being deprecated, signaling a significant shift in how outbound connectivity is handled. The NAT Gateway offers a scalable, secure, and reliable method for managing outbound internet traffic for your virtual networks.&lt;/p&gt;
&lt;h3 id="key-benefits-of-nat-gateway"&gt;&lt;strong&gt;Key Benefits of NAT Gateway:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simplified Management:&lt;/strong&gt; No need for complex user-defined routing or public IP assignments on individual VMs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability:&lt;/strong&gt; Supports high bandwidth scenarios, automatically scaling to meet demand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent IP Addressing:&lt;/strong&gt; Uses static public IP addresses or prefixes, ensuring predictable outbound IPs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Security:&lt;/strong&gt; Reduces exposure by eliminating the need for public IP addresses on VMs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="architecting-the-network-topology"&gt;&lt;strong&gt;Architecting the Network Topology&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Designing an effective network layout is crucial. Here&amp;rsquo;s an illustrative topology:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph LR;
A["VM Subnet &lt;/br&gt;(VMs without PublicIP)"] --&gt;B[NAT Gateway Associated Subnet] --&gt;|NATGW with PIP| C[Internet]
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Key Components:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public IP Addresses or Prefixes:&lt;/strong&gt; Assigns specific public IPs so your outbound connections use predictable and consistent IP addresses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subnet Association:&lt;/strong&gt; Connects to subnets, ensuring all resources within automatically use the NAT Gateway for outbound internet traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Idle Timeout Configuration:&lt;/strong&gt; Manages TCP/UDP connection timeouts, configurable from 4 to 120 minutes to suit your application&amp;rsquo;s needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Design Considerations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scalability and Performance:&lt;/strong&gt; Ensure the NAT Gateway can handle your application&amp;rsquo;s outbound traffic demands without becoming a bottleneck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zonal Redundancy and Availability:&lt;/strong&gt; Deploy in appropriate availability zones to enhance resilience and reduce latency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost Implications:&lt;/strong&gt; Monitor and estimate outbound data since charges are based on hourly usage and data processed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="part-1-implementing-nat-gateway"&gt;Part 1: Implementing NAT Gateway
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s get hands-on and set up a NAT Gateway using both the Azure Portal and Bicep.&lt;/p&gt;
&lt;h3 id="scenario-overview"&gt;&lt;strong&gt;Scenario Overview&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Imagine you have a virtual network with multiple VMs that need outbound internet access. We&amp;rsquo;ll:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a NAT Gateway.&lt;/li&gt;
&lt;li&gt;Associate it with a subnet containing VMs.&lt;/li&gt;
&lt;li&gt;Verify outbound connectivity.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="implementation-using-the-azure-portal"&gt;Implementation Using the Azure Portal
&lt;/h2&gt;&lt;h3 id="step-1-create-a-public-ip-address"&gt;&lt;strong&gt;Step 1: Create a Public IP Address&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navigate to Public IP Addresses:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;In the Azure Portal, search for &lt;strong&gt;&amp;ldquo;Public IP addresses&amp;rdquo;&lt;/strong&gt; and select it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a New Public IP:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;quot;+ Create&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basics Tab:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription:&lt;/strong&gt; Select your subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group:&lt;/strong&gt; Choose an existing one or create new.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; Enter a name, e.g., &lt;code&gt;myNATPublicIP&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region:&lt;/strong&gt; Choose the region of your VNet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP Version:&lt;/strong&gt; IPv4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SKU:&lt;/strong&gt; Standard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assignment:&lt;/strong&gt; Static.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Review + Create&amp;rdquo;&lt;/strong&gt;, then &lt;strong&gt;&amp;ldquo;Create&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-create-the-nat-gateway"&gt;&lt;strong&gt;Step 2: Create the NAT Gateway&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navigate to NAT Gateways:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Search for &lt;strong&gt;&amp;ldquo;NAT gateways&amp;rdquo;&lt;/strong&gt; and select it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a New NAT Gateway:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;quot;+ Create&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basics Tab:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription:&lt;/strong&gt; Your subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group:&lt;/strong&gt; Same as above.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;myNATGateway&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region:&lt;/strong&gt; Same as your VNet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Idle Timeout (Minutes):&lt;/strong&gt; Default is fine unless you have specific needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Associate Public IP:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public IP Addresses:&lt;/strong&gt; Click &lt;strong&gt;&amp;ldquo;Add&amp;rdquo;&lt;/strong&gt; and select &lt;code&gt;myNATPublicIP&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Associate with Subnet:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subnet Tab:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Configure Subnets&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the subnet where your VMs reside.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;OK&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review and Create:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Review + Create&amp;rdquo;&lt;/strong&gt;, ensure validation passes.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;&amp;ldquo;Create&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-verify-outbound-connectivity"&gt;&lt;strong&gt;Step 3: Verify Outbound Connectivity&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Connect to a VM in the Subnet:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Use Remote Desktop Protocol (RDP) or SSH.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check Outbound IP Address:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Open a web browser and navigate to &lt;a class="link" href="https://ifconfig.me/" target="_blank" rel="noopener"
&gt;ifconfig.me&lt;/a&gt; or &lt;a class="link" href="https://ident.me" target="_blank" rel="noopener"
&gt;ident.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Verify that the displayed IP matches &lt;code&gt;myNATPublicIP&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="implementation-using-bicep"&gt;Implementation Using Bicep
&lt;/h2&gt;&lt;p&gt;Now, let&amp;rsquo;s achieve the same using Bicep, Azure&amp;rsquo;s domain-specific language for deploying resources declaratively.&lt;/p&gt;
&lt;div class="info"&gt;
&lt;div class="info-icon"&gt;ℹ️&lt;/div&gt;
&lt;div class="info-content"&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure CLI:&lt;/strong&gt; Ensure you have the latest version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep CLI:&lt;/strong&gt; Comes integrated with Azure CLI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure VNET:&lt;/strong&gt; Azure Virtual Network should already be deployed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.info {
display: flex;
align-items: center;
background-color: #0089e41c;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.info-icon {
font-size: 24px;
margin-right: 10px;
}
.info-content {
flex: 1;
}
&lt;/style&gt;&lt;h3 id="step-1-write-the-bicep-template"&gt;&lt;strong&gt;Step 1: Write the Bicep Template&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Create a file named &lt;code&gt;natGateway.bicep&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Name of the NAT Gateway&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param natGatewayName &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;myNATGateway&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Name of the Public IP Address&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param publicIPName &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;myNATPublicIP&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Name of the Virtual Network&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param vnetName &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Name of the Subnet to associate with NAT Gateway&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param subnetName &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mySubnet&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Location of the resources&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param location &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; resourceGroup&lt;span class="o"&gt;()&lt;/span&gt;.location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@description&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Idle timeout in minutes&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;param idleTimeout &lt;span class="nv"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// Create Public IP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource publicIP &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2024-05-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: publicIPName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location: location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sku: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; publicIPAllocationMethod: &lt;span class="s1"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; publicIPAddressVersion: &lt;span class="s1"&gt;&amp;#39;IPv4&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// Create NAT Gateway
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource natGateway &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/natGateways@2024-05-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: natGatewayName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location: location
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sku: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &lt;span class="s1"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; publicIpAddresses: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; id: publicIP.id
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; idleTimeoutInMinutes: idleTimeout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// Reference existing VNet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource vnet &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: vnetName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// Update Subnet to Associate NAT Gateway
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource subnet &lt;span class="s1"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2024-05-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; parent: vnet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: subnetName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; properties: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; addressPrefix: vnet.properties.addressSpace.addressPrefixes&lt;span class="o"&gt;[&lt;/span&gt;0&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; natGateway: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; id: natGateway.id
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-2-deploy-the-bicep-template"&gt;&lt;strong&gt;Step 2: Deploy the Bicep Template&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Login to Azure:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set the Subscription Context:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az account &lt;span class="nb"&gt;set&lt;/span&gt; --subscription &lt;span class="s1"&gt;&amp;#39;YourSubscriptionID&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy the Template:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &lt;span class="s1"&gt;&amp;#39;YourResourceGroup&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --template-file natGateway.bicep &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --parameters &lt;span class="nv"&gt;natGatewayName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myNATGateway&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;publicIPName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myNATPublicIP&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mySubnet&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-verify-deployment"&gt;&lt;strong&gt;Step 3: Verify Deployment&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Repeat the verification steps from the portal implementation to confirm that your VMs are using the NAT Gateway for outbound traffic.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping Up
&lt;/h2&gt;&lt;p&gt;Implementing a NAT Gateway is a vital step in adapting to the deprecation of direct internet access for Azure VMs. By using both the Azure Portal and Bicep, we&amp;rsquo;ve explored flexible methods to deploy and manage NAT Gateways, catering to different preferences and operational needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NAT Gateway Simplifies Outbound Connectivity:&lt;/strong&gt; It streamlines internet access management for your VMs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bicep Offers Infrastructure as Code Benefits:&lt;/strong&gt; Enables repeatable, version-controlled deployments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Explore &lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/nat-gateway/nat-overview" target="_blank" rel="noopener"
&gt;Azure NAT Gateway Documentation&lt;/a&gt; for in-depth knowledge.&lt;/li&gt;
&lt;li&gt;Check out &lt;a class="link" href="https://learn.microsoft.com/azure/azure-resource-manager/bicep/learn-bicep" target="_blank" rel="noopener"
&gt;Bicep Learning Path&lt;/a&gt; to master infrastructure as code on Azure.&lt;/li&gt;
&lt;li&gt;Experiment with Azure&amp;rsquo;s &lt;a class="link" href="https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview" target="_blank" rel="noopener"
&gt;Network Watcher&lt;/a&gt; to monitor and diagnose network issues.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Arc Update Management: Elevating Your Non-Azure Virtual Machines - Part 5 of 5</title><link>https://blog.brewedinthecloud.com/p/azure-arc-updatemgr/</link><pubDate>Sat, 22 Feb 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-arc-updatemgr/</guid><description>&lt;p&gt;Welcome to the final installment of our deep dive into &lt;strong&gt;Azure Arc&lt;/strong&gt;! Throughout this series, we&amp;rsquo;ve explored how Azure Arc empowers organisations to unify hybrid environments, optimize licensing, and enhance monitoring. In &lt;strong&gt;Part 5&lt;/strong&gt;, we&amp;rsquo;ll focus on &lt;strong&gt;Azure Arc Update Management&lt;/strong&gt; and how you can leverage &lt;strong&gt;Azure Update Manager&lt;/strong&gt; to maintain your non-Azure virtual machines. As organisations seek more efficient ways to manage updates across diverse infrastructures, Azure Arc offers a modern, streamlined solution.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s unravel how to transition from traditional update management tools to a unified approach that keeps your servers secure and compliant.&lt;/p&gt;
&lt;h2 id="the-evolution-of-update-management"&gt;The Evolution of Update Management
&lt;/h2&gt;&lt;p&gt;Managing updates for servers has always been critical for security and performance. Traditional tools like &lt;strong&gt;Windows Server Update Services (WSUS)&lt;/strong&gt; have been staples in on-premises environments. However, with the growing complexity of hybrid infrastructures, there&amp;rsquo;s a need for more scalable and flexible solutions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Challenges with Traditional Update Management:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complexity in Hybrid Environments:&lt;/strong&gt; Managing updates across on-premises, cloud, and edge devices becomes cumbersome.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limited Scalability:&lt;/strong&gt; Scaling WSUS to accommodate growing environments can be resource-intensive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance Overhead:&lt;/strong&gt; Managing infrastructure, databases, and storage for WSUS adds operational overhead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lack of Integration:&lt;/strong&gt; Difficulty integrating with modern DevOps practices and automated workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Enter Azure Update Manager with Azure Arc.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="introducing-azure-update-manager-with-azure-arc"&gt;Introducing Azure Update Manager with Azure Arc
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Azure Update Manager&lt;/strong&gt; is a feature within &lt;strong&gt;Azure Automation&lt;/strong&gt; that provides a unified way to manage updates for both Windows and Linux systems across hybrid environments. When combined with &lt;strong&gt;Azure Arc&lt;/strong&gt;, it extends these capabilities to your non-Azure virtual machines, allowing you to manage updates from a single platform.&lt;/p&gt;
&lt;h3 id="key-benefits"&gt;&lt;strong&gt;Key Benefits:&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unified Management:&lt;/strong&gt; Centralize update management for all servers, regardless of where they reside.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability:&lt;/strong&gt; Easily scale to manage thousands of servers without the need for additional infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation and Scheduling:&lt;/strong&gt; Automate update deployments and schedule maintenance windows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance and Reporting:&lt;/strong&gt; Gain insights into update compliance and generate reports.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration with DevOps:&lt;/strong&gt; Incorporate update management into CI/CD pipelines and automation scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setting-up-azure-update-manager-for-non-azure-virtual-machines"&gt;Setting Up Azure Update Manager for Non-Azure Virtual Machines
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s dive into how you can set up Azure Update Manager with Azure Arc to manage updates on your non-Azure virtual machines.&lt;/p&gt;
&lt;h3 id="prerequisites"&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Subscription:&lt;/strong&gt; An active subscription with necessary permissions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Arc-enabled Servers:&lt;/strong&gt; Your non-Azure VMs should be onboarded to Azure Arc. Refer to &lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-arc-deployscale/" target="_blank" rel="noopener"
&gt;Azure Arc Deployment: Mastering Installations with Scale - Part 2 of 5&lt;/a&gt; for guidance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Connectivity:&lt;/strong&gt; Outbound internet access on ports 443 and 80 from the servers to Azure services.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-1-enable-update-management-center"&gt;&lt;strong&gt;Step 1: Enable Update Management Center&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;The &lt;strong&gt;Azure Update Manager&lt;/strong&gt; (formerly known as &lt;strong&gt;Update Management Center&lt;/strong&gt;) is the hub for managing updates.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navigate to Azure Update Manager&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;In the Azure Portal, search for &lt;strong&gt;Update Manager&lt;/strong&gt; or navigate to &lt;strong&gt;Azure Services&lt;/strong&gt; &amp;gt; &lt;strong&gt;Update Manager&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable Update Management&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Machines&lt;/strong&gt; from the left-hand menu.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Get Started&lt;/strong&gt; to enable Update Manager if it&amp;rsquo;s not already active.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-configure-non-azure-machines"&gt;&lt;strong&gt;Step 2: Configure Non-Azure Machines&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Now, let&amp;rsquo;s configure your non-Azure virtual machines for update management.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Select Your Arc-enabled Servers&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;In Update Manager, go to &lt;strong&gt;Machines&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Add Machines&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Azure Arc-enabled Servers&lt;/strong&gt; from the options.&lt;/li&gt;
&lt;li&gt;Choose the servers you wish to manage and click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install the Azure Monitor Agent&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;The Azure Monitor Agent (AMA) is required for Update Manager.&lt;/li&gt;
&lt;li&gt;During the onboarding process, you&amp;rsquo;ll be prompted to install the agent.&lt;/li&gt;
&lt;li&gt;Follow the on-screen instructions to deploy the agent to your servers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-assess-update-compliance"&gt;&lt;strong&gt;Step 3: Assess Update Compliance&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Understanding the current update status of your machines is crucial.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;View Compliance Overview&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;In Update Manager, select &lt;strong&gt;Machines&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ll see a compliance overview indicating which updates are missing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drill Down into Details&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Click on a specific server to view detailed information about missing updates.&lt;/li&gt;
&lt;li&gt;Explore categories like &lt;strong&gt;Critical Updates&lt;/strong&gt;, &lt;strong&gt;Security Updates&lt;/strong&gt;, and &lt;strong&gt;Update Rollups&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-4-create-and-schedule-update-deployments"&gt;&lt;strong&gt;Step 4: Create and Schedule Update Deployments&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Automate the deployment of updates by creating schedules.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create an Update Deployment&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;In Update Manager, select &lt;strong&gt;Update Deployments&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;+ Create&lt;/strong&gt; to start a new deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configure Deployment Settings&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Provide a meaningful name (e.g., &lt;code&gt;Monthly_Patch_Deployment&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machines&lt;/strong&gt;: Select the target Arc-enabled servers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update Classifications&lt;/strong&gt;: Choose the types of updates (e.g., Security, Critical).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Include/Exclude Updates&lt;/strong&gt;: Specify any updates to include or exclude if needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schedule Deployment&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Time&lt;/strong&gt;: Set the date and time for the deployment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recurring Schedule&lt;/strong&gt;: If desired, configure the deployment to recur (e.g., monthly).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance Window&lt;/strong&gt;: Define how long the deployment can run.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pre-Scripts and Post-Scripts (Optional)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Configure scripts to run before or after the update deployment for custom actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review and Create&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Verify all settings and click &lt;strong&gt;Create&lt;/strong&gt; to schedule the deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-5-monitor-deployment-progress"&gt;&lt;strong&gt;Step 5: Monitor Deployment Progress&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Stay informed about the status of your deployments.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;View Deployment Status&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;In Update Manager, go to &lt;strong&gt;Update Deployments&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the deployment to view progress and results.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for Errors&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Review any errors or issues that occurred during the deployment.&lt;/li&gt;
&lt;li&gt;Use logs and detailed error messages to troubleshoot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-6-automate-with-azure-policy"&gt;&lt;strong&gt;Step 6: Automate with Azure Policy&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Ensure compliance and automate onboarding using Azure Policy.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Assign Built-in Policies&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Azure Policy&lt;/strong&gt; in the Azure Portal.&lt;/li&gt;
&lt;li&gt;Assign policies like &lt;strong&gt;Configure machines to automatically install the Azure Monitor Agent&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automate Agent Installation&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Policies can automatically deploy the Azure Monitor Agent to new servers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ensure Compliance&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Regularly review compliance reports to identify non-compliant resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="enhancing-update-management-with-additional-features"&gt;Enhancing Update Management with Additional Features
&lt;/h2&gt;&lt;h3 id="integration-with-change-management"&gt;&lt;strong&gt;Integration with Change Management&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Automation Change Tracking and Inventory&lt;/strong&gt; can track changes on your servers, providing insights into update impact.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="alerts-and-notifications"&gt;&lt;strong&gt;Alerts and Notifications&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Set up alerts to notify you of deployment successes, failures, or compliance issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="role-based-access-control-rbac"&gt;&lt;strong&gt;Role-Based Access Control (RBAC)&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Use Azure RBAC to control who can view or manage updates, enhancing security.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="custom-reporting"&gt;&lt;strong&gt;Custom Reporting&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Utilize &lt;strong&gt;Workbooks&lt;/strong&gt; in Azure Monitor to create custom reports and dashboards.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="advantages-over-traditional-wsus"&gt;Advantages Over Traditional WSUS
&lt;/h2&gt;&lt;p&gt;While WSUS has served organisations well, Azure Update Manager with Azure Arc offers several advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloud-Based Management:&lt;/strong&gt; No need to maintain on-premises update infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-Platform Support:&lt;/strong&gt; Manage updates for both Windows and Linux servers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global Scalability:&lt;/strong&gt; Easily scale to manage updates across global infrastructures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrated Security:&lt;/strong&gt; Seamlessly integrate with Azure Security Center for enhanced protection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost Efficiency:&lt;/strong&gt; Reduce costs associated with maintaining WSUS servers and storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="real-world-scenario"&gt;Real-World Scenario
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Company XYZ&lt;/strong&gt; operates a hybrid infrastructure with servers on-premises and in multiple clouds. They traditionally used WSUS for updates but faced challenges with scalability and maintenance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution with Azure Arc and Update Manager:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unified Update Management:&lt;/strong&gt; Onboarded all servers to Azure Arc and enabled Update Manager.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated Deployments:&lt;/strong&gt; Scheduled regular update deployments during maintenance windows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability:&lt;/strong&gt; Easily managed updates across hundreds of servers without additional infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Compliance:&lt;/strong&gt; Achieved higher compliance rates with automated policies and reporting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Outcome:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reduced Operational Overhead:&lt;/strong&gt; Eliminated the need to manage WSUS servers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved Security Posture:&lt;/strong&gt; Ensured timely deployment of critical security updates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Increased Efficiency:&lt;/strong&gt; Streamlined update processes, freeing up IT resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Transitioning to Azure Update Manager with Azure Arc revolutionizes how you maintain your non-Azure virtual machines. By embracing this modern, cloud-based approach, you benefit from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simplified Operations:&lt;/strong&gt; Manage all updates from a centralized platform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Security:&lt;/strong&gt; Keep systems up-to-date with the latest patches.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational Efficiency:&lt;/strong&gt; Reduce the time and resources spent on update management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future-Proofing:&lt;/strong&gt; Adopt a solution that evolves with your infrastructure needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As the IT landscape continues to evolve, leveraging tools like Azure Arc ensures you&amp;rsquo;re equipped to handle the complexities of hybrid environments with confidence and agility.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;To dive deeper into Azure Update Manager and Azure Arc, explore these Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/update-management-center/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Update Management Center Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/update-management-center/manage-machines?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Manage Machines with Azure Update Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-arc/servers/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Arc-enabled Servers Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/governance/policy/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Use Azure Policy to Manage Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/agents/azure-monitor-agent-windows-client?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Automate Azure Monitor Agent Deployment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="final-thoughts"&gt;Final Thoughts
&lt;/h2&gt;&lt;p&gt;This brings us to the end of our &lt;strong&gt;Azure Arc&lt;/strong&gt; series. Throughout these five parts, we&amp;rsquo;ve journeyed through:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Introduction to Azure Arc&lt;/strong&gt;: Unveiling its transformative capabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment Strategies&lt;/strong&gt;: Mastering Installations with Scale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Licensing Benefits&lt;/strong&gt;: Maximizing Windows and SQL Server investments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring Non-Azure Machines&lt;/strong&gt;: Harnessing Azure Monitor&amp;rsquo;s power.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update Management&lt;/strong&gt;: Elevating your update strategy with Azure Update Manager.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By integrating Azure Arc into your operations, you&amp;rsquo;re not just adopting a set of tools—you&amp;rsquo;re paving the way for a unified, efficient, and future-ready IT environment. The synergy between Azure Arc and Azure services propels your organisation toward innovation and resilience.&lt;/p&gt;</description></item><item><title>Azure Arc Monitoring: Leveraging Azure Monitor in On-Premises Machines - Part 4 of 5</title><link>https://blog.brewedinthecloud.com/p/azure-arc-monitoring/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-arc-monitoring/</guid><description>&lt;p&gt;Welcome back to our deep dive into &lt;strong&gt;Azure Arc&lt;/strong&gt;! In &lt;strong&gt;Part 3&lt;/strong&gt;, we explored how Azure Arc can optimize your Windows and SQL Server licensing costs. Today, in &lt;strong&gt;Part 4&lt;/strong&gt;, we&amp;rsquo;re focusing on harnessing the power of &lt;strong&gt;Azure Monitor&lt;/strong&gt; for your on-premises machines using Azure Arc.&lt;/p&gt;
&lt;p&gt;Imagine having a single dashboard that shows the health and performance of all your servers, whether they&amp;rsquo;re in Azure, on-premises, or in another cloud. With Azure Arc and Azure Monitor, this isn&amp;rsquo;t just a dream—it&amp;rsquo;s your new reality. Let&amp;rsquo;s unravel how to set up Azure Arc Monitoring for your non-Azure virtual machines and unlock comprehensive insights into your infrastructure.&lt;/p&gt;
&lt;h2 id="understanding-azure-monitor-with-azure-arc"&gt;Understanding Azure Monitor with Azure Arc
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Azure Monitor&lt;/strong&gt; is a powerful service that maximizes the availability and performance of your applications and services. By integrating it with &lt;strong&gt;Azure Arc-enabled servers&lt;/strong&gt;, you can extend Azure&amp;rsquo;s robust monitoring capabilities to machines residing outside of Azure.&lt;/p&gt;
&lt;h3 id="key-benefits"&gt;&lt;strong&gt;Key Benefits&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unified Monitoring&lt;/strong&gt;: Centrally monitor on-premises and cloud resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deep Insights&lt;/strong&gt;: Collect and analyze logs and metrics for actionable insights.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proactive Alerting&lt;/strong&gt;: Set up alerts to notify you of critical issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance Optimization&lt;/strong&gt;: Identify and resolve performance bottlenecks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setting-up-azure-arc-monitoring-for-non-azure-virtual-machines"&gt;Setting Up Azure Arc Monitoring for Non-Azure Virtual Machines
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s walk through the step-by-step process to set up Azure Monitor for your on-premises Windows or Linux virtual machines using Azure Arc.&lt;/p&gt;
&lt;h3 id="prerequisites"&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Subscription&lt;/strong&gt;: An active subscription to Azure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Arc-enabled Servers&lt;/strong&gt;: Your non-Azure virtual machines should be onboarded to Azure Arc. (Refer to &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-arc/servers/onboard-windows-server?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Arc Onboarding&lt;/a&gt; for assistance.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Connectivity&lt;/strong&gt;: Outbound internet access on port 443 from the servers to Azure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log Analytics Workspace&lt;/strong&gt;: A workspace in Azure to store collected logs and metrics.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-1-prepare-your-log-analytics-workspace"&gt;&lt;strong&gt;Step 1: Prepare Your Log Analytics Workspace&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;A &lt;strong&gt;Log Analytics Workspace&lt;/strong&gt; is essential for data ingestion and analysis.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create a Log Analytics Workspace&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Navigate&lt;/strong&gt;: In the Azure Portal, search for and select &lt;strong&gt;Log Analytics workspaces&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create Workspace&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;+ Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscription&lt;/strong&gt;: Choose your Azure subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;: Select an existing group or create a new one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Provide a unique name (e.g., &lt;code&gt;ArcMonitoringWorkspace&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region&lt;/strong&gt;: Select the closest region to your on-premises infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review and Create&lt;/strong&gt;: Validate the information and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note Workspace Details&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Workspace ID&lt;/strong&gt; and &lt;strong&gt;Primary Key&lt;/strong&gt;: You&amp;rsquo;ll need these for agent configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-install-the-azure-monitor-agent"&gt;&lt;strong&gt;Step 2: Install the Azure Monitor Agent&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;The &lt;strong&gt;Azure Monitor Agent (AMA)&lt;/strong&gt; replaces older monitoring agents and provides enhanced capabilities.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Add the Azure Monitor Agent Extension&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Navigate&lt;/strong&gt;: Go to your &lt;strong&gt;Arc-enabled server&lt;/strong&gt; in the Azure Portal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select Extensions&lt;/strong&gt;: Under &lt;strong&gt;Settings&lt;/strong&gt;, click on &lt;strong&gt;Extensions + applications&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Extension&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;+ Add&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;AzureMonitorWindowsAgent&lt;/strong&gt; (for Windows) or &lt;strong&gt;AzureMonitorLinuxAgent&lt;/strong&gt; (for Linux).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configure the Agent&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data Collection Rule (DCR)&lt;/strong&gt;: You can associate the agent with a DCR now or later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review and Install&lt;/strong&gt;: Confirm the settings and click &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-create-data-collection-rules"&gt;&lt;strong&gt;Step 3: Create Data Collection Rules&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Data Collection Rules&lt;/strong&gt; define what data is collected by the agent and where it&amp;rsquo;s sent.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create a Data Collection Rule&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Navigate&lt;/strong&gt;: Search for &lt;strong&gt;Data Collection Rules&lt;/strong&gt; in the Azure Portal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create Rule&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;+ Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basics&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription&lt;/strong&gt; and &lt;strong&gt;Resource Group&lt;/strong&gt;: Select the same as your workspace.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region&lt;/strong&gt;: Must match the workspace region.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Provide a name (e.g., &lt;code&gt;ArcServerMetricsDCR&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Define Resources&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;+ Add resources&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope&lt;/strong&gt;: Select &lt;strong&gt;Arc Server&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select Resources&lt;/strong&gt;: Choose the servers you want to monitor.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configure Data Sources&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows Performance Counters&lt;/strong&gt; (for Windows servers):
&lt;ul&gt;
&lt;li&gt;Add counters like &lt;code&gt;\\Processor(_Total)\\% Processor Time&lt;/code&gt;, &lt;code&gt;\\Memory\\Available MBytes&lt;/code&gt;, &lt;code&gt;\\LogicalDisk(_Total)\\% Free Space&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Syslog and Linux Performance Counters&lt;/strong&gt; (for Linux servers):
&lt;ul&gt;
&lt;li&gt;Define relevant syslog facilities and performance counters.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set Destinations&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Select Destination&lt;/strong&gt;: Choose your &lt;strong&gt;Log Analytics workspace&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review and Create&lt;/strong&gt;: Validate all settings and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-4-verify-data-ingestion"&gt;&lt;strong&gt;Step 4: Verify Data Ingestion&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Ensure data is flowing into Azure Monitor.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Run Log Queries&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Navigate&lt;/strong&gt;: Go to your &lt;strong&gt;Log Analytics workspace&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Logs&lt;/strong&gt;: Under &lt;strong&gt;General&lt;/strong&gt;, select &lt;strong&gt;Logs&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sample Queries&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows Event Logs&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Event
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where TimeGenerated &amp;gt; ago(1h)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize count() by Source
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance Metrics&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Perf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where TimeGenerated &amp;gt; ago(1h)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize avg(CounterValue) by CounterName
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run Query&lt;/strong&gt;: Execute the query to see if data is present.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check Agent Health&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Navigate&lt;/strong&gt;: In the Azure Portal, go to &lt;strong&gt;Azure Monitor&lt;/strong&gt; &amp;gt; &lt;strong&gt;Agents&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Health&lt;/strong&gt;: Review the status of your agents to ensure they&amp;rsquo;re healthy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-5-create-alerts-and-visualize-data"&gt;&lt;strong&gt;Step 5: Create Alerts and Visualize Data&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Proactively monitor your servers by setting up alerts and dashboards.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Set Up Alerts&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Navigate&lt;/strong&gt;: In Azure Monitor, select &lt;strong&gt;Alerts&lt;/strong&gt; &amp;gt; &lt;strong&gt;+ New alert rule&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Define Alert Rule&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scope&lt;/strong&gt;: Select your Log Analytics workspace.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Condition&lt;/strong&gt;: Use a &lt;strong&gt;Custom log search&lt;/strong&gt; to define the criteria.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action Group&lt;/strong&gt;: Create or select an action group for notifications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alert Details&lt;/strong&gt;: Provide a name and description.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create Alert&lt;/strong&gt;: Review and create the alert rule.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build Dashboards&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Workbooks&lt;/strong&gt;: Use &lt;strong&gt;Azure Monitor Workbooks&lt;/strong&gt; to create rich visual reports.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Templates&lt;/strong&gt;: Utilize built-in templates like &lt;strong&gt;Performance Monitoring&lt;/strong&gt; or &lt;strong&gt;Agent Health&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customization&lt;/strong&gt;: Tailor the workbooks to display metrics and logs relevant to your environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pin to Dashboard&lt;/strong&gt;: Add important charts and graphs to your Azure Portal dashboard for quick access.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="additional-insights"&gt;Additional Insights
&lt;/h2&gt;&lt;h3 id="leverage-insights-for-servers"&gt;&lt;strong&gt;Leverage Insights for Servers&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Azure Monitor offers &lt;strong&gt;Insights&lt;/strong&gt; specifically designed for servers.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Enable VM Insights&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Navigate&lt;/strong&gt;: Go to your &lt;strong&gt;Arc-enabled server&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Insights&lt;/strong&gt;: Under &lt;strong&gt;Monitoring&lt;/strong&gt;, select &lt;strong&gt;Insights&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable&lt;/strong&gt;: Click on &lt;strong&gt;Enable&lt;/strong&gt; if not already activated.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explore Metrics&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: View CPU, memory, and disk utilization trends.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maps&lt;/strong&gt;: Visualize connections between processes and external systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logs&lt;/strong&gt;: Dive deep into collected logs for troubleshooting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="integrate-with-azure-security-center"&gt;&lt;strong&gt;Integrate with Azure Security Center&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Enhance security by integrating with &lt;strong&gt;Azure Security Center&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Enable Security Center&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Navigate&lt;/strong&gt;: In the Azure Portal, go to &lt;strong&gt;Azure Security Center&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;: Follow prompts to enable it for your subscription.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assess Security Posture&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recommendations&lt;/strong&gt;: Review suggestions for improving security on your Arc-enabled servers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Threat Protection&lt;/strong&gt;: Enable threat detection features for real-time alerts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="automate-at-scale"&gt;&lt;strong&gt;Automate at Scale&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;For larger environments, automation ensures consistency.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scripts&lt;/strong&gt;: Deploy agents and configure monitoring using scripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policies&lt;/strong&gt;: Use &lt;strong&gt;Azure Policy&lt;/strong&gt; to enforce compliance and auto-remediate issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration Management&lt;/strong&gt;: Integrate with tools like &lt;strong&gt;Azure Automation State Configuration&lt;/strong&gt; or &lt;strong&gt;Desired State Configuration (DSC)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;By integrating Azure Monitor with your on-premises machines via Azure Arc, you&amp;rsquo;re breaking down silos and achieving a holistic view of your infrastructure. This unified monitoring approach not only simplifies operations but also empowers you to be proactive in maintaining system health.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Centralized Visibility&lt;/strong&gt;: Monitor all servers from a single platform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proactive Management&lt;/strong&gt;: Detect and resolve issues before they impact users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Security&lt;/strong&gt;: Leverage Azure&amp;rsquo;s security features across your environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalable Solutions&lt;/strong&gt;: Easily extend monitoring as your infrastructure grows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For further reading and detailed tutorials, check out these Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/agents/azure-monitor-agent-manage?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Monitor servers with Azure Monitor Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/vm/azure-arc-virtual-machine-query?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Monitor for virtual machines (Azure Arc)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/agents/data-collection-rule-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Collect logs and metrics with Azure Monitor Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/agents/data-collection-rule-create-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Use Data Collection Rules to collect data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/visualize/workbooks-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Monitor Workbooks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Arc Licensing Benefits: Windows and SQL Server Licensing - Part 3 of 5</title><link>https://blog.brewedinthecloud.com/p/azure-arc-licensingbenfits/</link><pubDate>Sat, 08 Feb 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-arc-licensingbenfits/</guid><description>&lt;p&gt;Welcome back to our comprehensive series on &lt;strong&gt;Azure Arc&lt;/strong&gt;! In &lt;strong&gt;Part 1&lt;/strong&gt;, we introduced you to Azure Arc&amp;rsquo;s transformative capabilities, and in &lt;strong&gt;Part 2&lt;/strong&gt;, we explored deployment strategies to integrate your infrastructure seamlessly. Today, in &lt;strong&gt;Part 3&lt;/strong&gt;, we&amp;rsquo;ll dive into how Azure Arc can optimize your Windows and SQL Server licensing costs through &lt;strong&gt;Pay-As-You-Go (PAYG)&lt;/strong&gt; and &lt;strong&gt;Azure Hybrid Benefit&lt;/strong&gt;, especially beneficial for those with &lt;strong&gt;Software Assurance&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s uncover how Azure Arc not only unifies your hybrid environment but also enhances your licensing strategy to drive significant cost savings.&lt;/p&gt;
&lt;h2 id="understanding-the-licensing-landscape"&gt;Understanding the Licensing Landscape
&lt;/h2&gt;&lt;p&gt;Managing licenses for Windows Server and SQL Server across on-premises, cloud, and edge environments can be complex and costly. Traditional licensing models often don&amp;rsquo;t provide the flexibility needed for dynamic, modern workloads. organisations face challenges like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Underutilized Licenses&lt;/strong&gt;: Paying for licenses that aren&amp;rsquo;t fully utilized due to fluctuating workloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance Management&lt;/strong&gt;: Ensuring all deployments meet licensing agreements to avoid penalties.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Budget Constraints&lt;/strong&gt;: High upfront costs for acquiring licenses hindering scalability.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure Arc addresses these challenges by providing flexible licensing options that align with your hybrid strategy.&lt;/p&gt;
&lt;h2 id="azure-hybrid-benefit-with-azure-arc"&gt;Azure Hybrid Benefit with Azure Arc
&lt;/h2&gt;&lt;h3 id="what-is-azure-hybrid-benefit"&gt;What is Azure Hybrid Benefit?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Azure Hybrid Benefit&lt;/strong&gt; is a licensing offer that helps you significantly reduce the costs of running workloads in the cloud. It allows you to use your &lt;strong&gt;existing on-premises licenses&lt;/strong&gt; with &lt;strong&gt;Software Assurance&lt;/strong&gt; to pay a reduced rate when migrating or extending to Azure services.&lt;/p&gt;
&lt;h3 id="key-advantages"&gt;&lt;strong&gt;Key Advantages&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cost Savings&lt;/strong&gt;: Save up to 85% compared to pay-as-you-go rates for Windows Server and SQL Server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;License Mobility&lt;/strong&gt;: Use licenses both on-premises and in Azure, perfect for hybrid deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Investment Maximization&lt;/strong&gt;: Leverage existing investments in Windows and SQL Server licenses.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="leveraging-azure-hybrid-benefit-with-azure-arc-enabled-servers"&gt;Leveraging Azure Hybrid Benefit with Azure Arc-enabled Servers
&lt;/h3&gt;&lt;p&gt;Azure Arc extends the Azure Hybrid Benefit to your on-premises and multi-cloud servers. Here&amp;rsquo;s how:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Connect Your Servers to Azure Arc&lt;/strong&gt;: Onboard your Windows Servers and SQL Servers to Azure Arc for unified management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apply Azure Hybrid Benefit&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;In the Azure Portal, navigate to your &lt;strong&gt;Arc-enabled server&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, select &lt;strong&gt;Configuration&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Azure Hybrid Benefit&lt;/strong&gt; by confirming you have active Software Assurance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor Compliance and Usage&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Use Azure Policy and compliance tools to ensure you meet licensing requirements.&lt;/li&gt;
&lt;li&gt;Regularly review your usage to optimize license allocation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unified Billing&lt;/strong&gt;: Consolidate your licensing costs through Azure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;: Easily move licenses between on-premises and cloud environments as your needs change.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplified Compliance&lt;/strong&gt;: Azure tracks license usage, simplifying audits and reporting.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pay-as-you-go-licensing-with-azure-arc"&gt;Pay-As-You-Go Licensing with Azure Arc
&lt;/h2&gt;&lt;h3 id="understanding-pay-as-you-go-payg-licensing"&gt;Understanding Pay-As-You-Go (PAYG) Licensing
&lt;/h3&gt;&lt;p&gt;PAYG licensing allows you to pay for Windows Server and SQL Server licenses on an hourly or monthly basis through your Azure subscription. This model is ideal for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Variable Workloads&lt;/strong&gt;: Environments where workloads scale up or down frequently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Short-Term Projects&lt;/strong&gt;: Temporary deployments where purchasing perpetual licenses isn&amp;rsquo;t cost-effective.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Budget-Friendly Options&lt;/strong&gt;: Avoiding large upfront investments and paying only for what you use.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="implementing-payg-licensing-on-azure-arc-enabled-servers"&gt;Implementing PAYG Licensing on Azure Arc-enabled Servers
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;For Windows Server&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic Detection&lt;/strong&gt;: When you connect a Windows Server to Azure Arc, Azure can detect it doesn&amp;rsquo;t have an activated license.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable PAYG&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;In the Azure Portal, go to your &lt;strong&gt;Arc-enabled Windows Server&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, select &lt;strong&gt;Extensions + applications&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Install the &lt;strong&gt;Windows Server PAYG Extension&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Billing&lt;/strong&gt;: Azure begins billing for the Windows Server license as part of your subscription.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For SQL Server&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SQL Server Extension&lt;/strong&gt;: Install the &lt;strong&gt;Azure Arc-enabled SQL Server extension&lt;/strong&gt; on your server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enable PAYG Licensing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;During configuration, opt into &lt;strong&gt;Pay-As-You-Go licensing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;This activates the SQL Server licensing meter in Azure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cost Management&lt;/strong&gt;: Monitor costs in the &lt;strong&gt;Cost Management + Billing&lt;/strong&gt; section in Azure.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scalable Costs&lt;/strong&gt;: Align licensing costs directly with usage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Software Assurance Required&lt;/strong&gt;: PAYG licensing doesn&amp;rsquo;t require existing licenses or Software Assurance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Up-to-Date Software&lt;/strong&gt;: Access to the latest features and security updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="maximizing-software-assurance-with-azure-arc"&gt;Maximizing Software Assurance with Azure Arc
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Software Assurance&lt;/strong&gt; provides benefits like license mobility, version upgrades, and support. With Azure Arc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extended License Mobility&lt;/strong&gt;: Use your Software Assurance to cover workloads on-premises and across clouds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified Updates&lt;/strong&gt;: Streamline updates and patches through Azure Update Management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Support&lt;/strong&gt;: Benefit from Azure&amp;rsquo;s support ecosystem for hybrid scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Practical Steps&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Assess Your Current Licenses&lt;/strong&gt;: Identify licenses with active Software Assurance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plan Your Hybrid Deployment&lt;/strong&gt;: Decide which workloads to extend to Azure using Azure Arc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apply Azure Hybrid Benefit&lt;/strong&gt;: Enable the benefit on your Arc-enabled servers to start saving.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="real-world-example"&gt;Real-World Example
&lt;/h2&gt;&lt;h3 id="scenario-financial-services-firm-optimizes-licensing-costs"&gt;Scenario: Financial Services Firm Optimizes Licensing Costs
&lt;/h3&gt;&lt;p&gt;A financial services company operates critical applications on SQL Server across its on-premises datacenters and in the cloud. They faced high licensing costs and complex compliance requirements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution with Azure Arc&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enabled Azure Hybrid Benefit&lt;/strong&gt;: Leveraged existing SQL Server licenses with Software Assurance across all environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implemented PAYG Licensing&lt;/strong&gt;: Used PAYG for additional temporary servers during peak processing times, avoiding unnecessary license purchases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Centralized Management&lt;/strong&gt;: Monitored all server licenses and compliance through the Azure Portal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Results&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cost Reduction&lt;/strong&gt;: Achieved up to 50% savings on licensing costs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplified Compliance&lt;/strong&gt;: Streamlined audit preparations with unified reporting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational Flexibility&lt;/strong&gt;: Scaled workloads efficiently without licensing delays.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Arc empowers organisations to optimize licensing costs and simplify management for Windows Server and SQL Server across hybrid environments. By harnessing Azure Hybrid Benefit and PAYG licensing, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Significantly Reduce Costs&lt;/strong&gt;: Utilize existing investments and pay only for what you need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhance Flexibility&lt;/strong&gt;: Adapt quickly to changing workload demands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplify Compliance Management&lt;/strong&gt;: Use Azure&amp;rsquo;s tools to maintain compliance effortlessly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Incorporating these licensing strategies with Azure Arc not only maximizes the value of your existing licenses but also aligns your IT spending with actual usage, driving efficiency and fiscal responsibility.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;Deepen your understanding with these Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-machines/windows/hybrid-use-benefit-licensing?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Hybrid Benefit for Windows Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-sql/azure-hybrid-benefit?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Hybrid Benefit for SQL Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-arc/servers/license-extended-security-updates#software-assuranceservices-provider-license-agreement-conformance?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Use Azure Hybrid Benefit with Azure Arc-enabled Servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-arc/servers/cloud-native/licensing-cost-management#sql-server-pay-as-you-go?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Pay-As-You-Go Licensing for Azure Arc-enabled SQL Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Arc Deployment: Mastering Installations with Scale - Part 2 of 5</title><link>https://blog.brewedinthecloud.com/p/azure-arc-deployscale/</link><pubDate>Sat, 01 Feb 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-arc-deployscale/</guid><description>&lt;p&gt;Welcome back to our &lt;strong&gt;Azure Arc&lt;/strong&gt; series! In &lt;strong&gt;Part 1&lt;/strong&gt;, we introduced you to the transformative capabilities of Azure Arc and walked through onboarding a Windows virtual machine using a PowerShell script. In &lt;strong&gt;Part 2&lt;/strong&gt;, we&amp;rsquo;ll dive deeper into deploying Azure Arc using &lt;strong&gt;service principals&lt;/strong&gt; to enhance security and automation. We&amp;rsquo;ll explore various methods including automation scripts, managed installations with &lt;strong&gt;SCCM&lt;/strong&gt; and &lt;strong&gt;GPO&lt;/strong&gt;, all leveraging service principals where possible.&lt;/p&gt;
&lt;p&gt;By integrating service principals into your deployment process, you ensure secure, scalable, and efficient management of your hybrid environment.&lt;/p&gt;
&lt;h2 id="azure-arc-deployment-strategies-with-service-principals"&gt;Azure Arc Deployment Strategies with Service Principals
&lt;/h2&gt;&lt;p&gt;Deploying Azure Arc-enabled servers efficiently is crucial for organisations managing resources across diverse environments. Using service principals allows us to automate deployments securely without relying on user credentials. Let&amp;rsquo;s explore different deployment methods:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Automated Deployment Using Scripts with Service Principals&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed Installations with SCCM Using Service Principals&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed Installations with GPO Using Service Principals&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual Installation (Interactive Login)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="1-automated-deployment-using-scripts-with-service-principals"&gt;1. Automated Deployment Using Scripts with Service Principals
&lt;/h3&gt;&lt;p&gt;Automation ensures consistency and efficiency, especially when onboarding multiple servers.&lt;/p&gt;
&lt;h3 id="using-powershell-scripts-with-service-principals"&gt;&lt;strong&gt;Using PowerShell Scripts with Service Principals&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Why Use Service Principals?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Secure Automation&lt;/strong&gt;: Avoid embedding personal credentials in scripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Least Privilege Access&lt;/strong&gt;: Assign only necessary permissions to the service principal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Automate onboarding across numerous servers securely.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;Azure Active Directory (AD) Service Principal&lt;/strong&gt; with the required permissions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Connected Machine Agent&lt;/strong&gt; installer accessible on target servers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure PowerShell&lt;/strong&gt; module installed on target servers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step-by-Step Guide:&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="1-create-a-service-principal"&gt;&lt;strong&gt;1. Create a Service Principal&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;First, create a service principal in Azure AD that will authenticate the connection.&lt;/p&gt;
&lt;h4 id="using-azure-powershell"&gt;&lt;strong&gt;Using Azure PowerShell&lt;/strong&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Connect to Azure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Connect-AzAccount&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set the context to your subscription&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Set-AzContext&lt;/span&gt; &lt;span class="n"&gt;-Subscription&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SubscriptionName&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$spName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AzureArcDeploymentSP&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$subscriptionId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-AzContext&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;Subscription&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;YourResourceGroup&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Create the service principal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$sp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-AzADServicePrincipal&lt;/span&gt; &lt;span class="n"&gt;-DisplayName&lt;/span&gt; &lt;span class="nv"&gt;$spName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Retrieve the Application (Client) ID and Secret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$appId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$sp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ApplicationId&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$tenantId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$sp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;TenantId&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Generate a client secret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$spSecret&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-AzADAppCredential&lt;/span&gt; &lt;span class="n"&gt;-ObjectId&lt;/span&gt; &lt;span class="nv"&gt;$sp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Assign the &amp;#39;Azure Connected Machine Onboarding&amp;#39; role&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-AzRoleAssignment&lt;/span&gt; &lt;span class="n"&gt;-ObjectId&lt;/span&gt; &lt;span class="nv"&gt;$sp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Id&lt;/span&gt; &lt;span class="n"&gt;-RoleDefinitionName&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Azure Connected Machine Onboarding&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Scope&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/subscriptions/&lt;/span&gt;&lt;span class="nv"&gt;$subscriptionId&lt;/span&gt;&lt;span class="s2"&gt;/resourceGroups/&lt;/span&gt;&lt;span class="nv"&gt;$resourceGroup&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. Securely Store Service Principal Credentials&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Store the service principal credentials securely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Key Vault&lt;/strong&gt;: Store credentials and retrieve them during deployment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure Files&lt;/strong&gt;: Use encrypted files or secure password management solutions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environment Variables&lt;/strong&gt;: Set credentials as environment variables on target machines.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Modify the PowerShell Script to Use the Service Principal&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Parameters (replace placeholders with actual values or retrieve securely)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$tenantId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Tenant ID&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$subscriptionId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Subscription ID&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Resource Group&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Azure Region&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$appId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Service Principal App ID&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$spSecret&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Service Principal Secret&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install the Connected Machine Agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;https://aka.ms/AzureConnectedMachineAgent&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-OutFile&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AzureConnectedMachineAgent.msi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Start-Process&lt;/span&gt; &lt;span class="n"&gt;msiexec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="n"&gt;-Wait&lt;/span&gt; &lt;span class="n"&gt;-ArgumentList&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/I AzureConnectedMachineAgent.msi /qn&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Connect the machine using the service principal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:\\Program Files\\AzureConnectedMachineAgent\\azcmagent.exe&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-resource-group&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-subscription-id&lt;/span&gt; &lt;span class="nv"&gt;$subscriptionId&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-tenant-id&lt;/span&gt; &lt;span class="nv"&gt;$tenantId&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-location&lt;/span&gt; &lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-service-principal-id&lt;/span&gt; &lt;span class="nv"&gt;$appId&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-service-principal-secret&lt;/span&gt; &lt;span class="nv"&gt;$spSecret&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-no-gui&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Verify the connection status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:\\Program Files\\AzureConnectedMachineAgent\\azcmagent.exe&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Ensure that you retrieve the service principal secret (&lt;code&gt;$spSecret&lt;/code&gt;) securely and avoid hardcoding sensitive information in scripts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Execute the Script&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run the script on each server that you wish to onboard.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use remote execution tools like &lt;strong&gt;PowerShell Remoting&lt;/strong&gt;, &lt;strong&gt;SSH&lt;/strong&gt;, or &lt;strong&gt;Desired State Configuration (DSC)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ensure the script has the necessary execution permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;5. Verify the Connection&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the Azure Portal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Azure Arc&lt;/strong&gt; &amp;gt; &lt;strong&gt;Servers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm that your servers appear and have a status of &lt;strong&gt;Connected&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-managed-installations-with-sccm-using-service-principals"&gt;2. Managed Installations with SCCM Using Service Principals
&lt;/h3&gt;&lt;p&gt;Leverage &lt;strong&gt;System Center Configuration Manager (SCCM)&lt;/strong&gt; to deploy the Azure Connected Machine Agent and connect using service principals.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SCCM environment with client agents installed on target machines.&lt;/li&gt;
&lt;li&gt;Access to the &lt;strong&gt;Azure Connected Machine Agent&lt;/strong&gt; MSI.&lt;/li&gt;
&lt;li&gt;Service principal created and credentials securely stored.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1. Prepare the Agent Installer&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download the &lt;strong&gt;AzureConnectedMachineAgent.msi&lt;/strong&gt; and place it in a network share accessible by SCCM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. Create an Application in SCCM&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the SCCM Console, navigate to &lt;strong&gt;Software Library&lt;/strong&gt; &amp;gt; &lt;strong&gt;Application Management&lt;/strong&gt; &amp;gt; &lt;strong&gt;Applications&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Right-click &lt;strong&gt;Applications&lt;/strong&gt; and select &lt;strong&gt;Create Application&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Windows Installer (*.msi file)&lt;/strong&gt; and browse to the agent MSI.&lt;/li&gt;
&lt;li&gt;Proceed through the wizard to create the application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Configure Deployment Types&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In the deployment type properties, set the installation command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;msiexec /i &lt;span class="s2"&gt;&amp;#34;AzureConnectedMachineAgent.msi&amp;#34;&lt;/span&gt; /qn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a dependency for a script or program that will run the connection command using the service principal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4. Create a Package for the Connection Script&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a script that connects the agent using the service principal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example Connection Script:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Retrieve credentials securely&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$tenantId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Tenant ID&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$subscriptionId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Subscription ID&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Resource Group&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Azure Region&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$appId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Service Principal App ID&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$spSecret&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Service Principal Secret&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Connect the machine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:\\Program Files\\AzureConnectedMachineAgent\\azcmagent.exe&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-resource-group&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-subscription-id&lt;/span&gt; &lt;span class="nv"&gt;$subscriptionId&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-tenant-id&lt;/span&gt; &lt;span class="nv"&gt;$tenantId&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-location&lt;/span&gt; &lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-service-principal-id&lt;/span&gt; &lt;span class="nv"&gt;$appId&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-service-principal-secret&lt;/span&gt; &lt;span class="nv"&gt;$spSecret&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-no-gui&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new package in SCCM for this script.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure the program to run the script silently.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;5. Deploy the Application and Package&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deploy the agent application and connection script package to the target device collections.&lt;/li&gt;
&lt;li&gt;Ensure that the connection script runs after the agent installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;6. Monitor Deployment&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check the SCCM reports to ensure successful deployment.&lt;/li&gt;
&lt;li&gt;Verify that the servers appear in Azure Arc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-managed-installations-with-gpo-using-service-principals"&gt;3. Managed Installations with GPO Using Service Principals
&lt;/h3&gt;&lt;p&gt;Use &lt;strong&gt;Group Policy Objects (GPO)&lt;/strong&gt; to install the agent and connect using service principals for domain-joined machines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Active Directory environment.&lt;/li&gt;
&lt;li&gt;Machines must be domain-joined.&lt;/li&gt;
&lt;li&gt;Service principal created and credentials securely stored.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1. Prepare the MSI Package&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Place the &lt;strong&gt;AzureConnectedMachineAgent.msi&lt;/strong&gt; in a shared folder accessible by target machines (e.g., &lt;code&gt;\\\\YourServer\\Share\\AzureConnectedMachineAgent.msi&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. Create a GPO for Software Deployment&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open &lt;strong&gt;Group Policy Management Console (GPMC)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Create a new GPO or edit an existing one applied to the target OUs.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Computer Configuration&lt;/strong&gt; &amp;gt; &lt;strong&gt;Policies&lt;/strong&gt; &amp;gt; &lt;strong&gt;Software Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Software Installation&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Right-click and select &lt;strong&gt;New&lt;/strong&gt; &amp;gt; &lt;strong&gt;Package&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Browse to the network share and select the MSI.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Assigned&lt;/strong&gt; as the deployment method.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Add a Startup Script for Connection&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In the same GPO, go to &lt;strong&gt;Computer Configuration&lt;/strong&gt; &amp;gt; &lt;strong&gt;Policies&lt;/strong&gt; &amp;gt; &lt;strong&gt;Windows Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Scripts (Startup/Shutdown)&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a &lt;strong&gt;Startup&lt;/strong&gt; script to connect the agent using the service principal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Startup Script:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Path to the script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;\\\\&lt;/span&gt;&lt;span class="n"&gt;YourServer&lt;/span&gt;&lt;span class="p"&gt;\\&lt;/span&gt;&lt;span class="n"&gt;Share&lt;/span&gt;&lt;span class="p"&gt;\\&lt;/span&gt;&lt;span class="nb"&gt;Connect-AzureArc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Contents of Connect-AzureArc.ps1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$tenantId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Tenant ID&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$subscriptionId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Subscription ID&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Resource Group&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Azure Region&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$appId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Service Principal App ID&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$spSecret&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;Service Principal Secret&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Connect the machine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:\\Program Files\\AzureConnectedMachineAgent\\azcmagent.exe&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-resource-group&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-subscription-id&lt;/span&gt; &lt;span class="nv"&gt;$subscriptionId&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-tenant-id&lt;/span&gt; &lt;span class="nv"&gt;$tenantId&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-location&lt;/span&gt; &lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-service-principal-id&lt;/span&gt; &lt;span class="nv"&gt;$appId&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-service-principal-secret&lt;/span&gt; &lt;span class="nv"&gt;$spSecret&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-no-gui&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure that the script has the appropriate permissions and is accessible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4. Link the GPO&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Link the GPO to the organisational Units (OUs) containing the target computers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;5. Restart Target Machines&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The installation and connection will occur at startup. Reboot the target machines to apply the policy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;6. Verify Deployment&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Confirm that the agent is installed and connected by checking Azure Arc in the Azure Portal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-manual-installation-interactive-login"&gt;4. Manual Installation (Interactive Login)
&lt;/h3&gt;&lt;p&gt;For testing or small environments, you may opt for manual installation using interactive login.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Download and Install the Agent&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;https://aka.ms/AzureConnectedMachineAgent&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-OutFile&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AzureConnectedMachineAgent.msi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Start-Process&lt;/span&gt; &lt;span class="n"&gt;msiexec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="n"&gt;-Wait&lt;/span&gt; &lt;span class="n"&gt;-ArgumentList&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/I AzureConnectedMachineAgent.msi&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect the Machine&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the following command and follow the interactive prompts to log in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:\\Program Files\\AzureConnectedMachineAgent\\azcmagent.exe&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the necessary details like resource group, subscription, and region during the prompts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verify Connection&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Check the connection status:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:\\Program Files\\AzureConnectedMachineAgent\\azcmagent.exe&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verify in Azure Portal&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Azure Arc&lt;/strong&gt; &amp;gt; &lt;strong&gt;Servers&lt;/strong&gt; to ensure the server is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;By integrating service principals into your Azure Arc deployment strategies, you enhance security, enable scalable automation, and adhere to best practices for credential management. Whether you&amp;rsquo;re using automation scripts, SCCM, or GPO, leveraging service principals allows you to deploy Azure Arc-enabled servers efficiently and securely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security First&lt;/strong&gt;: Service principals prevent the need to use personal credentials in automation scripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalable Automation&lt;/strong&gt;: Automate deployments across numerous servers without manual intervention.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible Deployment Options&lt;/strong&gt;: Choose the method that aligns with your organisation&amp;rsquo;s infrastructure and policies.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;Enhance your understanding with these Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-arc/servers/onboard-service-principal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Connect machines to Azure Arc using service principals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/active-directory/develop/howto-create-service-principal-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create an Azure Active Directory application and service principal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-arc/servers/agent-configuration-policies?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Automate agent installation with Azure Policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://azurearcjumpstart.io/azure_arc_jumpstart/azure_arc_servers/azure/azure_sp_win_azcli?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Arc Jumpstart - Service Principal Onboarding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Arc Unleashed: A Journey into Hybrid Cloud Management - Part 1 of 5</title><link>https://blog.brewedinthecloud.com/p/azure-arc-overview/</link><pubDate>Sat, 25 Jan 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-arc-overview/</guid><description>&lt;p&gt;Welcome to the first installment of our five-part series exploring &lt;strong&gt;Azure Arc&lt;/strong&gt;, Microsoft&amp;rsquo;s innovative solution for seamless hybrid and multi-cloud management. In this series, we&amp;rsquo;ll dive deep into how Azure Arc can transform your infrastructure management, starting with an introduction to its features, use cases, and pricing. Plus, we&amp;rsquo;ll walk through onboarding a Windows virtual machine using a PowerShell script. Let&amp;rsquo;s embark on this journey!&lt;/p&gt;
&lt;h2 id="introduction-to-azure-arc"&gt;Introduction to Azure Arc
&lt;/h2&gt;&lt;p&gt;In today&amp;rsquo;s dynamic IT landscape, organisations often juggle resources across on-premises datacenters, multiple clouds, and edge environments. &lt;strong&gt;Azure Arc&lt;/strong&gt; bridges these diverse infrastructures, extending Azure management and services to any environment. It enables you to manage and govern workloads consistently, regardless of where they run.&lt;/p&gt;
&lt;h3 id="key-features"&gt;Key Features
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unified Management&lt;/strong&gt;: Manage Windows and Linux servers, Kubernetes clusters, and applications from a single pane of glass.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Services Anywhere&lt;/strong&gt;: Deploy Azure data services on-premises, at the edge, or in multi-cloud environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent Deployment&lt;/strong&gt;: Use infrastructure-as-code tools like ARM templates, Terraform, or Pulumi for consistent deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Security and Compliance&lt;/strong&gt;: Apply Azure policies and role-based access control (RBAC) universally across your resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation and DevOps Integration&lt;/strong&gt;: Integrate with CI/CD pipelines and utilize GitOps for Kubernetes configurations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="use-cases"&gt;Use Cases
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hybrid Server Management&lt;/strong&gt;: Centrally manage servers across on-premises, Azure, and other cloud providers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes Management&lt;/strong&gt;: Govern Kubernetes clusters anywhere using Azure tools and services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Services Deployment&lt;/strong&gt;: Run Azure SQL Managed Instance and PostgreSQL Hyperscale on any infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Governance and Compliance&lt;/strong&gt;: Enforce organisational standards and assess compliance at scale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edge Computing&lt;/strong&gt;: Extend cloud capabilities to edge devices for low-latency scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pricing-overview"&gt;Pricing Overview
&lt;/h3&gt;&lt;p&gt;Azure Arc offers flexible pricing based on the resources and services you use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Servers&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Arc-enabled Servers&lt;/strong&gt;: No additional cost for projecting on-premises or other cloud servers into Azure. Charges apply if you enable additional Azure services like Defender for Cloud.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes Clusters&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Arc-enabled Kubernetes&lt;/strong&gt;: Connecting and inventorying clusters is free. Charges apply when onboarding to Azure Monitor or Azure Policy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Services&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Arc-enabled Data Services&lt;/strong&gt;: Billed on a usage-based model, similar to their Azure counterparts, based on vCore consumption.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For detailed and up-to-date pricing information, visit the &lt;a class="link" href="https://azure.microsoft.com/pricing/details/azure-arc/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Arc pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="onboarding-a-windows-virtual-machine-using-powershell"&gt;Onboarding a Windows Virtual Machine Using PowerShell
&lt;/h2&gt;&lt;p&gt;Bringing your existing Windows VMs under Azure Arc management is straightforward. Here&amp;rsquo;s how you can onboard a Windows virtual machine using a PowerShell script.&lt;/p&gt;
&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Account&lt;/strong&gt;: An active Azure subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure CLI&lt;/strong&gt;: Installed on your local machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;: Version 5.1 or higher on the Windows VM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Access&lt;/strong&gt;: Outbound connectivity to Azure services (HTTPS port 443).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="installation-guide"&gt;Installation Guide
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;1. Register Resource Providers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ensure the necessary resource providers are registered in your Azure subscription:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Log in to Azure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Connect-AzAccount&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Register providers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Register-AzResourceProvider&lt;/span&gt; &lt;span class="n"&gt;-ProviderNamespace&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Microsoft.HybridCompute&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Register-AzResourceProvider&lt;/span&gt; &lt;span class="n"&gt;-ProviderNamespace&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Microsoft.GuestConfiguration&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. Create the Azure ARC Resource Group and prepare the script for download&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Azure Portal Search for Azure ARC in the search bar&lt;/li&gt;
&lt;li&gt;From the overview page click “Add resources”&lt;/li&gt;
&lt;li&gt;On the next page click “Add/Create” within the block labelled “Machines” and then click “Add a machine”&lt;/li&gt;
&lt;li&gt;On the new page that has appeared click “Generate script” in the block labelled “Add a single server”&lt;/li&gt;
&lt;li&gt;Now we are preparing the automated script, you fill in these prompts
&lt;ul&gt;
&lt;li&gt;Subscription&lt;/li&gt;
&lt;li&gt;Resource Group&lt;/li&gt;
&lt;li&gt;Region&lt;/li&gt;
&lt;li&gt;Operating System (this example we are using windows)&lt;/li&gt;
&lt;li&gt;SQL Server: Connect SQL Server (if your VM has a SQL Instance this will allow ARC to access it)&lt;/li&gt;
&lt;li&gt;Connectivity Method: Public (This means Azure ARC Agent will communicate over the internet, you can also use a proxy or private endpoint if your environment has these requirements)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Now click on “Next”&lt;/li&gt;
&lt;li&gt;You can setup specific Physical Location Tags which help you to group your resources within ARC before clicking “Next”&lt;/li&gt;
&lt;li&gt;ARC has now generated a token code and a script which you can extract some key variables and move to the next step (or just copy the script from the portal)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Install the Azure Connected Machine Agent&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On the Windows VM you wish to onboard:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Download the agent installer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://aka.ms/AzureConnectedMachineAgent&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-OutFile&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AzureConnectedMachineAgent.msi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install the agent silently&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Start-Process&lt;/span&gt; &lt;span class="n"&gt;msiexec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="n"&gt;-Wait&lt;/span&gt; &lt;span class="n"&gt;-ArgumentList&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/I AzureConnectedMachineAgent.msi /qn&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Connect the VM to Azure Arc by completing the below in a PowerShell window opened as Administrator&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set the context to your subscription&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Set-AzContext&lt;/span&gt; &lt;span class="n"&gt;-Subscription&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SubscriptionName&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Execute the onboarding&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$env:SUBSCRIPTION_ID&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-AzContext&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;Subscription&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$env:RESOURCE_GROUP&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;YourResourceGroupName&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;# Make sure you update this to the resource group you want your Arc endpoints to be added to&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$env:TENANT_ID&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-AzContext&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;Tenant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$env:LOCATION&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-AzResourceGroup&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$env:RESOURCE_GROUP&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$env:AUTH_TYPE&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$env:CORRELATION_ID&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;# Make sure you get this from the previous step&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$env:CLOUD&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AzureCloud&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;Net.ServicePointManager&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;SecurityProtocol&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;Net.ServicePointManager&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;SecurityProtocol&lt;/span&gt; &lt;span class="o"&gt;-bor&lt;/span&gt; &lt;span class="mf"&gt;3072&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class="n"&gt;-UseBasicParsing&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://gbl.his.arc.azure.com/azcmagent-windows&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-TimeoutSec&lt;/span&gt; &lt;span class="mf"&gt;30&lt;/span&gt; &lt;span class="n"&gt;-OutFile&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:TEMP&lt;/span&gt;&lt;span class="s2"&gt;\install_windows_azcmagent.ps1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:TEMP&lt;/span&gt;&lt;span class="s2"&gt;\install_windows_azcmagent.ps1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$LASTEXITCODE&lt;/span&gt; &lt;span class="o"&gt;-ne&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:ProgramW6432&lt;/span&gt;&lt;span class="s2"&gt;\AzureConnectedMachineAgent\azcmagent.exe&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-resource-group&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:RESOURCE_GROUP&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-tenant-id&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:TENANT_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-location&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:LOCATION&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-subscription-id&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:SUBSCRIPTION_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-cloud&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:CLOUD&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-correlation-id&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:CORRELATION_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$logBody&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;subscriptionId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:SUBSCRIPTION_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:RESOURCE_GROUP&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;tenantId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:TENANT_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:LOCATION&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;correlationId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:CORRELATION_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;authType&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$env:AUTH_TYPE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;onboarding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;messageType&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FullyQualifiedErrorId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class="n"&gt;-UseBasicParsing&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://gbl.his.arc.azure.com/log&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Method&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PUT&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Body&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$logBody&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;ConvertTo-Json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;out-null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Host&lt;/span&gt; &lt;span class="n"&gt;-ForegroundColor&lt;/span&gt; &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4. Verify the Connection&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the Azure portal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Azure Arc&lt;/strong&gt; &amp;gt; &lt;strong&gt;Servers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm that your Windows VM appears in the list of Arc-enabled servers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tips"&gt;Tips
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automation&lt;/strong&gt;: Incorporate this script into your deployment pipelines for automated onboarding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tags and Organisation&lt;/strong&gt;: Use tags to organize resources and simplify management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policies&lt;/strong&gt;: Apply Azure Policies for governance and compliance across your Arc-enabled servers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Arc empowers organisations to harness the power of Azure management and services across diverse environments. By unifying operations, enhancing security, and simplifying governance, Azure Arc is redefining hybrid cloud management. Onboarding your Windows virtual machines is a significant first step toward a more streamlined and efficient infrastructure.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;Enhance your understanding with these Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-arc/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Introduction to Azure Arc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-arc/servers/onboard-powershell?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Connect Hybrid Machines to Azure using PowerShell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://azure.microsoft.com/en-us/pricing/details/azure-arc/core-control-plane/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Arc Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-arc/servers/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Arc-enabled Servers Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2025 Shaking Things Up</title><link>https://blog.brewedinthecloud.com/p/blog-whats-new/</link><pubDate>Sat, 18 Jan 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/blog-whats-new/</guid><description>&lt;h2 id="whats-new---2025"&gt;Whats New - 2025
&lt;/h2&gt;&lt;p&gt;As 2025 dawns on us and after having some time off over the holiday period I am bringing a new lense, a different focus to 2025. I have landed on a brand for this blog and I have started working towards getting that ready for launch.&lt;/p&gt;
&lt;p&gt;I will also try to diversify my content this year whilst writting blogs has been super useful for me to get into a rythmn with releasing content it has sometimes lacked the demonstrative approaches that I use professional to ensure the knowledge I share is understood and practical for those consuming it. I will attempt to launch more demonstrative content via video (YouTube) and will hopefully bring that content in line with my written to ensure readers get the best of both worlds.&lt;/p&gt;
&lt;h2 id="new-brand-you-say"&gt;New Brand you say?
&lt;/h2&gt;&lt;p&gt;Thats right in the not so distant future you will begin to see the site change from a personal blog site to something I have labelled &amp;ldquo;Brewed in the Cloud&amp;rdquo; which in my head shows a combination of my love of hot coffee, cold beer and my passion for cloud technologies!&lt;/p&gt;
&lt;p&gt;For now the content will still be reachable from the current URL (hugo.hailes.id.au) and in future will also include blog.brewedinthecloud.com&lt;/p&gt;
&lt;p&gt;As always things here are fluid and if you have feedback or advice I am always willing, interested and keen to hear it. Please send me a message on LinkedIn.&lt;/p&gt;</description></item><item><title>Azure Bastion Automation with Azure DevOps</title><link>https://blog.brewedinthecloud.com/p/azure-bastion-automation-devops/</link><pubDate>Sat, 11 Jan 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-bastion-automation-devops/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Bastion is a fully managed platform-as-a-service (PaaS) that provides secure and seamless RDP/SSH connectivity to virtual machines directly in the Azure portal over SSL. By deploying Azure Bastion, you eliminate the need to expose your virtual machines to the public internet, thereby enhancing security and reducing the attack surface.&lt;/p&gt;
&lt;p&gt;In many scenarios, it is crucial to have Azure Bastion deployed only during the hours it is needed. This approach offers several benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cost Efficiency: Azure Bastion incurs costs while it is running. By scheduling deployments and destructions, you can ensure that the resource is only active during necessary periods, thereby optimizing your cloud expenditure.&lt;/li&gt;
&lt;li&gt;Enhanced Security: Limiting the deployment window reduces the potential attack surface. By having Azure Bastion active only during specific hours, you minimize the risk of unauthorized access during off-hours.&lt;/li&gt;
&lt;li&gt;Resource Management: Automating the deployment and destruction of Azure Bastion helps in better resource management. It ensures that resources are not left running unintentionally, which can lead to unnecessary costs and potential security vulnerabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog post will guide you through the process of deploying Azure Bastion using Azure DevOps, with a focus on scheduling deployments and destructions using Bicep templates.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide-using-bicep"&gt;Step-by-Step Implementation Guide Using Bicep
&lt;/h2&gt;&lt;p&gt;Step 1: Create Bicep Templates
First, create a Bicep template for deploying Azure Bastion. Save the following code in a file named main.bicep:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2022-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bastion-pip&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Import the existing vnet and subnet to get the subnet id for deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2022-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnet-ae-hub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vnetResourceGroupName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets@2022-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzureBastionSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bastion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/bastionHosts@2020-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bastion&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bastionHostIp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Step 2: Configure Azure DevOps Pipeline for Deployment
Next, configure your Azure DevOps pipeline to deploy the Bicep template. Create a new pipeline and add the following YAML configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;schedules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="nt"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0 7 * * *&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Deploy at 7am daily&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Daily Deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;branches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;deploy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Set this to &amp;#39;deploy&amp;#39; or &amp;#39;destroy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="nt"&gt;job&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;DeployOrDestroyBastion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Deploy or Destroy Azure Bastion&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;vmImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ubuntu-latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;AzureCLI@2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;azureSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;your-service-connection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bash&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptLocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;inlineScript&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inlineScript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; if [ $(action) == &amp;#39;deploy&amp;#39; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; az deployment group create --resource-group rg-bastion --template-file main.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; elif [ $(action) == &amp;#39;destroy&amp;#39; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; az resource delete --resource-group rg-bastion --name bastion --resource-type &amp;#34;Microsoft.Network/bastionHosts&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;Invalid action specified. Use &amp;#39;deploy&amp;#39; or &amp;#39;destroy&amp;#39;.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; fi&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Step 3: Configure Azure DevOps Pipeline for Destroy
Next, configure your Azure DevOps pipeline to destroy the Bicep template. Create a new pipeline and add the following YAML configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;schedules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="nt"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0 19 * * *&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Destroy at 7pm daily&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Daily Destroy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;branches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;destroy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Set this to &amp;#39;deploy&amp;#39; or &amp;#39;destroy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="nt"&gt;job&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;DeployOrDestroyBastion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Deploy or Destroy Azure Bastion&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;vmImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ubuntu-latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;AzureCLI@2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;azureSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;your-service-connection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bash&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptLocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;inlineScript&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inlineScript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; if [ $(action) == &amp;#39;deploy&amp;#39; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; az deployment group create --resource-group rg-bastion --template-file main.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; elif [ $(action) == &amp;#39;destroy&amp;#39; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; az resource delete --resource-group rg-bastion --name bastion --resource-type &amp;#34;Microsoft.Network/bastionHosts&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;Invalid action specified. Use &amp;#39;deploy&amp;#39; or &amp;#39;destroy&amp;#39;.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; fi&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Deploying Azure Bastion via Azure DevOps using Bicep templates and scheduling deployments and destructions can significantly enhance your infrastructure&amp;rsquo;s security and manageability. By automating these processes, you ensure that your virtual machines remain secure without manual intervention.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and additional resources, visit the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/bastion/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Bastion Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure SQL DTU DB Scaling with Azure Automation Account</title><link>https://blog.brewedinthecloud.com/p/azure-sql-scaling/</link><pubDate>Sat, 04 Jan 2025 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-sql-scaling/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In today&amp;rsquo;s dynamic cloud environment, managing database performance and cost efficiency is crucial. Azure SQL Database offers a flexible and scalable solution with its Database Transaction Unit (DTU) model. However, manual scaling can be time-consuming and prone to errors. This is where Azure Automation Account and PowerShell scripts come into play, enabling automated and scheduled scaling of SQL DTUs to meet varying workload demands efficiently.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide-using-bicep"&gt;Step-by-Step Implementation Guide Using Bicep
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Azure Automation Account&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to the Azure portal and create a new Automation Account. Ensure you create a Run As Account during this process to manage authentication seamlessly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Update PowerShell Modules&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Once the Automation Account is created, update the PowerShell modules to ensure you have the latest cmdlets. This can be done by importing a script to update the modules.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the Scaling Runbook&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In the Automation Account, create a new runbook and select PowerShell as the type. Use the following script to define the scaling logic:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$ResourceGroupName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$ServerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$DatabaseName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$DTU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$Database&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-AzSqlDatabase&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$ResourceGroupName&lt;/span&gt; &lt;span class="n"&gt;-ServerName&lt;/span&gt; &lt;span class="nv"&gt;$ServerName&lt;/span&gt; &lt;span class="n"&gt;-DatabaseName&lt;/span&gt; &lt;span class="nv"&gt;$DatabaseName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$Database&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Set-AzSqlDatabase&lt;/span&gt; &lt;span class="n"&gt;-Edition&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Standard&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-RequestedServiceObjectiveName&lt;/span&gt; &lt;span class="nv"&gt;$DTU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Schedule the Runbook&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Schedule the runbook to run at specific times using the Azure portal. This ensures that the DTU scaling happens automatically based on your defined schedule.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy Using Bicep&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a Bicep file to deploy the necessary resources. Here’s a sample Bicep template:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;automationAccountName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myAutomationAccount&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;runbookName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ScaleSQLDTU&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceGroupName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myResourceGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;serverName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mySqlServer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;databaseName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myDatabase&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;S3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;automationAccount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Automation/automationAccounts@2020-01-13-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;automationAccountName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;runbook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Automation/automationAccounts/runbooks@2020-01-13-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;automationAccountName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;runbookName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;runbookType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PowerShell&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logProgress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logVerbose&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Runbook to scale SQL DTU&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inEdit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;runbookId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;runbook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy the Bicep Template&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use Azure CLI or Azure PowerShell to deploy the Bicep template:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group myResourceGroup --template-file main.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Automating SQL DTU scaling using Azure Automation Account and PowerShell scripts not only enhances performance management but also optimizes costs by scaling resources based on actual demand. By leveraging Bicep for deployment, you can ensure a streamlined and efficient setup process.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and advanced configurations, refer to the following Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-sql/database/scale-resources?view=azuresql" target="_blank" rel="noopener"
&gt;Scale resources - Azure SQL Database &amp;amp; Azure SQL Managed Instance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-sql/database/scripts/monitor-and-scale-database-powershell?view=azuresql" target="_blank" rel="noopener"
&gt;Use PowerShell to monitor and scale a single database - Azure SQL Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.datatechguard.com/azure-bicep-getting-started-guide/" target="_blank" rel="noopener"
&gt;Azure Bicep: Getting Started and How-To Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2024 Done and Dusted</title><link>https://blog.brewedinthecloud.com/p/blog-2024-thanks/</link><pubDate>Tue, 31 Dec 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/blog-2024-thanks/</guid><description>&lt;h2 id="thank-you"&gt;Thank You
&lt;/h2&gt;&lt;p&gt;I wanted my first post of 2025 to be a personal thank you for all those who read my blog. I challenged myself at the start of 2024 to make sure I posted 52 articles (1 per week) and I&amp;rsquo;m proud to say I have achieved that. Even if you&amp;rsquo;ve only stumbled across my blog from googling something I&amp;rsquo;ve covered to those who read it regularly, Thank You!&lt;/p&gt;
&lt;p&gt;Writting this blog has always been a way for me to give back to my technology community.&lt;/p&gt;
&lt;p&gt;I wish you all the very best for the New Year ahead!&lt;/p&gt;</description></item><item><title>Implementing Information Protection with M35 DSC</title><link>https://blog.brewedinthecloud.com/p/m365-purview-informationprotection/</link><pubDate>Sat, 28 Dec 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/m365-purview-informationprotection/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Microsoft Purview is a comprehensive data governance solution that helps organisations manage and protect their data across various environments. It provides tools for data discovery, classification, and protection, ensuring that sensitive information is safeguarded and compliance requirements are met. With Microsoft Purview, businesses can gain insights into their data landscape, enforce data protection policies, and mitigate risks associated with data breaches.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Microsoft 365 subscription&lt;/li&gt;
&lt;li&gt;Microsoft 365 DSC (Desired State Configuration) module installed&lt;/li&gt;
&lt;li&gt;PowerShell installed on your machine&lt;/li&gt;
&lt;li&gt;Basic understanding of Microsoft Purview and information protection policies&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-microsoft-365-dsc-to-implement-information-protection"&gt;Using Microsoft 365 DSC to Implement Information Protection
&lt;/h3&gt;&lt;h4 id="step-1-install-the-microsoft-365-dsc-module"&gt;Step 1: Install the Microsoft 365 DSC Module
&lt;/h4&gt;&lt;p&gt;Open PowerShell and run the following command to install the Microsoft 365 DSC module:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Install-Module&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;Microsoft365DSC&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; &lt;span class="n"&gt;-AllowClobber&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-2-export-the-current-configuration"&gt;Step 2: Export the Current Configuration
&lt;/h4&gt;&lt;p&gt;Export the current configuration of your Microsoft 365 environment to a .ps1 file. This will help you understand the existing setup and make necessary adjustments.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Export-M365DSCConfiguration&lt;/span&gt; &lt;span class="n"&gt;-Components&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;InformationProtection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-FilePath&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:\M365DSC\CurrentConfig.ps1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-3-define-the-desired-configuration"&gt;Step 3: Define the Desired Configuration
&lt;/h4&gt;&lt;p&gt;Create a new PowerShell script (e.g., &lt;code&gt;InformationProtectionConfig.ps1&lt;/code&gt;) and define the desired state for your information protection policies. Below is an example configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;InformationProtectionConfig
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;param&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;Mandatory&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;PSCredential&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;$Creds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Import-DscResource&lt;/span&gt; &lt;span class="n"&gt;-ModuleName&lt;/span&gt; &lt;span class="n"&gt;Microsoft365DSC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SPOInformationRightsManagementSettings&lt;/span&gt; &lt;span class="n"&gt;SPOIRMSettings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SiteUrl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://yourtenant.sharepoint.com/sites/yoursite&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AllowPrint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AllowScript&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AllowWriteCopy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Credentials&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$Creds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;EXOInformationBarrierPolicy&lt;/span&gt; &lt;span class="n"&gt;EXOIBPolicy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ConfidentialPolicy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AssignedSegment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Confidential&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SegmentFilter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Department -eq &amp;#39;Finance&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Credentials&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$Creds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;InformationProtectionConfig&lt;/span&gt; &lt;span class="n"&gt;-Creds&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Credential&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-4-apply-the-desired-configuration"&gt;Step 4: Apply the Desired Configuration
&lt;/h4&gt;&lt;p&gt;Run the following command to apply the desired configuration to your Microsoft 365 environment:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Start-DscConfiguration&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:\M365DSC\InformationProtectionConfig&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Wait&lt;/span&gt; &lt;span class="n"&gt;-Verbose&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-5-verify-the-configuration"&gt;Step 5: Verify the Configuration
&lt;/h3&gt;&lt;p&gt;After applying the configuration, verify that the information protection policies have been implemented correctly. You can do this by checking the Microsoft Purview portal and ensuring that the policies are in place and functioning as expected.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Implementing information protection with Microsoft Purview and Microsoft 365 DSC allows organisations to automate and enforce data protection policies effectively. By following the steps outlined in this guide, you can ensure that your sensitive information is safeguarded and compliance requirements are met. Microsoft Purview provides a robust solution for managing and protecting your data across various environments.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and tutorials, visit the following Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-365/compliance/microsoft-purview-overview" target="_blank" rel="noopener"
&gt;Overview of Microsoft Purview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-365/compliance/information-protection" target="_blank" rel="noopener"
&gt;Implementing Information Protection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/microsoft-365-dsc" target="_blank" rel="noopener"
&gt;Microsoft 365 DSC Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Defender for Servers using Bicep</title><link>https://blog.brewedinthecloud.com/p/azure-defender-servervm/</link><pubDate>Sat, 21 Dec 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-defender-servervm/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Microsoft Defender for Servers is a comprehensive security solution designed to protect your server infrastructure from various threats, including vulnerabilities. It provides advanced threat detection, vulnerability management, and security recommendations to help organisations safeguard their servers. With Microsoft Defender for Servers, you can identify and remediate vulnerabilities, ensuring your server environment remains secure and compliant.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Azure subscription&lt;/li&gt;
&lt;li&gt;Basic understanding of Bicep and Azure Resource Manager (ARM) templates&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-bicep-to-implement-vulnerability-management"&gt;Using Bicep to Implement Vulnerability Management
&lt;/h3&gt;&lt;h4 id="step-1-create-a-bicep-file"&gt;Step 1: Create a Bicep File
&lt;/h4&gt;&lt;p&gt;Create a new Bicep file (e.g., &lt;code&gt;defenderForServers.bicep&lt;/code&gt;) and define the resources needed for Microsoft Defender for Servers. Below is an example configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;defenderForServers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Security/autoProvisioningSettings@2020-01-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;autoProvision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;On&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityContact&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Security/securityContacts@2020-01-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;security@example.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;+1234567890&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;alertNotifications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;On&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;alertsToAdmins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;On&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pricing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Security/pricings@2020-01-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualMachines&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pricingTier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-2-deploy-the-bicep-file"&gt;Step 2: Deploy the Bicep File
&lt;/h4&gt;&lt;p&gt;Run the following command to deploy the Bicep file to your Azure subscription:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group &amp;lt;your-resource-group&amp;gt; --template-file defenderForServers.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-4-verify-the-deployment"&gt;Step 4: Verify the Deployment
&lt;/h4&gt;&lt;p&gt;After deploying the Bicep file, verify that Microsoft Defender for Servers is enabled and configured correctly. You can do this by checking the Azure portal and ensuring that the resources are in place and functioning as expected.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Implementing vulnerability management with Microsoft Defender for Servers and Bicep allows organisations to automate and enforce security policies effectively. By following the steps outlined in this guide, you can ensure that your server infrastructure is protected from vulnerabilities and threats. Microsoft Defender for Servers provides a robust solution for managing and securing your server environment.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and tutorials, visit the following Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-servers-introduction?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Overview of Microsoft Defender for Servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/deploy-vulnerability-assessment-defender-vulnerability-management?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Implementing Vulnerability Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Integrating Azure Logic Apps with On-Premises Systems</title><link>https://blog.brewedinthecloud.com/p/azure-logicapps-onprem-bicep/</link><pubDate>Sat, 14 Dec 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-logicapps-onprem-bicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Logic Apps is a cloud-based service that enables you to automate workflows and integrate applications, data, and services across organisations. It provides a visual designer to build workflows that can connect to various cloud and on-premises systems. With Azure Logic Apps, you can create complex integrations with minimal code, making it an ideal solution for businesses looking to streamline their processes and improve efficiency.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Azure subscription&lt;/li&gt;
&lt;li&gt;Bicep CLI installed&lt;/li&gt;
&lt;li&gt;Visual Studio Code with Bicep extension&lt;/li&gt;
&lt;li&gt;Basic understanding of Azure Logic Apps and on-premises data gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-bicep-to-integrate-with-on-premises-systems"&gt;Using Bicep to Integrate with On-Premises Systems
&lt;/h3&gt;&lt;h4 id="step-1-define-the-bicep-file"&gt;Step 1: Define the Bicep File
&lt;/h4&gt;&lt;p&gt;Create a new Bicep file (e.g., &lt;code&gt;logic-app-onprem.bicep&lt;/code&gt;) and define the parameters and resources needed for the Logic App, on-premises data gateway, and the integration workflow.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logicAppName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyLogicApp&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyOnPremisesDataGateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectionName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyOnPremisesConnection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logicApp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Logic/workflows@2019-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logicAppName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;$&lt;/span&gt;&lt;span class="nv"&gt;schema&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#&amp;#34;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;actions&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;Initialize_variable&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;InitializeVariable&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;inputs&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;variables&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;exampleVariable&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;Hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;World&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;runAfter&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;triggers&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;Recurrence&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;Recurrence&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;recurrence&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;frequency&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;Day&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;interval&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Web/connections@2018-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;On-Premises Data Gateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/subscriptions/{subscription-id}/providers/Microsoft.Web/locations/{location}/managedApis/onpremisesgateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Web/connections@2018-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectionName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;On-Premises Connection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/subscriptions/{subscription-id}/providers/Microsoft.Web/locations/{location}/managedApis/onpremisesgateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parameterValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gateway&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Web/connections&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-2-deploy-the-bicep-file"&gt;Step 2: Deploy the Bicep File
&lt;/h4&gt;&lt;p&gt;Use the Azure CLI to deploy the Bicep file to your Azure subscription.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group &amp;lt;Your-Resource-Group&amp;gt; --template-file logic-app-onprem.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-3-configure-the-on-premises-data-gateway"&gt;Step 3: Configure the On-Premises Data Gateway
&lt;/h3&gt;&lt;p&gt;After deployment, configure the on-premises data gateway by downloading and installing the gateway software on your on-premises server. Follow the instructions in the Azure portal to complete the setup and register the gateway.&lt;/p&gt;
&lt;h3 id="step-4-create-the-integration-workflow"&gt;Step 4: Create the Integration Workflow
&lt;/h3&gt;&lt;p&gt;In the Azure portal, navigate to your Logic App and use the visual designer to create the integration workflow. Add actions and triggers to connect to your on-premises systems using the configured connection.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Logic Apps provides a powerful and flexible solution for integrating with on-premises systems. By using Bicep to define and deploy your Logic Apps and connections, you can ensure consistency, simplify management, and leverage DevOps practices for continuous integration and deployment. Azure Logic Apps enhances your ability to automate workflows and integrate systems seamlessly.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and tutorials, visit the following Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/logic-apps/connect-on-premises-data-sources?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Connect to on-premises data sources from Azure Logic Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Overview of Azure Logic Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Network Security Perimeter</title><link>https://blog.brewedinthecloud.com/p/azure-network-security-perimeter/</link><pubDate>Sun, 08 Dec 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-network-security-perimeter/</guid><description>&lt;h2 id="introduction-to-network-security-perimeter"&gt;Introduction to Network Security Perimeter
&lt;/h2&gt;&lt;p&gt;Network Security Perimeter is a powerful feature offered by Microsoft Azure that allows organisations to define a logical network isolation boundary for Platform-as-a-Service (PaaS) resources. This feature is particularly useful for securing resources such as Azure Storage accounts and SQL Database servers that are deployed outside your organisation&amp;rsquo;s virtual networks. By restricting public network access to these resources, Network Security Perimeter ensures that only authorized traffic can reach your PaaS resources.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://learn.microsoft.com/en-us/azure/private-link/media/network-security-perimeter-concepts/network-security-perimeter-overview.png?sharingId=MVP_473698"
loading="lazy"
alt="Network Security Primeter Overview"
&gt;&lt;/p&gt;
&lt;h2 id="detailed-step-by-step-implementation-guide-using-bicep"&gt;Detailed Step-by-Step Implementation Guide Using Bicep
&lt;/h2&gt;&lt;h3 id="create-a-network-security-perimeter"&gt;Create a Network Security Perimeter
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Open Azure CLI&lt;/strong&gt;: Start by opening your terminal and logging into your Azure account using &lt;code&gt;az login&lt;/code&gt;.
&lt;strong&gt;Create a Resource Group&lt;/strong&gt;: Create a new resource group where your Network Security Perimeter will reside.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az group create --name MyResourceGroup --location eastus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Create the Network Security Perimeter&lt;/strong&gt;: Use Bicep to define and deploy the Network Security Perimeter.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkSecurityPerimeter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityPerimeters@2023-03-11&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyNetworkSecurityPerimeter&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;accessRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllowInbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deploy the Bicep Template&lt;/strong&gt;: Deploy the Bicep template using the Azure CLI.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group MyResourceGroup --template-file myNetworkSecurityPerimeter.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="associate-resources-with-the-perimeter"&gt;Associate Resources with the Perimeter
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Add Resources to the Perimeter&lt;/strong&gt;: Associate your PaaS resources with the Network Security Perimeter.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network security-perimeter resource-association create --name MyNetworkSecurityPerimeter --resource-id /subscriptions/your-subscription-id/resourceGroups/MyResourceGroup/providers/Microsoft.Storage/storageAccounts/myStorageAccount
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="configure-access-rules"&gt;Configure Access Rules
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Define Access Rules&lt;/strong&gt;: Add inbound and outbound access rules to control network access.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;networkSecurityPerimeter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityPerimeters@2023-03-11&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyNetworkSecurityPerimeter&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;accessRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllowInbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllowOutbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Outbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deploy the Updated Template&lt;/strong&gt;: Deploy the updated Bicep template.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group MyResourceGroup --template-file myNetworkSecurityPerimeter.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="limitations"&gt;Limitations
&lt;/h2&gt;&lt;p&gt;Its worth noting the below limitations for this feature&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limitation&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Number of network security perimeters&lt;/td&gt;
&lt;td&gt;Supported up to 100 as recommended limit per subscription.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profiles per network security perimeters&lt;/td&gt;
&lt;td&gt;Supported up to 200 as recommended limit.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number of rule elements per profile&lt;/td&gt;
&lt;td&gt;Supported up to 200 as hard limit.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number of PaaS resources across subscriptions associated with the same network security perimeter&lt;/td&gt;
&lt;td&gt;Supported up to 1000 as recommended limit.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Implementing Network Security Perimeter using Bicep is a straightforward process that significantly enhances the security of your PaaS resources. By following the steps outlined above, you can create a secure network isolation boundary, control access to your resources, and ensure compliance with your organisation&amp;rsquo;s security policies.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/private-link/network-security-perimeter-concepts?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Learn documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Protecting ALL Azure VMs with Azure Backup</title><link>https://blog.brewedinthecloud.com/p/azure-backup-allvms-bicep/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-backup-allvms-bicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Based on my article last week I have since extended the original bicep with some powershell to enable protection across all Azure Virtual Machines with Azure Backup. In order for this to ensure I capture all VM&amp;rsquo;s old and new I&amp;rsquo;m running the this script from Azure DevOps on a daily schedule&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Azure subscription&lt;/li&gt;
&lt;li&gt;An Azure DevOps environment&lt;/li&gt;
&lt;li&gt;Visual Studio Code with Bicep extension&lt;/li&gt;
&lt;li&gt;Basic understanding of DevOps pipelines &amp;amp; Azure Backup concepts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-bicep-to-protect-all-existing-virtual-machines"&gt;Using Bicep to Protect All Existing Virtual Machines
&lt;/h3&gt;&lt;h4 id="step-1-create-a-new-devops-pipeline"&gt;Step 1: Create a new DevOps Pipeline
&lt;/h4&gt;&lt;p&gt;Create a new DevOps pipeline using the below yaml as an example&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;vmImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ubuntu-latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="nt"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;AzureCLI@2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;azureSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;Your Azure Service Connection&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ps&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptLocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;inlineScript&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inlineScript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Get all VMs in the subscription&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;$vms = Get-AzVM&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Create a Bicep file to associate VMs with a backup policy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;$bicepContent = @&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;param vms array&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;param backupPolicyName string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;param vaultName string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;param resourceGroupName string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;resource recoveryServicesVault &amp;#39;Microsoft.RecoveryServices/vaults@2021-01-01&amp;#39; existing = {&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;vaultName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;resourceGroup(resourceGroupName)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;resource backupPolicy &amp;#39;Microsoft.RecoveryServices/vaults/backupPolicies@2021-01-01&amp;#39; existing = {&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;backupPolicyName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;recoveryServicesVault&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resource vmBackupAssociation &amp;#39;Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems@2021-01-01&amp;#39; = [for vm in vms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\${vm.name}-backup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;protectedItemType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sourceResourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;vm.id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;policyId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;backupPolicy.id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;@
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; # Save the Bicep content to a file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; $bicepFilePath = &amp;#34;&lt;/span&gt;&lt;span class="l"&gt;associateVMsToBackupPolicy.bicep&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;$bicepContent | Out-File -FilePath $bicepFilePath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Define the parameters (replace with your actual values)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;$backupPolicyName = &amp;#34;{policy-name}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;$vaultName = &amp;#34;{vault-name}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;$resourceGroupName = &amp;#34;{resource-group-name}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Deploy the Bicep file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;az deployment group create --resource-group $resourceGroupName --template-file $bicepFilePath --parameters vms=$vms backupPolicyName=$backupPolicyName vaultName=$vaultName resourceGroupName=$resourceGroupName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-2-verify-the-resources"&gt;Step 2: Verify the Resources
&lt;/h3&gt;&lt;p&gt;After deployment, verify that the Recovery Services vault, backup policy, and backup protection for all existing virtual machines have been created and are configured as expected. You can do this by navigating to the Azure portal and checking the resources under the Recovery Services vault section.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Backup provides a comprehensive solution for protecting your data in the cloud. By using Bicep to define and deploy your backup resources, you can ensure consistency, simplify management, and leverage DevOps practices for continuous integration and deployment. Azure Backup enhances your ability to protect and manage your data assets seamlessly.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and tutorials, visit the following Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/backup/quick-backup-vm-bicep-file?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Quickstart: Back up a virtual machine in Azure with a Bicep template&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/training/modules/protect-virtual-machines-with-azure-backup/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Protect your virtual machines by using Azure Backup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/backup/security-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Overview of security features - Azure Backup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Protecting Azure Virtual Machines with Azure Backup</title><link>https://blog.brewedinthecloud.com/p/azure-backup-bicep/</link><pubDate>Sat, 30 Nov 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-backup-bicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Backup is a comprehensive, scalable, and secure data protection solution designed to safeguard your data assets in the cloud. It offers a simple and cost-effective way to back up and restore your data, ensuring that your critical workloads are protected against data loss and corruption. Azure Backup supports a wide range of workloads, including virtual machines, databases, and file shares, and integrates seamlessly with other Azure services.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Azure subscription&lt;/li&gt;
&lt;li&gt;Bicep CLI installed&lt;/li&gt;
&lt;li&gt;Visual Studio Code with Bicep extension&lt;/li&gt;
&lt;li&gt;Basic understanding of Azure Backup concepts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-bicep-to-protect-a-virtual-machine"&gt;Using Bicep to Protect a Virtual Machine
&lt;/h3&gt;&lt;h4 id="step-1-define-the-bicep-file"&gt;Step 1: Define the Bicep File
&lt;/h4&gt;&lt;p&gt;Create a new Bicep file (e.g., &lt;code&gt;vm-backup.bicep&lt;/code&gt;) and define the parameters and resources needed for the Recovery Services vault, backup policy, and virtual machine.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vaultName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyRecoveryServicesVault&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backupPolicyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyBackupPolicy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ExistingVM&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;recoveryServicesVault&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.RecoveryServices/vaults@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vaultName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backupPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.RecoveryServices/vaults/backupPolicies@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backupPolicyName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;recoveryServicesVault&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;schedulePolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scheduleRunFrequency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Daily&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scheduleRunTimes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 2am Sydney,Australia&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;2024-11-29T16:00:00Z&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dailySchedule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionTimes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 2am Sydney,Australia&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;2024-11-29T16:00:00Z&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;retentionDuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;durationType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Days&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backupProtectedItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;vmName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-backup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;recoveryServicesVault&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protectedItemType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceResourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Compute/virtualMachines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vmName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;backupPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-2-deploy-the-bicep-file"&gt;Step 2: Deploy the Bicep File
&lt;/h4&gt;&lt;p&gt;Use the Azure CLI to deploy the Bicep file to your Azure subscription.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group &amp;lt;Your-Resource-Group&amp;gt; --template-file vm-backup.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-3-verify-the-resources"&gt;Step 3: Verify the Resources
&lt;/h3&gt;&lt;p&gt;After deployment, verify that the Recovery Services vault, backup policy, and virtual machine have been created and are configured as expected. You can do this by navigating to the Azure portal and checking the resources under the Recovery Services vault section.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Backup provides a comprehensive solution for protecting your data in the cloud. By using Bicep to define and deploy your backup resources, you can ensure consistency, simplify management, and leverage DevOps practices for continuous integration and deployment. Azure Backup enhances your ability to protect and manage your data assets seamlessly.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and tutorials, visit the following Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/backup/quick-backup-vm-bicep-file?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Quickstart: Back up a virtual machine in Azure with a Bicep template&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/training/modules/protect-virtual-machines-with-azure-backup/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Protect your virtual machines by using Azure Backup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/backup/security-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Overview of security features - Azure Backup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Using Bicep for Microsoft Graph Resources</title><link>https://blog.brewedinthecloud.com/p/azure-graph-bicep/</link><pubDate>Sat, 23 Nov 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-graph-bicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For those who are not familiar with Bicep, Bicep is a domain-specific language (DSL) that simplifies the deployment and management of Azure resources. With the introduction of the Microsoft Graph Bicep extension, you can now author, deploy, and manage Microsoft Graph resources using Bicep templates. This extension allows you to define resources such as groups, users, and role assignments in a declarative manner, ensuring consistency and repeatability across your deployments. This blog post will guide you through the process of using Bicep to create a group, add a user to it, and assign it to an Azure RBAC role contributor to the resource group. This new resource type in bicep has only recently made it to public preview you can see a full list of resource types avaliable through this bicep provider here: &lt;a class="link" href="https://learn.microsoft.com/en-us/graph/templates/reference/overview?view=graph-bicep-1.0" target="_blank" rel="noopener"
&gt;Microsoft Graph Bicep resource reference overview&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Azure subscription&lt;/li&gt;
&lt;li&gt;Bicep CLI installed&lt;/li&gt;
&lt;li&gt;Visual Studio Code with Bicep extension&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-bicep-and-microsoft-graph-provider"&gt;Using Bicep and Microsoft Graph Provider
&lt;/h3&gt;&lt;h4 id="step-1-enabling-extensibility-in-vscode"&gt;Step 1: Enabling extensibility in VSCode
&lt;/h4&gt;&lt;p&gt;In your vscode directory create a bicepconfig.json file with this json to enable the extensibility extension.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;experimentalFeaturesEnabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;extensibility&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-2-define-the-bicep-file"&gt;Step 2: Define the Bicep File
&lt;/h4&gt;&lt;p&gt;Create a new Bicep file (e.g., &lt;code&gt;azure-group-rbac.bicep&lt;/code&gt;) and define the parameters and resources needed for the Microsoft Graph resources.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupNameDisplay&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;My Graph Group&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupNameUnique&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyGraphGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupNameMail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mygroup@contoso.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myUser&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;b24988ac-6180-42a0-ab88-20f7382dd24c&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Contributor role ID&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceGroupId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nv"&gt;extension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;microsoftGraph&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;graphGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Graph/groups@v1.0&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupNameDisplay&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mailEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isAssignableToRole&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;uniqueName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupNameUnique&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mailNickname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;groupNameMail&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;members&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;graphUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;graphUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.GraphServices/accounts@2023-04-13&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;userName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/roleAssignments@2022-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;guid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;resourceGroupId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;graphUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/roleDefinitions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleDefinitionId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;principalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;graphUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleAssignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceGroupName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;resourceId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;roleAssignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-3-deploy-the-bicep-file"&gt;Step 3: Deploy the Bicep File
&lt;/h4&gt;&lt;p&gt;Use the Azure CLI to deploy the Bicep file to your Azure subscription.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group &amp;lt;Your-Resource-Group&amp;gt; --template-file azure-group-rbac.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step--verify-the-resources"&gt;Step : Verify the Resources
&lt;/h3&gt;&lt;p&gt;After deployment, verify that the Microsoft Graph resources have been created and are configured as expected. You can do this by navigating to the Azure portal and checking the resources under Entra ID and the resource group.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Using Bicep for Microsoft Graph resources provides a streamlined and efficient way to manage your tenant&amp;rsquo;s infrastructure. By defining resources as code, you can ensure consistency, simplify management, and leverage DevOps practices for continuous integration and deployment. The Microsoft Graph Bicep extension enhances your ability to manage both Azure and Microsoft Graph resources seamlessly.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and tutorials, visit the following Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/graph/templates/reference/overview?view=graph-bicep-1.0?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Graph Bicep resource reference overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/graph/templates/overview-bicep-templates-for-graph?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep templates for Microsoft Graph resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/graph/templates/quickstart-create-bicep-interactive-mode?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create and deploy your first Bicep file with Microsoft Graph resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/graph/templates/how-to-reference-existing-resources?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Reference existing Microsoft Graph resources in Bicep templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/quickstart-role-assignments-bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Assign an Azure role using Bicep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/scenarios-rbac?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create Azure RBAC resources by using Bicep&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Integrating Azure Firewall in Azure vWAN</title><link>https://blog.brewedinthecloud.com/p/azure-vwan-afw-bicep/</link><pubDate>Sat, 16 Nov 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vwan-afw-bicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Virtual WAN is a comprehensive networking service that provides optimized and automated branch connectivity to, and through, Azure. It enables you to connect your branches, remote users, and data centers to Azure and each other using a combination of site-to-site VPN, point-to-site VPN, and ExpressRoute connections. One of the key features of Azure Virtual WAN is its ability to integrate Azure Firewall, including Azure Firewall Premium, to enhance security and connectivity.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Azure subscription&lt;/li&gt;
&lt;li&gt;Bicep CLI installed&lt;/li&gt;
&lt;li&gt;Visual Studio Code with Bicep extension&lt;/li&gt;
&lt;li&gt;Basic understanding of Azure networking concepts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-bicep-to-integrate-azure-firewall-premium"&gt;Using Bicep to Integrate Azure Firewall Premium
&lt;/h3&gt;&lt;h4 id="step-1-define-the-bicep-file"&gt;Step 1: Define the Bicep File
&lt;/h4&gt;&lt;p&gt;Create a new Bicep file (e.g., &lt;code&gt;virtual-wan-firewall.bicep&lt;/code&gt;) and define the parameters and resources needed for the Virtual WAN and Azure Firewall Premium.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWanName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVirtualWAN&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHubName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVirtualHub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyAzureFirewall&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyFirewallPolicy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualWans@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWanName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualHubs@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHubName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/firewallPolicies@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicyName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Premium&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;azureFirewall&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/azureFirewalls@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AZFW_VNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Premium&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-2-deploy-the-bicep-file"&gt;Step 2: Deploy the Bicep File
&lt;/h4&gt;&lt;p&gt;Use the Azure CLI to deploy the Bicep file to your Azure subscription.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group &amp;lt;Your-Resource-Group&amp;gt; --template-file virtual-wan-firewall.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-3-verify-the-resources"&gt;Step 3: Verify the Resources
&lt;/h3&gt;&lt;p&gt;After deployment, verify that the Virtual WAN, Azure Firewall Premium, and Firewall Policy resources have been created and are configured as expected. You can do this by navigating to the Azure portal and checking the resources under the Virtual WAN and Virtual Hub sections.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Integrating Azure Firewall Premium with Azure Virtual WAN using Bicep provides a streamlined and efficient way to enhance your network security and connectivity. By defining resources as code, you can ensure consistency, simplify management, and leverage DevOps practices for continuous integration and deployment. Azure Virtual WAN enhances your ability to connect and manage your network resources seamlessly.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and tutorials, visit the following Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-wan/howto-firewall" target="_blank" rel="noopener"
&gt;Install Azure Firewall in a Virtual WAN hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall-manager/quick-secure-virtual-hub-bicep" target="_blank" rel="noopener"
&gt;Quickstart: Secure virtual hub using Azure Firewall Manager - Bicep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall-manager/quick-firewall-policy-bicep" target="_blank" rel="noopener"
&gt;Quickstart: Create an Azure Firewall and a firewall policy - Bicep&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Integrating Third Party NVA in Azure vWAN</title><link>https://blog.brewedinthecloud.com/p/azure-vwan-nva-bicep/</link><pubDate>Sat, 09 Nov 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vwan-nva-bicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Virtual WAN is a comprehensive networking service that provides optimized and automated branch connectivity to, and through, Azure. It enables you to connect your branches, remote users, and data centers to Azure and each other using a combination of site-to-site VPN, point-to-site VPN, and ExpressRoute connections. One of the key features of Azure Virtual WAN is its ability to integrate third-party Network Virtual Appliances (NVAs), such as Palo Alto Networks VM-Series, to enhance security and connectivity.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Azure subscription&lt;/li&gt;
&lt;li&gt;Bicep CLI installed&lt;/li&gt;
&lt;li&gt;Visual Studio Code with Bicep extension&lt;/li&gt;
&lt;li&gt;Basic understanding of Azure networking concepts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-bicep-to-integrate-palo-alto-nva"&gt;Using Bicep to Integrate Palo Alto NVA
&lt;/h3&gt;&lt;h4 id="step-1-define-the-bicep-file"&gt;Step 1: Define the Bicep File
&lt;/h4&gt;&lt;p&gt;Create a new Bicep file (e.g., &lt;code&gt;virtual-wan-nva.bicep&lt;/code&gt;) and define the parameters and resources needed for the Virtual WAN and Palo Alto NVA.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWanName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVirtualWAN&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHubName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVirtualHub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nvaName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyPaloAltoNVA&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualWans@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWanName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualHubs@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHubName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nva&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualAppliances@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nvaName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nvaSku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VM-Series&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vendor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;PaloAltoNetworks&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;autoScaleConfiguration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-2-deploy-the-bicep-file"&gt;Step 2: Deploy the Bicep File
&lt;/h4&gt;&lt;p&gt;Use the Azure CLI to deploy the Bicep file to your Azure subscription.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group &amp;lt;Your-Resource-Group&amp;gt; --template-file virtual-wan-nva.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-3-verify-the-resources"&gt;Step 3: Verify the Resources
&lt;/h3&gt;&lt;p&gt;After deployment, verify that the Virtual WAN and Palo Alto NVA resources have been created and are configured as expected. You can do this by navigating to the Azure portal and checking the resources under the Virtual WAN and Virtual Hub sections.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Integrating third-party NVAs like Palo Alto Networks VM-Series with Azure Virtual WAN using Bicep provides a streamlined and efficient way to enhance your network security and connectivity. By defining resources as code, you can ensure consistency, simplify management, and leverage DevOps practices for continuous integration and deployment. Azure Virtual WAN enhances your ability to connect and manage your network resources seamlessly.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and tutorials, visit the following Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-wan/about-nva-hub" target="_blank" rel="noopener"
&gt;About Network Virtual Appliances - Virtual WAN hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-wan/scenario-route-through-nva" target="_blank" rel="noopener"
&gt;Scenario: Route traffic through a Network Virtual Appliance (NVA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-wan/third-party-integrations" target="_blank" rel="noopener"
&gt;Third-party integrations with Virtual WAN Hub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Integrating ExpressRoute and VPN in Azure vWAN</title><link>https://blog.brewedinthecloud.com/p/azure-vwan-ervpn-bicep/</link><pubDate>Sat, 02 Nov 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vwan-ervpn-bicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Virtual WAN is a networking service that provides optimized and automated branch connectivity to, and through, Azure. It enables you to connect your branches, remote users, and data centers to Azure and each other using a combination of site-to-site VPN, point-to-site VPN, and ExpressRoute connections. This blog post will guide you through the process of integrating ExpressRoute or Site-to-Site VPN with Azure Virtual WAN using Bicep, a domain-specific language (DSL) for deploying Azure resources.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Azure subscription&lt;/li&gt;
&lt;li&gt;Bicep CLI installed&lt;/li&gt;
&lt;li&gt;Visual Studio Code with Bicep extension&lt;/li&gt;
&lt;li&gt;Basic understanding of Azure networking concepts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-bicep-to-integrate-expressroute-or-site-to-site-vpn"&gt;Using Bicep to Integrate ExpressRoute or Site-to-Site VPN
&lt;/h3&gt;&lt;h4 id="step-1-define-the-bicep-file"&gt;Step 1: Define the Bicep File
&lt;/h4&gt;&lt;p&gt;Create a new Bicep file (e.g., &lt;code&gt;virtual-wan.bicep&lt;/code&gt;) and define the parameters and resources needed for the Virtual WAN, ExpressRoute, or Site-to-Site VPN.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWanName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVirtualWAN&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHubName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyVirtualHub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;expressRouteGatewayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyExpressRouteGateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;siteToSiteVpnGatewayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySiteToSiteVpnGateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualWans@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWanName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualHubs@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHubName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;expressRouteGateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/expressRouteGateways@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;expressRouteGatewayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;autoScaleConfiguration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;siteToSiteVpnGateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/vpnGateways@2023-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;siteToSiteVpnGatewayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MySiteToSiteConnection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVpnSite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/subscriptions/&amp;lt;subscription-id&amp;gt;/resourceGroups/&amp;lt;resource-group&amp;gt;/providers/Microsoft.Network/vpnSites/&amp;lt;vpn-site-name&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectionBandwidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnConnectionProtocolType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IKEv2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="step-2-deploy-the-bicep-file"&gt;Step 2: Deploy the Bicep File
&lt;/h4&gt;&lt;p&gt;Use the Azure CLI to deploy the Bicep file to your Azure subscription.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group &amp;lt;Your-Resource-Group&amp;gt; --template-file virtual-wan.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-3-verify-the-resources"&gt;Step 3: Verify the Resources
&lt;/h3&gt;&lt;p&gt;After deployment, verify that the Virtual WAN, ExpressRoute, or Site-to-Site VPN resources have been created and are configured as expected. You can do this by navigating to the Azure portal and checking the resources under the Virtual WAN and Virtual Hub sections.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Integrating ExpressRoute or Site-to-Site VPN with Azure Virtual WAN using Bicep provides a streamlined and efficient way to manage your network infrastructure. By defining resources as code, you can ensure consistency, simplify management, and leverage DevOps practices for continuous integration and deployment. Azure Virtual WAN enhances your ability to connect and manage your network resources seamlessly.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information and tutorials, visit the following Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-wan/virtual-wan-site-to-site-portal" target="_blank" rel="noopener"
&gt;Create site-to-site connections using Virtual WAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-wan/virtual-wan-expressroute-about" target="_blank" rel="noopener"
&gt;About ExpressRoute connections in Azure Virtual WAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-wan/vpn-over-expressroute" target="_blank" rel="noopener"
&gt;ExpressRoute encryption: IPsec over ExpressRoute for Virtual WAN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Virtual WAN with Bicep</title><link>https://blog.brewedinthecloud.com/p/azure-vwan-bicep/</link><pubDate>Sat, 26 Oct 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vwan-bicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Virtual WAN is a comprehensive networking service that brings together various networking, security, and routing functionalities into a single operational interface. It is designed to simplify and optimize the connectivity between branches, remote users, and cloud resources, leveraging Microsoft&amp;rsquo;s global network backbone. Key features include branch connectivity, site-to-site VPN, remote user VPN, private connectivity (ExpressRoute), and intra-cloud connectivity.&lt;/p&gt;
&lt;h2 id="implementation-guide"&gt;Implementation Guide
&lt;/h2&gt;&lt;h3 id="step-1-setting-up-azure-virtual-wan-using-bicep"&gt;Step 1: Setting Up Azure Virtual WAN Using Bicep
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Resource Group&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Resources/resourceGroups@2021-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myResourceGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Australia East&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy Virtual WAN&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualWans@2023-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVirtualWAN&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Australia East&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowBranchToBranchTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowVnetToVnetTraffic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create Virtual Hub&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualHubs@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVirtualHub&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Australia East&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualWan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-configuring-virtual-network-connections"&gt;Step 2: Configuring Virtual Network Connections
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Virtual Network&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Australia East&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect Virtual Network to Virtual Hub&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualHubs/hubVirtualNetworkConnections@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNetConnection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualHub&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remoteVirtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-integrating-with-azure-devops"&gt;Step 3: Integrating with Azure DevOps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Azure DevOps Pipeline&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a new pipeline in Azure DevOps.&lt;/li&gt;
&lt;li&gt;Add tasks to run the Bicep deployment scripts.&lt;/li&gt;
&lt;li&gt;Use Azure Key Vault to manage secrets and credentials.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuous Integration and Delivery&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure the pipeline to trigger on code changes.&lt;/li&gt;
&lt;li&gt;Validate changes in a staging environment before deploying to production.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Virtual WAN simplifies network connectivity by providing a unified platform for managing various networking needs. By leveraging Bicep for infrastructure as code, organisations can achieve a streamlined and automated network management process. This approach not only enhances efficiency but also ensures consistency and compliance across the network.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-wan/virtual-wan-about" target="_blank" rel="noopener"
&gt;Azure Virtual WAN Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/training/modules/introduction-azure-virtual-wan/" target="_blank" rel="noopener"
&gt;Introduction to Azure Virtual WAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-wan/virtual-wan-configuration-best-practices" target="_blank" rel="noopener"
&gt;Azure Virtual WAN Configuration Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/quick-create-bicep" target="_blank" rel="noopener"
&gt;Quickstart: Use Bicep templates to create a virtual network&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Working with Bicep files at scale</title><link>https://blog.brewedinthecloud.com/p/azure-bicepsplitting/</link><pubDate>Sat, 19 Oct 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-bicepsplitting/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Bicep is a domain-specific language (DSL) for deploying Azure resources declaratively. It simplifies the authoring experience with a more concise syntax compared to traditional ARM templates. By using Bicep, you can modularize your infrastructure as code (IaC) and manage complex deployments with ease.&lt;/p&gt;
&lt;h2 id="detailed-step-by-step-implementation-guide"&gt;Detailed Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure subscription&lt;/li&gt;
&lt;li&gt;Azure CLI installed&lt;/li&gt;
&lt;li&gt;Bicep CLI installed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the Bicep Files&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;main.bicepparam&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;$schema&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.management.azure.com/schemas/2020-10-01/tenantDeploymentParameters.json#&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;contentVersion&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.0.0.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;australiaeast&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;storageAccountName&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mystorageaccount&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;resource.bicep&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Storage/storageAccounts@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_LRS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;StorageV2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;main.bicep&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageModule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;resource.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;storageModule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy the Bicep Files Using Azure CLI&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy the main.bicep file with parameters&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group &amp;lt;Your Resource Group&amp;gt; --parameters main.bicepparam
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="why-split-the-files"&gt;Why Split the Files?
&lt;/h2&gt;&lt;p&gt;Splitting the files into &lt;code&gt;main.bicepparam&lt;/code&gt;, &lt;code&gt;main.bicep&lt;/code&gt;, and &lt;code&gt;resource.bicep&lt;/code&gt; offers several advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modularity&lt;/strong&gt;: By separating parameters, main logic, and resources, you can reuse and manage each component independently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readability&lt;/strong&gt;: Smaller, focused files are easier to read and understand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintainability&lt;/strong&gt;: Changes in one file do not affect others, making updates and debugging simpler.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;: Different team members can work on different parts of the deployment without conflicts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;By following this guide, you have successfully created and deployed Azure resources using Azure Bicep with the main.bicepparam, main.bicep, and resource.bicep files. This modular approach allows for better organisation and management of your infrastructure as code, making deployments more efficient and maintainable.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Bicep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/cli/azure/install-azure-cli?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Resource Manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Deploy Azure Firewall Policy Premium with Bicep</title><link>https://blog.brewedinthecloud.com/p/azure-fwpolicybicep/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-fwpolicybicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Firewall Policy is a central management solution for your Azure Firewall instances, allowing you to define and enforce network security policies across multiple firewalls. The Premium SKU offers advanced features such as TLS inspection, IDPS (Intrusion Detection and Prevention System), and URL filtering, providing enhanced security for your cloud environment.&lt;/p&gt;
&lt;h2 id="detailed-step-by-step-implementation-guide"&gt;Detailed Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure subscription&lt;/li&gt;
&lt;li&gt;Azure CLI installed&lt;/li&gt;
&lt;li&gt;Bicep CLI installed&lt;/li&gt;
&lt;li&gt;Azure DevOps account&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Bicep File for Azure Firewall Policy&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/firewallPolicies@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myFirewallPolicy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Premium&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;threatIntelMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Alert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add Premium Features&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TLS Inspection&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tlsPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/firewallPolicies@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myFirewallPolicy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;transportSecurity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;certificateAuthority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;afw-certificate&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultSecretId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;https://vaultname.vault.azure.net/secrets/afw-certificate/certificateid&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IDPS&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;idpsPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/firewallPolicies@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myFirewallPolicy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Alert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;signatureOverrides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;URL Filtering&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;urlFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/firewallPolicies/ruleCollectionGroups@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myUrlFilter&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleCollections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;urlFilterRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;allowRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ApplicationRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;www.microsoft.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocolType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Https&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy the Bicep File Using Azure DevOps&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a new pipeline in Azure DevOps&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add a task to deploy the Bicep file&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;vmImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ubuntu-latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="nt"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;AzureCLI@2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;azureSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;Your Azure Subscription&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bash&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptLocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;inlineScript&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inlineScript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; az deployment group create --resource-group &amp;lt;Your Resource Group&amp;gt; --template-file &amp;lt;Path to Bicep File&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;By following this guide, you have successfully created and deployed an Azure Firewall Policy Premium with all the premium features using Bicep and Azure DevOps. This setup enhances your network security with advanced features like TLS inspection, IDPS, and URL filtering, ensuring a robust security posture for your cloud environment.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall-manager/policy-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Firewall Policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Bicep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/devops/?view=azure-devops?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure DevOps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Public Preview: Azure Network IP Address Management</title><link>https://blog.brewedinthecloud.com/p/azure-network-ipam-bicep/</link><pubDate>Tue, 08 Oct 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-network-ipam-bicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Virtual Network IP Address Management (IPAM) is now available in public preview. This feature centralizes and optimizes IP address management, giving users more control and efficiency in their network operations. Azure Virtual Network IPAM helps in planning and allocating IP addresses, ensuring non-overlapping, conflict-free usage. The tool automatically handles address reservations for specific needs and prevents address conflicts, thus simplifying network management.&lt;/p&gt;
&lt;h2 id="implementation-guide-using-bicep"&gt;Implementation Guide using Bicep
&lt;/h2&gt;&lt;h3 id="step-1-create-an-ip-address-pool"&gt;Step 1: Create an IP Address Pool
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamPool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/ipamPools@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myIpamPool&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-2-associate-the-ip-address-pool-with-your-virtual-network"&gt;Step 2: Associate the IP Address Pool with Your Virtual Network
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;subnet1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.1.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamAssociation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/ipamAssociations@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myIpamAssociation&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamPool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamPool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-3-create-static-cidr-blocks"&gt;Step 3: Create Static CIDR Blocks
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticCidrBlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/staticCidrBlocks@2024-05-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myStaticCidrBlock&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.0.2.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamPool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamPool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-4-deploy-the-ipam-configuration"&gt;Step 4: Deploy the IPAM Configuration
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;targetScope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;resourceGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamPool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ipamPool.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnet.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticCidrBlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;staticCidrBlock.bicep&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamPoolId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipamPool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticCidrBlockId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;staticCidrBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="step-5-deploy-the-bicep-file"&gt;Step 5: Deploy the Bicep File
&lt;/h3&gt;&lt;p&gt;Use the Azure CLI to deploy the Bicep file to your Azure subscription.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group &amp;lt;Your-Resource-Group&amp;gt; --template-file aznetman-ipam.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="monitor-ipam"&gt;Monitor IPAM
&lt;/h3&gt;&lt;p&gt;After deploying, monitor IP address usage and allocation using the Azure portal. Navigate to your IPAM resource and check the overview for address allocations and reservations.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;The Azure Virtual Network IP Address Management public preview brings a sophisticated toolset for effective IP address management, crucial for maintaining seamless network operations. With the steps above, you can start harnessing the capabilities of Azure IPAM, ensuring efficient IP address allocation and monitoring.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For detailed information, refer to these Microsoft Learn resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/how-to-manage-ip-addresses-network-manager?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Manage IP addresses with Azure Virtual Network Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network-manager/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;What is Azure Virtual Network Manager?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://techcommunity.microsoft.com/t5/azure-networking-blog/optimize-azure-landing-zone-with-azure-virtual-network-manager/ba-p/4262040?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Optimize Azure Landing Zone with Azure Virtual Network Manager IP Address Management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Deploy Azure Policy with Bicep</title><link>https://blog.brewedinthecloud.com/p/azure-policybicep/</link><pubDate>Sat, 05 Oct 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-policybicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Policy is a service in Azure that enables you to create, assign, and manage policies that enforce different rules and effects over your resources. These policies help ensure that your resources comply with your organisation&amp;rsquo;s standards and service level agreements. In this blog post, we will explore how to define and manage Azure Policy definitions and initiatives using Bicep and Azure DevOps, providing a streamlined and automated approach to governance.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="step-1-set-up-your-azure-environment"&gt;Step 1: Set Up Your Azure Environment
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Resource Group&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Resources/resourceGroups@2021-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myResourceGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-define-azure-policy"&gt;Step 2: Define Azure Policy
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Policy Definition&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policyDefinitions@2021-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myPolicyDefinition&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Custom&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;All&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allowed Storage Account SKUs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;This policy allows only specified SKUs for storage accounts.&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyRule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;if&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Storage/storageAccounts&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;then&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;details&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;allowedValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_LRS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard_GRS&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-create-a-policy-initiative"&gt;Step 3: Create a Policy Initiative
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an Initiative Definition&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;initiativeDefinition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policySetDefinitions@2021-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myInitiativeDefinition&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Storage Account Governance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Initiative to enforce storage account governance policies.&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-4-assign-policies-and-initiatives"&gt;Step 4: Assign Policies and Initiatives
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assign a Policy&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policyAssignments@2021-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myPolicyAssignment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Enforce Allowed Storage Account SKUs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assign an Initiative&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;initiativeAssignment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Authorization/policyAssignments@2021-06-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myInitiativeAssignment&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Enforce Storage Account Governance&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;policyDefinitionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;initiativeDefinition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-5-automate-deployment-with-azure-devops"&gt;Step 5: Automate Deployment with Azure DevOps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a New Pipeline&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to your Azure DevOps project.&lt;/li&gt;
&lt;li&gt;Click on &amp;ldquo;Pipelines&amp;rdquo; and then &amp;ldquo;Create Pipeline&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Select your repository and choose &amp;ldquo;YAML&amp;rdquo; for the pipeline configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define the Pipeline YAML&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;vmImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ubuntu-latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="nt"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;AzureCLI@2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;azureSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;YOUR_AZURE_SUBSCRIPTION&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bash&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptLocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;inlineScript&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inlineScript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; az deployment group create --resource-group myResourceGroup --template-file main.bicep&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;By following this guide, you can define and manage Azure Policy definitions and initiatives using Bicep and Azure DevOps, ensuring a secure and automated governance process. This approach simplifies the management of your policies and enhances the compliance of your resources.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/governance/policy/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Policy Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Bicep Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/devops/?view=azure-devops?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure DevOps Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Deploy Azure S2S with Bicep</title><link>https://blog.brewedinthecloud.com/p/azure-s2svpnbicep/</link><pubDate>Sat, 28 Sep 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-s2svpnbicep/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure VPN Gateway is a service that enables you to establish secure, cross-premises connectivity between your on-premises network and your Azure virtual network. By leveraging Azure VPN Gateway, you can create a reliable and secure connection to your resources in Azure. In this blog post, we will explore how to configure a Site-to-Site VPN connection using Bicep and Azure DevOps, providing a streamlined and automated approach to managing your infrastructure.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="step-1-set-up-your-azure-environment"&gt;Step 1: Set Up Your Azure Environment
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Resource Group&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Resources/resourceGroups@2021-04-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myResourceGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;australiaeast&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Virtual Network and Subnet&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;GatewaySubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-configure-the-vpn-gateway"&gt;Step 2: Configure the VPN Gateway
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the Public IP Address&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myPublicIP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Dynamic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the VPN Gateway&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnGateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworkGateways@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVpnGateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnetGatewayConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Vpn&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RouteBased&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enableBgp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VpnGw1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-configure-the-local-network-gateway"&gt;Step 3: Configure the Local Network Gateway
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the Local Network Gateway&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkGateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/localNetworkGateways@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myLocalNetworkGateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayIpAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;YOUR_ON_PREMISES_PUBLIC_IP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkAddressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.2.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-4-create-the-vpn-connection"&gt;Step 4: Create the VPN Connection
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the Connection&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/connections@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVpnConnection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtualNetworkGateway1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkGateway2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;localNetworkGateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;connectionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;IPsec&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sharedKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;YOUR_SHARED_KEY&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-5-automate-deployment-with-azure-devops"&gt;Step 5: Automate Deployment with Azure DevOps
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a New Pipeline&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to your Azure DevOps project.&lt;/li&gt;
&lt;li&gt;Click on &amp;ldquo;Pipelines&amp;rdquo; and then &amp;ldquo;Create Pipeline&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Select your repository and choose &amp;ldquo;YAML&amp;rdquo; for the pipeline configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define the Pipeline YAML&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;vmImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ubuntu-latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="nt"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;AzureCLI@2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;azureSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;YOUR_AZURE_SUBSCRIPTION&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bash&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptLocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;inlineScript&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inlineScript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; az deployment group create --resource-group myResourceGroup --template-file main.bicep&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;By following this guide, you can configure a Site-to-Site VPN connection using Bicep and Azure DevOps, ensuring a secure and automated deployment process. This approach not only simplifies the management of your infrastructure but also enhances the reliability and security of your connections.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/vpn-gateway/" target="_blank" rel="noopener"
&gt;Azure VPN Gateway Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/" target="_blank" rel="noopener"
&gt;Bicep Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/devops/?view=azure-devops" target="_blank" rel="noopener"
&gt;Azure DevOps Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Optimise Azure Bastion</title><link>https://blog.brewedinthecloud.com/p/azure-bastionautomation/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-bastionautomation/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Bastion is a fully managed service that provides secure and seamless RDP and SSH connectivity to your virtual machines directly through the Azure portal. By leveraging Azure Bastion, you can enhance the security of your virtual network without exposing your VMs to the public internet. However, to further optimise costs and resource usage, you can automate the creation and deletion of Azure Bastion instances based on a schedule using Azure Logic Apps and Automation Accounts.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="step-1-create-an-azure-automation-account"&gt;Step 1: Create an Azure Automation Account
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Sign in to the &lt;a class="link" href="https://portal.azure.com/" target="_blank" rel="noopener"
&gt;Azure portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click on &amp;ldquo;Create a resource&amp;rdquo; and search for &amp;ldquo;Automation&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Create&amp;rdquo; and fill in the required details:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Enter a name for your Automation Account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;: Create a new resource group or select an existing one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location&lt;/strong&gt;: Choose the region closest to your resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Review + create&amp;rdquo; and then &amp;ldquo;Create&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-create-a-runbook-to-delete-azure-bastion"&gt;Step 2: Create a Runbook to Delete Azure Bastion
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to your Automation Account in the Azure portal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &amp;ldquo;Runbooks&amp;rdquo; in the left-hand menu and then &amp;ldquo;Create a runbook&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fill in the required details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Enter a name for your runbook (e.g., DeleteBastion).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runbook type&lt;/strong&gt;: Select &amp;ldquo;PowerShell&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &amp;ldquo;Create&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the runbook editor, enter the following PowerShell script to delete the Azure Bastion instance:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;param&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$ResourceGroupName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$BastionName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Remove-AzBastion&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$ResourceGroupName&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$BastionName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &amp;ldquo;Save&amp;rdquo; and then &amp;ldquo;Publish&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-create-a-runbook-to-create-azure-bastion"&gt;Step 3: Create a Runbook to Create Azure Bastion
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Repeat the steps to create another runbook, but this time name it &amp;ldquo;CreateBastion&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the runbook editor, enter the following PowerShell script to create an Azure Bastion instance:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;param&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$ResourceGroupName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$BastionName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$VNetName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$SubnetName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$bastionConfig&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-AzBastionConfig&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$BastionName&lt;/span&gt; &lt;span class="n"&gt;-VirtualNetworkName&lt;/span&gt; &lt;span class="nv"&gt;$VNetName&lt;/span&gt; &lt;span class="n"&gt;-SubnetName&lt;/span&gt; &lt;span class="nv"&gt;$SubnetName&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$ResourceGroupName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-AzBastion&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$ResourceGroupName&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$BastionName&lt;/span&gt; &lt;span class="n"&gt;-BastionConfig&lt;/span&gt; &lt;span class="nv"&gt;$bastionConfig&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &amp;ldquo;Save&amp;rdquo; and then &amp;ldquo;Publish&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-4-create-a-logic-app-to-schedule-the-runbooks"&gt;Step 4: Create a Logic App to Schedule the Runbooks
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Navigate to the &lt;a class="link" href="https://portal.azure.com/" target="_blank" rel="noopener"
&gt;Azure portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click on &amp;ldquo;Create a resource&amp;rdquo; and search for &amp;ldquo;Logic App&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Create&amp;rdquo; and fill in the required details:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Enter a name for your Logic App.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;: Create a new resource group or select an existing one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location&lt;/strong&gt;: Choose the region closest to your resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Review + create&amp;rdquo; and then &amp;ldquo;Create&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-5-configure-the-logic-app"&gt;Step 5: Configure the Logic App
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In the Logic App Designer, select &amp;ldquo;Recurrence&amp;rdquo; as the trigger and set the schedule for when you want to delete and create the Azure Bastion instance.&lt;/li&gt;
&lt;li&gt;Add an action to &amp;ldquo;Create Job&amp;rdquo; for the &amp;ldquo;DeleteBastion&amp;rdquo; runbook in your Automation Account.&lt;/li&gt;
&lt;li&gt;Add another action to &amp;ldquo;Create Job&amp;rdquo; for the &amp;ldquo;CreateBastion&amp;rdquo; runbook in your Automation Account.&lt;/li&gt;
&lt;li&gt;Configure the parameters for each action (e.g., ResourceGroupName, BastionName, VNetName, SubnetName).&lt;/li&gt;
&lt;li&gt;Save and run your Logic App.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;By automating the creation and deletion of Azure Bastion instances based on a schedule, you can optimise your deployment and reduce costs. Azure Logic Apps and Automation Accounts provide a powerful combination to achieve this automation seamlessly.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/bastion/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Bastion Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/automation/manage-runbooks?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create and manage Azure Automation runbooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/logic-apps/quickstart-create-first-logic-app-workflow?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create a logic app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Function Apps</title><link>https://blog.brewedinthecloud.com/p/azure-functionapps/</link><pubDate>Sat, 14 Sep 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-functionapps/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Functions is a serverless compute service that enables you to run event-driven code without having to explicitly provision or manage infrastructure. With Azure Functions, you can write less code, maintain less infrastructure, and save on costs. This service allows you to build applications that scale automatically and only charge for the resources you use.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;h3 id="step-1-create-an-azure-function-app"&gt;Step 1: Create an Azure Function App
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Sign in to the &lt;a class="link" href="https://portal.azure.com/" target="_blank" rel="noopener"
&gt;Azure portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click on &amp;ldquo;Create a resource&amp;rdquo; and search for &amp;ldquo;Function App&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Create&amp;rdquo; and fill in the required details:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subscription&lt;/strong&gt;: Select your Azure subscription.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;: Create a new resource group or select an existing one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function App name&lt;/strong&gt;: Enter a unique name for your Function App.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publish&lt;/strong&gt;: Choose &amp;ldquo;Code&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime stack&lt;/strong&gt;: Select your preferred runtime stack (e.g., .NET, Node.js, Python).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region&lt;/strong&gt;: Choose the region closest to your users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Review + create&amp;rdquo; and then &amp;ldquo;Create&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-develop-your-function"&gt;Step 2: Develop Your Function
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Once the Function App is created, navigate to it in the Azure portal.&lt;/li&gt;
&lt;li&gt;Click on &amp;ldquo;Functions&amp;rdquo; in the left-hand menu and then &amp;ldquo;Add&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Choose a development environment (e.g., In-portal, VS Code, etc.).&lt;/li&gt;
&lt;li&gt;Select a template for your function (e.g., HTTP trigger, Timer trigger).&lt;/li&gt;
&lt;li&gt;Configure the new function:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Function name&lt;/strong&gt;: Enter a name for your function.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authorization level&lt;/strong&gt;: Choose the appropriate authorization level (e.g., Function, Anonymous).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Create&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-write-your-function-code"&gt;Step 3: Write Your Function Code
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In the Azure portal, navigate to your newly created function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &amp;ldquo;Code + Test&amp;rdquo; in the left-hand menu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write or paste your function code in the code editor. For example, an HTTP trigger function in C# might look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.IO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.Mvc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Azure.WebJobs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Azure.WebJobs.Extensions.Http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.Http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.Logging&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Newtonsoft.Json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HttpTriggerFunction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [FunctionName(&amp;#34;HttpTriggerFunction&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [HttpTrigger(AuthorizationLevel.Function, &amp;#34;get&amp;#34;, &amp;#34;post&amp;#34;, Route = null)]&lt;/span&gt; &lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;C# HTTP trigger function processed a request.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;requestBody&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;StreamReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;ReadToEndAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;dynamic&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JsonConvert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeserializeObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requestBody&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ActionResult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;OkObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$&amp;#34;Hello, {name}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BadRequestObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Please pass a name on the query string or in the request body&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-4-test-your-function"&gt;Step 4: Test Your Function
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In the Azure portal, navigate to your function.&lt;/li&gt;
&lt;li&gt;Click on &amp;ldquo;Test/Run&amp;rdquo; in the left-hand menu.&lt;/li&gt;
&lt;li&gt;Enter any required parameters and click &amp;ldquo;Run&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Check the output and logs to ensure your function is working as expected.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-5-monitor-and-scale-your-function"&gt;Step 5: Monitor and Scale Your Function
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Navigate to your Function App in the Azure portal.&lt;/li&gt;
&lt;li&gt;Click on &amp;ldquo;Monitor&amp;rdquo; in the left-hand menu to view logs and metrics.&lt;/li&gt;
&lt;li&gt;To configure scaling, click on &amp;ldquo;Scale out (App Service plan)&amp;rdquo; in the left-hand menu and adjust the settings as needed.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Functions provides a powerful and flexible way to build serverless applications that scale automatically and only charge for the resources you use. By following the steps outlined in this guide, you can quickly get started with Azure Functions and take advantage of its benefits.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-functions/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Functions Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-azure-function?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create your first function in the Azure portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Functions triggers and bindings concepts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Logic Apps</title><link>https://blog.brewedinthecloud.com/p/logicapps-azure/</link><pubDate>Sat, 07 Sep 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/logicapps-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Logic Apps is a cloud-based service that enables you to automate and orchestrate tasks across various applications, data systems, and services. It provides a visual designer and prebuilt operations, allowing you to create workflows with little to no code. Azure Logic Apps simplifies the way you connect legacy, modern, and cutting-edge systems across cloud, on-premises, and hybrid environments. It supports enterprise and business-to-business (B2B) scenarios, making it a powerful tool for app integration, data integration, system integration, and enterprise application integration (EAI).&lt;/p&gt;
&lt;h2 id="implementation-guide"&gt;Implementation Guide
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s a step-by-step guide on how to get started with Azure Logic Apps using PowerShell:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;: Ensure you have an active Azure subscription and the Az PowerShell module installed on your local computer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sign in to Azure&lt;/strong&gt;: Run &lt;code&gt;Connect-AzAccount&lt;/code&gt; in PowerShell to sign in to Azure and check that your subscription is active.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Resource Group&lt;/strong&gt;: If you don&amp;rsquo;t already have a resource group for your logic app, create one with the &lt;code&gt;New-AzResourceGroup&lt;/code&gt; cmdlet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-AzResourceGroup&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;testResourceGroup&lt;/span&gt; &lt;span class="n"&gt;-Location&lt;/span&gt; &lt;span class="n"&gt;australiaeast&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Workflow Definition&lt;/strong&gt;: Before you create a new logic app or update an existing one, you need a workflow definition for your logic app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create Logic Apps from PowerShell&lt;/strong&gt;: You can create a Consumption logic app in multi-tenant Azure Logic Apps by using the JSON file for a logic app workflow definition.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Please note that this quickstart currently applies only to Consumption logic app workflows that run in multi-tenant Azure Logic Apps. Azure PowerShell is currently unavailable for Standard logic app workflows that run in single-tenant Azure Logic Apps.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Logic Apps offers a robust platform for creating automated and scalable workflows, enabling seamless integration across various applications, data systems, and services. With the help of PowerShell, you can automate different aspects of Azure Logic Apps, making it a powerful tool for app integration, data integration, system integration, EAI, and B2B communication.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more information about Azure Logic Apps, you can refer to the following resources on Microsoft Learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Overview - Azure Logic Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-examples-and-scenarios?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Logic Apps documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/training/paths/build-workflows-with-logic-apps/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Examples &amp;amp; common scenarios - Azure Logic Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Deploy Azure Firewall using Bicep</title><link>https://blog.brewedinthecloud.com/p/azure-bicep-azfw/</link><pubDate>Sat, 31 Aug 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-bicep-azfw/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Firewall is a managed, cloud-based network security service that protects your Azure Virtual Network resources. It offers high availability and scalability, and it allows you to centrally create, enforce, and log application and network connectivity policies across subscriptions and virtual networks. This guide will walk you through deploying an Azure Firewall with application and network rulesets using Bicep and Azure DevOps, ensuring a streamlined and automated setup process.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Your Azure Environment&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure you have an active Azure subscription and the necessary permissions to create resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Azure CLI and Bicep&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install Azure CLI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sL https://aka.ms/InstallAzureCLIDeb &lt;span class="p"&gt;|&lt;/span&gt; sudo bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install Bicep:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az bicep install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Bicep Template for Azure Firewall&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Define the Bicep template (&lt;code&gt;azureFirewall.bicep&lt;/code&gt;) to create the Azure Firewall and configure rules:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myAzureFirewall&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AzureFirewallSubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myFirewallPolicy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewall&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/azureFirewalls@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AZFW_VNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;azureFirewallIpConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks/subnets&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnetName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnetName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myPublicIP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Static&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/firewallPolicies@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;firewallPolicyName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Standard&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleCollectionGroups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appRuleCollectionGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleCollections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;appRuleCollection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleCollectionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FirewallPolicyFilterRuleCollection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;allowWeb&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ApplicationRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocolType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Http&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;targetFqdns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;www.microsoft.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;netRuleCollectionGroup&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleCollections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;netRuleCollection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleCollectionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FirewallPolicyFilterRuleCollection&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;allowDns&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;NetworkRule&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;8.8.8.8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPorts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;53&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UDP&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy the Bicep Template Using Azure CLI&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Deploy the Bicep template to create the Azure Firewall and configure rules:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group myResourceGroup --template-file azureFirewall.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Azure DevOps Pipeline&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a New Pipeline&lt;/strong&gt;: In Azure DevOps, create a new pipeline and connect it to your repository containing the Bicep template.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define Pipeline YAML&lt;/strong&gt;: Add a YAML file (&lt;code&gt;azure-pipelines.yml&lt;/code&gt;) to automate the deployment:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;vmImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ubuntu-latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;AzureCLI@2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;azureSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;your-azure-subscription&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bash&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptLocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;inlineScript&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inlineScript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; az deployment group create --resource-group myResourceGroup --template-file azureFirewall.bicep&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;addSpnToEnvironment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run the Pipeline&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Commit the changes and run the pipeline to deploy the Azure Firewall automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Deploying an Azure Firewall with application and network rulesets using Bicep and Azure DevOps streamlines the process, ensuring a consistent and automated setup. This approach not only saves time but also reduces the potential for manual errors, providing a robust and secure network security solution.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information, refer to the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall-manager/quick-firewall-policy-bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Quickstart: Create an Azure Firewall and a firewall policy - Bicep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/add-template-to-azure-pipelines?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;CI/CD with Azure Pipelines, Bicep, and bicepparam files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/deploy-bicep?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Deploy Azure Firewall with Availability Zones - Bicep&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Deploy Azure VPN Gateway with P2S Config using Bicep</title><link>https://blog.brewedinthecloud.com/p/azure-bicep-vpn-p2s/</link><pubDate>Sat, 24 Aug 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-bicep-vpn-p2s/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure VPN Gateway is a vital service that facilitates secure connectivity between on-premises networks and Azure virtual networks. With Point-To-Site (P2S) VPN, individual clients can securely connect to an Azure Virtual Network (VNet) from remote locations. This guide will demonstrate how to deploy an Azure VPN Gateway with P2S configuration using Azure certificate authentication, Bicep, and Azure DevOps, ensuring a streamlined and automated setup process.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Your Azure Environment&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure you have an active Azure subscription and the necessary permissions to create resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Azure CLI and Bicep&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install Azure CLI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sL https://aka.ms/InstallAzureCLIDeb &lt;span class="p"&gt;|&lt;/span&gt; sudo bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install Bicep:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az bicep install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Generate and Export Certificates&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a self-signed root certificate using PowerShell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$cert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-SelfSignedCertificate&lt;/span&gt; &lt;span class="n"&gt;-Type&lt;/span&gt; &lt;span class="n"&gt;Custom&lt;/span&gt; &lt;span class="n"&gt;-Subject&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;CN=P2SRootCert&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-KeySpec&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="n"&gt;-KeyExportPolicy&lt;/span&gt; &lt;span class="n"&gt;Exportable&lt;/span&gt; &lt;span class="n"&gt;-KeyUsage&lt;/span&gt; &lt;span class="n"&gt;CertSign&lt;/span&gt; &lt;span class="n"&gt;-KeyUsageProperty&lt;/span&gt; &lt;span class="n"&gt;Sign&lt;/span&gt; &lt;span class="n"&gt;-KeyLength&lt;/span&gt; &lt;span class="mf"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;-HashAlgorithm&lt;/span&gt; &lt;span class="n"&gt;sha256&lt;/span&gt; &lt;span class="n"&gt;-CertStoreLocation&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Cert:\CurrentUser\My&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-NotAfter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;AddMonths&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Export the root certificate public key (.cer):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Export-Certificate&lt;/span&gt; &lt;span class="n"&gt;-Cert&lt;/span&gt; &lt;span class="nv"&gt;$cert&lt;/span&gt; &lt;span class="n"&gt;-FilePath&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:\path\to\rootcert.cer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate a client certificate from the root certificate:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$clientCert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-SelfSignedCertificate&lt;/span&gt; &lt;span class="n"&gt;-Type&lt;/span&gt; &lt;span class="n"&gt;Custom&lt;/span&gt; &lt;span class="n"&gt;-Subject&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;CN=P2SClientCert&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-KeySpec&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="n"&gt;-KeyExportPolicy&lt;/span&gt; &lt;span class="n"&gt;Exportable&lt;/span&gt; &lt;span class="n"&gt;-KeyUsage&lt;/span&gt; &lt;span class="n"&gt;DigitalSignature&lt;/span&gt; &lt;span class="n"&gt;-KeyUsageProperty&lt;/span&gt; &lt;span class="n"&gt;Sign&lt;/span&gt; &lt;span class="n"&gt;-KeyLength&lt;/span&gt; &lt;span class="mf"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;-HashAlgorithm&lt;/span&gt; &lt;span class="n"&gt;sha256&lt;/span&gt; &lt;span class="n"&gt;-CertStoreLocation&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Cert:\CurrentUser\My&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Signer&lt;/span&gt; &lt;span class="nv"&gt;$cert&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Export the client certificate (.pfx):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Export-PfxCertificate&lt;/span&gt; &lt;span class="n"&gt;-Cert&lt;/span&gt; &lt;span class="nv"&gt;$clientCert&lt;/span&gt; &lt;span class="n"&gt;-FilePath&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:\path\to\clientcert.pfx&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Password&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ConvertTo-SecureString&lt;/span&gt; &lt;span class="n"&gt;-String&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;password&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; &lt;span class="n"&gt;-AsPlainText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Bicep Template for VPN Gateway&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Define the Bicep template (&lt;code&gt;vpnGateway.bicep&lt;/code&gt;) to create the VPN Gateway:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworks@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVNet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Australia East&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressSpace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;GatewaySubnet&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.1.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnGateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/virtualNetworkGateways@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myVpnGateway&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;East US&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ipConfigurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vnetGatewayConfig&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gatewayType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Vpn&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RouteBased&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enableBgp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VpnGw1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VpnGw1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnClientConfiguration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnClientAddressPool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;addressPrefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;172.16.0.0/24&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vpnClientProtocols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;OpenVPN&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rootCertificates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RootCert&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicCertData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/publicIPAddresses@2021-02-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;myPublicIP&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;East US&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;publicIPAllocationMethod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Dynamic&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Public Cert data is obtained by opening the root certificate file (in base64) in notepad and copy the content WITHOUT the &amp;mdash;BEGIN&amp;mdash; and &amp;mdash;END&amp;mdash; lines&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy the Bicep Template Using Azure CLI&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Deploy the Bicep template to create the VPN Gateway:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az deployment group create --resource-group myResourceGroup --template-file vpnGateway.bicep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Azure DevOps Pipeline&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a New Pipeline&lt;/strong&gt;: In Azure DevOps, create a new pipeline and connect it to your repository containing the Bicep template.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define Pipeline YAML&lt;/strong&gt;: Add a YAML file (&lt;code&gt;azure-pipelines.yml&lt;/code&gt;) to automate the deployment:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;vmImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ubuntu-latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;AzureCLI@2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;azureSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;your-azure-subscription&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bash&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scriptLocation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;inlineScript&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inlineScript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; az deployment group create --resource-group myResourceGroup --template-file vpnGateway.bicep&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;addSpnToEnvironment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run the Pipeline&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Commit the changes and run the pipeline to deploy the VPN Gateway automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Deploying an Azure VPN Gateway with Point-To-Site configuration using Azure certificate authentication, Bicep, and Azure DevOps streamlines the process, ensuring a consistent and automated setup. This approach not only saves time but also reduces the potential for manual errors, providing a reliable and secure connection for remote clients.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information, refer to the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal" target="_blank" rel="noopener"
&gt;Configure Point-to-Site VPN Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-certificates-point-to-site" target="_blank" rel="noopener"
&gt;Generate and Export Certificates for P2S&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/devops/pipelines/get-started-yaml?view=azure-devops" target="_blank" rel="noopener"
&gt;Azure DevOps Pipeline Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Networking Labs</title><link>https://blog.brewedinthecloud.com/p/azure-networking-labs/</link><pubDate>Mon, 19 Aug 2024 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-networking-labs/</guid><description>&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gP_DJt9g" target="_blank" rel="noopener"
&gt;Design and implement a virtual network in Azure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gXc9WHNs" target="_blank" rel="noopener"
&gt;Configure DNS settings in Azure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gNED8Ys6" target="_blank" rel="noopener"
&gt;Connect two Azure Virtual Networks using global virtual network peering&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gHeDVTb8" target="_blank" rel="noopener"
&gt;Create and configure a virtual network gateway&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gfVccCgq" target="_blank" rel="noopener"
&gt;Create a Virtual WAN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gE_q3a53" target="_blank" rel="noopener"
&gt;Configure an ExpressRoute Gateway&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gRqQe4gM" target="_blank" rel="noopener"
&gt;Provision an ExpressRoute circuit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/g9yKM6jA" target="_blank" rel="noopener"
&gt;Create and configure an Azure load balancer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gpgvT6s3" target="_blank" rel="noopener"
&gt;Create a Traffic Manager profile&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gShY-UdT" target="_blank" rel="noopener"
&gt;Deploy Azure Application Gateway&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gtqmxChV" target="_blank" rel="noopener"
&gt;Create a Front Door for a highly available web application&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/grQb4c9b" target="_blank" rel="noopener"
&gt;Configure DDoS Protection on a virtual network&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/g44ZqJtb" target="_blank" rel="noopener"
&gt;Deploy and configure Azure Firewall&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gbQvqrQp" target="_blank" rel="noopener"
&gt;Secure your virtual hub using Azure Firewall Manager&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gwvNJyc3" target="_blank" rel="noopener"
&gt;Restrict network access to PaaS resources with virtual network service endpoints&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gsReps3K" target="_blank" rel="noopener"
&gt;Create an Azure private endpoint using Azure PowerShell&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌&lt;a class="link" href="https://lnkd.in/gj3FCr7s" target="_blank" rel="noopener"
&gt;Monitor a load balancer resource using Azure Monitor&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Configuring Microsoft Purview with Microsoft 365 DSC</title><link>https://blog.brewedinthecloud.com/p/m365-dsc-purview-devops/</link><pubDate>Sat, 17 Aug 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/m365-dsc-purview-devops/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Microsoft 365 Desired State Configuration (DSC) is a powerful tool that allows administrators to manage and configure their Microsoft 365 environments using code. One of its key applications is configuring Microsoft Purview, which provides comprehensive data governance and compliance solutions. By using DSC, you can automate the setup of data classifications and information boundaries, ensuring consistent and secure data management across your organisation.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Microsoft 365 DSC&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Begin by installing the Microsoft 365 DSC module using PowerShell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Install-Module&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;Microsoft365DSC&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; &lt;span class="n"&gt;-AllowClobber&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extract Current Configuration&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Extract the current configuration of your Microsoft Purview settings to create a baseline:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Export-M365DSCConfiguration&lt;/span&gt; &lt;span class="n"&gt;-Quiet&lt;/span&gt; &lt;span class="n"&gt;-Components&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Purview&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This command generates a configuration file that represents the current state of your Purview settings.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define Data Classifications&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Edit the extracted configuration file to define your data classifications. For example, you can specify labels for sensitive information such as &amp;ldquo;Confidential&amp;rdquo; or &amp;ldquo;Internal Use Only&amp;rdquo;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;MyPurviewConfig &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Import-DscResource&lt;/span&gt; &lt;span class="n"&gt;-ModuleName&lt;/span&gt; &lt;span class="n"&gt;Microsoft365DSC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;M365DSC_PurviewLabel&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ConfidentialLabel&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Ensure&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Present&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DisplayName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Confidential&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Label for confidential data&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Red&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Information Boundaries&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Define information boundaries to control data access and sharing within your organisation. This can include setting up policies to restrict data flow between departments:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;MyPurviewConfig &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Import-DscResource&lt;/span&gt; &lt;span class="n"&gt;-ModuleName&lt;/span&gt; &lt;span class="n"&gt;Microsoft365DSC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;M365DSC_PurviewInformationBoundary&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;FinanceBoundary&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Ensure&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Present&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Finance Department&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Boundary for finance department data&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Members&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user1@domain.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;user2@domain.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apply Configuration&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Apply the desired configuration to your Microsoft 365 tenant:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Start-DSCConfiguration&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PathToConfigurationFile&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;-Wait&lt;/span&gt; &lt;span class="n"&gt;-Verbose&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This command ensures that your Purview settings match the desired state defined in the configuration file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automate with Azure DevOps&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Set Up Azure DevOps Pipeline&lt;/strong&gt;: Create a pipeline in Azure DevOps to automate the extraction and application of Purview configurations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schedule Configuration Updates&lt;/strong&gt;: Use the pipeline to run the &lt;code&gt;Export-M365DSCConfiguration&lt;/code&gt; and &lt;code&gt;Start-DSCConfiguration&lt;/code&gt; commands on a schedule, ensuring your Purview settings are always up-to-date.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Microsoft 365 DSC provides a robust and efficient way to manage your Microsoft Purview configurations through code. By automating the setup of data classifications and information boundaries, you can ensure consistent and secure data governance across your organisation.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information, refer to the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/microsoft-365-dsc-overview" target="_blank" rel="noopener"
&gt;Introduction to Microsoft 365 DSC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-365/compliance/microsoft-purview-overview" target="_blank" rel="noopener"
&gt;Configuring Microsoft Purview with DSC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-365/compliance/data-classification-overview" target="_blank" rel="noopener"
&gt;Managing Data Classifications and Information Boundaries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mastering Your M365 Tenant with Microsoft 365 DSC</title><link>https://blog.brewedinthecloud.com/p/m365-dsc-devops/</link><pubDate>Sat, 10 Aug 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/m365-dsc-devops/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Microsoft 365 Desired State Configuration (DSC) is a powerful tool that allows administrators to manage and configure their Microsoft 365 (M365) environments using code. This approach, often referred to as &amp;ldquo;Infrastructure as Code&amp;rdquo; (IaC), helps eliminate the inefficiencies and potential errors associated with manual configurations, or &amp;ldquo;clickops.&amp;rdquo; By using DSC, you can ensure that your M365 tenant remains consistent, compliant, and easily reproducible.&lt;/p&gt;
&lt;h2 id="step-by-step-implementation-guide"&gt;Step-by-Step Implementation Guide
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Microsoft 365 DSC&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Begin by installing the Microsoft 365 DSC module using PowerShell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Install-Module&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;Microsoft365DSC&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; &lt;span class="n"&gt;-AllowClobber&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extract Configuration&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Extract the current configuration of your M365 tenant to create a baseline:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Export-M365DSCConfiguration&lt;/span&gt; &lt;span class="n"&gt;-Quiet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This command generates a configuration file that represents the current state of your M365 environment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modify Configuration&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edit the extracted configuration file to define the desired state of your M365 tenant. You can add, remove, or modify settings as needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Change Review&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Review the changes made to the configuration file to ensure they align with your desired state. This step is crucial for maintaining consistency and compliance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apply Updated Configuration&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Apply the desired configuration to your M365 tenant:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Start-DSCConfiguration&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;PathToConfigurationFile&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;-Wait&lt;/span&gt; &lt;span class="n"&gt;-Verbose&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This command ensures that your M365 environment matches the desired state defined in the configuration file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Using Azure DevOps for Automation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Set Up Azure DevOps Pipeline&lt;/strong&gt;: Create a pipeline in Azure DevOps to automate the extraction and change detection process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schedule Extraction&lt;/strong&gt;: Use the pipeline to run the &lt;code&gt;Export-M365DSCConfiguration&lt;/code&gt; command on a schedule, ensuring your configuration is always up-to-date.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change Detection&lt;/strong&gt;: Implement a step in the pipeline to compare the extracted configuration with the desired state and notify you of any discrepancies.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Microsoft 365 DSC provides a robust and efficient way to manage your M365 tenant through code, reducing the risks associated with manual configurations. By adopting DSC and integrating it with Azure DevOps, you can achieve greater consistency, compliance, and ease of management in your M365 environment.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information, refer to the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/microsoft-365-dsc-overview" target="_blank" rel="noopener"
&gt;Introduction to Microsoft 365 DSC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/microsoft-365-dsc-installation" target="_blank" rel="noopener"
&gt;Installing and Configuring Microsoft 365 DSC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/microsoft-365-dsc-management" target="_blank" rel="noopener"
&gt;Managing Microsoft 365 with DSC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure DevOps</title><link>https://blog.brewedinthecloud.com/p/azure-devops/</link><pubDate>Sat, 03 Aug 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-devops/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure DevOps is a comprehensive platform that offers a set of development tools, services, and features designed to enable teams to plan smarter, collaborate better, and ship faster. It provides a collaborative culture and set of processes that bring together developers, project managers, and contributors to develop software. Azure DevOps allows organisations to create and improve products at a faster pace than they can with traditional software development approaches.&lt;/p&gt;
&lt;h2 id="implementation-guide"&gt;Implementation Guide
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s a step-by-step guide on how to implement CI/CD pipelines with Azure DevOps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Project&lt;/strong&gt;: Start by creating a new project in Azure DevOps. Navigate to your Azure DevOps account, click on &amp;lsquo;New Project&amp;rsquo;, fill in the details, and click &amp;lsquo;Create&amp;rsquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Repository&lt;/strong&gt;: Once the project is created, create a new repository by clicking on &amp;lsquo;Repos&amp;rsquo; and then &amp;lsquo;New repository&amp;rsquo;. You can choose to initialize the repository with a README or a .gitignore.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Pipeline&lt;/strong&gt;: Navigate to &amp;lsquo;Pipelines&amp;rsquo; and click on &amp;lsquo;Create Pipeline&amp;rsquo;. Choose where your code is located and select the repository you just created.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure the Pipeline&lt;/strong&gt;: Choose &amp;lsquo;Starter Pipeline&amp;rsquo; and you&amp;rsquo;ll be presented with a YAML file. This file defines the steps for your pipeline. You can add tasks such as building, testing, and deploying your application.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run the Pipeline&lt;/strong&gt;: Once you&amp;rsquo;ve configured your pipeline, click on &amp;lsquo;Run&amp;rsquo; to start the pipeline. You can monitor the progress and view the logs in real-time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Release&lt;/strong&gt;: After the pipeline has successfully run, you can create a release to deploy your application. Navigate to &amp;lsquo;Pipelines&amp;rsquo;, then &amp;lsquo;Releases&amp;rsquo;, and click on &amp;lsquo;New release pipeline&amp;rsquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure DevOps offers a robust platform for creating automated and scalable workflows, enabling seamless integration across various applications, data systems, and services. With its comprehensive set of tools and features, Azure DevOps not only simplifies the process of software development but also enhances team collaboration, making it an ideal choice for teams aiming to deliver high-quality software at a faster pace.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more information about Azure DevOps, you can refer to the following resources on Microsoft Learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/training/modules/introduction-to-devops/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Introduction to Azure DevOps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/devops/user-guide/?view=azure-devops?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure DevOps documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/plans/6ey7h68p2zk3j2?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure DevOps: Zero to Hero Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/devops/get-started/?view=azure-devops?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Get started with Azure DevOps documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Protecting Azure Private Endpoints in Azure</title><link>https://blog.brewedinthecloud.com/p/private-endpoints-nsg-azure/</link><pubDate>Sat, 27 Jul 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/private-endpoints-nsg-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Private Endpoint is a powerful feature that allows you to securely connect to Azure services over a private link. By using Network Security Groups (NSGs), you can control the traffic allowed into your private endpoints, enhancing security and ensuring that only authorized traffic can access your resources.&lt;/p&gt;
&lt;h2 id="implementation-guide"&gt;Implementation Guide
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enable Network Policies for Private Endpoints&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ensure that the &lt;code&gt;PrivateEndpointNetworkPolicies&lt;/code&gt; property is enabled on the subnet containing your private endpoint resources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use Azure PowerShell or CLI to enable this feature:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;az&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="n"&gt;vnet&lt;/span&gt; &lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;subnet-name&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-vnet-name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;vnet-name&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-resource-group&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;resource-group&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-disable-private-endpoint-network-policies&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create or Update NSGs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a new NSG or update an existing one to include rules that match the private IP addresses of your private endpoints.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Define inbound and outbound security rules to control traffic. For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;az&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="n"&gt;nsg&lt;/span&gt; &lt;span class="n"&gt;rule&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-resource-group&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;resource-group&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-nsg-name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;nsg-name&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-name&lt;/span&gt; &lt;span class="n"&gt;AllowPrivateEndpoint&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-priority&lt;/span&gt; &lt;span class="mf"&gt;100&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-source-address-prefixes&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;private-endpoint-ip&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-destination-port-ranges&lt;/span&gt; &lt;span class="mf"&gt;443&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-access&lt;/span&gt; &lt;span class="n"&gt;Allow&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-protocol&lt;/span&gt; &lt;span class="n"&gt;Tcp&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-direction&lt;/span&gt; &lt;span class="n"&gt;Inbound&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Associate NSGs with Subnets&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Associate the NSG with the subnet that contains your private endpoints:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;az&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="n"&gt;vnet&lt;/span&gt; &lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;subnet-name&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-vnet-name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;vnet-name&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-resource-group&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;resource-group&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-network-security-group&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;nsg-name&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verify Configuration&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that the NSG rules are correctly applied and that traffic is being controlled as expected. You can use Azure Network Watcher to monitor and diagnose network issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Using NSGs to control traffic into Azure Private Endpoints provides an additional layer of security, ensuring that only authorized traffic can access your resources. By following the steps outlined above, you can effectively manage and secure your private endpoints.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information, refer to the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/private-link/inspect-traffic-with-azure-firewall?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Network security groups support for private endpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/private-link/inspect-traffic-with-azure-firewall?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Managing network policies for private endpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/private-link/inspect-traffic-with-azure-firewall?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Private Link overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SharePoint: Implementing Access Reviews for SharePoint Sites</title><link>https://blog.brewedinthecloud.com/p/sharepoint-access-m365/</link><pubDate>Sat, 27 Jul 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/sharepoint-access-m365/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Microsoft SharePoint is a versatile and widely-used collaboration platform that helps organisations create, manage, and share content and information. It provides a centralized space for teams to collaborate, communicate, and access important documents, making it an invaluable tool for organisations of all sizes. One of the key features of SharePoint is the ability to implement access reviews, a critical component for maintaining secure and efficient data management.&lt;/p&gt;
&lt;h2 id="implementation-guide"&gt;Implementation Guide
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s a step-by-step guide on how to implement access reviews for SharePoint sites:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prepare for Access Reviews&lt;/strong&gt;: Before starting the access review process, ensure that your SharePoint application is integrated with Microsoft Entra ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check Groups for Review&lt;/strong&gt;: If your SharePoint application relies on groups, ensure that these groups are ready for the review.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Select Appropriate Reviewers&lt;/strong&gt;: Choose the individuals who will be responsible for conducting the access reviews.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Schedule Regular Reviews&lt;/strong&gt;: Microsoft Entra access reviews allow you to schedule regular reviews or do ad-hoc reviews to discover who has access to specific resources, such as SharePoint sites.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Track Reviews&lt;/strong&gt;: Keep track of the reviews for insights, compliance, or policy reasons.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automate Review Outcomes&lt;/strong&gt;: Use the insights from the reviews to efficiently determine if users should continue to have access and automate outcomes, such as removing users&amp;rsquo; access to resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Implementing access reviews for SharePoint sites is a crucial step in ensuring data security and compliance within your organisation. It allows for efficient management of user access, ensuring that only authorized individuals have access to specific resources. With SharePoint&amp;rsquo;s robust features and integrations with other Microsoft tools, organisations can enhance collaboration, simplify document management, and automate processes.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more information about Microsoft SharePoint and implementing access reviews, you can refer to the following resources on Microsoft Learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/id-governance/access-reviews-application-preparation" target="_blank" rel="noopener"
&gt;Prepare for an access review of users&amp;rsquo; access to an application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/id-governance/deploy-access-reviews" target="_blank" rel="noopener"
&gt;Plan a Microsoft Entra access reviews deployment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Microsoft Defender Product Suite</title><link>https://blog.brewedinthecloud.com/p/defender-servers-azure/</link><pubDate>Sun, 21 Jul 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/defender-servers-azure/</guid><description>&lt;h2 id="introduction-to-microsoft-defender-for-servers"&gt;Introduction to Microsoft Defender for Servers
&lt;/h2&gt;&lt;p&gt;In the wake of recent CrowdStrike BSOD, many organisations are seeking robust and reliable security solutions. Microsoft Defender for Servers emerges as a strong contender, offering comprehensive protection for your server infrastructure. Microsoft Defender for Servers is a part of the Microsoft Defender suite, designed to provide advanced threat protection for server environments. It integrates seamlessly with Azure and other cloud platforms, ensuring your servers are safeguarded against a wide range of cyber threats.&lt;/p&gt;
&lt;h2 id="detailed-trial-options-for-microsoft-defender"&gt;Detailed Trial Options for Microsoft Defender
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1. Microsoft Defender for Endpoint:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trial Duration:&lt;/strong&gt; 90 days&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Features:&lt;/strong&gt; Real-time threat detection, automated investigation and response, and advanced hunting capabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. Microsoft Defender for Servers:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trial Duration:&lt;/strong&gt; 30 days&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Features:&lt;/strong&gt; Endpoint detection and response (EDR), vulnerability management, and integration with Azure Security Center.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Microsoft Defender for Cloud:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trial Duration:&lt;/strong&gt; 30 days&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Features:&lt;/strong&gt; Continuous assessment of security posture, threat protection across multi-cloud environments, and compliance management.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Microsoft Defender for Servers offers a robust alternative for organisations looking to enhance their security posture in the wake of issues like the CrowdStrike BSOD. With comprehensive protection, seamless integration, and detailed trial options, it stands out as a reliable choice for securing your server infrastructure.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-servers-introduction?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Defender for Servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/microsoft-365/security/defender-endpoint/microsoft-defender-endpoint?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Defender for Endpoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-cloud-introduction?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Microsoft Defender for Cloud&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Microsoft Purview: Information Boundaries</title><link>https://blog.brewedinthecloud.com/p/purview-infoboundaries-m365/</link><pubDate>Sat, 20 Jul 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/purview-infoboundaries-m365/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Microsoft Purview is a comprehensive data governance service that helps organisations manage and get insights from their data. It&amp;rsquo;s particularly useful in creating information boundaries within your Microsoft 365 (M365) environment. Information boundaries are essential for data security, compliance, and efficient data management.&lt;/p&gt;
&lt;h2 id="implementation-guide"&gt;Implementation Guide
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s a step-by-step guide on how to implement information boundaries with Microsoft Purview in your M365 environment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Microsoft Purview&lt;/strong&gt;: Begin by setting up your Microsoft Purview account in the Azure portal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect to M365&lt;/strong&gt;: Connect your M365 environment to Microsoft Purview. This allows Purview to access and manage your M365 data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scan Your Data&lt;/strong&gt;: Use Microsoft Purview&amp;rsquo;s scanning feature to discover and catalog data across your M365 environment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define Information Boundaries&lt;/strong&gt;: Define information boundaries based on your organisation&amp;rsquo;s data governance policies. This could be based on data sensitivity, business function, or regulatory requirements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apply Information Boundaries&lt;/strong&gt;: Apply the defined information boundaries to your data. This involves assigning data to specific boundaries and applying the appropriate access controls.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitor and Review&lt;/strong&gt;: Regularly monitor and review your information boundaries to ensure they remain accurate and relevant. Microsoft Purview provides comprehensive reporting and analytics capabilities to facilitate this.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Implementing information boundaries with Microsoft Purview in your M365 environment can provide significant benefits. It enhances data security, facilitates compliance, and improves data usability. By providing a clear overview of your data landscape, Microsoft Purview empowers you to manage your data more effectively and securely.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more information about Microsoft Purview and implementing information boundaries, you can refer to the following resources on Microsoft Learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/learn/modules/introduction-to-microsoft-purview/" target="_blank" rel="noopener"
&gt;Introduction to Microsoft Purview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/learn/modules/implement-information-boundaries-with-purview/" target="_blank" rel="noopener"
&gt;Implementing information boundaries with Microsoft Purview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/purview/" target="_blank" rel="noopener"
&gt;Microsoft Purview documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/purview/create-catalog-portal" target="_blank" rel="noopener"
&gt;Get started with Microsoft Purview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Microsoft Purview: Data Classifications</title><link>https://blog.brewedinthecloud.com/p/purview-classificaions-m365/</link><pubDate>Sat, 13 Jul 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/purview-classificaions-m365/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Microsoft Purview is a unified data governance service that facilitates the management of your data landscape. It enables organisations to map, catalog, understand, and classify data across various sources, including Microsoft 365 (M365). Implementing data classifications with Microsoft Purview in your M365 environment can significantly enhance your data security, compliance, and usability.&lt;/p&gt;
&lt;h2 id="implementation-guide"&gt;Implementation Guide
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s a step-by-step guide on how to implement data classifications with Microsoft Purview in your M365 environment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Microsoft Purview&lt;/strong&gt;: Start by setting up your Microsoft Purview account. This involves creating a Purview account in the Azure portal and configuring the necessary settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect to M365&lt;/strong&gt;: Connect your M365 environment to Microsoft Purview. This allows Purview to access and manage your M365 data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scan Your Data&lt;/strong&gt;: Use Microsoft Purview&amp;rsquo;s scanning feature to discover and catalog data across your M365 environment. This includes data in SharePoint, Teams, and other M365 services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Classify Your Data&lt;/strong&gt;: Implement data classifications by applying labels to your data based on its sensitivity and business impact. Microsoft Purview supports both built-in and custom classifications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apply Data Protection Measures&lt;/strong&gt;: Based on the classifications, apply appropriate data protection measures. This could include access controls, encryption, and data loss prevention policies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitor and Review&lt;/strong&gt;: Regularly monitor and review your data classifications to ensure they remain accurate and relevant. Microsoft Purview provides comprehensive reporting and analytics capabilities to facilitate this.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Implementing data classifications with Microsoft Purview in your M365 environment can provide significant benefits. It enhances data security, facilitates compliance, and improves data usability. By providing a clear overview of your data landscape, Microsoft Purview empowers you to manage your data more effectively and securely.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more information about Microsoft Purview and data classifications, you can refer to the following resources on Microsoft Learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/learn/modules/introduction-to-microsoft-purview/" target="_blank" rel="noopener"
&gt;Introduction to Microsoft Purview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/learn/modules/implement-data-classifications-with-purview/" target="_blank" rel="noopener"
&gt;Implementing data classifications with Microsoft Purview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/purview/" target="_blank" rel="noopener"
&gt;Microsoft Purview documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/purview/create-catalog-portal" target="_blank" rel="noopener"
&gt;Get started with Microsoft Purview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Preparing for Copilot for M365</title><link>https://blog.brewedinthecloud.com/p/copilot-m365/</link><pubDate>Sat, 06 Jul 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/copilot-m365/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Copilot for M365 is a comprehensive tool designed to streamline the management of your Microsoft 365 environment. It provides an overview of data classification, information protection, and just enough access for M365, SharePoint, and Teams. By adopting Copilot for M365, organisations can enhance their data security, improve compliance, and optimize their collaborative workflows.&lt;/p&gt;
&lt;h2 id="implementation-guide"&gt;Implementation Guide
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s a step-by-step guide on how to prepare your M365 environment for Copilot adoption:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assess Your Current Environment&lt;/strong&gt;: Start by understanding your current M365 environment. Identify the types of data you have, where it&amp;rsquo;s stored, and who has access to it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Classify Your Data&lt;/strong&gt;: Use the data classification capabilities of Copilot for M365 to categorize your data based on sensitivity and business impact. This could range from public data to highly confidential data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implement Information Protection&lt;/strong&gt;: Leverage the information protection features of Copilot for M365 to apply appropriate security controls to your data. This could include encryption, access controls, and data loss prevention policies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Just Enough Access&lt;/strong&gt;: Set up just enough access (JEA) for M365, SharePoint, and Teams. JEA is a principle that limits user access rights to only what&amp;rsquo;s necessary for their job function. This minimizes the risk of unauthorized access or changes to your environment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitor and Review&lt;/strong&gt;: Regularly review and update your data classification, information protection, and access controls to ensure they remain effective and relevant.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Adopting Copilot for M365 can significantly enhance the security and efficiency of your M365 environment. By providing a clear overview of data classification, information protection, and just enough access, it empowers organisations to manage their data more effectively and securely. As a result, organisations can ensure compliance, protect sensitive information, and foster a more collaborative and productive workspace.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more information about Copilot for M365, you can refer to the following resources on Microsoft Learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/learn/modules/introduction-to-microsoft-365/" target="_blank" rel="noopener"
&gt;Introduction to Microsoft 365&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/microsoft-365/" target="_blank" rel="noopener"
&gt;Microsoft 365 documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/learn/paths/m365-learn-path/" target="_blank" rel="noopener"
&gt;Microsoft 365: Zero to Hero Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/microsoft-365/get-started?view=o365-worldwide" target="_blank" rel="noopener"
&gt;Get started with Microsoft 365 documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Policy: Enforcing Organisational Compliance</title><link>https://blog.brewedinthecloud.com/p/policy-azure/</link><pubDate>Sat, 29 Jun 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/policy-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Policy is a service within Microsoft Azure that allows organisations to create, assign, and manage policies. These policies enforce rules and effects over resources, helping ensure compliance with corporate standards and service-level agreements. Azure Policy provides an aggregated view to evaluate the overall state of your environment, with the ability to drill down to the per-resource, per-policy granularity. It&amp;rsquo;s a powerful tool for maintaining governance and ensuring compliance at scale.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Azure Policy can be accessed and managed programmatically using PowerShell. Here&amp;rsquo;s an example of how to create a policy assignment using Azure PowerShell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Connect to Azure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Connect-AzAccount&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Register the Azure Policy Insights resource provider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Register-AzResourceProvider&lt;/span&gt; &lt;span class="n"&gt;-ProviderNamespace&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Microsoft.PolicyInsights&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Create a policy assignment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$definition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-AzPolicyDefinition&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DisplayName&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Audit VMs that do not use managed disks&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$rg&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-AzResourceGroup&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;resourceGroupName&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-AzPolicyAssignment&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;assignmentName&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;-DisplayName&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;displayName&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;-Scope&lt;/span&gt; &lt;span class="nv"&gt;$rg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ResourceId&lt;/span&gt; &lt;span class="n"&gt;-PolicyDefinition&lt;/span&gt; &lt;span class="nv"&gt;$definition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example, we&amp;rsquo;re creating a policy assignment to audit virtual machines that do not use managed disks. Replace &lt;code&gt;&amp;lt;resourceGroupName&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;assignmentName&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;displayName&amp;gt;&lt;/code&gt; with your own values.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Policy is an essential tool for any organisation using Azure. It helps enforce organisational standards and assess compliance at scale. With its ability to provide an aggregated view of the environment and drill down to the per-resource, per-policy granularity, Azure Policy offers a robust solution for maintaining governance and ensuring compliance in your Azure environment.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more information about Azure Policy, you can refer to the following resources on Microsoft Learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/governance/policy/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Overview of Azure Policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/governance/policy/assign-policy-powershell?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Policy documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/training/modules/configure-azure-policy/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Configure Azure Policy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These resources provide a wealth of information about Azure Policy and can help you understand the service better and guide you on how to effectively use it in your projects.&lt;/p&gt;</description></item><item><title>Azure Advisor: Optimizing Azure Resources</title><link>https://blog.brewedinthecloud.com/p/advisory-azure/</link><pubDate>Sat, 22 Jun 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/advisory-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Advisor is a digital cloud assistant that helps you follow best practices to optimize your Azure deployments. It analyzes your resource configuration and usage telemetry, then recommends solutions that can help you improve the cost-effectiveness, performance, reliability, and security of your Azure resources. With Azure Advisor, you can get proactive, actionable, and personalized best practices recommendations. It helps improve the performance, security, and reliability of your resources, as you identify opportunities to reduce your overall Azure spend.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Azure Advisor can be accessed through the Azure portal. The Advisor dashboard displays personalized recommendations for all your subscriptions. The recommendations are divided into five categories: Reliability, Security, Performance, Cost, and Operational Excellence.&lt;/p&gt;
&lt;p&gt;Here is a PowerShell example of how to get cost savings summary from Azure Advisor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Get cost savings summary from Azure Advisor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;az&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AdvisorResources | where type == &amp;#39;microsoft.advisor/recommendations&amp;#39; | where properties.category == &amp;#39;Cost&amp;#39; | extend resources = tostring(properties.resourceMetadata.resourceId), savings = todouble(properties.extendedProperties.savingsAmount), solution = tostring(properties.shortDescription.solution), currency = tostring(properties.extendedProperties.savingsCurrency) | summarize dcount(resources), bin(sum(savings), 0.01) by solution, currency | project solution, dcount_resources, sum_savings, currency | order by sum_savings desc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This query summarizes the cost savings of each Azure Advisor recommendation.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Advisor is a powerful tool that provides personalized recommendations based on your individual needs. It helps you follow best practices to optimize your Azure deployments, making it an invaluable resource for any Azure user. Whether you&amp;rsquo;re looking to improve performance, enhance security, increase reliability, or reduce costs, Azure Advisor has you covered.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more information about Azure Advisor, you can refer to the following resources on Microsoft Learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/advisor/advisor-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Introduction to Azure Advisor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://azure.microsoft.com/en-us/products/advisor?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Advisor – Azure Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These resources provide a wealth of information about Azure Advisor and can help you understand the service better and guide you on how to effectively use it in your projects.&lt;/p&gt;</description></item><item><title>Azure Bastion Developer SKU</title><link>https://blog.brewedinthecloud.com/p/bastiondeveloper-azure/</link><pubDate>Sat, 15 Jun 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/bastiondeveloper-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Bastion Developer SKU is a free, lightweight SKU ideal for Dev/Test users who want to securely connect to their VMs. This SKU allows users to connect to one Azure VM at a time directly through the virtual machine connect page. The VMs you connect to don&amp;rsquo;t need a public IP address, client software, agent, or a special configuration.&lt;/p&gt;
&lt;p&gt;The Developer SKU is currently available in several regions including Central US, EUAP East US 2, EUAP West Central US, North Central US, West US, and North Europe. It&amp;rsquo;s important to note that VNet peering isn&amp;rsquo;t currently supported for the Developer SKU.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;To deploy Azure Bastion using the Developer SKU, you need to have an Azure subscription and a VM in a VNet. The values are pulled from the virtual network in which your VM resides. Make sure the VM resides in a resource group that&amp;rsquo;s in a region where the Developer SKU is supported.&lt;/p&gt;
&lt;p&gt;Here is a PowerShell example of how to create a new Azure Bastion resource in the AzureBastionSubnet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Create a new Azure Bastion resource in the AzureBastionSubnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-AzBastion&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyResourceGroup&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyBastion&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-PublicIpAddress&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyPublicIpAddress&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-VirtualNetwork&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyVirtualNetwork&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Sku&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Developer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This example uses the Basic SKU, but you can also deploy Bastion using a different SKU by changing the &lt;code&gt;-Sku&lt;/code&gt; value.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;The Azure Bastion Developer SKU represents a novel, cost-effective, and streamlined version of the Bastion service². It caters to Dev/Test users seeking secure VM connections without the need for additional features or scalability². This SKU is a great resource for developers and testers who want to securely connect to their VMs in a cost-effective manner.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more information about Azure Bastion and the Developer SKU, you can refer to the following resources on Microsoft Learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/bastion/quickstart-developer-sku?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Quickstart: Deploy Azure Bastion - Developer SKU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://azure.microsoft.com/en-us/updates/azure-bastion-developer-public-preview/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Upgrade or view a SKU: portal - Azure Bastion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These resources provide a wealth of information about Azure Bastion and its various SKUs, including the Developer SKU. They can help you understand the service better and guide you on how to effectively use it in your projects.&lt;/p&gt;</description></item><item><title>Azure Service Bus: Decoupling Applications in the Cloud</title><link>https://blog.brewedinthecloud.com/p/servicebus-azure/</link><pubDate>Sat, 08 Jun 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/servicebus-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Service Bus is a cloud messaging system for connecting applications, services, and devices running on Azure, on-premises systems, or both. It provides reliable message queuing and durable publish/subscribe messaging capabilities. By decoupling applications and services from each other, it provides load-balancing work across competing workers and safely routes and transfers data and control across service and application boundaries.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Implementing Azure Service Bus involves several steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create a Service Bus namespace&lt;/strong&gt;: A namespace provides a scoping container for addressing Service Bus resources within your application. Here&amp;rsquo;s an example of creating a namespace using PowerShell:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$resourceGroupName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;myResourceGroup&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$namespaceName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;myNamespace&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Australia East&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-AzServiceBusNamespace&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroupName&lt;/span&gt; &lt;span class="n"&gt;-NamespaceName&lt;/span&gt; &lt;span class="nv"&gt;$namespaceName&lt;/span&gt; &lt;span class="n"&gt;-Location&lt;/span&gt; &lt;span class="nv"&gt;$location&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;&lt;strong&gt;Create a queue&lt;/strong&gt;: Queues offer First In, First Out (FIFO) message delivery to one or more competing consumers. Here&amp;rsquo;s an example of creating a queue using PowerShell:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$queueName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;myQueue&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-AzServiceBusQueue&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroupName&lt;/span&gt; &lt;span class="n"&gt;-NamespaceName&lt;/span&gt; &lt;span class="nv"&gt;$namespaceName&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$queueName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;Send a message to the queue&lt;/strong&gt;: You can send messages to the queue using .NET. Here&amp;rsquo;s an example:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;connectionString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;lt;your_connection_string&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;queueName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;lt;your_queue_name&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// create a Service Bus client &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ServiceBusClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// create a sender for the queue &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSender&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queueName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// create a message that we can send&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ServiceBusMessage&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ServiceBusMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello, Azure!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// send the message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendMessageAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$&amp;#34;Sent a single message to the queue: {queueName}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;&lt;strong&gt;Receive a message from the queue&lt;/strong&gt;: You can receive messages from the queue using .NET. Here&amp;rsquo;s an example:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;connectionString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;lt;your_connection_string&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;queueName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;lt;your_queue_name&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// create a Service Bus client &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ServiceBusClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// create a processor that we can use to process the message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;processor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateProcessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queueName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ServiceBusProcessorOptions&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// add handler to process messages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProcessMessageAsync&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;MessageHandler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// add handler to process any errors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProcessErrorAsync&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;ErrorHandler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// start processing &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StartProcessingAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$&amp;#34;Started processing of messages from the queue: {queueName}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Service Bus provides a robust and scalable solution for decoupling applications in the cloud. By providing reliable message queuing and durable publish/subscribe messaging capabilities, it ensures safe routing and transferring of data and control across service and application boundaries.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information about Azure Service Bus, you can visit the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Introduction to Azure Service Bus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-quickstart-topics-subscriptions-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;How to use Service Bus topics and subscriptions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember, Azure Service Bus is a continuously evolving platform, so it&amp;rsquo;s important to stay updated with the latest features and enhancements.&lt;/p&gt;</description></item><item><title>Azure Cosmos DB: Building Globally Distributed Applications</title><link>https://blog.brewedinthecloud.com/p/cosmosdb-azure/</link><pubDate>Sat, 01 Jun 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/cosmosdb-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Cosmos DB is a globally distributed, multi-model database service. It allows you to distribute your data across multiple regions worldwide, enabling low-latency access to data for users in different areas, as well as high availability and disaster recovery capabilities.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Implementing Azure Cosmos DB involves several steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an Azure Cosmos DB account&lt;/strong&gt;: Navigate to the Azure portal, select &amp;lsquo;Create a resource&amp;rsquo;, and then choose &amp;lsquo;Azure Cosmos DB&amp;rsquo;. Fill in the necessary information and click &amp;lsquo;Create&amp;rsquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a database&lt;/strong&gt;: You can create a new database using Azure portal or Azure CLI. Here&amp;rsquo;s an example of creating a database using PowerShell:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$resourceGroupName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;myResourceGroup&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$accountName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;myCosmosDBAccount&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$databaseName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;myDatabase&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-AzCosmosDBSqlDatabase&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroupName&lt;/span&gt; &lt;span class="n"&gt;-AccountName&lt;/span&gt; &lt;span class="nv"&gt;$accountName&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$databaseName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;Create a container&lt;/strong&gt;: Containers in Azure Cosmos DB provide a place to store your items. Here&amp;rsquo;s an example of creating a container using PowerShell:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$containerName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;myContainer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$partitionKeyPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/myPartitionKey&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-AzCosmosDBSqlContainer&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroupName&lt;/span&gt; &lt;span class="n"&gt;-AccountName&lt;/span&gt; &lt;span class="nv"&gt;$accountName&lt;/span&gt; &lt;span class="n"&gt;-DatabaseName&lt;/span&gt; &lt;span class="nv"&gt;$databaseName&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$containerName&lt;/span&gt; &lt;span class="n"&gt;-PartitionKeyKind&lt;/span&gt; &lt;span class="n"&gt;Hash&lt;/span&gt; &lt;span class="n"&gt;-PartitionKeyPath&lt;/span&gt; &lt;span class="nv"&gt;$partitionKeyPath&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;&lt;strong&gt;Add items to your container&lt;/strong&gt;: You can add items to your container using the Azure portal, Azure CLI, or one of the Azure Cosmos DB SDKs.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Cosmos DB provides a robust and scalable solution for building globally distributed applications. By providing multi-region replication, it ensures low-latency access to data for users in different areas and offers high availability and disaster recovery capabilities.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information about Azure Cosmos DB, you can visit the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/cosmos-db/introduction?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Introduction to Azure Cosmos DB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/learn/modules/create-cosmos-db-for-scale/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create an Azure Cosmos DB database built to scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/cosmos-db/distribute-data-globally?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Distribute your data globally with Azure Cosmos DB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-dotnet-application?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Build a .NET web app with Azure Cosmos DB using the SQL API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember, Azure Cosmos DB is a continuously evolving platform, so it&amp;rsquo;s important to stay updated with the latest features and enhancements.&lt;/p&gt;</description></item><item><title>Azure App Service: Hosting Web Apps, Mobile App Backends, and RESTful APIs</title><link>https://blog.brewedinthecloud.com/p/webapps-azure/</link><pubDate>Sat, 25 May 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/webapps-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure App Service is an HTTP-based service for hosting web applications, REST APIs, and mobile back ends. It supports development in various languages, including .NET, .NET Core, Java, Node.js, PHP, and Python. Applications can run and scale with ease on both Windows and Linux-based environments.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Implementing Azure App Service involves several steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an Azure App Service&lt;/strong&gt;: Navigate to the Azure portal, select &amp;lsquo;Create a resource&amp;rsquo;, and then choose &amp;lsquo;Web App&amp;rsquo;. Fill in the necessary information and click &amp;lsquo;Create&amp;rsquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy your application&lt;/strong&gt;: You can deploy your application using various methods such as Git, FTP, and more. Here&amp;rsquo;s an example of deploying a .NET application using PowerShell:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$webappname&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mywebapp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Australia East&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$webapp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-AzureRmWebApp&lt;/span&gt; &lt;span class="n"&gt;-ResourceGroupName&lt;/span&gt; &lt;span class="n"&gt;myResourceGroup&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$webappname&lt;/span&gt; &lt;span class="n"&gt;-Location&lt;/span&gt; &lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="n"&gt;-AppServicePlan&lt;/span&gt; &lt;span class="nv"&gt;$plan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure your application&lt;/strong&gt;: You can configure your application settings, connection strings, handlers, and virtual directories in the &amp;lsquo;Configuration&amp;rsquo; section of your App Service.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scale your application&lt;/strong&gt;: Azure App Service allows you to scale your application manually or automatically based on predefined rules. Navigate to your App Service, then &amp;lsquo;Scale out (App Service plan)&amp;rsquo;, and configure the scale settings.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure App Service provides a robust and scalable solution for hosting web applications, mobile app backends, and RESTful APIs. By providing support for various development languages and seamless scaling options, Azure App Service simplifies the hosting and management of applications.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information about Azure App Service, you can visit the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/app-service/overview" target="_blank" rel="noopener"
&gt;Introduction to Azure App Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/app-service/quickstart-dotnetcore" target="_blank" rel="noopener"
&gt;Quickstart: Create an ASP.NET Core web app in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-rest-api" target="_blank" rel="noopener"
&gt;Tutorial: Host RESTful API with CORS in Azure App Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/app-service/deploy-zip" target="_blank" rel="noopener"
&gt;How to deploy Azure Web Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember, Azure App Service is a continuously evolving platform, so it&amp;rsquo;s important to stay updated with the latest features and enhancements.&lt;/p&gt;</description></item><item><title>Azure Key Vault: Securing Application Secrets</title><link>https://blog.brewedinthecloud.com/p/keyvault-azure/</link><pubDate>Sat, 18 May 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/keyvault-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Key Vault is a cloud-based service that securely stores and manages cryptographic keys, certificates, passwords, and other secrets in a centralised repository. It enables applications to operate on a copy of the data that&amp;rsquo;s close to its users. This blog post will explore the implementation of Azure Key Vault and how it secures application secrets.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Implementing Azure Key Vault involves several steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an Azure Key Vault&lt;/strong&gt;: Navigate to the Azure portal, select &amp;lsquo;Create a resource&amp;rsquo;, and then choose &amp;lsquo;Key Vault&amp;rsquo;. Fill in the necessary information and click &amp;lsquo;Create&amp;rsquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add secrets to the Key Vault&lt;/strong&gt;: Once the Key Vault is created, you can add secrets. Navigate to your Key Vault, then &amp;lsquo;Secrets&amp;rsquo;, and select &amp;lsquo;Generate/Import&amp;rsquo;. Fill in the secret&amp;rsquo;s details and click &amp;lsquo;Create&amp;rsquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access secrets from an application&lt;/strong&gt;: To access secrets from an application, you need to use the Azure SDK. Here&amp;rsquo;s an example in C#:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;kvUri&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;https://myvault.vault.azure.net&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SecretClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kvUri&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;KeyVaultSecret&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetSecret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mySecret&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;&lt;strong&gt;Manage access to the Key Vault&lt;/strong&gt;: Azure Key Vault allows you to manage access to the Key Vault by using Access Policies. Navigate to your Key Vault, then &amp;lsquo;Access policies&amp;rsquo;, and click &amp;lsquo;Add Access Policy&amp;rsquo;. Choose the permissions you want to grant and click &amp;lsquo;Add&amp;rsquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Key Vault provides a robust and secure solution for managing application secrets. By centralizing the storage of secrets and providing fine-grained access control, Azure Key Vault enhances the security of applications. The implementation of Azure Key Vault not only secures application secrets but also simplifies their management.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information about Azure Key Vault, you can visit the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/key-vault/general/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;About Azure Key Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/key-vault/secrets/quick-create-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Quickstart: Set and retrieve a secret from Azure Key Vault using the Azure portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/key-vault/general/tutorial-net-create-vault-azure-web-app?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Tutorial: Use Azure Key Vault with an Azure web app in .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/key-vault/general/manage-with-cli2?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Manage Key Vault using CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember, Azure Key Vault is a continuously evolving platform, so it&amp;rsquo;s important to stay updated with the latest features and enhancements.&lt;/p&gt;</description></item><item><title>Entra ID: Enhancing Identity and Access Management</title><link>https://blog.brewedinthecloud.com/p/entraid-azure/</link><pubDate>Sat, 11 May 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/entraid-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Entra ID is a cloud-based identity and access management service. It centralises identity management, treats identity as the primary security perimeter, and enforces multi-factor verification for users. This blog post will delve into the implementation of Entra ID and how it enhances identity and access management.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Implementing Entra ID involves several steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set up an Entra ID account&lt;/strong&gt;: If you don&amp;rsquo;t already have one, create an Entra ID account. This will give you access to the Entra ID portal where you can manage your services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an Entra ID directory&lt;/strong&gt;: Navigate to the Entra ID portal, select &amp;lsquo;Create a resource&amp;rsquo;, and then choose &amp;lsquo;Entra ID Directory&amp;rsquo;. Fill in the necessary information and click &amp;lsquo;Create&amp;rsquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add users to the directory&lt;/strong&gt;: Once the directory is created, you can add users. Navigate to &amp;lsquo;Entra ID Directory&amp;rsquo;, then &amp;lsquo;Users&amp;rsquo;, and select &amp;lsquo;New user&amp;rsquo;. Fill in the user&amp;rsquo;s details and click &amp;lsquo;Create&amp;rsquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assign roles to users&lt;/strong&gt;: Entra ID allows you to assign roles to users, granting them specific permissions. Navigate to &amp;lsquo;Entra ID Directory&amp;rsquo;, then &amp;lsquo;Users&amp;rsquo;. Select a user, then &amp;lsquo;Assigned roles&amp;rsquo;, and click &amp;lsquo;Add assignments&amp;rsquo;. Choose the roles you want to assign and click &amp;lsquo;Add&amp;rsquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enable Multi-Factor Authentication (MFA)&lt;/strong&gt;: Navigate to &amp;lsquo;Entra ID Directory&amp;rsquo;, then &amp;lsquo;Security&amp;rsquo;, and select &amp;lsquo;MFA&amp;rsquo;. Here, you can enable MFA for your users, enhancing the security of your directory.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Entra ID is a powerful tool for managing identity and access within an organisation. By centralizing identity management, treating identity as the primary security perimeter, and enforcing multi-factor verification, Entra ID provides a robust and secure solution for identity and access management. The implementation of Entra ID not only enhances security but also simplifies the management of users and their access rights.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information about Entra ID, you can visit the following Microsoft Learn articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-whatis?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;What is Entra ID?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/add-users-azure-active-directory?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Manage users and groups in Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-users-assign-role-azure-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Assign administrator and non-administrator roles to users with Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/active-directory/authentication/concept-mfa-howitworks?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Secure your cloud resources with Entra ID Multi-Factor Authentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember, Entra ID is a continuously evolving platform, so it&amp;rsquo;s important to stay updated with the latest features and enhancements.&lt;/p&gt;</description></item><item><title>Azure SQL Database: Geo-Replication and Disaster Recovery</title><link>https://blog.brewedinthecloud.com/p/sqlgeo-azure/</link><pubDate>Sat, 04 May 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/sqlgeo-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure SQL Database is a fully managed relational database service provided by Microsoft as part of the Azure cloud platform. One of its key features is the built-in geo-replication and disaster recovery capabilities, which ensure data protection and enable rapid recovery in case of failure.&lt;/p&gt;
&lt;h3 id="how-azure-sql-database-works"&gt;How Azure SQL Database Works
&lt;/h3&gt;&lt;p&gt;Azure SQL Database uses active geo-replication, a feature that allows you to configure up to four readable secondary databases in the same or different data center locations (regions). These secondary databases are available for querying and can be located in the same region as the primary or in different regions for disaster recovery purposes. In the event of a regional outage, you can failover to one of the secondary databases.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Implementing geo-replication and disaster recovery with Azure SQL Database involves several steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an Azure SQL Database&lt;/strong&gt;: If you don&amp;rsquo;t already have one, you&amp;rsquo;ll need to create an Azure SQL Database.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Active Geo-Replication&lt;/strong&gt;: You can configure active geo-replication through the Azure portal, PowerShell, or the Azure CLI. This involves creating secondary databases and choosing their locations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Perform Failover&lt;/strong&gt;: In the event of a regional outage or if you want to switch processing to a secondary location, you can manually failover to one of the secondary databases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test Your Disaster Recovery Strategy&lt;/strong&gt;: It&amp;rsquo;s important to regularly test your disaster recovery strategy to ensure you can successfully failover when needed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Implementing geo-replication and disaster recovery with Azure SQL Database provides an organisation with robust data protection capabilities. The automatic creation of secondary databases and the ability to failover to these databases offer peace of mind, knowing that your data is safe and can be quickly restored in case of a regional outage.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information on Azure SQL Database and its geo-replication and disaster recovery capabilities, you can refer to the following resources on the official Microsoft Learn website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/sql-database/sql-database-paas-overview" target="_blank" rel="noopener"
&gt;Overview of Azure SQL Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/sql-database/sql-database-active-geo-replication" target="_blank" rel="noopener"
&gt;Configure and manage active geo-replication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/sql-database/sql-database-geo-replication-overview" target="_blank" rel="noopener"
&gt;Failover groups and active geo-replication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/sql-database/sql-database-disaster-recovery" target="_blank" rel="noopener"
&gt;Disaster recovery in Azure SQL Database&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Implementing Azure Sentinel</title><link>https://blog.brewedinthecloud.com/p/sentinel-azure/</link><pubDate>Sat, 27 Apr 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/sentinel-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Sentinel is a scalable, cloud-native, security information event management (SIEM) and security orchestration automated response (SOAR) solution. It provides intelligent security analytics and threat intelligence across the enterprise, providing a single solution for alert detection, threat visibility, proactive hunting, and threat response.&lt;/p&gt;
&lt;h3 id="how-azure-sentinel-works"&gt;How Azure Sentinel Works
&lt;/h3&gt;&lt;p&gt;Azure Sentinel collects data across all users, devices, applications, and infrastructure, both on-premises and in multiple clouds. By integrating with existing tools and using built-in machine learning algorithms, Azure Sentinel reduces false positives and helps security teams focus on the most important events. It also includes built-in orchestration and automation of common tasks and responses.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Implementing Azure Sentinel involves several steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Workspace&lt;/strong&gt;: Azure Sentinel uses Log Analytics workspaces to store data. If you don&amp;rsquo;t have an existing workspace, you&amp;rsquo;ll need to create one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect Data Sources&lt;/strong&gt;: Azure Sentinel can collect data from a wide variety of sources. You can connect to your Microsoft services, other cloud services, and on-premises systems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set Up Detection Rules&lt;/strong&gt;: Azure Sentinel includes a number of built-in detection rules, but you can also create your own. These rules help you identify specific activities or patterns that may indicate a threat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Respond to Threats&lt;/strong&gt;: When a threat is detected, Azure Sentinel can respond in a number of ways. This could include sending an alert, triggering an automated response, or creating an incident for further investigation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Implementing Azure Sentinel can significantly enhance an organisation&amp;rsquo;s security posture. By providing a single, integrated solution for security information and event management, Azure Sentinel makes it easier to detect, investigate, and respond to threats. And because it&amp;rsquo;s cloud-native, it can scale to meet the needs of any organisation, no matter how large or complex.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information on Azure Sentinel, you can refer to the following resources on the official Microsoft Learn website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/sentinel/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Introduction to Azure Sentinel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/sentinel/connect-data-sources?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Connect data sources to Azure Sentinel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/sentinel/tutorial-detect-threats-built-in?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Detect threats with Azure Sentinel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/sentinel/tutorial-respond-threats-playbook?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Respond to threats with Azure Sentinel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Storage Solutions: Blob, Queue, Table, and File Share</title><link>https://blog.brewedinthecloud.com/p/storageaccounts-azure/</link><pubDate>Sat, 20 Apr 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/storageaccounts-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Storage is a Microsoft-managed service providing cloud storage that is highly available, secure, durable, scalable, and redundant. It includes four services: Blob storage, Queue storage, Table storage, and File Share.&lt;/p&gt;
&lt;h3 id="how-azure-storage-solutions-work"&gt;How Azure Storage Solutions Work
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Blob Storage&lt;/strong&gt;: Blob (Binary Large Object) storage is a service for storing large amounts of unstructured data, such as text or binary data, that can be accessed from anywhere in the world via HTTP or HTTPS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Queue Storage&lt;/strong&gt;: Queue storage is a service for storing large numbers of messages. It can be used to create a backlog of work to process asynchronously.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Table Storage&lt;/strong&gt;: Table storage is a service that stores structured NoSQL data in the cloud, providing a key/attribute store with a schema-less design.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;File Share&lt;/strong&gt;: Azure File Share is a service that offers fully managed file shares in the cloud that are accessible via the industry-standard Server Message Block (SMB) protocol.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Implementing Azure Storage solutions involves several steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Storage Account&lt;/strong&gt;: This is the first step in implementing Azure Storage. A storage account provides a unique namespace in Azure for your data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Container, Queue, Table, or File Share&lt;/strong&gt;: Depending on the service you want to use, you would create a blob container for Blob storage, a queue for Queue storage, a table for Table storage, or a file share for File Share.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Upload Data&lt;/strong&gt;: Once you have created a container, queue, table, or file share, you can upload data to it. For example, you can upload a blob to Blob storage, add a message to Queue storage, insert an entity into Table storage, or upload a file to File Share.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access Data&lt;/strong&gt;: After uploading data, you can access or download it. You can also list blobs, messages, entities, or files, and delete them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Storage solutions offer a robust and scalable platform for storing data in the cloud. Whether you need to store unstructured data like images, audio, and logs (Blob), send messages between application components (Queue), store NoSQL data (Table), or set up highly available network file shares (File Share), Azure Storage has a solution to fit your needs.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information on Azure Storage solutions, you can refer to the following resources on the official Microsoft Learn website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/storage/common/storage-introduction" target="_blank" rel="noopener"
&gt;Introduction to Azure Storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction" target="_blank" rel="noopener"
&gt;Azure Blob Storage Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/storage/queues/storage-queues-introduction" target="_blank" rel="noopener"
&gt;Azure Queue Storage Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/storage/tables/table-storage-overview" target="_blank" rel="noopener"
&gt;Azure Table Storage Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/storage/files/storage-files-introduction" target="_blank" rel="noopener"
&gt;Azure File Share Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Site Recovery: Ensuring Business Continuity</title><link>https://blog.brewedinthecloud.com/p/azuresiterecovery-azure/</link><pubDate>Sat, 13 Apr 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azuresiterecovery-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In the digital age, business continuity is heavily dependent on the uninterrupted functioning of IT infrastructure. Azure Site Recovery (ASR), a service offered by Microsoft as part of its Azure cloud platform, plays a crucial role in ensuring that your business applications continue to run during both planned and unplanned outages.&lt;/p&gt;
&lt;h3 id="how-azure-site-recovery-works"&gt;How Azure Site Recovery Works
&lt;/h3&gt;&lt;p&gt;ASR works by replicating workloads running on physical and virtual machines (VMs) from a primary site to a secondary location. When an outage occurs at your primary site, you fail over to the secondary location, and access the apps from there. Once the primary location is up and running again, you can fail back to it.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;Implementing Azure Site Recovery involves a series of steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prepare your infrastructure&lt;/strong&gt;: Identify the resources that you want to protect, prepare the source and target environments, and choose your replication strategy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enable replication&lt;/strong&gt;: Configure the settings and enable replication. ASR will start replicating your data to the target location.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test failover&lt;/strong&gt;: Perform a test failover to ensure that everything is working as expected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Failover and failback&lt;/strong&gt;: When an outage occurs, you can easily failover to the secondary site. Once the primary site is up and running, you can fail back to it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For example, if you have an e-commerce application running on a VM in your primary site, you can use ASR to replicate this VM to Azure. In the event of an outage, you can failover to the VM in Azure, ensuring that your e-commerce application remains available to your customers.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Implementing Azure Site Recovery as part of your BCDR strategy ensures that your business applications are always available, thereby minimizing the impact of outages on your business operations. It provides a robust and reliable solution for maintaining business continuity in the face of disruptions.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;p&gt;For more detailed information on Azure Site Recovery, you can refer to the following resources on the official Microsoft Learn website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/site-recovery/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Overview of Azure Site Recovery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/site-recovery/site-recovery-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Site Recovery Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/site-recovery/tutorial-prepare-azure?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Site Recovery Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Automation Accounts: Automating Cloud Management Tasks with Managed Identity</title><link>https://blog.brewedinthecloud.com/p/automationaccountmanagedid-azure/</link><pubDate>Sat, 06 Apr 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/automationaccountmanagedid-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Automation Accounts is a service provided by Microsoft Azure that enables the automation of cloud management tasks. It provides a reliable and scalable platform for process automation, allowing businesses to streamline their operations and reduce manual intervention. This blog post will focus on the use of Managed Identity with Azure Automation Accounts.&lt;/p&gt;
&lt;h2 id="what-is-azure-automation-accounts"&gt;What is Azure Automation Accounts?
&lt;/h2&gt;&lt;p&gt;Azure Automation Accounts is a cloud-based automation and configuration service that supports consistent management across your Azure and non-Azure environments. It comprises process automation, update management, and configuration features. Azure Automation delivers these tools for managing operating systems and processes across Windows and Linux environments.&lt;/p&gt;
&lt;h2 id="managed-identity-in-azure-automation-accounts"&gt;Managed Identity in Azure Automation Accounts
&lt;/h2&gt;&lt;p&gt;Managed Identity is a feature of Azure Active Directory. It provides Azure services with an automatically managed identity in Azure AD. You can use this identity to authenticate to any service that supports Azure AD authentication, without having credentials in your code.&lt;/p&gt;
&lt;p&gt;Azure Automation Accounts can leverage Managed Identity to authenticate and interact with other Azure resources. This eliminates the need to store credentials in your Automation runbooks.&lt;/p&gt;
&lt;h2 id="setting-up-azure-automation-accounts-with-managed-identity"&gt;Setting Up Azure Automation Accounts with Managed Identity
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an Automation Account&lt;/strong&gt;: In the Azure portal, you can create a new Automation Account by specifying some basic information such as your subscription, resource group, and a unique name for your Automation Account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enable Managed Identity&lt;/strong&gt;: In the settings of your Automation Account, you can enable Managed Identity. Once enabled, Azure creates an identity for the instance in the Azure AD tenant that&amp;rsquo;s trusted by the subscription of the instance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Grant Permissions&lt;/strong&gt;: You can grant the managed identity access to another resource by assigning the appropriate role to it. This role assignment can be done in the IAM section of the resource.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Managed Identity in Runbooks&lt;/strong&gt;: In your runbooks, you can use the managed identity to authenticate to other Azure resources. The &lt;code&gt;Connect-AzAccount&lt;/code&gt; cmdlet allows you to authenticate using the Managed Identity.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="example-of-using-managed-identity-in-a-powershell-script"&gt;Example of Using Managed Identity in a PowerShell Script
&lt;/h3&gt;&lt;p&gt;Here is an example of how you can use Managed Identity in a PowerShell script within a runbook:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Authenticate to Azure with Managed Identity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$AzureContext&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Connect-AzAccount&lt;/span&gt; &lt;span class="n"&gt;-Identity&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;context&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Select the subscription&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Select-AzSubscription&lt;/span&gt; &lt;span class="n"&gt;-SubscriptionId&lt;/span&gt; &lt;span class="nv"&gt;$AzureContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Subscription&lt;/span&gt; &lt;span class="n"&gt;-TenantId&lt;/span&gt; &lt;span class="nv"&gt;$AzureContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Tenant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Perform operations on Azure resources&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This script first authenticates to Azure using the Managed Identity of the Automation Account. It then selects the subscription associated with the Managed Identity. After that, you can perform operations on Azure resources.&lt;/p&gt;
&lt;h3 id="key-features-of-azure-automation-accounts"&gt;Key Features of Azure Automation Accounts
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Process Automation&lt;/strong&gt;: This feature allows you to automate frequent, time-consuming, and error-prone cloud management tasks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Update Management&lt;/strong&gt;: You can manage operating system updates for your Windows and Linux computers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configuration Management&lt;/strong&gt;: Desired State Configuration (DSC) is a feature in PowerShell 4.0 and above that helps to implement and manage the configuration data for software services and manages the environment in which these services run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inventory&lt;/strong&gt;: You can track changes in servers across your environment to help you pinpoint operational issues.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Automation Accounts is a powerful service for automating your cloud management tasks. Its integration with Managed Identity makes it a secure and efficient solution for managing your Azure resources.&lt;/p&gt;
&lt;p&gt;For more information, you can refer to the &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/automation/automation-intro?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;official Azure Automation Accounts documentation&lt;/a&gt; and the &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/automation/automation-faq?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Automation Accounts FAQ&lt;/a&gt;. For more details on Managed Identity, you can visit the &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;official Managed Identity documentation&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Azure Front Door Accelerating and Securing Web Applications</title><link>https://blog.brewedinthecloud.com/p/frontdoor-azure/</link><pubDate>Sat, 30 Mar 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/frontdoor-azure/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Azure Front Door is a service offered by Microsoft Azure that provides a scalable and secure entry point for the fast delivery of your global web applications. It is designed to offer various layers of security, including DDoS protection, Web Application Firewall (WAF), and SSL offload. It also provides global load balancing and URL-based routing capabilities to ensure high availability and performance.&lt;/p&gt;
&lt;h2 id="what-is-azure-front-door"&gt;What is Azure Front Door?
&lt;/h2&gt;&lt;p&gt;Azure Front Door is a global, scalable entry-point that uses the Microsoft global edge network to create fast, secure, and widely scalable web applications. With Azure Front Door, you can transform your global (multi-region) consumer and enterprise applications into robust, high-performance personalized modern applications.&lt;/p&gt;
&lt;h2 id="setting-up-azure-front-door"&gt;Setting Up Azure Front Door
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Front Door&lt;/strong&gt;: In the Azure portal, you can create a new Front Door within a few clicks. You&amp;rsquo;ll need to specify some basic information such as your subscription, resource group, and a unique name for your Front Door.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Frontend Hosts&lt;/strong&gt;: Frontend hosts are the domain names that you want the Front Door to respond to. You can add your custom domain or use the default domain provided by Azure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Routing Rules&lt;/strong&gt;: Routing rules define the conditions that a request must meet for it to be routed to a specific backend pool. You can configure these rules based on the URL path or other parameters of the incoming request.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Backend Pools&lt;/strong&gt;: Backend pools are the set of servers where your web application is running. You can add multiple backends to a single pool and Front Door will automatically load balance the traffic among them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Health Probes&lt;/strong&gt;: Health probes are used by Front Door to determine the health of your backends. If a backend is deemed unhealthy, Front Door will stop sending traffic to it until it becomes healthy again.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="key-features-of-azure-front-door"&gt;Key Features of Azure Front Door
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;URL-Based Routing&lt;/strong&gt;: Azure Front Door allows you to route user traffic to different backend services based on the URL path of the request. This is particularly useful for microservices architectures where different services are responsible for different parts of the application.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Session Affinity&lt;/strong&gt;: If your application relies on maintaining a user session, Azure Front Door can keep the user&amp;rsquo;s session sticky to a specific backend. This is done using cookies and ensures that all requests from a user during a session are served by the same backend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SSL Offload&lt;/strong&gt;: Azure Front Door can terminate the SSL connection at the edge of the Microsoft network, relieving your backends from the overhead of decrypting SSL traffic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom Domains and Certificate Management&lt;/strong&gt;: You can use your own custom domain name with Azure Front Door. It also provides automatic certificate management, which means it can handle the procurement and renewal of SSL certificates for your custom domains.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Web Application Firewall (WAF)&lt;/strong&gt;: Azure Front Door comes with built-in WAF capabilities. You can define custom WAF policies to protect your application from common exploits like SQL injection or Cross-Site Scripting (XSS).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Front Door is a powerful service for accelerating and securing your web applications. Its global load balancing and URL-based routing capabilities ensure high availability and performance, while its security features like WAF and DDoS protection help keep your applications safe from threats.&lt;/p&gt;
&lt;p&gt;For more information, you can refer to the &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/frontdoor/front-door-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;official Azure Front Door documentation&lt;/a&gt; and the &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/frontdoor/front-door-faq?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Front Door FAQ&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Azure Traffic Manager Optimizing Global Application Delivery</title><link>https://blog.brewedinthecloud.com/p/trafficmanager-azure/</link><pubDate>Sat, 23 Mar 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/trafficmanager-azure/</guid><description>&lt;p&gt;In the era of globalization and digital transformation, ensuring optimal delivery of applications across multiple regions is a critical aspect of business operations. Azure Traffic Manager, a cloud-based load balancing service, plays a pivotal role in this context. This blog post aims to provide an in-depth understanding of Azure Traffic Manager and guidance on leveraging it for global application delivery optimization.&lt;/p&gt;
&lt;h2 id="introduction-to-azure-traffic-manager"&gt;Introduction to Azure Traffic Manager
&lt;/h2&gt;&lt;p&gt;Azure Traffic Manager is a DNS-based traffic load balancer that enables you to distribute traffic optimally to services across global Azure regions, while providing high availability and responsiveness. It uses DNS to direct client requests to the most appropriate service endpoint based on a traffic-routing method and the health of the endpoints.&lt;/p&gt;
&lt;h2 id="implementing-azure-traffic-manager"&gt;Implementing Azure Traffic Manager
&lt;/h2&gt;&lt;h3 id="step-1-create-a-traffic-manager-profile"&gt;Step 1: Create a Traffic Manager profile
&lt;/h3&gt;&lt;p&gt;The first step is to create a Traffic Manager profile, which contains the DNS settings and the traffic-routing method.&lt;/p&gt;
&lt;h3 id="step-2-add-endpoints-to-your-traffic-manager-profile"&gt;Step 2: Add endpoints to your Traffic Manager profile
&lt;/h3&gt;&lt;p&gt;Endpoints are the IP addresses or URLs of your application instances. You can add these to your Traffic Manager profile, and Traffic Manager will monitor the health of these endpoints.&lt;/p&gt;
&lt;h3 id="step-3-configure-traffic-routing-method"&gt;Step 3: Configure traffic-routing method
&lt;/h3&gt;&lt;p&gt;Azure Traffic Manager supports multiple traffic-routing methods to determine how to route your client&amp;rsquo;s requests to the available endpoints. These include Priority, Weighted, Performance, Geographic, and Multivalue.&lt;/p&gt;
&lt;h3 id="step-4-enable-endpoint-monitoring"&gt;Step 4: Enable endpoint monitoring
&lt;/h3&gt;&lt;p&gt;Traffic Manager continuously monitors the health of all endpoints and automatically directs traffic away from any that are degraded or unavailable.&lt;/p&gt;
&lt;h3 id="step-5-test-your-traffic-manager-profile"&gt;Step 5: Test your Traffic Manager profile
&lt;/h3&gt;&lt;p&gt;Once you&amp;rsquo;ve set up your Traffic Manager profile and added endpoints, it&amp;rsquo;s important to test the configuration to ensure that traffic is being correctly routed.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Traffic Manager is a powerful tool for optimizing the global delivery of applications. By effectively implementing and managing it, businesses can ensure high availability and responsiveness of their applications, thereby enhancing user experience and operational efficiency.&lt;/p&gt;
&lt;h2 id="further-reading"&gt;Further Reading
&lt;/h2&gt;&lt;p&gt;For more detailed information on Azure Traffic Manager, please refer to the official &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/traffic-manager/" target="_blank" rel="noopener"
&gt;Azure Traffic Manager Documentation&lt;/a&gt;. For practical implementation guidance, the &lt;a class="link" href="https://learn.microsoft.com/en-us/learn/modules/intro-to-azure-traffic-manager/" target="_blank" rel="noopener"
&gt;Microsoft Learn module on Azure Traffic Manager&lt;/a&gt; is a great resource.&lt;/p&gt;</description></item><item><title>Azure Application Gateway WAF and Beyond</title><link>https://blog.brewedinthecloud.com/p/appgateway-azure/</link><pubDate>Sat, 16 Mar 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/appgateway-azure/</guid><description>&lt;p&gt;Azure Application Gateway is a powerful tool for managing traffic to web applications. It offers advanced security features, including the Web Application Firewall (WAF), to protect web applications from common exploits and vulnerabilities. In this post, we will discuss the security features of Azure Application Gateway, focusing on the WAF and other advanced security capabilities for protecting web applications.&lt;/p&gt;
&lt;h2 id="azure-application-gateway-security-features"&gt;Azure Application Gateway Security Features
&lt;/h2&gt;&lt;p&gt;Azure Application Gateway is an application delivery controller (ADC) that provides advanced routing capabilities, such as URL-based routing and SSL termination. It also offers Transport Layer Security (TLS), previously known as Secure Sockets Layer (SSL), termination, cookie-based session affinity, round-robin load distribution, and content-based routing.&lt;/p&gt;
&lt;p&gt;Application Gateway security enhancements include TLS policy management and end-to-end TLS support. Application security is strengthened by WAF integration into Application Gateway. The combination protects your web applications against common vulnerabilities. And it provides an easy-to-configure central location to manage.&lt;/p&gt;
&lt;h2 id="web-application-firewall-waf"&gt;Web Application Firewall (WAF)
&lt;/h2&gt;&lt;p&gt;The Azure Web Application Firewall (WAF) on Azure Application Gateway provides centralised protection of your web applications from common exploits and vulnerabilities. Web applications are increasingly targeted by malicious attacks that exploit commonly known vulnerabilities. SQL injection and cross-site scripting are among the most common attacks. WAF on Application Gateway is based on the Core Rule Set (CRS) from the Open Web Application Security Project (OWASP).&lt;/p&gt;
&lt;p&gt;All of the WAF features exist inside of a WAF policy. You can create multiple policies, and they can be associated with an Application Gateway, to individual listeners, or to path-based routing rules on an Application Gateway. This way, you can have separate policies for each site behind your Application Gateway if needed. For more information on WAF policies, see Create a WAF Policy.&lt;/p&gt;
&lt;h2 id="other-advanced-security-capabilities"&gt;Other Advanced Security Capabilities
&lt;/h2&gt;&lt;p&gt;Azure Application Gateway also provides other advanced security capabilities for protecting web applications. These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Protection against DDoS attacks&lt;/strong&gt;: Application Gateway provides protection against Distributed Denial of Service (DDoS) attacks. It can detect and mitigate DDoS attacks in real-time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Protection against malicious bots&lt;/strong&gt;: Application Gateway can protect your web applications from malicious bots with the IP Reputation ruleset.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;: Application Gateway provides real-time monitoring of attacks against your web applications. The log is integrated with Azure Monitor to track WAF alerts and easily monitor trends.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-by-step-guide-to-implementing-application-gateway-with-waf"&gt;Step-by-Step Guide to Implementing Application Gateway with WAF
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Create an Application Gateway resource in the Azure portal.&lt;/li&gt;
&lt;li&gt;Create a backend pool and add backend instances.&lt;/li&gt;
&lt;li&gt;Create a listener and associate it with the backend pool.&lt;/li&gt;
&lt;li&gt;Create a rule and associate it with the listener.&lt;/li&gt;
&lt;li&gt;Create a WAF policy and associate it with the rule.&lt;/li&gt;
&lt;li&gt;Configure the WAF policy to meet your security requirements.&lt;/li&gt;
&lt;li&gt;Enable the WAF policy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more detailed instructions, see &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/create-waf-policy-ag?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Create an application gateway with a web application firewall using the Azure portal&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Application Gateway is a powerful tool for managing traffic to web applications. It offers advanced security features, including the Web Application Firewall (WAF), to protect web applications from common exploits and vulnerabilities. In addition to the WAF, Application Gateway provides other advanced security capabilities, such as protection against DDoS attacks and malicious bots, and real-time monitoring. By using Azure Application Gateway, you can ensure that your web applications are secure and protected from malicious attacks.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/ag-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;What is Azure Web Application Firewall on Azure Application Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.openappsec.io/post/azure-waf-pricing-guide?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Understanding Azure Web Application Firewall Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/best-practices?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Best practices for Azure Web Application Firewall (WAF) on Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/app-proxy/application-proxy-application-gateway-waf?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Using Application Gateway WAF to protect your application&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Azure Firewall A Deep Dive into Cloud-Based Network Security</title><link>https://blog.brewedinthecloud.com/p/azurefirewall-azure/</link><pubDate>Sat, 09 Mar 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azurefirewall-azure/</guid><description>&lt;p&gt;Azure Firewall is a cloud-native and intelligent network firewall security service that provides the best of breed threat protection for your cloud workloads running in Azure. It&amp;rsquo;s a fully stateful firewall as a service with built-in high availability and unrestricted cloud scalability. It provides both east-west and north-south traffic inspection.&lt;/p&gt;
&lt;p&gt;In this blog post, we will provide an in-depth examination of Azure Firewall, covering its features, benefits, and detailed practical implementation for securing traffic between Azure Virtual Networks and the internet.&lt;/p&gt;
&lt;h2 id="features-of-azure-firewall"&gt;Features of Azure Firewall
&lt;/h2&gt;&lt;p&gt;Azure Firewall is offered in three SKUs: Standard, Premium, and Basic. Each SKU has different levels of threat intelligence, IDPS, and scalability. Here are some of the key features of each SKU:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Firewall Standard&lt;/strong&gt;: This SKU provides L3-L7 filtering and threat intelligence feeds directly from Microsoft Cyber Security. Threat intelligence-based filtering can alert and deny traffic from/to known malicious IP addresses and domains that are updated in real time to protect against new and emerging attacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Firewall Premium&lt;/strong&gt;: This SKU provides advanced capabilities include signature based IDPS to allow rapid detection of attacks by looking for specific patterns. These patterns can include byte sequences in network traffic or known malicious instruction sequences used by malware. There are more than 67,000 signatures in over 50 categories that are updated in real time to protect against new and emerging exploits. The exploit categories include malware, phishing, coin mining, and Trojan attacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Firewall Basic&lt;/strong&gt;: This SKU is intended for small and medium size (SMB) customers to secure their Azure cloud environments. It provides the essential protection SMB customers need at an affordable price point. Azure Firewall Basic is like Firewall Standard, but has the following main limitations: Supports Threat Intel alert mode only Fixed scale unit to run the service on two virtual machine backend instances Recommended for environments with an estimated throughput of 250 Mbps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To compare the all Firewall SKU features, see &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/skus" target="_blank" rel="noopener"
&gt;Choose the right Azure Firewall SKU to meet your needs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="benefits-of-azure-firewall"&gt;Benefits of Azure Firewall
&lt;/h2&gt;&lt;p&gt;Azure Firewall has many benefits over traditional network firewalls. Some of the benefits are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloud-native&lt;/strong&gt;: Azure Firewall is a fully managed service that runs on Azure infrastructure. You don&amp;rsquo;t need to worry about hardware maintenance, software updates, or capacity planning. Azure Firewall automatically scales up or down based on your traffic load and supports up to 30 Gbps of throughput.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Centralised management&lt;/strong&gt;: You can use Azure Firewall Manager to centrally manage Azure Firewalls across multiple subscriptions. Firewall Manager uses firewall policy to apply a common set of network/application rules and configuration to the firewalls in your tenant. Firewall Manager supports firewalls in both VNet and Virtual WANs (Secure Virtual Hub) environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DevOps friendly&lt;/strong&gt;: You can use Azure CLI, PowerShell, REST API, or ARM templates to automate the deployment and configuration of Azure Firewall. You can also integrate Azure Firewall with Azure DevOps or GitHub to enable continuous integration and delivery (CI/CD) pipelines for your firewall rules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High availability&lt;/strong&gt;: Azure Firewall has built-in high availability and fault tolerance. It runs on multiple availability zones within a region and has automatic failover mechanisms. You don&amp;rsquo;t need to configure any load balancers or health probes for Azure Firewall.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network security integration&lt;/strong&gt;: Azure Firewall integrates with other Azure network security services such as Azure DDoS Protection, Azure Application Gateway, Azure Sentinel, and Azure Security Center. You can leverage these services to enhance your network visibility and threat detection capabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementation-of-azure-firewall"&gt;Implementation of Azure Firewall
&lt;/h2&gt;&lt;p&gt;To implement Azure Firewall for securing traffic between your Azure Virtual Networks and the internet, you need to follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create an Azure Virtual Network with at least two subnets: one for your workloads and one for your firewall.&lt;/li&gt;
&lt;li&gt;Create an Azure Firewall resource in the firewall subnet. Choose the appropriate SKU based on your requirements.&lt;/li&gt;
&lt;li&gt;Configure the firewall rules to allow or deny traffic based on source IP address, destination IP address, port number, protocol type, application FQDNs, or IDPS signatures.&lt;/li&gt;
&lt;li&gt;Configure the routing tables for your workload subnet and firewall subnet to route traffic through the firewall.&lt;/li&gt;
&lt;li&gt;Test your firewall rules by sending traffic from your workloads to the internet or vice versa.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For a detailed tutorial on how to deploy an Azure Firewall using the Azure portal, see &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/tutorial-deploy-portal" target="_blank" rel="noopener"
&gt;Deploy an Azure Firewall&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Firewall is a powerful network security service that can help you protect your cloud workloads from malicious attacks. It offers three SKUs with different levels of threat intelligence, IDPS, and scalability. It also has many benefits such as cloud-native architecture, centralised management, DevOps compatibility, high availability, and network security integration&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/firewall/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Firewall documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Azure NAT Gateway</title><link>https://blog.brewedinthecloud.com/p/natgw-azure/</link><pubDate>Sat, 02 Mar 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/natgw-azure/</guid><description>&lt;p&gt;Azure NAT Gateway is a managed network address translation (NAT) service that provides outbound connectivity for virtual machines (VMs) in your virtual network. NAT Gateway is a highly available, scalable, and resilient service that can handle millions of connections per second. In this blog post, we will provide step-by-step instructions for setting up Azure NAT Gateways.&lt;/p&gt;
&lt;h2 id="steps-to-set-up-azure-nat-gateways"&gt;Steps to set up Azure NAT Gateways
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;In the Azure portal, navigate to the virtual network that you want to add a NAT gateway to.&lt;/li&gt;
&lt;li&gt;Under Settings, select NAT gateway.&lt;/li&gt;
&lt;li&gt;Click Create to create a new NAT gateway.&lt;/li&gt;
&lt;li&gt;In the Create NAT gateway pane, enter a name for the NAT gateway.&lt;/li&gt;
&lt;li&gt;Select the virtual network that you want to add the NAT gateway to.&lt;/li&gt;
&lt;li&gt;Configure the NAT gateway settings, such as the SKU, the IP address allocation method, and the subnet.&lt;/li&gt;
&lt;li&gt;Click OK to create the NAT gateway.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="sku"&gt;SKU
&lt;/h3&gt;&lt;p&gt;The SKU determines the maximum number of connections per second that the NAT gateway can handle. The available SKUs are Basic and Standard. The Basic SKU can handle up to 16,000 connections per second, while the Standard SKU can handle up to 64,000 connections per second.&lt;/p&gt;
&lt;h3 id="ip-address-allocation-method"&gt;IP address allocation method
&lt;/h3&gt;&lt;p&gt;The IP address allocation method determines how IP addresses are assigned to the NAT gateway. The available methods are Dynamic and Static. With Dynamic allocation, the NAT gateway is assigned a dynamic public IP address. With Static allocation, you can assign a static public IP address to the NAT gateway.&lt;/p&gt;
&lt;h3 id="subnet"&gt;Subnet
&lt;/h3&gt;&lt;p&gt;The subnet is the virtual network subnet that the NAT gateway is deployed to. The subnet must have a route table associated with it that routes traffic to the NAT gateway.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;In this blog post, we have provided step-by-step instructions for setting up Azure NAT Gateways. By leveraging Azure NAT Gateways, you can provide outbound connectivity for virtual machines in your virtual network. Azure NAT Gateways is a highly available, scalable, and resilient service that can handle millions of connections per second.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/nat-gateway/quickstart-create-nat-gateway-portal?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Quickstart: Create a NAT gateway - Azure portal | Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Bastion Simplifying Secure Remote Access</title><link>https://blog.brewedinthecloud.com/p/bastion-azure/</link><pubDate>Sat, 24 Feb 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/bastion-azure/</guid><description>&lt;p&gt;In today&amp;rsquo;s world, remote access to virtual machines is a necessity for many businesses. However, it can be challenging to provide secure remote access without exposing the virtual machines to the public internet. Azure Bastion is a fully managed service that provides more secure and seamless Remote Desktop Protocol (RDP) and Secure Shell Protocol (SSH) access to virtual machines (VMs) without any exposure through public IP addresses. In this blog post, we will introduce Azure Bastion and provide a step-by-step guide on its setup.&lt;/p&gt;
&lt;h2 id="what-is-azure-bastion"&gt;&lt;strong&gt;What is Azure Bastion?&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Azure Bastion is a fully managed service that provides secure and seamless RDP and SSH access to virtual machines without any exposure through public IP addresses. It is a Platform as a Service (PaaS) offering from Microsoft Azure that eliminates the need for a public IP address, Network Security Groups (NSGs), or a jump host. Azure Bastion provides connectivity directly from the Azure portal using Transport Layer Security (TLS) and can be provisioned directly in your local or peered virtual network (vNet) to get support for all the VMs within it.&lt;/p&gt;
&lt;h2 id="how-to-set-up-azure-bastion"&gt;&lt;strong&gt;How to set up Azure Bastion?&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Setting up Azure Bastion is a straightforward process. Here&amp;rsquo;s a step-by-step guide:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a virtual network&lt;/strong&gt;: If you don&amp;rsquo;t already have a virtual network, create one in the Azure portal. This vNet will need to be peered with other vNets that contain your virtual machines, or you can skip this step an go to step 2 in your existing Virtual Network.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a subnet&lt;/strong&gt;: Create a subnet in the virtual network that you created in step 1 or within your existing vNet. This subnet must be called &amp;ldquo;AzureBastionSubnet&amp;rdquo; to be used with the Azure Bastion service.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create an Azure Bastion resource&lt;/strong&gt;: In the Azure portal, search for &amp;ldquo;Azure Bastion&amp;rdquo; and create a new resource.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Azure Bastion&lt;/strong&gt;: Configure Azure Bastion by specifying the virtual network and subnet that you created in steps 1 and 2.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect to the virtual machine&lt;/strong&gt;: In the Azure portal, navigate to the virtual machine that you created in step 3 and click on the &amp;ldquo;Connect&amp;rdquo; button. You should now see an option to connect via Azure Bastion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect via Azure Bastion&lt;/strong&gt;: Click on the &amp;ldquo;Connect via Azure Bastion&amp;rdquo; option and enter your credentials. You should now be connected to your virtual machine via Azure Bastion.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="automating-provisioning-and-deletion-of-azure-bastion"&gt;&lt;strong&gt;Automating Provisioning and Deletion of Azure Bastion&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;To reduce costs associated with Bastion you can automate the provisioning and deletion of Azure Bastion, you can use Azure PowerShell or Azure CLI. Here&amp;rsquo;s how to do it using Azure PowerShell:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a PowerShell script for provisioning&lt;/strong&gt;: Create a PowerShell script that includes the commands to create the Azure Bastion resource. Refer to the following link &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/bastion/bastion-create-host-powershell#deploy-bastion" target="_blank" rel="noopener"
&gt;Deploy Bastion&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a PowerShell script for removal:&lt;/strong&gt;: Create a PowerShell script that includes the commands to remove the Azure Bastion resource. Refer to the following link &lt;a class="link" href="https://learn.microsoft.com/en-us/powershell/module/az.network/remove-azbastion?view=azps-11.2.0&amp;amp;viewFallbackFrom=azps-11.0.0" target="_blank" rel="noopener"
&gt;Remove Bastion&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Schedule the scripts&lt;/strong&gt;: Use the Azure Automation to schedule the script to run at specific times that meets your requirements.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Azure Bastion is a fully managed service that provides more secure and seamless RDP and SSH access to virtual machines without any exposure through public IP addresses. It eliminates the need for a public IP address, Network Security Groups (NSGs), or a jump host, and provides a browser-based interface that can be accessed from anywhere, without the need for software installation or configuration. Setting up Azure Bastion is a straightforward process that can be completed in just a few steps. By using Azure Bastion, you can provide secure remote access to your virtual machines in Azure and ensure that your data is protected. By automating the provisioning and deletion of Azure Bastion, you can ensure that your virtual machines are always secure, even during out-of-hours periods.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://azure.microsoft.com/en-us/products/azure-bastion/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Bastion - Fully Managed RDP/SSH | Microsoft Azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Connecting On-Premises and Azure Cloud Resources</title><link>https://blog.brewedinthecloud.com/p/vpnconnectivity-azure/</link><pubDate>Sat, 17 Feb 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vpnconnectivity-azure/</guid><description>&lt;p&gt;Azure Virtual Private Network (VPN) is a secure and reliable way to connect your on-premises network to your Azure virtual network over the public internet. It provides a secure communication channel between your on-premises network and your Azure virtual network, allowing you to extend your on-premises network to the cloud. In this blog post, we will guide you through the setup and configuration of Azure VPNs, covering site-to-site and point-to-site connections, and addressing common challenges.&lt;/p&gt;
&lt;h2 id="site-to-site-vpn"&gt;Site-to-Site VPN
&lt;/h2&gt;&lt;p&gt;Site-to-Site VPN is the most common method organisations use to connect on-premises network to Azure vNet. This VPN connection is initiated in your edge firewall or router level. Site-to-Site VPN allows you to connect your on-premises network to your Azure virtual network over the public internet. This connection is encrypted and secure, and it allows you to extend your on-premises network to the cloud.&lt;/p&gt;
&lt;h3 id="steps-to-configure-site-to-site-vpn"&gt;Steps to Configure Site-to-Site VPN
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Create a virtual network in Azure.&lt;/li&gt;
&lt;li&gt;Create a local network gateway.&lt;/li&gt;
&lt;li&gt;Create a connection between the virtual network and the local network gateway.&lt;/li&gt;
&lt;li&gt;Configure your on-premises VPN device.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="site-to-site-common-challenges"&gt;Site-to-Site Common Challenges
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connectivity Issues&lt;/strong&gt;: If you are experiencing connectivity issues, check your firewall settings and ensure that your VPN device is configured correctly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance Issues&lt;/strong&gt;: If you are experiencing performance issues, check your network bandwidth and ensure that your VPN device is configured correctly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="point-to-site-vpn"&gt;Point-to-Site VPN
&lt;/h2&gt;&lt;p&gt;Point-to-Site VPN allows you to connect your on-premises network to your Azure virtual network over the public internet. This connection is initiated from your client computer and is encrypted and secure. Point-to-Site VPN is useful when you need to connect to your Azure virtual network from a remote location, such as your home.&lt;/p&gt;
&lt;h3 id="steps-to-configure-point-to-site-vpn"&gt;Steps to Configure Point-to-Site VPN
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Create a virtual network in Azure.&lt;/li&gt;
&lt;li&gt;Create a VPN gateway.&lt;/li&gt;
&lt;li&gt;Create a root certificate.&lt;/li&gt;
&lt;li&gt;Create a client certificate.&lt;/li&gt;
&lt;li&gt;Install the client certificate on your client computer.&lt;/li&gt;
&lt;li&gt;Connect to the VPN gateway from your client computer.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="point-to-site-common-challenges"&gt;Point-to-Site Common Challenges
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Certificate Issues&lt;/strong&gt;: If you are experiencing certificate issues, ensure that your certificates are valid and that they are installed correctly on your client computer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connectivity Issues&lt;/strong&gt;: If you are experiencing connectivity issues, check your firewall settings and ensure that your VPN device is configured correctly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Virtual Private Network (VPN) is a secure and reliable way to connect your on-premises network to your Azure virtual network over the public internet. In this blog post, we have guided you through the setup and configuration of Azure VPNs, covering site-to-site and point-to-site connections, and addressing common challenges. We hope that this blog post has been helpful to you and that you are now able to connect your on-premises network to your Azure virtual network with ease.&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://techcommunity.microsoft.com/t5/itops-talk-blog/step-by-step-creating-an-azure-point-to-site-vpn/ba-p/326264" target="_blank" rel="noopener"
&gt;Step-By-Step: Creating an Azure Point-to-Site VPN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-configure-vnet-connections" target="_blank" rel="noopener"
&gt;Configure and validate virtual network or VPN connections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/vpn-gateway/tutorial-site-to-site-portal" target="_blank" rel="noopener"
&gt;Tutorial: Create a site-to-site VPN connection in the Azure portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.pluralsight.com/courses/microsoft-azure-on-premises-networks-virtual-networks-connecting" target="_blank" rel="noopener"
&gt;Connecting On-premises Networks with Azure Virtual Networks&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Azure Network Design Architecting for Scalability and Security</title><link>https://blog.brewedinthecloud.com/p/networkdesign4scaleandavailability-azure/</link><pubDate>Sat, 10 Feb 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/networkdesign4scaleandavailability-azure/</guid><description>&lt;p&gt;One of the key challenges in building on Azure is designing a network architecture that is both scalable and secure. In this blog post, we will discuss proven network design patterns for building scalable and secure solutions in Azure, covering considerations for multi-tier applications, load balancing, and high availability.&lt;/p&gt;
&lt;h2 id="multi-tier-applications"&gt;Multi-Tier Applications
&lt;/h2&gt;&lt;p&gt;Multi-tier applications are a common architecture pattern for building scalable and secure solutions in Azure. In this pattern, the application is divided into multiple tiers, each with its own set of responsibilities. The most common tiers are the presentation tier, the application tier, and the data tier.&lt;/p&gt;
&lt;p&gt;The presentation tier is responsible for presenting the user interface to the user. The application tier is responsible for processing business logic and managing application state. The data tier is responsible for storing and retrieving data.&lt;/p&gt;
&lt;p&gt;To ensure scalability and security, each tier should be deployed to a separate virtual network (VNet). This allows you to apply different security policies to each tier and scale each tier independently.&lt;/p&gt;
&lt;h2 id="load-balancing"&gt;Load Balancing
&lt;/h2&gt;&lt;p&gt;Load balancing is another important consideration when designing a network architecture for Azure. Load balancing allows you to distribute traffic across multiple instances of an application, ensuring that no single instance is overloaded.&lt;/p&gt;
&lt;p&gt;Azure provides several load balancing options, including Azure Load Balancer, Azure Application Gateway, and Azure Traffic Manager. Each of these options has its own set of features and benefits, so it&amp;rsquo;s important to choose the right one for your specific use case.&lt;/p&gt;
&lt;h2 id="high-availability"&gt;High Availability
&lt;/h2&gt;&lt;p&gt;High availability is critical for ensuring that your applications are always available to your users. Azure provides several options for achieving high availability, including Azure Availability Zones, Azure Site Recovery, and Azure Backup.&lt;/p&gt;
&lt;p&gt;Azure Availability Zones provide physically separate locations within an Azure region, ensuring that your applications are available even in the event of a data center outage. Azure Site Recovery provides disaster recovery capabilities, allowing you to replicate your applications to a secondary location. Azure Backup provides backup and restore capabilities, ensuring that your data is always protected.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Designing a network architecture for Azure requires careful consideration of several factors, including multi-tier applications, load balancing, and high availability. By following proven network design patterns, you can build scalable and secure solutions that meet the needs of your users. If you are interested in learning more about network design patterns in Azure, check out the resources provided by Microsoft&lt;/p&gt;
&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/patterns/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Cloud design patterns - Azure Architecture Center | Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/guide/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Application Architecture Fundamentals | Azure Architecture Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cloud-architekt.net/overview-of-azure-architecture/" target="_blank" rel="noopener"
&gt;Azure Architecture &amp;amp; Design Patterns (Study collection) | Cloud Architekt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/well-architected/security/design-patterns?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Cloud design patterns that support security - Microsoft Azure Well Architected | Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/approaches/networking?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Architectural approaches for networking in multitenant solutions | Micosoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/networking/fundamentals/architecture-guides?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Networking architecture documentation | Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/guide/networking/networking-start-her?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Networking architecture design | Azure Architecture Center&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Azure Network Security Monitoring Leveraging Azure Monitor and Log Analytics</title><link>https://blog.brewedinthecloud.com/p/networksecuritymonitoring-azure/</link><pubDate>Sat, 03 Feb 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/networksecuritymonitoring-azure/</guid><description>&lt;p&gt;Azure Monitor and Log Analytics are powerful tools that can be used to monitor network security. In this blog post, we will explore how these tools can be utilized for network security monitoring, including setting up alerts, collecting and analyzing logs, and responding to security incidents.&lt;/p&gt;
&lt;h2 id="setting-up-alerts"&gt;Setting up Alerts
&lt;/h2&gt;&lt;p&gt;Azure Monitor can be used to set up alerts for various network security events. For example, you can set up alerts for failed logins, suspicious IP addresses, and other security-related events. These alerts can be configured to send notifications via email, SMS, or other channels.&lt;/p&gt;
&lt;h2 id="collecting-and-analyzing-logs"&gt;Collecting and Analyzing Logs
&lt;/h2&gt;&lt;p&gt;Azure Monitor can also be used to collect and analyze logs from various sources, including virtual machines, containers, and other Azure resources. This data can be used to identify security threats and vulnerabilities in your network.&lt;/p&gt;
&lt;p&gt;Log Analytics is a powerful tool that can be used to analyze logs collected by Azure Monitor. With Log Analytics, you can create custom queries to search for specific events or patterns in your logs. You can also use pre-built queries to identify common security threats and vulnerabilities.&lt;/p&gt;
&lt;h2 id="responding-to-security-incidents"&gt;Responding to Security Incidents
&lt;/h2&gt;&lt;p&gt;When a security incident occurs, it is important to respond quickly and effectively. Azure Monitor and Log Analytics can be used to help you respond to security incidents in a timely manner.&lt;/p&gt;
&lt;p&gt;For example, you can use Azure Monitor to set up alerts for suspicious activity on your network. When an alert is triggered, you can use Log Analytics to investigate the incident and identify the root cause of the problem. You can then take appropriate action to mitigate the threat and prevent similar incidents from occurring in the future.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Monitor and Log Analytics are powerful tools that can be used to monitor network security. By setting up alerts, collecting and analyzing logs, and responding to security incidents, you can help ensure the security of your network. If you are interested in learning more about Azure Network Security Monitoring, check out the resources provided by Microsoft.&lt;/p&gt;
&lt;h2 id="lean-more"&gt;Lean More
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/networking/network-monitoring-overview?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Network Monitoring in Azure Monitor logs | Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.pluralsight.com/labs/azure/monitor-logs-analytics-azure-monitor" target="_blank" rel="noopener"
&gt;Azure Monitor Lab: How to Monitor Logs and Analytics | Pluralsight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/logs/data-security?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Monitor Logs data security | Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-monitor/best-practices-logs?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Best practices for Azure Monitor Logs | Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Enhancing Azure Network Monitoring and Diagnostics</title><link>https://blog.brewedinthecloud.com/p/networkwatcher-azure/</link><pubDate>Sat, 27 Jan 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/networkwatcher-azure/</guid><description>&lt;p&gt;If you are using Azure to host your applications and services, you know how important it is to have a reliable and secure network infrastructure. However, managing and troubleshooting network issues can be challenging, especially in complex and dynamic environments. That&amp;rsquo;s why Azure provides a powerful tool to help you monitor, diagnose, and gain insights into your network performance and health&lt;/p&gt;
&lt;h2 id="azure-network-watcher"&gt;Azure Network Watcher
&lt;/h2&gt;&lt;p&gt;Azure Network Watcher is a service that enables you to monitor and diagnose conditions at a network scenario level in, to, and from Azure. Network diagnostic and visualization tools available with Network Watcher help you understand, diagnose, and gain insights to your network in Azure.&lt;/p&gt;
&lt;p&gt;Some of the key capabilities of Azure Network Watcher are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Network Performance Monitor&lt;/strong&gt;: A service that monitors the performance of your network across cloud and on-premises environments. It helps you detect network issues such as packet loss, latency, and topology changes. You can also set alerts and notifications based on your performance thresholds and SLAs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connection Monitor&lt;/strong&gt;: A feature of Network Performance Monitor that tracks the connectivity and performance of individual connections between your VMs, endpoints, or Azure services. It helps you identify the source and scope of network issues and troubleshoot them quickly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic Analytics&lt;/strong&gt;: A feature of Network Performance Monitor that analyzes the flow logs from your NSGs to provide insights into the traffic patterns, usage trends, and security risks in your network. It helps you optimize your network configuration, identify anomalies, and detect threats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Watcher Agent&lt;/strong&gt;: A VM extension that enables you to collect network data from your VMs and send it to Network Watcher for analysis. It supports various tools such as IP flow verify, packet capture, next hop, security group view, and connection troubleshoot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packet Capture&lt;/strong&gt;: A tool that allows you to capture packets from your VMs or NICs for offline analysis. You can specify filters, time limits, and storage options for your packet capture sessions. You can also analyze the captured packets using open-source tools such as Wireshark or Microsoft Message Analyzer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP Flow Verify&lt;/strong&gt;: A tool that allows you to check if a packet is allowed or denied by an NSG based on the 5-tuple information (source IP, destination IP, source port, destination port, protocol). It helps you validate your NSG rules and troubleshoot connectivity issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next Hop&lt;/strong&gt;: A tool that allows you to determine the next hop for packets being sent from a VM. It helps you verify your user-defined routes and troubleshoot routing issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Group View&lt;/strong&gt;: A tool that allows you to view the effective security rules applied to a VM or NIC. It helps you understand the impact of multiple NSGs and ASGs on your network security posture.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connection Troubleshoot&lt;/strong&gt;: A tool that allows you to check the connectivity status and latency between a source and a destination. It also provides hop-by-hop analysis and possible causes for connectivity failures. It helps you diagnose network issues across hybrid and distributed environments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure Network Watcher is a comprehensive solution for enhancing your network monitoring and diagnostics capabilities in Azure. It can help you improve your network performance, reliability, security, and visibility. To learn more about Azure Network Watcher and how to use it, check out the official documentation here: &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/network-watcher/?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Azure Network Watcher&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Demystifying Azure Virtual Networks</title><link>https://blog.brewedinthecloud.com/p/azure-vnetfundamentals/</link><pubDate>Sun, 21 Jan 2024 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-vnetfundamentals/</guid><description>&lt;p&gt;Azure Virtual Networks (VNet) are one of the core components of Azure cloud platform, enabling you to create isolated and secure networks for your cloud resources. In this blog post, we will demystify the fundamentals of Azure Virtual Networks, including setup, configuration, and best practices for optimal performance and security.&lt;/p&gt;
&lt;h2 id="what-is-an-azure-virtual-network"&gt;What is an Azure Virtual Network?
&lt;/h2&gt;&lt;p&gt;An Azure Virtual Network is a logical representation of a network in the cloud. It allows you to define your own private IP address space, subnets, route tables, network security groups, virtual network peering, service endpoints, private endpoints, and more. You can use Azure Virtual Networks to connect your Azure resources, such as virtual machines, web apps, databases and other services with virtual network integrations as well as to connect to your on-premises network or the internet.&lt;/p&gt;
&lt;h2 id="why-use-an-azure-virtual-network"&gt;Why use an Azure Virtual Network?
&lt;/h2&gt;&lt;h3 id="using-an-azure-virtual-network-has-many-benefits-such-as"&gt;Using an Azure Virtual Network has many benefits, such as
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Isolation: You can isolate your cloud resources from other tenants and the public internet, ensuring that only authorized traffic can access them.&lt;/li&gt;
&lt;li&gt;Security: You can apply granular network security policies to your subnets and resources using network security groups and service endpoints. You can also use private endpoints to access Azure services over a private link, without exposing them to the internet.&lt;/li&gt;
&lt;li&gt;Performance: You can optimize the performance of your network traffic by using route tables and virtual network peering. You can also use accelerated networking to improve the throughput and latency of your virtual machines.&lt;/li&gt;
&lt;li&gt;Flexibility: You can customize your network topology and configuration to suit your needs. You can also integrate your Azure Virtual Network with other Azure services, such as load balancers, VPN gateways, application gateways, firewalls, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-to-create-an-azure-virtual-network"&gt;How to create an Azure Virtual Network?
&lt;/h2&gt;&lt;p&gt;Creating an Azure Virtual Network is easy and can be done using the Azure portal, PowerShell, CLI, or ARM templates. Here are the basic steps to create an Azure Virtual Network:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choose a name and a region for your virtual network.&lt;/li&gt;
&lt;li&gt;Specify the address space for your virtual network. This is the range of IP addresses that you can use for your subnets and resources. You can use either IPv4 or IPv6 addresses, or both. The address space must not overlap with any other virtual network or on-premises network that you want to connect to.&lt;/li&gt;
&lt;li&gt;Create one or more subnets within your virtual network. A subnet is a segment of your virtual network that contains a subset of IP addresses. You can assign different subnets to different resources based on their functionality or security requirements.&lt;/li&gt;
&lt;li&gt;Optionally, you can configure other settings for your virtual network, such as DNS servers, route tables, network security groups, service endpoints, private endpoints, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-are-some-best-practices-for-azure-virtual-networks"&gt;What are some best practices for Azure Virtual Networks?
&lt;/h2&gt;&lt;p&gt;To get the most out of your Azure Virtual Networks, here are some best practices that you should follow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plan your address space carefully. Choose a large enough address space that can accommodate your current and future needs. Avoid overlapping address spaces with other networks that you want to connect to.&lt;/li&gt;
&lt;li&gt;Use multiple subnets for different purposes. For example, you can use separate subnets for web servers, database servers, management servers, etc. This will help you organize your resources and apply appropriate network security policies.&lt;/li&gt;
&lt;li&gt;Use network security groups to control the inbound and outbound traffic to your subnets and resources. Network security groups are like firewalls that allow or deny traffic based on rules that you define. You can use tags to group your resources and apply network security groups at the subnet level or the resource level.&lt;/li&gt;
&lt;li&gt;Use service endpoints to secure your access to Azure services. Service endpoints are like gateways that enable you to access Azure services over a direct connection from your virtual network. This will improve the security and performance of your communication with Azure services.&lt;/li&gt;
&lt;li&gt;Use private endpoints to access Azure services over a private link. Private endpoints are like aliases that map a private IP address from your virtual network to an Azure service. This will allow you to access Azure services without exposing them to the internet or using public IP addresses.&lt;/li&gt;
&lt;li&gt;Use virtual network peering to connect multiple virtual networks within the same region or across regions. Virtual network peering is like a bridge that enables you to route traffic between virtual networks using the Microsoft backbone network. This will improve the performance and reliability of your cross-network communication.&lt;/li&gt;
&lt;li&gt;Use VPN gateways or ExpressRoute circuits to connect your Azure Virtual Network to your on-premises network or other clouds. VPN gateways are like tunnels that encrypt and secure your traffic between networks over the internet. ExpressRoute circuits are like dedicated lines that provide fast and reliable connectivity between networks over a private connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Azure Virtual Networks are powerful and flexible tools that enable you to create secure and optimized networks for your cloud resources. By following the fundamentals and best practices discussed in this blog post, you can leverage Azure Virtual Networks to achieve better isolation, security, performance, and flexibility for your cloud applications.&lt;/p&gt;</description></item><item><title>Azure Monitor Automation with DevOps and Tags</title><link>https://blog.brewedinthecloud.com/p/azmonitorautomation-azure/</link><pubDate>Sat, 13 Jan 2024 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azmonitorautomation-azure/</guid><description>&lt;h2 id="summary"&gt;Summary
&lt;/h2&gt;&lt;p&gt;In this blog post, I will show you how to monitor your Azure resources using a PowerShell script that is scheduled in Azure DevOps. The script creates the Azure Monitor Alert Rules based on a CSV configuration and Azure resource tags to identify exceptions. The Azure DevOps pipeline runs on a schedule so that the alert rules are updated based on tags that have been created with the new threshold for the alert rule.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/processflow.drawio.svg"
loading="lazy"
alt="Process flow"
&gt;&lt;/p&gt;
&lt;h2 id="why-use-powershell-and-azure-devops-for-monitoring"&gt;Why use PowerShell and Azure DevOps for monitoring?
&lt;/h2&gt;&lt;p&gt;You can use PowerShell to create, modify, and delete Azure Monitor Alert Rules, which are the rules that define the conditions and actions for monitoring your Azure resources. Azure Monitor Alert Rules can be based on metrics, logs, or activity logs, and can trigger notifications, runbooks, logic apps, or webhooks when the conditions are met. In my environment I have them triggering an action-group which has an email notification.&lt;/p&gt;
&lt;p&gt;Azure DevOps is a cloud-based platform that provides various tools and services for software development and delivery. You can use Azure DevOps to create pipelines, which are workflows that automate the steps of building, testing, and deploying your code. You can also use Azure DevOps to schedule your pipelines to run at specific times or intervals, or to trigger them based on events or changes in your code.&lt;/p&gt;
&lt;p&gt;By combining PowerShell and Azure DevOps, you can create a solution that automates the creation and update of your Azure Monitor Alert Rules based on your configuration and tags. This way, you can ensure that your monitoring settings are consistent and up-to-date across your Azure resources.&lt;/p&gt;
&lt;h2 id="the-powershell-script"&gt;The PowerShell script
&lt;/h2&gt;&lt;p&gt;The script I am using is one I co-authored while I&amp;rsquo;ve been working at &lt;a class="link" href="cubesys" &gt;https://cubesys.com.au&lt;/a&gt;. The [https://github.com/cloudclarity-app/Azure-Monitoring](Azure Monitor Automation Script) is a powershell script that is used to automatically set monitoring threshold on Azure resources. By default, the script applies to all metrics enabled for monitoring accross the entire subscription. You can restrict the scope by defining either a specific resource group, using the rgazresources variable, and/or a specific resource type, using the azrestype variable.&lt;/p&gt;
&lt;h2 id="devops-repo-setup"&gt;DevOps Repo Setup
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Clone the repo into your devops repo
&lt;img src="https://blog.brewedinthecloud.com/clonerepo.png"
loading="lazy"
alt="Clone Azure Monitoring Repo to your DevOps"
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create folders for each subscription, in this example i have 4 subscriptions I am monitoring
&lt;img src="https://blog.brewedinthecloud.com/devops-subscriptionfolders.png"
loading="lazy"
alt="Azure DevOps Subscription Folders"
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modify your Azure Monitor CSV to enable the relevant alerts for your subscription
&lt;img src="https://blog.brewedinthecloud.com/azuremonitorcsv.png"
loading="lazy"
alt="Azure Monitor CSV"
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create the Azure DevOps Pipeline for deployment, I created a pipeline for each subscription under monitoring
&lt;img src="https://blog.brewedinthecloud.com/azuredevops-pipeline.png"
loading="lazy"
alt="Azure DevOps Pipeline YAML"
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Azure Pipelines&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;vmImage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;- &lt;span class="nt"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;AzurePowerShell@5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;azureSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ServiceConnectionName&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ScriptPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$(system.defaultworkingdirectory)/azuremonitoring.ps1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;azurePowerShellVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;LatestVersion&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="5"&gt;
&lt;li&gt;Create DevOps scheudling, I have two schedules configured
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Execution based on commit to the subscription folder within the Repo
&lt;img src="https://blog.brewedinthecloud.com/azuredevops-schedulepath.png"
loading="lazy"
alt="Azure DevOps Pipeline Schedule Path"
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Execution based on a schedule to look for Tags, you can have multiple time based schedules to suit your needs
&lt;img src="https://blog.brewedinthecloud.com/azuredevops-scheduletime.png"
loading="lazy"
alt="Azure DevOps Pipeline Schedule Time"
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="azure-monitor"&gt;Azure Monitor
&lt;/h2&gt;&lt;p&gt;Now that the pipeline has executed we can now see the alert rules it has created for my virtual machines
&lt;img src="https://blog.brewedinthecloud.com/azure-monitoralerts.png"
loading="lazy"
alt="Azure Monitor Alert Rules"
&gt;&lt;/p&gt;
&lt;p&gt;Based on the script it has created these alert rules, and associated the relevant action group which will then send me an email in the event that any of these alert rules are triggered.&lt;/p&gt;</description></item><item><title>Microsoft &amp; ACSC Essential Eight Empowers Organisations</title><link>https://blog.brewedinthecloud.com/p/acsc-essential8-azure/</link><pubDate>Thu, 20 Jul 2023 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/acsc-essential8-azure/</guid><description>&lt;p&gt;In the ever-evolving digital landscape, organisations face a multitude of challenges when it comes to compliance and security. Regulatory requirements, data protection, and the constant threat of cyberattacks make it crucial for businesses to implement robust measures to safeguard their operations. Enter the Australian Cyber Security Centre’s Essential Eight framework, which addresses these concerns head-on. In this blog, we explore the power of Microsoft products and how they solve critical problems for customers, paving the way for compliance excellence.&lt;/p&gt;
&lt;p&gt;Are you struggling with compliance and security in today’s digital world? Discover how Microsoft Essential Eight can solve your organisation’s compliance challenges and unlock excellence in this blog!&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Enhancing Cybersecurity:&lt;/strong&gt; Cybersecurity breaches can devastate businesses, leading to data loss, financial losses, and reputational damage. ACSC Essential Eight provides a set of essential security controls that help organisations proactively defend against threats. By implementing these controls to maturity levels 1, 2 or 3, businesses can fortify their defences, detect and respond to incidents promptly, and mitigate potential risks effectively.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Addressing Regulatory Requirements:&lt;/strong&gt; Navigating the ever-changing landscape of regulations can be overwhelming. ACSC Essential Eight aligns with various industry standards and compliance frameworks, making it easier for organisations to meet regulatory obligations. By leveraging this framework, businesses can streamline their compliance activities, reduce the burden of manual processes, and ensure adherence to key regulations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protecting Sensitive Data:&lt;/strong&gt; Data breaches and unauthorised access pose significant risks to organisations. Essential Eight includes data protection measures to safeguard sensitive information. With features like encryption, access controls, and data loss prevention, businesses can ensure the confidentiality, integrity, and availability of their critical data. By implementing these controls, organisations can protect their customers’ trust and meet data privacy requirements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strengthening Endpoint Security:&lt;/strong&gt; Endpoints, including laptops and mobile devices, are common entry points for cyber threats. Essential Eight focuses on endpoint security, offering solutions to protect these vulnerable devices. By implementing robust endpoint security measures, organisations can defend against malware, prevent unauthorised access, and ensure the integrity of their endpoints, thereby minimising the risk of breaches.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streamlining Incident Response:&lt;/strong&gt; Timely detection and effective response are critical in mitigating the impact of security incidents. Essential Eight provides tools and technologies to streamline incident response processes. By leveraging these capabilities, organisations can detect threats promptly, investigate incidents efficiently, and take swift action to minimise damage, thereby improving overall incident management.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Essential Eight empowers organisations to tackle compliance and security challenges head-on. By implementing this comprehensive framework, businesses can enhance cybersecurity, meet regulatory requirements, protect sensitive data, strengthen endpoint security, and streamline incident response processes.&lt;/p&gt;</description></item><item><title>Azure Virtual Desktop Networking and Security</title><link>https://blog.brewedinthecloud.com/p/vdisecurity-azure/</link><pubDate>Fri, 10 Feb 2023 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/vdisecurity-azure/</guid><description>&lt;p&gt;Azure Virtual Desktop (AVD) is a cloud-based desktop as a service (DaaS) solution offered by Microsoft Azure. It provides access to a virtualized Windows environment, allowing users to run applications, access data, and store files in the cloud.&lt;/p&gt;
&lt;p&gt;With the rising need for flexible computing solutions, the virtual desktop infrastructure market is growing at a Compound Annual Growth Rate of 19.2% during the forecast period (2022–2030) (GlobeNewsWire 2022). As a result, AVD is becoming increasingly popular.&lt;/p&gt;
&lt;p&gt;While the trend indicates that this industry is booming, it also means that it will be an easy target for cyber-attacks. It becomes important for us to reinforce our infrastructure’s security backbone and avoid taking any shortcuts. Security and networking are two critical aspects when it comes to AVD.&lt;/p&gt;
&lt;h2 id="build-up-your-avd-security"&gt;Build up your AVD Security
&lt;/h2&gt;&lt;p&gt;The security of data and applications is of utmost importance when using any cloud-based service. Organisations that adopt a cybersecurity network architecture by 2024 will reduce the financial liabilities of security breaches by 90% (Gartner 2022).&lt;/p&gt;
&lt;p&gt;AVD relies on Microsoft Azure’s security infrastructure, which includes physical security, network security, and data protection. The service also uses encryption to protect data in transit and at rest, ensuring that sensitive information remains confidential.&lt;/p&gt;
&lt;h3 id="multi-factor-authentication"&gt;Multi-factor authentication
&lt;/h3&gt;&lt;p&gt;Multi-factor authentication (MFA) is another important feature of Azure Virtual Desktop. MFA adds an extra layer of security by requiring users to provide a second form of identification, such as a one-time code sent to their phone, in addition to their username and password. This helps prevent unauthorized access to the virtual desktop environment and the data stored there.&lt;/p&gt;
&lt;h3 id="role-based-access-control"&gt;Role-based access control
&lt;/h3&gt;&lt;p&gt;Role-based access control (RBAC) is another security feature of Azure Virtual Desktop. RBAC allows administrators to restrict user access to sensitive resources, ensuring that only authorized individuals have access to sensitive information. This helps minimize the risk of data breaches and unauthorized access to sensitive data.&lt;/p&gt;
&lt;h2 id="improve-accessibility-with-avd"&gt;Improve accessibility with AVD
&lt;/h2&gt;&lt;p&gt;Networking is another critical aspect of AVD. The service uses Microsoft Azure’s global network infrastructure, which provides low latency and high availability. This helps ensure that the virtual desktop environment is accessible and responsive, even when users are accessing it from remote locations.&lt;/p&gt;
&lt;h3 id="azure-expressroute"&gt;Azure ExpressRoute
&lt;/h3&gt;&lt;p&gt;However, the performance of AVD will depend on the quality of the user’s internet connection. A fast and stable internet connection is essential to ensure the best possible performance. If network connectivity is an issue, Azure ExpressRoute can be used to establish a private connection between the user’s on-premises infrastructure and the Azure Virtual Desktop service.&lt;/p&gt;
&lt;p&gt;ExpressRoute provides an additional layer of security by allowing users to bypass the public internet, reducing the risk of data breaches and unauthorized access. ExpressRoute also provides a more stable and predictable network connection, helping to ensure that Azure Virtual Desktop is always accessible and responsive.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/vdisecurity-azure/expressroute-overview.png"
width="1301"
height="658"
srcset="https://blog.brewedinthecloud.com/p/vdisecurity-azure/expressroute-overview_hu_3ba3a3794dfc8431.png 480w, https://blog.brewedinthecloud.com/p/vdisecurity-azure/expressroute-overview_hu_8bb5c0c7ffc43206.png 1024w"
loading="lazy"
alt="Overview of Azure ExpressRoute"
class="gallery-image"
data-flex-grow="197"
data-flex-basis="474px"
&gt;&lt;/p&gt;
&lt;h2 id="secure-remote-access-with-avd"&gt;Secure Remote Access with AVD
&lt;/h2&gt;&lt;p&gt;In conclusion, AVD is a secure and convenient solution for remote work and on-the-go computing. With the security and networking features provided by Microsoft Azure, users can be confident that their data and applications are protected and accessible when they need them. The use of encryption, MFA, RBAC, and ExpressRoute helps ensure that sensitive information remains confidential and that the virtual desktop environment is accessible and responsive. If you are considering using Azure Virtual Desktop, be sure to take these important security and networking considerations into account.&lt;/p&gt;
&lt;p&gt;Join our Panel Discussion event to get all the best AVD networking and security tips straight from the experts. We’ll be joined by speakers from Microsoft, Nerdio, and cubesys as they run you through fundamental concepts as well as what network isolation has achieved for our clients. If you miss the live event, check out the event replay.&lt;/p&gt;</description></item><item><title>Advanced Microsoft Authenticator Security Features</title><link>https://blog.brewedinthecloud.com/p/advmfa-azure/</link><pubDate>Tue, 08 Nov 2022 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/advmfa-azure/</guid><description>&lt;p&gt;Previously in public preview, Microsoft Authenticator security features are now Generally Available for your organisation! So, how will this affect you?&lt;/p&gt;
&lt;p&gt;Admins can now use number matching, location context, and application context to prevent accidental approvals in Microsoft Authenticator. For those that might not be aware of the terminology, number matching involves entering a number into the Authenticator app that matches the one presented to the user.&lt;/p&gt;
&lt;p&gt;On top of this, admins can now also better manage the Microsoft Authenticator app with new Admin UX and Admin APIs (Application Programming Interface). Admin UX refers to the Admin user experience, which refers to the experience the user takes away from interacting with that product.&lt;/p&gt;
&lt;p&gt;With the rise of Multi-Factor Authentication (MFA) fatigue attacks, critical security features are enabled to eradicate threats before they become a problem. An MFA fatigue attack involves bombarding a user’s authentication app with push notifications until they accept, allowing them to gain entry to their account or device.&lt;/p&gt;
&lt;h2 id="number-matching-in-microsoft-authenticator"&gt;Number matching in Microsoft Authenticator
&lt;/h2&gt;&lt;p&gt;By the end of February 2023, number matching will be enabled for all Microsoft Authenticator users. Admins can make it a requirement for users to number match when approving an MFA request in Authenticator. This not only prevents accidental approvals, it helps defend users against the MFA fatigue attacks mentioned prior.&lt;/p&gt;
&lt;h3 id="additional-context-in-approval-requests"&gt;Additional context in approval requests
&lt;/h3&gt;&lt;p&gt;Showing users additional context in Microsoft Authenticator notifications is another way to reduce any accidental approvals. The following contexts can be selected by Admins to be displayed to users:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application context: Users see which application they’re signing into&lt;/li&gt;
&lt;li&gt;Location context: Users see their sign-in location based on the IP address of the device they’re signing into&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="updated-admin-ux-and-apis"&gt;Updated Admin UX and APIs
&lt;/h3&gt;&lt;p&gt;The refresh Admin UX and APIs will help Admins better manage their Microsoft Authenticator features. The new Configure tab in the Admin UX allows different features to be enabled or disabled. It also includes the ability to exclude groups from features, a highly requested feature, which will help with smoother feature rollouts.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Once number matching has been enabled for all at the end of February 2023, these rollout controls will be disconnected.&lt;/p&gt;
&lt;h3 id="ongoing-security-and-usability-optimisations"&gt;Ongoing security and usability optimisations
&lt;/h3&gt;&lt;p&gt;Microsoft Authenticator is working on constantly innovating and improving its security and user experience features. For example, the iOS app now includes App Transport Security (ATS), which improves the privacy and data integrity between Authenticator and web services.&lt;/p&gt;</description></item><item><title>Common Azure Cost Optimisation Practices</title><link>https://blog.brewedinthecloud.com/p/costopt-azure/</link><pubDate>Thu, 06 Oct 2022 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/costopt-azure/</guid><description>&lt;p&gt;There are various ways to achieve a cost-effective, well-architected framework (WAF) Azure environment. We have selected some of the most common optimisations we talk to customers about. They can be categorised as the following: storage, Infrastructure as a Service (IaaS), monitoring, and Platform as a Service (PaaS).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/azure-cost-optimisations.png"
loading="lazy"
alt="7 ways to optimise costs"
&gt;
Source: &lt;a class="link" href="https://azure.microsoft.com/en-us/solutions/cost-optimization/#ways-to-optimize?sharingId=MVP_473698" target="_blank" rel="noopener"
&gt;Cloud Cost Optimization&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="iaas"&gt;IaaS
&lt;/h3&gt;&lt;h4 id="spot-vms"&gt;Spot VMs
&lt;/h4&gt;&lt;p&gt;Azure Spot Virtual Machines (VMs) on scale sets can help you benefit from Azure’s unused capacity at a significant cost saving. When Azure needs capacity back, they’ll evict the Azure Spot VM instances. This makes these VMs ideal for workloads that can cope with interruptions, such as batch processing jobs, dev/test environments, and more.&lt;/p&gt;
&lt;h4 id="shutdown-or-resize-underutilised-virtual-machines"&gt;Shutdown or Resize Underutilised Virtual Machines
&lt;/h4&gt;&lt;p&gt;Having VMs in your cloud environment that aren’t running at their full potential or are sized incorrectly will incur unnecessary compute costs. This also includes any VMs that aren’t currently in use but are still running. So, it’s important to make sure you stop your VMs during off hours or resize them.&lt;/p&gt;
&lt;h4 id="reservations"&gt;Reservations
&lt;/h4&gt;&lt;p&gt;A reservation can be scoped for a subscription or resource groups. By setting the reservation’s scope, you’re picking where the reservation settings apply. Based on your needs, you can choose to scope your reservation in three ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Single resource group scope: This is where the reservation discount is applied only to the matching resources in the chosen resource group.&lt;/li&gt;
&lt;li&gt;Single subscription scope: Similarly, this scope applies the discount to the matching resources in a chosen subscription.&lt;/li&gt;
&lt;li&gt;Shared scope: With this scope, the reservation discount is applied to suitable resources in eligible subscriptions that are in a billing context. Once a subscription is moved to a different billing context, this scope will stop applying to it.&lt;br&gt;
If you’re unsure about what the billing context is, it’s dependent on what your licensing is.&lt;/li&gt;
&lt;li&gt;If you have an Enterprise Agreement, the billing context will be the enrolment. In this instance, you can include several Active Directory (AD) tenants in a shared scope.&lt;/li&gt;
&lt;li&gt;If you have a Microsoft Customer Agreement, your billing scope is the billing profile.&lt;/li&gt;
&lt;li&gt;If you have an individual, pay-as-you-go subscription, your billing scope will be any eligible subscription created by the account admin.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="monitoring"&gt;Monitoring
&lt;/h4&gt;&lt;p&gt;To centrally manage platforms, it’s recommended to use a single monitor logs workplace. This is ideal for circumstances where role-based access control (RBAC), data sovereignty requirements, and data retention policies dictate separate workspaces.&lt;/p&gt;
&lt;p&gt;Centralised logging pushes reports about change movement, configuration, service health, and other important aspects required for IT operations. As a result, having centralised logging provides your operations management teams with the visibility they need while reducing administrative effort and chances for holes in observability.&lt;/p&gt;
&lt;p&gt;Log Analytics offers the Pay-As-You-Go model, but it also caters to Commitment Tiers. These tiers can save you as much as 30 per cent by allowing you to commit to a tier of data ingestion for a workspace. The lowest tier starts at 100 GB per day at a price lower than what’s offered by the Pay-As-You-Go model. The Commitment Tiers provide a 31-day period of commitment from the moment a tier is chosen.&lt;/p&gt;
&lt;h4 id="azure-advisor"&gt;Azure Advisor
&lt;/h4&gt;&lt;p&gt;Don’t forget to take advantage of this free tool! With respect to WAF, Azure Advisor provides helpful insights to help you get the most value out of your Azure environments.&lt;/p&gt;
&lt;h3 id="paas"&gt;PaaS
&lt;/h3&gt;&lt;h4 id="app-service-plans"&gt;App Service Plans
&lt;/h4&gt;&lt;p&gt;App Service plans run instances, and they act as the scale unit of App Service applications. So, if the plan is designed to run four VM instances, then every app in the plan runs on all four instances. Then, each of these VM instances is charged the same regardless of the number of applications running on them.&lt;/p&gt;
&lt;p&gt;You can use App Service plans alongside auto-scaling to reduce expenditure. Extra costs can be saved by implementing multiple apps into a single App Service plan, so long as the plan has sufficient resources to cope with the load.&lt;/p&gt;
&lt;p&gt;You should also consider creating separate App Service plans for production and testing as best practice. As all applications within a single App Service plan share the same VM instance, it’s not recommended to use slots on the production implementation for testing as it can negatively impact the production deployment.&lt;/p&gt;
&lt;h3 id="storage"&gt;Storage
&lt;/h3&gt;&lt;h4 id="storage-account-gpv2"&gt;Storage Account GPv2
&lt;/h4&gt;&lt;p&gt;The general-purpose v2 (GPv2) tier for storage accounts maintains the latest Azure Storage features while also incorporating the functionality of general-purpose v1 (GPv1) and Blob storage accounts.&lt;/p&gt;
&lt;p&gt;Some cost-friendly features of GPv2 include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Delivering the lowest per-gigabyte capacity prices alongside industry-competitive transaction prices.&lt;/li&gt;
&lt;li&gt;Supporting default account access tiers (hot or cool) as well as Blob-level tiering (hot, cool, archive).&lt;/li&gt;
&lt;li&gt;Granting lifecycle management for storage cost optimisation.
As a result, GPv2 accounts are advised for most storage circumstances and are considered best practice.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="recovery-services-vault-and-backup-vault"&gt;Recovery Services Vault and Backup Vault
&lt;/h4&gt;&lt;p&gt;Azure contains two key types of vaults:&lt;/p&gt;
&lt;p&gt;Backup Vault: A storage entity that holds backup data for workloads supported by Azure Backup.
Recovery Services Vault: A storage entity that holds copies of data or configuration information for VMs, workloads, servers and workstations.&lt;/p&gt;</description></item><item><title>Access to BitLocker Recovery Key (Preview)</title><link>https://blog.brewedinthecloud.com/p/bitlocker-entraid/</link><pubDate>Thu, 15 Sep 2022 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/bitlocker-entraid/</guid><description>&lt;p&gt;When BitLocker is enabled on a Windows device, the recovery key can be saved to Azure Active Directory (Azure AD), a USB, a file, or even printed. End-users can access this key for their owned device through Azure AD or by going to their device properties.&lt;/p&gt;
&lt;p&gt;If you don’t know how to access it through Azure AD, first go to Azure AD and then click on the Devices blade. From here, you can access the BitLocker keys (Preview).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/bitlocker-entraid/review-bitlocker-key.jpeg"
width="828"
height="266"
srcset="https://blog.brewedinthecloud.com/p/bitlocker-entraid/review-bitlocker-key_hu_50ae89676665ad01.jpeg 480w, https://blog.brewedinthecloud.com/p/bitlocker-entraid/review-bitlocker-key_hu_83348ccf29e04cbc.jpeg 1024w"
loading="lazy"
alt="View BitLocker Recovery Key"
class="gallery-image"
data-flex-grow="311"
data-flex-basis="747px"
&gt;&lt;/p&gt;
&lt;h2 id="restricting-access-to-the-bitlocker-recovery-key-in-azure"&gt;Restricting access to the BitLocker recovery key in Azure
&lt;/h2&gt;&lt;p&gt;First, you need to make sure that you’ve updated your authorisation policy to turn off the self-service BitLocker key access, which can be done using the Microsoft Graph PowerShell module.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Connect-MgGraph&lt;/span&gt; &lt;span class="n"&gt;-Scopes&lt;/span&gt; &lt;span class="n"&gt;Policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ReadWrite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Authorization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$authPolicyUri&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;policies&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;authorizationPolicy&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;authorizationPolicy&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$body&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;defaultUserRolePermissions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;allowedToReadBitlockerKeysForOwnedDevice&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$false&lt;/span&gt; &lt;span class="c"&gt;#Set this to $true to allow BitLocker self-service recovery &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}|&lt;/span&gt; &lt;span class="nb"&gt;ConvertTo-Json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-MgGraphRequest&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="nv"&gt;$authPolicyUri&lt;/span&gt; &lt;span class="n"&gt;-Method&lt;/span&gt; &lt;span class="n"&gt;PATCH&lt;/span&gt; &lt;span class="n"&gt;-Body&lt;/span&gt; &lt;span class="nv"&gt;$body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Show current policy setting &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$authPolicy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Invoke-MgGraphRequest&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="nv"&gt;$authPolicyUri&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$authPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;defaultUserRolePermissions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Once this authorisation policy has been updated, the following Azure AD roles will be able to access they key:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Global administrators&lt;/li&gt;
&lt;li&gt;Security administrators&lt;/li&gt;
&lt;li&gt;Intune Service administrators&lt;/li&gt;
&lt;li&gt;Security readers&lt;/li&gt;
&lt;li&gt;Any custom role with the right permissions&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ExpressRoute Traffic Collector (Preview)</title><link>https://blog.brewedinthecloud.com/p/azure-expressroute/</link><pubDate>Sat, 20 Aug 2022 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-expressroute/</guid><description>&lt;p&gt;ExpressRoute Traffic Collector, is a service that enables deep visibility into traffic within ExpressRoute Circuits. The Traffic Collector aggregates flow logs from ER circuits and forwards them to Azure tools such as Log Analytics for network traffic analysis, visualization, and insights. Depending on your termination of hardware on premises where visibility of this traffic may not be passed through an aggregation device which has sufficient logging capabilities, this allows you to achieve that visibility natively within Azure Log Analytics workspaces.&lt;/p&gt;
&lt;p&gt;At the time of writing this article it is only available in the following regions, but it would be expected that this is rolled out to additional regions throughout the preview phase.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Central US&lt;/li&gt;
&lt;li&gt;East US&lt;/li&gt;
&lt;li&gt;East US 2&lt;/li&gt;
&lt;li&gt;North Central US&lt;/li&gt;
&lt;li&gt;South Central US&lt;/li&gt;
&lt;li&gt;West Central US&lt;/li&gt;
&lt;li&gt;West US&lt;/li&gt;
&lt;li&gt;West US 2&lt;/li&gt;
&lt;li&gt;West US 3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information you can also view the Microsoft Docs website on the link below&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/expressroute/traffic-collector" target="_blank" rel="noopener"
&gt;Enable flow logging using Azure ExpressRoute Traffic Collector (Preview) | Microsoft Docs&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Azure Private DNS Resolver</title><link>https://blog.brewedinthecloud.com/p/azure-private-dns/</link><pubDate>Fri, 01 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-private-dns/</guid><description>&lt;p&gt;Another new service introduced this year so far by Microsoft, Azure DNS (Domain Name System) Private Resolver is a cloud-native, DevOps-friendly, and highly available service.&lt;/p&gt;
&lt;p&gt;The purpose of this new service is to allow the querying of Azure DNS private zones from an on-premises environment and vice versa, removing the need to deploy virtual machine (VM) based DNS servers.&lt;/p&gt;
&lt;h2 id="supporting-hybrid-networking"&gt;Supporting hybrid networking
&lt;/h2&gt;&lt;p&gt;Normally, if you wanted to query a DNS private zone, a custom DNS solution needs to be created and supported. Azure DNS Private Resolver offers a simple and secure service to conditionally forward and resolve DNS queries from an on-premises environment or a virtual network to any target DNS server. The result is the enabling of crucial hybrid networking setups.&lt;/p&gt;
&lt;h3 id="the-processes-behind-dns-private-resolver"&gt;The processes behind DNS Private Resolver
&lt;/h3&gt;&lt;p&gt;To use Azure DNS Private Resolver, you first need an Azure Virtual Network that you can use to contain the resolver. This then creates inbound endpoints, which are used as destination points for DNS queries. The resolver also has an outbound endpoint that processes DNS queries based on a configurable DNS forwarding ruleset.&lt;/p&gt;
&lt;p&gt;The resolver’s inbound and outbound endpoints each need a subnet within the virtual network they’re handled in. These subnets must have no other services running within it, and they can only be delegated to Microsoft.Network/dnsResolvers. It’s also important to note that DNS resolution between on-premises networks and virtual networks requires a VPN or Azure ExpressRoute.&lt;/p&gt;
&lt;p&gt;The DNS query process looks something like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A DNS query is issued by a client in a virtual network&lt;/li&gt;
&lt;li&gt;If you’ve specified custom DNS servers for this virtual network, the query will be forwarded to the specified IP addresses.&lt;/li&gt;
&lt;li&gt;If you’re using Azure’s default DNS servers for this virtual network and you’ve linked Private DNS Zones to the network, these zones are checked.&lt;/li&gt;
&lt;li&gt;If your query doesn’t match any of the virtual network’s private DNS zones, virtual network links for DNS forwarding rulesets are accessed.&lt;/li&gt;
&lt;li&gt;If you have no ruleset links, then the query is resolved by Azure DNS.&lt;/li&gt;
&lt;li&gt;If you have ruleset links, then the DNS forwarding rules are assessed.&lt;/li&gt;
&lt;li&gt;The query is forwarded to the allocated address if a suffix match is found.&lt;/li&gt;
&lt;li&gt;In a situation where there are multiple suffixes matched, the longest suffix is selected.&lt;/li&gt;
&lt;li&gt;If there are no matches, Azure DNS resolves the query and no DNS forwarding takes place.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="benefits-of-azure-dns-private-resolver"&gt;Benefits of Azure DNS Private Resolver
&lt;/h3&gt;&lt;p&gt;Azure DNS Private Resolver is highly available and zone redundant, and it runs at the fraction of the cost associated with typical IaaS (Infrastructure as a Service) solutions. You’ll also be able to conditionally forward to and from on-premises environments privately and securely. This is great for hybrid cloud setups.&lt;/p&gt;
&lt;p&gt;Some other benefits include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High scalability with its endpoints offering high performance.&lt;/li&gt;
&lt;li&gt;Support for DevOps, where you can create pipelines using Terraform, Bicep, or Azure Resource Manager (ARM)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-current-limitations-of-dns-private-resolver"&gt;The current limitations of DNS Private Resolver
&lt;/h3&gt;&lt;p&gt;Currently, Azure DNS Private Resolver is in public preview, which brings along restrictions that might otherwise not be present in a generally available release. Regarding rulesets, there can be no more than 25 rules, and these rulesets can’t be linked across multiple subscriptions. You also won’t be able to use any IPv6-enabled subnets.&lt;/p&gt;
&lt;p&gt;Nonetheless, this is a very beneficial new service, especially for hybrid companies. Getting your organisation familiar with the processes associated with using this new service can help prepare for when it’s generally available.&lt;/p&gt;</description></item><item><title>Azure Private Link for Azure Monitor</title><link>https://blog.brewedinthecloud.com/p/privatelink-azure/</link><pubDate>Wed, 22 Jun 2022 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/privatelink-azure/</guid><description>&lt;h2 id="private-links--what-are-they-why-do-you-need-them-how-do-you-implement-them"&gt;Private links – What are they? Why do you need them? How do you implement them?
&lt;/h2&gt;&lt;p&gt;Keeping your environment secure is important, even in the cloud. Some organisations or environments required private and secure communication even for their monitoring solutions, Azure Private Link has recently been enabled for Azure Monitor&lt;/p&gt;
&lt;p&gt;Because public networks are just that – public. They are open to anyone who wishes to use them and as such, any communication passing through them is potentially visible to anyone who cares to look (also known as man in the middle). &lt;/p&gt;
&lt;p&gt;As an organisation, this is a big security concern. We’ve all heard the horror stories of companies that have had their confidential data compromised by hackers who were able to gain access to their networks through open/unprotected Wi-Fi networks. It’s a costly mistake and PR nightmare for any brand, which is why you need to take extra steps to protect your organisation’s data, even the monitoring data.&lt;/p&gt;
&lt;p&gt;Today, we’ll discuss private links and how to set them up using a Domain Name System (DNS). By the end of this article, you’ll know how to create a private link and use it with Azure Monitor. Let’s explore &lt;/p&gt;
&lt;h2 id="what-are-private-links"&gt;What are private links? 
&lt;/h2&gt;&lt;p&gt;This is where private links come in. Private links work by setting up a private endpoint within your internal DNS environment.&lt;/p&gt;
&lt;p&gt;Traffic between your network and the service using internal IP addressing and travels the Microsoft backbone network. This eliminates the requirement to expose service to the public internet. You can create your own private link service in your Azure virtual network and deliver it to your customers. Setup and consumption using Azure Private Link is consistent across Azure PaaS, customer-owned services.&lt;/p&gt;
&lt;h3 id="setup-azure-monitor-private-link"&gt;Setup Azure Monitor private link
&lt;/h3&gt;&lt;p&gt;Azure Monitor is a great solution for monitoring your cloud environment, but it can be difficult to keep your data secure when you’re using it. &lt;/p&gt;
&lt;p&gt;One of the best ways to keep your data safe is to use a private link between your Azure Monitor environment and your on-premises environment. This will prevent traffic from passing between your environment and the Azure Monitoring platform through the public network.&lt;/p&gt;
&lt;h4 id="step-1"&gt;Step 1
&lt;/h4&gt;&lt;p&gt;From the Azure Portal, go to Azure Monitor:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Within the settings section select “Private Link Scopes”&lt;/li&gt;
&lt;li&gt;Click Create&lt;/li&gt;
&lt;li&gt;Provide your subscription, resource group and instance detail, and select Private Only
&lt;img src="https://blog.brewedinthecloud.com/p/privatelink-azure/azure-monitor-privatelinkblade.png"
width="1200"
height="464"
srcset="https://blog.brewedinthecloud.com/p/privatelink-azure/azure-monitor-privatelinkblade_hu_fa937b8913053236.png 480w, https://blog.brewedinthecloud.com/p/privatelink-azure/azure-monitor-privatelinkblade_hu_4959f70fcb0cda.png 1024w"
loading="lazy"
alt="Accessing Private Link Scopes blade in Azure Monitor"
class="gallery-image"
data-flex-grow="258"
data-flex-basis="620px"
&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="step-2"&gt;Step 2
&lt;/h4&gt;&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/privatelink-azure/azure-monitor-privatelinks-scope.png"
width="756"
height="780"
srcset="https://blog.brewedinthecloud.com/p/privatelink-azure/azure-monitor-privatelinks-scope_hu_48cf2f23976aaa7f.png 480w, https://blog.brewedinthecloud.com/p/privatelink-azure/azure-monitor-privatelinks-scope_hu_5be911ef5effc324.png 1024w"
loading="lazy"
alt="Azure Monitor Private Link Scope creation process and settings"
class="gallery-image"
data-flex-grow="96"
data-flex-basis="232px"
&gt;&lt;/p&gt;
&lt;h4 id="step-3"&gt;Step 3
&lt;/h4&gt;&lt;p&gt;For the initial setup, it’s recommended to leave it as open. Once you’ve reconfigured all your endpoints to use the private endpoint, then finally come back to your AMPLS and select Private Only.&lt;/p&gt;
&lt;h3 id="implementing-a-private-link-into-your-dns"&gt;Implementing a private link into your DNS
&lt;/h3&gt;&lt;p&gt;We’ll now focus on implementing Private Link and integrating it within Active Directory DNS Servers that are on-prem. Implementing this in Azure DNS can be done by just completing step 2.&lt;/p&gt;
&lt;p&gt;To get the name resolution working, you’ll need the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS Server on-prem&lt;/li&gt;
&lt;li&gt;DNS Server within Azure Virtual Network (This will soon be replaced by DNS Private Resolver which is now in Public Preview)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Create a conditional forwarder within DNS server for privatelink.monitor.azure.com and point those towards your Azure VM, which is a DNS relay in cloud.&lt;/li&gt;
&lt;li&gt;On your Azure VM DNS server, configure its DNS forwarders to Azure’s public DNS services IP 168.63.129.16.
&lt;img src="https://blog.brewedinthecloud.com/p/privatelink-azure/azure-dns-forwarder.png"
width="796"
height="360"
srcset="https://blog.brewedinthecloud.com/p/privatelink-azure/azure-dns-forwarder_hu_b54bec6415286ad1.png 480w, https://blog.brewedinthecloud.com/p/privatelink-azure/azure-dns-forwarder_hu_423f163dd070710e.png 1024w"
loading="lazy"
alt="Preview of private link DNS domain and IP address"
class="gallery-image"
data-flex-grow="221"
data-flex-basis="530px"
&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Private links are a great way to keep your data safe and secure, and using DNS is one of the best ways to set them up. In this article, we’ve shown you how to create a private link using DNS and how to use it securely with Azure Monitor.&lt;/p&gt;</description></item><item><title>Microsoft Dev Box</title><link>https://blog.brewedinthecloud.com/p/microsoft-vdi/</link><pubDate>Thu, 09 Jun 2022 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/microsoft-vdi/</guid><description>&lt;p&gt;Modern-day problems require modern-day solutions. The way we work has changed, with remote and hybrid work becoming the norm, and this especially rings true for development teams. It’s important to ensure developer workstations can keep pace and be flexible so as not to interrupt their productivity.&lt;/p&gt;
&lt;p&gt;Microsoft Dev Box is a newly released cloud service that aims to provide a secure developer workstation for developers working in hybrid teams. Essentially, they can focus on coding with pre-configured tools and resources as opposed to losing time setting up, configuring, and maintaining workstations. Simultaneously, Microsoft Endpoint Manager is integrated with Dev Box providing the IT team with uniform governance, compliance, and security.&lt;/p&gt;
&lt;p&gt;While Dev Box is an exciting new service, it’s currently in private preview. If you’re eager to use it, you’ll have to sign up for the waiting list. Nonetheless, let’s have a deeper look at the benefits of Microsoft Dev Box.&lt;/p&gt;
&lt;h3 id="a-new-look-at-developer-workstations"&gt;A new look at developer workstations
&lt;/h3&gt;&lt;p&gt;A common frustration with onboarding or starting with a new company is getting your workstation setup. It takes a significant amount of time which results in a huge amount of time lost before they’re able to make their first commit. Secondly, for senior or more experienced developers, working across different projects can sometimes lead to dependencies that are incompatible with one another. This has the potential to greatly disrupt their workstation.&lt;/p&gt;
&lt;p&gt;Microsoft Dev Box provides your team the ability to create an image and maintain it, alongside all the tools and dependencies they’ll need to build and test their apps. On top of this, the source code for the app and nightly built binaries can be included in the Dev Box, which can allow developers to skip the re-build phase and immediately start running the code.&lt;/p&gt;
&lt;p&gt;Another great feature is the developer portal, which provides your team the ability to create and delete Dev Boxes for any of their projects. You can create a Dev Box whenever you want to keep projects separate, experiment on a proof-of-concept, or parallelise jobs across an environment. Dev boxes can even assist with legacy apps by allowing you to quickly produce an environment that can recreate and diagnose issues as they arise.&lt;/p&gt;
&lt;h3 id="dev-box-simplifies-management"&gt;Dev Box simplifies management
&lt;/h3&gt;&lt;p&gt;With Azure Active Directory integration, new team members can be quickly onboarded and provided access to the Dev Boxes they’ll need for their projects. Besides new additions to the team, Dev Boxes are also especially useful for remote work by providing them with a high-fidelity experience and gigabit connection speeds, regardless of their location. You’ll only have to deploy the Dev Box in the developer’s local region and connect through the Azure Global Network.&lt;/p&gt;
&lt;p&gt;If you’re outsourcing to an external development team and want to boost your network security, you can establish role-based permissions. This limits accessibility to external contractors without diminishing the flexibility or access of your local internal teams.&lt;/p&gt;
&lt;p&gt;You can also automatically ‘hibernate’ your Dev Box at the end of the day, when it isn’t in use, to save costs. Your team can easily ‘wake’ them when they’re needed and continue where they left off. These costs are then easily visible to your team from a single view, which can assist with understanding expenses across several teams and projects.&lt;/p&gt;
&lt;h4 id="security-compliance-across-developer-workstations"&gt;Security compliance across developer workstations
&lt;/h4&gt;&lt;p&gt;The benefits of Microsoft Dev Box aren’t limited to just more flexible workstations and empowering dev teams, it also heightens security. As mentioned prior, the service is integrated with Windows 365, and Endpoint Manager. With expedited feature updates, zero-day patches can be deployed across all devices within an organisation. And, in the event that a Dev Box is compromised, IT admins can isolate it and set up a new Dev Box without causing a major disruption.&lt;/p&gt;
&lt;p&gt;We also mentioned how Azure Active Directory can be used with a Dev Box to manage permissions and access controls. Well, administrators can also assign conditional access policies such as multi-factor authentication, connecting through a compliant device, or constructing risk-based sign-in policies if sensitive code or data is being handled.&lt;/p&gt;
&lt;p&gt;Currently, Microsoft Dev Box is able to support any integrated development environment (IDE), software development kit (SDK), or internal tool running on Windows. Above all, any workload you can build from a Windows Desktop can be targeted with a Dev Box. And best of all, since Microsoft Dev Box is a service hosted on the cloud, it can be accessed from anywhere!&lt;/p&gt;</description></item><item><title>Managing Google Chrome with Intune</title><link>https://blog.brewedinthecloud.com/p/chrome-intune/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/chrome-intune/</guid><description>&lt;p&gt;Previously, only those with on-premises environments and Active Directory could manage Chrome by importing ADMX templates (Google’s administrative templates) and using group policies. There was no option to perform the same for those who have a fully managed or hybrid cloud with Intune.&lt;/p&gt;
&lt;p&gt;Fortunately, Microsoft has launched a new feature that allows users to use an Intune device configuration profile to manage Google Chrome! This is extremely useful in cases where a client or user might need Google Chrome policies pushed out to an enrolled fleet by an IT administrator.&lt;/p&gt;
&lt;p&gt;If you’re unfamiliar with Intune, the Intune settings catalogue provides a list of all settings that can be configured for macOS or Windows 10 and later devices in one central place. This simplifies the process of creating policies or settings. There’s a large variety of settings for you to play around with, including default search providers, printing, password managers, and more.&lt;/p&gt;
&lt;h4 id="creating-intune-device-configuration-profiles-for-google-chrome"&gt;Creating Intune Device Configuration Profiles for Google Chrome
&lt;/h4&gt;&lt;p&gt;To start using this new feature, you need to connect to your Intune portal and access Devices\Windows\Configuration Profiles. From here, you can build a new device configuration profile by selecting Windows 10 and later as your platform, then pick Templates as your profile type, and then Administrative Templates.
&lt;img src="https://blog.brewedinthecloud.com/p/chrome-intune/intune-configprofiles.png"
width="1248"
height="842"
srcset="https://blog.brewedinthecloud.com/p/chrome-intune/intune-configprofiles_hu_c201de55b95d2b33.png 480w, https://blog.brewedinthecloud.com/p/chrome-intune/intune-configprofiles_hu_9c60fb9ebb3bc3e6.png 1024w"
loading="lazy"
alt="Accessing Intune device configuration profiles"
class="gallery-image"
data-flex-grow="148"
data-flex-basis="355px"
&gt;
&lt;img src="https://blog.brewedinthecloud.com/p/chrome-intune/intune-createprofile.png"
width="871"
height="553"
srcset="https://blog.brewedinthecloud.com/p/chrome-intune/intune-createprofile_hu_8a0bb600a84ce636.png 480w, https://blog.brewedinthecloud.com/p/chrome-intune/intune-createprofile_hu_a64865430e4066a6.png 1024w"
loading="lazy"
alt="Creating a new device configuration profile"
class="gallery-image"
data-flex-grow="157"
data-flex-basis="378px"
&gt;
Once you’ve finished naming your profile, you’ll see that the Google settings are available for user and computer configuration.
&lt;img src="https://blog.brewedinthecloud.com/p/chrome-intune/intune-chromeconfig.png"
width="1600"
height="1464"
srcset="https://blog.brewedinthecloud.com/p/chrome-intune/intune-chromeconfig_hu_a4600b6a6fcc23b5.png 480w, https://blog.brewedinthecloud.com/p/chrome-intune/intune-chromeconfig_hu_5bd4749fb8291dfe.png 1024w"
loading="lazy"
alt="Google Chrome settings available for configuration"
class="gallery-image"
data-flex-grow="109"
data-flex-basis="262px"
&gt;&lt;/p&gt;</description></item><item><title>Azure Bring your own Public IP Addresses</title><link>https://blog.brewedinthecloud.com/p/azure-byoipprefix/</link><pubDate>Thu, 07 Apr 2022 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-byoipprefix/</guid><description>&lt;p&gt;Microsoft has now released the general availability of BYOIP (Bring Your Own IP) to all regions of Azure! This is exciting news because existing public IPs can be kept and reused when planning on-premises migrations to the cloud. You might want to do this to either keep an established IP reputation or to suit the dependencies of customers.&lt;/p&gt;
&lt;p&gt;You need to use Azure’s Custom IP Prefix resource to do this. This is what’s going to let you bring your public IPv4 ranges to the cloud and use them in the way you would use any other public Azure-owned IP ranges. Once you’ve migrated your IPs, they can be used with other resources, private IPs or VNETs, and they can export data from Microsoft’s Wide Area Network.&lt;/p&gt;
&lt;h2 id="supplying-a-custom-ip-range"&gt;Supplying a custom IP range
&lt;/h2&gt;&lt;p&gt;First, to use your public IP range in Azure, you must own the range and have it registered with a Routing Internet Registry. Then, the migration can be done through your Azure Portal, Azure PowerShell, Azure CLI or through Azure Resource Manager (ARM) templates. Your range must be at least a /24 (256 IP addresses) or greater to be accepted by ISPs (Internet Service Providers). Once you’ve created your Custom IP Prefix resource, Microsoft will run you through some authentication steps to validate your ownership of the IP range.&lt;/p&gt;
&lt;p&gt;It’s important to note that your IP addresses will still remain under your ownership when you migrate, but Microsoft is allowed to advertise it from their WAN (Wide Area Network). Each range will also be linked to an Azure region.&lt;/p&gt;
&lt;h2 id="using-your-custom-ip-range"&gt;Using your custom IP range
&lt;/h2&gt;&lt;p&gt;After you’ve put your IP range into Azure, you can begin to use your IP addresses from the range. You can choose to begin assigning addresses to resources or advertising the range prior to assigning. Microsoft will start advertising your range within Azure and to the internet once you go ahead with commissioning it. The region associated with the range will also have the IP posted publicly.&lt;/p&gt;
&lt;p&gt;Assigning the custom IPs requires creating a prefix for the public IP, which allows you to distribute individual public IP addresses. Prefixes for the range can be taken from other subscriptions (assuming you have the right permissions).&lt;/p&gt;
&lt;p&gt;You can link your IP with resources that support Standard SKU public IPs. This includes, but isn’t limited to, virtual machines, Azure Firewalls and Standard Public Load Balancers. You are charged for egress bandwidth, but not for the maintenance or hosting of your Public IP Prefix.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-byoipprefix/byoip-onboarding-process-1536x816.png"
width="1536"
height="816"
srcset="https://blog.brewedinthecloud.com/p/azure-byoipprefix/byoip-onboarding-process-1536x816_hu_f5bd17c5f3e218c1.png 480w, https://blog.brewedinthecloud.com/p/azure-byoipprefix/byoip-onboarding-process-1536x816_hu_1b532a9b75b98fcc.png 1024w"
loading="lazy"
alt="Onboarding IP Prefix Flow"
class="gallery-image"
data-flex-grow="188"
data-flex-basis="451px"
&gt;&lt;/p&gt;</description></item><item><title>Azure Static Web App with GitHub Actions</title><link>https://blog.brewedinthecloud.com/p/azure-staticwebapp/</link><pubDate>Thu, 07 Oct 2021 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/p/azure-staticwebapp/</guid><description>&lt;h2 id="why-static-web-app"&gt;Why Static Web App?
&lt;/h2&gt;&lt;p&gt;I have a few older pieces of HTML and JavaScript that I use in some of my other dynamic websites but I wanted to see if I could migrate them to a free service to avoid having to pay for their hosting. I stumbled across Microsoft Azure Static Web App which is free for personal / hobby sites like mine and is the perfect fit! As with all the free services there are some limitations to consider you can view them here.&lt;/p&gt;
&lt;p&gt;If you are looking to learn a more about it, you can always head to Microsoft Learn Static Web Apps Module&lt;/p&gt;
&lt;h3 id="prerequisites"&gt;Prerequisites
&lt;/h3&gt;&lt;p&gt;Here is what you’ll need&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GitHub Account&lt;/li&gt;
&lt;li&gt;Azure Account&lt;/li&gt;
&lt;li&gt;Static Content for publishing&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="create-your-repo"&gt;Create your Repo
&lt;/h2&gt;&lt;h3 id="from-github-portal"&gt;From GitHub Portal
&lt;/h3&gt;&lt;p&gt;Go to Repositories and Select “New”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image004.png"
width="780"
height="95"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image004_hu_a3ca00257987629f.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image004_hu_e73427632dcbc44f.png 1024w"
loading="lazy"
alt="GitHub New Repository"
class="gallery-image"
data-flex-grow="821"
data-flex-basis="1970px"
&gt;&lt;/p&gt;
&lt;p&gt;Fill the required repository details and select “Create repository”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image006.png"
width="771"
height="768"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image006_hu_998153b87c662625.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image006_hu_117ec231985c6405.png 1024w"
loading="lazy"
alt="GitHub Create Repository"
class="gallery-image"
data-flex-grow="100"
data-flex-basis="240px"
&gt;&lt;/p&gt;
&lt;p&gt;Repo Name is the only required field along with selecting Public vs Private. This depends on your requirements, but for my project I’ve selected Private&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image008.png"
width="780"
height="326"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image008_hu_e077e82b9e54765a.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image008_hu_7854c09157be0f8a.png 1024w"
loading="lazy"
alt="GitHub Repository Content"
class="gallery-image"
data-flex-grow="239"
data-flex-basis="574px"
&gt;&lt;/p&gt;
&lt;p&gt;Now that my repo has been created I synchronise my repo to my local computer. My personal preference is to use the GitHub Desktop application&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image010.png"
width="476"
height="367"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image010_hu_18dfe557fb78816b.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image010_hu_923c240c69afdfd2.png 1024w"
loading="lazy"
alt="GitHub Clone Respository"
class="gallery-image"
data-flex-grow="129"
data-flex-basis="311px"
&gt;&lt;/p&gt;
&lt;p&gt;This will pop up in GitHub Desktop to clone the repo locally based on the local path you define&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image012.png"
width="624"
height="384"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image012_hu_6aa0b98f603b83fd.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image012_hu_92a229940860ca1b.png 1024w"
loading="lazy"
alt="GitHub Desktop Clone Repository"
class="gallery-image"
data-flex-grow="162"
data-flex-basis="390px"
&gt;&lt;/p&gt;
&lt;p&gt;Once the repo is synchronised you can now go ahead and edit the content for your repository locally&lt;/p&gt;
&lt;h2 id="create-your-static-web-app-in-azure"&gt;Create your Static Web App in Azure
&lt;/h2&gt;&lt;p&gt;Now we will create the Static Web App before we publish content to it.&lt;/p&gt;
&lt;h3 id="from-the-azure-portal"&gt;From the Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the Azure portal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select Create a Resource.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for Static Web Apps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select Static Web Apps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select Create.
&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image013.png"
width="780"
height="331"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image013_hu_35594491d0a378a9.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image013_hu_8c0d05a5192e2a77.png 1024w"
loading="lazy"
alt="Azure Static WebApp"
class="gallery-image"
data-flex-grow="235"
data-flex-basis="565px"
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the Basics section, begin by configuring your new app and linking it to a GitHub repository.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Select your Azure subscription.&lt;/li&gt;
&lt;li&gt;Select or Create your Resource Group.&lt;/li&gt;
&lt;li&gt;Give the Web App a Name.&lt;/li&gt;
&lt;li&gt;For Hosting plan Select Free&lt;/li&gt;
&lt;li&gt;Under Azure Functions and staging details, select a region closest to you.&lt;/li&gt;
&lt;li&gt;Under Deployment details, select GitHub.&lt;/li&gt;
&lt;li&gt;Select the Sign-in with GitHub button and authenticate with GitHub.
&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image015.png"
width="780"
height="764"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image015_hu_80be6389e178714b.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image015_hu_3e22afedab07d648.png 1024w"
loading="lazy"
alt="Azure Static Web App Configuration"
class="gallery-image"
data-flex-grow="102"
data-flex-basis="245px"
&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image017.png"
width="610"
height="768"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image017_hu_995ac1290b769061.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image017_hu_ddcf6deed29f6a44.png 1024w"
loading="lazy"
alt="Connect GitHub with Azure"
class="gallery-image"
data-flex-grow="79"
data-flex-basis="190px"
&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;After you sign in with GitHub, enter the repository information.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Select your preferred Organisation name.&lt;/li&gt;
&lt;li&gt;Select my-first-web-static-app from the Repository drop-down.&lt;/li&gt;
&lt;li&gt;Select main from the Branch drop-down.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;In the Build Details section, add configuration details specific to your preferred front-end framework.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Select Custom from the Build Presets dropdown.&lt;/li&gt;
&lt;li&gt;Type ./ in the App location box.&lt;/li&gt;
&lt;li&gt;Leave the Api location box empty.&lt;/li&gt;
&lt;li&gt;Leave the Output location box empty.&lt;/li&gt;
&lt;li&gt;The configuration file is generated by GitHub and stored in the .github/workflows folder, named using the following format: &amp;lt;WebApp_Name&amp;gt;-&amp;lt;RANDOM_NAME&amp;gt;.yml.
&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image019.png"
width="780"
height="665"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image019_hu_d98342f3899ea182.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image019_hu_bc53b137fc29bb35.png 1024w"
loading="lazy"
alt="Configure GitHub Deployment Integration"
class="gallery-image"
data-flex-grow="117"
data-flex-basis="281px"
&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Select “Review + Create” to validate your selections&lt;/li&gt;
&lt;li&gt;Select “Create” to begin the deployment&lt;/li&gt;
&lt;li&gt;Once ready you can click on “Go to Resource”&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="prepare-your-content"&gt;Prepare your content
&lt;/h2&gt;&lt;p&gt;Go ahead and create and edit your content locally based on your GitHub Repo clone, the minimum requirement is that the webapp must include a index.html in the root folder&lt;/p&gt;
&lt;p&gt;If you are looking for a basic example of static HTML page you could use something like [https://codepen.io/kingsfull123/pen/zwrOZr](Responsive webpage) by Sen Yang on Codepen.io&lt;/p&gt;
&lt;h2 id="commit"&gt;Commit
&lt;/h2&gt;&lt;p&gt;Once you’re ready to test your content, go ahead and commit / push content to the Repo&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image021.png"
width="780"
height="440"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image021_hu_b6c1f4fd459ed29f.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image021_hu_115ca861fbe8a5ca.png 1024w"
loading="lazy"
alt="GitHub Desktop Commit Content"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="425px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image023.png"
width="779"
height="167"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image023_hu_45f16a9467742343.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image023_hu_7e3b8fb2dd0d17d8.png 1024w"
loading="lazy"
alt="GitHub Desktop Push"
class="gallery-image"
data-flex-grow="466"
data-flex-basis="1119px"
&gt;&lt;/p&gt;
&lt;p&gt;When the commit has been accepted it will trigger the workflow action which will then upload the contents of the repo to the Azure Static Web App. You can monitor the progress from the GitHub “Actions” tab of your repository&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image025.png"
width="780"
height="244"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image025_hu_d57f21d62ef642ee.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image025_hu_f765b5230287d96b.png 1024w"
loading="lazy"
alt="GitHub Workflows"
class="gallery-image"
data-flex-grow="319"
data-flex-basis="767px"
&gt;&lt;/p&gt;
&lt;p&gt;It will display the verbose output of the action within the job and once its finished it will show a big green tick&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image027.png"
width="780"
height="282"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image027_hu_a044f50b6381b9ab.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image027_hu_266ef7f4f05b4eb5.png 1024w"
loading="lazy"
alt="GitHub Workflow Details"
class="gallery-image"
data-flex-grow="276"
data-flex-basis="663px"
&gt;&lt;/p&gt;
&lt;h2 id="check-your-content"&gt;Check your Content
&lt;/h2&gt;&lt;p&gt;Browse to the URL of the web app to check the published connect&lt;/p&gt;
&lt;h2 id="added-bonus"&gt;Added Bonus
&lt;/h2&gt;&lt;p&gt;You can add a custom domain to your Static Web App it’s super simple to do there is two steps you need to do&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If you are using CAA Records in your domain you need to add Digicert.com as an approved Certificate Authority&lt;/li&gt;
&lt;li&gt;Add a CNAME DNS record with your website hosting provider and point it to the random URL on the Static Web App Overview page&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="from-azure-portal"&gt;From Azure Portal
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Browse to the Static Web App&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select “Custom Domains” from the left side blade&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select “Add” and a right side blade will appear&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter the domain name you wish to have (for example subdomain.domain.com)
&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image029.png"
width="780"
height="285"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image029_hu_8c5628ec4c33a1e7.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image029_hu_c95f86624f1fd8d2.png 1024w"
loading="lazy"
alt="Azure WebApp Add Custom Domain"
class="gallery-image"
data-flex-grow="273"
data-flex-basis="656px"
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Azure Portal will give you the details for the CNAME record you need to add once this is done you select “Add”
&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image031.png"
width="698"
height="403"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image031_hu_f1dd5894b82bfa48.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image031_hu_a445c8b07c18b033.png 1024w"
loading="lazy"
alt="Azure WebApp Add Details for Custom Domain"
class="gallery-image"
data-flex-grow="173"
data-flex-basis="415px"
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should now see the new domain has been added to the domain list and is now ready for you to browse too
&lt;img src="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image033.png"
width="539"
height="278"
srcset="https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image033_hu_3234f8852a9e212b.png 480w, https://blog.brewedinthecloud.com/p/azure-staticwebapp/clip_image033_hu_2d3cc4cb0db5035f.png 1024w"
loading="lazy"
alt="WebApp now showing as secure"
class="gallery-image"
data-flex-grow="193"
data-flex-basis="465px"
&gt;&lt;/p&gt;</description></item></channel></rss>