<?xml version="1.0" encoding="UTF-8"?>







<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
	<channel>
		<title>Microsoft Tech Community - Latest Blogs - Azure Tools Blog</title>
		<link>https://techcommunity.microsoft.com</link>
		<description>
			Azure Tools Blog
			
		</description>
				<item>
				<title>Azure Verified Modules (AVM) is now owned by Azure engineering</title>
					<link>https://techcommunity.microsoft.com/blog/AzureToolsBlog/azure-verified-modules-avm-is-now-owned-by-azure-engineering/4563822</link>
					<description>&lt;P&gt;Azure Verified Modules (AVM) has moved into the Azure Deployments team, inside Microsoft’s Azure engineering organization. That is the headline, and it is a big one for us.&lt;/P&gt;
&lt;P&gt;AVM started as a community-led project inside Microsoft, built and maintained largely by people who cared about it alongside their day jobs in various roles and teams across Microsoft. It is now owned by an engineering team, with dedicated engineers working on it every day; as well as those who helped make AVM what it is today.&lt;/P&gt;
&lt;P&gt;I want to be clear about what that does and does not mean, because I know the questions this raises. AVM is still open source. The repositories, specifications, the contribution model and the way you consume modules from the public registries are all unchanged. What has changed is the level of investment behind it, and how sustainable we can make it.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;In short:&lt;/STRONG&gt; Microsoft has increased its investment in AVM. It has moved from a community-led project into Azure engineering, with dedicated engineering resources behind it. It stays open-source. On the back of that, we are updating the support statement and introducing a three-tier module ownership model at the start of 2027 (more on these below).&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This blog post has a lot of content, please take the time to read it all but feel free to use the table of contents below to help you navigate it.&lt;/P&gt;
&lt;DIV class=&quot;mce-toc&quot;&gt;
&lt;H2 id=&quot;community-4563822-toc-hId-1366199514&quot;&gt;Table of Contents&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href=&quot;#community-4563822-mcetoc_1k4qmpe51_1&quot; target=&quot;_self&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;If AVM is new to you&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;#community-4563822-mcetoc_1k4qmpe51_2&quot; target=&quot;_self&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;What the move lets us fix: our support statement&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;#community-4563822-mcetoc_1k4qmpe51_3&quot; target=&quot;_self&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Introducing module tiering&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;#community-4563822-mcetoc_1k4qmpe51_4&quot; target=&quot;_self&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Why we are not publishing the module tiering list yet&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;#community-4563822-mcetoc_1k4qmpe51_5&quot; target=&quot;_self&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Distributed ownership is still the point&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;#community-4563822-mcetoc_1k4qmpe51_6&quot; target=&quot;_self&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Come and meet the team (AVM Community Call)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;#community-4563822-mcetoc_1k4qmpe51_7&quot; target=&quot;_self&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;What happens next&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;#community-4563822-mcetoc_1k4qmpe51_8&quot; target=&quot;_self&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;And finally, thank you to everyone who built this&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/DIV&gt;
&lt;H2 id=&quot;community-4563822-mcetoc_1k4qmpe51_1&quot;&gt;If AVM is new to you&lt;/H2&gt;
&lt;P&gt;AVM is the Microsoft standard for Infrastructure as Code (IaC) modules for Azure, in both Bicep and Terraform. Every module is built to the same published specification, passes the same continuous integration (CI) tests, and is published to the official public Bicep and Terraform registries. The idea is simple: you should not have to write the same Azure IaC code again, and you should be able to trust what you pick up.&lt;/P&gt;
&lt;P&gt;There is a lot more detail at &lt;A href=&quot;https://aka.ms/AVM&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;aka.ms/AVM&lt;/A&gt;. And if you would rather watch than read, Jared Holgate and I covered AVM in our recent Azure Infra Summit session: &lt;A href=&quot;https://www.youtube.com/live/QBqRAMVTmwE&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow noreferrer&quot;&gt;watch the recording on YouTube&lt;/A&gt;.&lt;/P&gt;
&lt;H2 id=&quot;community-4563822-mcetoc_1k4qmpe51_2&quot;&gt;What the move lets us fix: our support statement&lt;/H2&gt;
&lt;P&gt;Today, the AVM support statement includes day-based targets for responses and fixes. We have not met them consistently, and that does not give you clear or reliable expectations.&lt;/P&gt;
&lt;P&gt;We are removing those targets and aligning with the support model used by Azure CLI, Azure PowerShell, Bicep, AzAPI, and the AzureRM Terraform provider.&lt;/P&gt;
&lt;P&gt;The move into Azure engineering is the important part. Dedicated engineers will maintain modules directly and improve the tooling, automation, and framework used by all module owners. That is a stronger commitment than any fixed target we cannot reliably meet.&lt;/P&gt;
&lt;P&gt;It also lets us be clearer about who maintains each module. Right now, every AVM module is treated identically, and that is not sustainable. So, we are introducing module tiering.&lt;/P&gt;
&lt;H2 id=&quot;community-4563822-mcetoc_1k4qmpe51_3&quot;&gt;Introducing module tiering&lt;/H2&gt;
&lt;P&gt;Right now, every AVM module is treated identically. That is not sustainable. A resource group module needs almost no attention. A storage account or virtual machine module needs constant work as the underlying service evolves.&lt;/P&gt;
&lt;P&gt;So, today we are introducing two tiers (and thinking about a third) based on who owns and maintains a module:&lt;/P&gt;
&lt;DIV class=&quot;styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN&quot;&gt;&lt;table class=&quot;lia-border-style-solid&quot; border=&quot;1&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;
&lt;P&gt;&lt;STRONG&gt;Tier&lt;/STRONG&gt;&lt;/P&gt;
&lt;/th&gt;&lt;th&gt;
&lt;P&gt;&lt;STRONG&gt;Owned by&lt;/STRONG&gt;&lt;/P&gt;
&lt;/th&gt;&lt;th&gt;
&lt;P&gt;&lt;STRONG&gt;What it means&lt;/STRONG&gt;&lt;/P&gt;
&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;
&lt;P&gt;&lt;STRONG&gt;Tier 1 &lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;(Core)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/th&gt;&lt;td&gt;
&lt;P&gt;The AVM engineering team&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Modules are owned directly by the AVM team inside Azure engineering. These are the ones we maintain as our day job alongside the AVM specifications and framework&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;
&lt;P&gt;&lt;STRONG&gt;Tier 2 &lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;(Maintained)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/th&gt;&lt;td&gt;
&lt;P&gt;Any Microsoft employee (FTE)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Modules are owned by any Microsoft full-time employee or team/s. It also includes other Azure engineering teams owning the modules for their own services.&lt;/P&gt;
&lt;P&gt;This is the model we have today, and it is not going away.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;
&lt;P&gt;&lt;STRONG&gt;Tier 3 &lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;(Open-Source)&lt;BR /&gt;&lt;EM&gt;* being considered for future *&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/th&gt;&lt;td&gt;
&lt;P&gt;Vetted external owners (future)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;An idea, not a commitment. It would let trusted external parties such as Microsoft MVPs and accredited partners own modules. We will not look at this until the 2nd half of calendar year 2027.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 33.33%&quot; /&gt;&lt;col style=&quot;width: 33.33%&quot; /&gt;&lt;col style=&quot;width: 33.33%&quot; /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;One thing that will not change: the bar. Every module in every tier is built to the same AVM specification and passes the same CI checks. Tiering describes who is behind a module, not its quality.&lt;/P&gt;
&lt;P&gt;Ownership also stays aligned across languages if in Tier 1. If we own a module in Tier 1, we own it in both Bicep and Terraform.&lt;/P&gt;
&lt;H2 id=&quot;community-4563822-mcetoc_1k4qmpe51_4&quot;&gt;Why we are not publishing the module tiering list yet&lt;/H2&gt;
&lt;P&gt;We want to know our real maintenance capacity before we commit. We are spending the rest of 2026 reducing toil and clearing the backlog. This work will show how many modules we can maintain.&lt;/P&gt;
&lt;P&gt;We would rather publish a list that we can sustain than change it soon after publication. Publishing a list will also focus attention on excluded modules. We want clear evidence before those discussions start.&lt;/P&gt;
&lt;P&gt;For context, our draft puts about 50 resource modules in Tier 1, across Bicep and Terraform. Current telemetry suggests these modules represent about 85 percent of AVM module deployments.&lt;/P&gt;
&lt;P&gt;Usage is one input. Critical services and other factors also matter. We will validate the draft before making a public commitment.&lt;/P&gt;
&lt;H2 id=&quot;community-4563822-mcetoc_1k4qmpe51_5&quot;&gt;Distributed ownership is still the point&lt;/H2&gt;
&lt;P&gt;AVM has always run on decentralized ownership and moving into engineering does not change that. If anything, it should help. Being inside Azure engineering puts us much closer to the product teams who build the services, and getting more of those teams to own the modules for their own service has been a goal from day one.&lt;/P&gt;
&lt;P&gt;That is already happening. With the recent transition of Azure Landing Zones (ALZ), the &lt;A href=&quot;https://techcommunity.microsoft.com/blog/azuregovernanceandmanagementblog/azure-landing-zone-alz-enters-its-next-chapter/4533520&quot; target=&quot;_blank&quot;&gt;Azure Migrate team now maintain&lt;/A&gt; the ALZ modules and the subscription vending modules in AVM. Those sit in Tier 2, but they are maintained by a dedicated engineering team. Tier 2 is not a lesser tier, it is a broader one.&lt;/P&gt;
&lt;P&gt;However, if they currently own a resource module that will be included in Tier 1, they are still welcome to be involved in its ownership alongside the AVM engineering team, but we would also encourage them to own a module outside of Tier 1 so we have an owner on as many modules as possible. But all of this will be dealt with when we implement the tiering structure in early 2027.&lt;/P&gt;
&lt;P&gt;Tier 2 ownership remains open to Microsoft employees and teams. The AVM engineering team will support those owners through improved tooling, automation, and the AVM framework. We will confirm ownership changes when we implement module tiering in early 2027.&lt;/P&gt;
&lt;H2 id=&quot;community-4563822-mcetoc_1k4qmpe51_6&quot;&gt;Come and meet the team (AVM Community Call)&lt;/H2&gt;
&lt;P&gt;Rather than list names on a page, we would rather you meet the people. Join our next AVM community call, where the new engineering team looking after AVM will introduce themselves and take your questions. If you want to know who is behind AVM now, or discuss anything in this post, this will be the place to do it, and we can’t wait to see you all there!&lt;/P&gt;
&lt;span class=&quot;lia-media-object lia-media-is-center lia-media-size-large&quot; data-image-alt=&quot;&quot;&gt;&lt;button class=&quot;lia-media-unstyled-btn&quot; type=&quot;button&quot; aria-haspopup=&quot;true&quot; aria-label=&quot;Enlarge Image&quot;&gt;&lt;img src=&quot;https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NTYzODIyLVNtUkw4OA?image-dimensions=999x562&amp;amp;revision=7&quot; width=&quot;999&quot; height=&quot;562&quot; alt=&quot;&quot; /&gt;&lt;/button&gt;&lt;/span&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Next community call: Monday 26th October 2026 @ 16:00 UK | 12:00 EDT | 09:00 PDT | 21:30 IST | 03:00 AEDT&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This call will be streamed to YouTube live so use the &quot;Set reminder&quot; / &quot;Notify Me&quot; options on YouTube and also put an entry in your calendar to remind you. This means it will automatically be recorded and published live once finished as well 👍&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;YouTube Live Link: &lt;A class=&quot;lia-external-url&quot; href=&quot;https://aka.ms/AVM/CommunityCall&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;aka.ms/AVM/CommunityCall&lt;/A&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;GitHub Issue Link: &lt;A class=&quot;lia-external-url&quot; href=&quot;https://github.com/Azure/Azure-Verified-Modules/issues/3079&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;AVM Community Call - October 2026 · Issue #3079 · Azure/Azure-Verified-Modules&lt;/A&gt;&amp;nbsp; &lt;/STRONG&gt;- please add a comment for any topics or discussions you&#39;d like covered&lt;/P&gt;
&lt;P&gt;Everyone is welcome whether you contribute to AVM or just use it. We want to welcome you for an insight into our roadmap over the next 6 months as well as an open discussion with you all.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H2 id=&quot;community-4563822-mcetoc_1k4qmpe51_7&quot;&gt;What happens next&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;We update the published module support statement and remove the day-based response targets.&lt;/LI&gt;
&lt;LI&gt;The team keeps burning down issues and pull requests and keeps reducing the manual toil in our CI.&lt;/LI&gt;
&lt;LI&gt;We validate our maintenance run rate through the end of calendar year 2026.&lt;/LI&gt;
&lt;LI&gt;We publish the initial tier classifications once we can stand behind them.&lt;/LI&gt;
&lt;LI&gt;We revisit Tier 3, including the legal and intellectual property questions, in 2027.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;AVM got here because customers, partners and contributors backed it and used it in anger. That has not changed, and neither has our need for your input. If you think we are getting this wrong, tell us in GitHub Discussions. Candidly, the feedback we get on this will shape how we land it.&lt;/P&gt;
&lt;H2 id=&quot;community-4563822-mcetoc_1k4qmpe51_8&quot;&gt;And finally, thank you to everyone who built this&lt;/H2&gt;
&lt;P&gt;AVM exists because many people put real work into it, often alongside their day jobs. Matt White, Charlie Grabiaud, Mate Barabas, Pankaj Meshram, were some of AVM’s key founders and helped shape the project during its early days that are no longer involved in AVM day-to-day. Jared Holgate, Alexander Sehr, Erika Gressi, Kris Baranek, Sebastian Graf, Rene Hezser and Chris Sidebotham remain involved today helping develop and maintain the AVM framework and specifications with the engineering team.&lt;/P&gt;
&lt;P&gt;Some contributors have moved to other roles, teams, or companies. Many continue through issues, pull requests, community calls, and module ownership and contributions. Every contribution helped AVM reach this point and continue to drive it forward today.&lt;/P&gt;
&lt;P&gt;The move into Azure engineering adds dedicated investment. It does not replace the community that built and sustained AVM.&lt;/P&gt;
&lt;P&gt;To every past and present contributor and module owner: thank you for your time, commitment, and belief in AVM.&lt;/P&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;Jack and the AVM team.&lt;/P&gt;
&lt;DIV class=&quot;styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN&quot;&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=&quot;styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN&quot;&gt;&amp;nbsp;&lt;/DIV&gt;</description>
					<guid>https://techcommunity.microsoft.com/blog/AzureToolsBlog/azure-verified-modules-avm-is-now-owned-by-azure-engineering/4563822</guid>
                    <dc:creator>jtracey93msft</dc:creator>
					<pubDate>Tue, 13 Oct 2026 07:52:59 PDT</pubDate>
				</item>
				<item>
				<title>Azure CLI on macOS got security upgrade: native broker authentication</title>
					<link>https://techcommunity.microsoft.com/blog/AzureToolsBlog/azure-cli-on-macos-got-security-upgrade-native-broker-authentication/4563073</link>
					<description>&lt;H1 aria-level=&quot;2&quot; id=&quot;community-4563073-toc-hId--1131823955&quot;&gt;&lt;STRONG&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;SPAN data-ccp-parastyle=&quot;heading 2&quot;&gt;Why we built this&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{&amp;quot;335559738&amp;quot;:240,&amp;quot;335559739&amp;quot;:120}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;If you manage Azure resources from a Mac today, az login opens a browser tab, you sign in, and a token comes back to the CLI. That&#39;s worked well for a long time. As security requirements become more stringent, many enterprise organizations are adopting secure authentication brokers to strengthen identity protection and reduce authentication-related risks.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Many organizations require &lt;/SPAN&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;broker-based authentication&lt;/SPAN&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt; as a matter of security policy. A broker is the operating system&#39;s own credential broker — on Windows this is the Web Account Manager (WAM), and it&#39;s what lets az login reuse your existing signed-in Windows account instead of opening a browser every time. Depending on the broker, device configuration, and policies applied by the organization, broker-based authentication can provide:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize=&quot;-1&quot; data-leveltext=&quot;&quot; data-font=&quot;Symbol&quot; data-listid=&quot;5&quot; data-list-defn-props=&quot;{&amp;quot;335551671&amp;quot;:0,&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}&quot; data-aria-posinset=&quot;0&quot; data-aria-level=&quot;1&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Device-bound refresh tokens&lt;/SPAN&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;, which help protect tokens from exfiltration and misuse&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize=&quot;-1&quot; data-leveltext=&quot;&quot; data-font=&quot;Symbol&quot; data-listid=&quot;5&quot; data-list-defn-props=&quot;{&amp;quot;335551671&amp;quot;:0,&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}&quot; data-aria-posinset=&quot;1&quot; data-aria-level=&quot;1&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Support for Conditional Access and device compliance checks&lt;/SPAN&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt; where those capabilities are configured and available&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize=&quot;-1&quot; data-leveltext=&quot;&quot; data-font=&quot;Symbol&quot; data-listid=&quot;5&quot; data-list-defn-props=&quot;{&amp;quot;335551671&amp;quot;:0,&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}&quot; data-aria-posinset=&quot;2&quot; data-aria-level=&quot;1&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Single sign-on using accounts known to the operating system&lt;/SPAN&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;, reducing repeated credential prompts&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Azure CLI has supported broker authentication on Windows for a while. Beginning with Azure &lt;/SPAN&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;CLI 2.91.0&lt;/SPAN&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;, organizations with stringent security requirements can also use broker-based authentication with Azure CLI on macOS.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level=&quot;2&quot; id=&quot;community-4563073-toc-hId-1355688878&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;SPAN data-ccp-parastyle=&quot;heading 2&quot;&gt;What changed&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{&amp;quot;335559738&amp;quot;:240,&amp;quot;335559739&amp;quot;:120}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Beginning with Azure CLI 2.91.0, broker-based authentication is available in preview on macOS. The feature uses MSAL&#39;s native macOS broker support and is disabled by default, so you remain in control of when to enable it.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;After you opt in and run az login, Azure CLI opens a native macOS account picker instead of starting the sign-in flow in a browser. You can select an account already known to the broker or add another account. If a compatible broker isn&#39;t available, Azure CLI falls back to the existing browser-based sign-in flow.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level=&quot;2&quot; id=&quot;community-4563073-toc-hId--451765585&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;SPAN data-ccp-parastyle=&quot;heading 2&quot;&gt;How Homebrew Cask supports broker authentication&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{&amp;quot;335559738&amp;quot;:240,&amp;quot;335559739&amp;quot;:120}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;The core MSAL library is open source, but the &lt;/SPAN&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;STRONG&gt;macOS broker&lt;/STRONG&gt; runtime is not&lt;/SPAN&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;. It is subject to strict internal compliance and intellectual property protection requirements and must also satisfy Apple-specific requirements such as notarization.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Azure CLI is now available through Homebrew Cask, a supported installation method that can accommodate these requirements and support broker-based authentication on macOS. The familiar package name continues to work for new installations:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-shell&quot;&gt;&lt;code&gt;brew update 
brew install azure-cli &lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;You can also select the Cask explicitly:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-shell&quot;&gt;&lt;code&gt;brew update 
brew install --cask azure-cli &lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;We tested the migration on a Mac that had &lt;STRONG&gt;Azure &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;CLI 2.90.0&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt; installed through the former Homebrew Formula. After brew update, Homebrew detected that azure-cli had moved to homebrew/cask, unlinked the existing Formula, downloaded &lt;STRONG&gt;Azure &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;CLI 2.91.0 or later&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;, and linked the az executable and shell completions from the Cask. The final output confirmed:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=&quot;lia-text-color-19&quot;&gt;&lt;EM&gt;azure-cli was successfully installed!&amp;nbsp;&lt;BR /&gt;azure-cli has been moved to homebrew/cask.&amp;nbsp;&lt;BR /&gt;The existing keg has been unlinked.&amp;nbsp;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;span class=&quot;lia-media-object lia-media-is-center lia-media-size-default&quot; data-image-alt=&quot;&quot;&gt;&lt;button class=&quot;lia-media-unstyled-btn&quot; type=&quot;button&quot; aria-haspopup=&quot;true&quot; aria-label=&quot;Enlarge Image&quot;&gt;&lt;img src=&quot;https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NTYzMDczLVdtOVVkdA?image-dimensions=648x411&amp;amp;revision=1&quot; width=&quot;648&quot; height=&quot;411&quot; alt=&quot;&quot; /&gt;&lt;/button&gt;&lt;/span&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Homebrew detects the package migration, installs Azure CLI from Cask, and preserves the az command.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Homebrew also recommended removing the old Formula record when convenient:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-shell&quot;&gt;&lt;code&gt;brew uninstall --formula --force azure-cli &lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;This means scripts that use brew install azure-cli can continue to use the same package name. If you previously used the Azure CLI preview tap and Homebrew still resolves stale Formula metadata, remove that tap and retry:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-shell&quot;&gt;&lt;code&gt;brew untap azure/azure-cli 
brew update 
brew install azure-cli &lt;/code&gt;&lt;/pre&gt;
&lt;H1 aria-level=&quot;2&quot; id=&quot;community-4563073-toc-hId-2035747248&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;SPAN data-ccp-parastyle=&quot;heading 2&quot;&gt;What the broker sign-in experience looks like&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{&amp;quot;335559738&amp;quot;:240,&amp;quot;335559739&amp;quot;:120}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Install &lt;STRONG&gt;Azure CLI 2.91.0&lt;/STRONG&gt;&amp;nbsp;or later and make sure a compatible authentication broker, such as Microsoft Company Portal, is available on your Mac.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Enable broker-based authentication:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;pre class=&quot;lia-code-sample language-shell&quot;&gt;&lt;code&gt;az config set core.enable_broker_on_mac=true 
az account clear &lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;You can confirm the setting with:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{&amp;quot;335559685&amp;quot;:720}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-shell&quot;&gt;&lt;code&gt;az config get core.enable_broker_on_mac &lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;3. Start a new sign-in:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-shell&quot;&gt;&lt;code&gt;az login &lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;4. Azure CLI opens the native single sign-on account picker. Select an existing account and choose &lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;Continue &lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;or&amp;nbsp;use the add-account button to sign in with another account.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;span class=&quot;lia-media-object lia-media-is-center lia-media-size-default&quot; data-image-alt=&quot;&quot;&gt;&lt;button class=&quot;lia-media-unstyled-btn&quot; type=&quot;button&quot; aria-haspopup=&quot;true&quot; aria-label=&quot;Enlarge Image&quot;&gt;&lt;img src=&quot;https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NTYzMDczLXlSWmppQg?image-dimensions=648x548&amp;amp;revision=1&quot; width=&quot;648&quot; height=&quot;548&quot; alt=&quot;&quot; /&gt;&lt;/button&gt;&lt;/span&gt;
&lt;P&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; After broker authentication is enabled, az login opens the native account picker instead of starting in a browser.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;5. Run az account show to confirm that you&#39;re signed in with the expected account and tenant.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;The broker changes how Azure CLI acquires credentials; it doesn&#39;t change Azure CLI&#39;s subscription or tenant selection model. If your account belongs to multiple tenants, you might still need to select the intended tenant explicitly:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-shell&quot;&gt;&lt;code&gt;az login --tenant &amp;lt;tenant-id&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;To opt out and return to browser-based authentication:&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-shell&quot;&gt;&lt;code&gt;az account clear 
az config set core.enable_broker_on_mac=false 
az login &lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;If a compatible broker isn&#39;t installed or available, Azure CLI automatically falls back to browser-based authentication.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level=&quot;2&quot; id=&quot;community-4563073-toc-hId-228292785&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;SPAN data-ccp-parastyle=&quot;heading 2&quot;&gt;What&#39;s&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle=&quot;heading 2&quot;&gt; next&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{&amp;quot;335559738&amp;quot;:240,&amp;quot;335559739&amp;quot;:120}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;This is one part of a broader push to bring Azure CLI&#39;s macOS experience up to parity with Windows and Linux — including packaging improvements (to keep pace with Apple&#39;s tightening notarization requirements). If you run Azure CLI on macOS in an enterprise environment, we&#39;d love to hear from you — file feedback or ask questions at &lt;/SPAN&gt;&lt;A href=&quot;https://github.com/Azure/azure-cli/issues&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;SPAN data-ccp-charstyle=&quot;Hyperlink&quot;&gt;Azure/azure-cli on GitHub&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level=&quot;2&quot; id=&quot;community-4563073-toc-hId--1579161678&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;SPAN data-ccp-parastyle=&quot;heading 2&quot;&gt;References&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props=&quot;{&amp;quot;335559738&amp;quot;:240,&amp;quot;335559739&amp;quot;:120}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize=&quot;-1&quot; data-leveltext=&quot;&quot; data-font=&quot;Symbol&quot; data-listid=&quot;7&quot; data-list-defn-props=&quot;{&amp;quot;335551671&amp;quot;:0,&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}&quot; data-aria-posinset=&quot;3&quot; data-aria-level=&quot;1&quot;&gt;&lt;A href=&quot;https://learn.microsoft.com/cli/azure/install-azure-cli-macos&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;SPAN data-ccp-charstyle=&quot;Hyperlink&quot;&gt;Install Azure CLI on macOS&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize=&quot;-1&quot; data-leveltext=&quot;&quot; data-font=&quot;Symbol&quot; data-listid=&quot;7&quot; data-list-defn-props=&quot;{&amp;quot;335551671&amp;quot;:0,&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}&quot; data-aria-posinset=&quot;4&quot; data-aria-level=&quot;1&quot;&gt;&lt;A href=&quot;https://learn.microsoft.com/cli/azure/authenticate-azure-cli-interactively#sign-in-with-an-authentication-broker-on-macos&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;SPAN data-ccp-charstyle=&quot;Hyperlink&quot;&gt;Sign in with an authentication broker on macOS&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize=&quot;-1&quot; data-leveltext=&quot;&quot; data-font=&quot;Symbol&quot; data-listid=&quot;7&quot; data-list-defn-props=&quot;{&amp;quot;335551671&amp;quot;:0,&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}&quot; data-aria-posinset=&quot;5&quot; data-aria-level=&quot;1&quot;&gt;&lt;A href=&quot;https://github.com/Azure/azure-cli/issues&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;SPAN data-contrast=&quot;none&quot;&gt;&lt;SPAN data-ccp-charstyle=&quot;Hyperlink&quot;&gt;Azure CLI issues on GitHub&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props=&quot;{}&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
					<guid>https://techcommunity.microsoft.com/blog/AzureToolsBlog/azure-cli-on-macos-got-security-upgrade-native-broker-authentication/4563073</guid>
                    <dc:creator>Alex-wdy</dc:creator>
					<pubDate>Thu, 8 Oct 2026 21:40:50 PDT</pubDate>
				</item>
				<item>
				<title>Azure AD Graph API retirement: action required for older versions of Azure CLI and Azure PowerShell</title>
					<link>https://techcommunity.microsoft.com/blog/AzureToolsBlog/azure-ad-graph-api-retirement-action-required-for-older-versions-of-azure-cli-an/4562225</link>
					<description>&lt;H2 id=&quot;community-4562225-toc-hId-1366163960&quot;&gt;Summary&lt;/H2&gt;
&lt;P&gt;Azure AD Graph API (the legacy graph.windows.net API, not to be confused with Microsoft Graph) entered its retirement process in &lt;STRONG&gt;September 2024&lt;/STRONG&gt;, with the general shutdown completed on &lt;STRONG&gt;July 1, 2025&lt;/STRONG&gt;. Azure CLI and Azure PowerShell completed their migration away from Azure AD Graph well ahead of that deadline. &lt;STRONG&gt;&lt;EM&gt;az ad&lt;/EM&gt;&lt;/STRONG&gt; and the &lt;STRONG&gt;&lt;EM&gt;Az&lt;/EM&gt;&lt;/STRONG&gt; module&#39;s Microsoft Entra ID (Azure AD) cmdlets have been backed by &lt;STRONG&gt;Microsoft Graph&lt;/STRONG&gt; for some time now. If you&#39;re running a current version of Azure CLI or Azure PowerShell, &lt;STRONG&gt;no action is required&lt;/STRONG&gt; on your part for this specific retirement.&lt;/P&gt;
&lt;P&gt;Because Azure CLI and Azure PowerShell are Microsoft first-party clients, their Azure AD Graph application identities have remained available temporarily to provide a transition path for legacy releases that still call Azure AD Graph. However, those legacy releases have long been out of maintenance and are no longer supported; the temporary availability of the application identities does not mean the old releases remain supported.&lt;/P&gt;
&lt;P&gt;Beginning after &lt;STRONG&gt;October 6, 2026&lt;/STRONG&gt;, the Microsoft Entra team will progressively disable this remaining legacy access over a two-month buffer period. Users of current versions are not affected, but anyone still running an old release should upgrade now. This post explains what changed, why, and how to confirm you&#39;re unaffected.&lt;/P&gt;
&lt;H2 id=&quot;community-4562225-toc-hId--441290503&quot;&gt;Terminology&lt;/H2&gt;
&lt;P&gt;This post uses the following terms:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Azure AD Graph API&lt;/STRONG&gt; (https://graph.windows.net) — the &lt;STRONG&gt;legacy&lt;/STRONG&gt;, now-retired API for reading and writing Microsoft Entra ID (formerly Azure Active Directory) objects: users, groups, applications, service principals, and directory roles.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Microsoft Graph&lt;/STRONG&gt; (https://graph.microsoft.com) — Microsoft&#39;s &lt;STRONG&gt;current, unified&lt;/STRONG&gt; API surface for Entra ID and the broader Microsoft 365 ecosystem, and the &lt;STRONG&gt;only supported path going forward&lt;/STRONG&gt; for any identity/directory operation.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id=&quot;community-4562225-toc-hId-2046222330&quot;&gt;If your Azure CLI or Azure PowerShell still uses legacy Azure AD Graph, migrate as soon as possible&lt;/H2&gt;
&lt;P&gt;Azure CLI has used Microsoft Graph for &lt;EM&gt;az ad&lt;/EM&gt; commands since version &lt;STRONG&gt;2.37.0&lt;/STRONG&gt;, and the identity-related cmdlets in Azure PowerShell have used Microsoft Graph since &lt;EM&gt;Az.Resources&lt;/EM&gt; version &lt;STRONG&gt;5.1.0&lt;/STRONG&gt;. These migrations were completed years before the Azure AD Graph retirement.&lt;/P&gt;
&lt;P&gt;Azure CLI releases earlier than 2.37.0 and &lt;EM&gt;Az.Resources&lt;/EM&gt; releases earlier than 5.1.0 have long been out of maintenance and are no longer supported. The temporary availability of the tools&#39; first-party Azure AD Graph application identities was retained only to provide a transition path for those legacy releases; it does not mean that the releases are maintained or supported.&lt;/P&gt;
&lt;H2 id=&quot;community-4562225-toc-hId-238767867&quot;&gt;We are notifying users who still use legacy Azure AD Graph versions&lt;/H2&gt;
&lt;P&gt;We are sending notifications in phases to tenants where telemetry indicates that calls may still be reaching Azure AD Graph endpoints. Some of this traffic comes from legacy Azure CLI or Azure PowerShell releases using the tools&#39; temporarily retained first-party Azure AD Graph identities; other cases typically trace back to one of the following:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;An old, unsupported version&lt;/STRONG&gt; of Azure CLI or the Az/AzureAD/MSOnline PowerShell modules still in use (for example, pinned in a long-lived CI/CD image or automation runbook that hadn&#39;t been updated).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Custom scripts or tooling&lt;/STRONG&gt; calling the legacy graph.windows.net endpoint directly via &lt;EM&gt;Invoke-RestMethod&lt;/EM&gt;/curl/a hand-rolled SDK client, independent of az/Az entirely.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The standalone legacy AzureAD or MSOnline PowerShell modules&lt;/STRONG&gt; (distinct from the Az module), which were already deprecated separately from this effort and have their own migration path to Microsoft.Graph PowerShell cmdlets.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;These notifications are intended to help close out any remaining migration gaps and continue the original retirement communication. Beginning after &lt;STRONG&gt;October 6, 2026&lt;/STRONG&gt;, the Microsoft Entra team will progressively disable the remaining legacy first-party access over a two-month buffer period. Old Azure CLI or Azure PowerShell releases that still depend on Azure AD Graph may stop working at any point during this phased shutdown.&lt;/P&gt;
&lt;H2 id=&quot;community-4562225-toc-hId--1568686596&quot;&gt;How to check whether your automation still uses Azure AD Graph&lt;/H2&gt;
&lt;P&gt;Checking the version actually running in each environment is the most reliable way to identify legacy Azure CLI or Azure PowerShell usage. Check developer machines as well as CI/CD agents, automation runbooks, scheduled jobs, and container images, which often remain pinned to an older version after interactive environments have been updated.&lt;/P&gt;
&lt;P&gt;You may need to work with your tenant, subscription, infrastructure, or automation administrators to locate the system that is generating the legacy traffic. The source may be a developer machine, VM, self-hosted build agent, automation worker, scheduled task, or container host that you do not manage directly. Use the tenant information from any targeted notification together with your organization&#39;s sign-in logs, automation inventory, pipeline logs, and VM or container inventory to identify the execution environment, then upgrade it or stop the obsolete job.&lt;/P&gt;
&lt;H3 id=&quot;community-4562225-toc-hId--878125122&quot;&gt;Azure CLI&lt;/H3&gt;
&lt;P&gt;Run the following command in the same environment and execution account used by your automation:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;STRONG&gt;&lt;EM&gt;az version&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Azure CLI &lt;STRONG&gt;2.37.0&lt;/STRONG&gt; replaced the Azure AD Graph implementation used by &lt;EM&gt;az ad&lt;/EM&gt; with Microsoft Graph. If the reported version is lower than 2.37.0, upgrade to the latest Azure CLI release and test your scripts before the phased shutdown begins. Also check pipeline definitions, package installation steps, and container image tags for an explicitly pinned Azure CLI version; checking only the version on your local workstation does not verify the version used by automation.&lt;/P&gt;
&lt;P&gt;For installations that support the built-in updater, run:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;EM&gt;&lt;STRONG&gt;az upgrade&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Otherwise, update Azure CLI through the same package manager or installation method originally used, then run the version check again.&lt;/P&gt;
&lt;P&gt;After upgrading, review the documented Microsoft Graph migration changes because some command arguments, behavior, and output properties changed. For example, Microsoft Graph directory object output uses id, while the corresponding Azure AD Graph property was objectId. This can affect scripts that parse command output. If you encounter a problem after upgrading, report it in the &lt;A href=&quot;https://github.com/Azure/azure-cli/issues/new/choose&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Azure CLI GitHub repository&lt;/A&gt; and include the output of az version, the affected command, and a minimal reproduction with secrets removed.&lt;/P&gt;
&lt;H3 id=&quot;community-4562225-toc-hId-1609387711&quot;&gt;Azure PowerShell&lt;/H3&gt;
&lt;P&gt;The Entra ID cmdlets discussed in this post are provided by Az.Resources, so check that module&#39;s version rather than relying only on the version of PowerShell itself:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;STRONG&gt;&lt;EM&gt;Get-Module Az.Resources -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1 Name, Version, Path&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Az.Resources &lt;STRONG&gt;5.1.0&lt;/STRONG&gt; introduced the Microsoft Graph implementation for the identity-related cmdlets. If the reported version is lower than 5.1.0, update to the latest Az module, restart the PowerShell session, and test your scripts. Check automation accounts, hosted agents, module caches, and container images separately. Also look for scripts that load a specific old version with Import-Module Az.Resources -RequiredVersion or declare a fixed module version in #Requires.&lt;/P&gt;
&lt;P&gt;If Az was installed from the PowerShell Gallery, update it with:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;STRONG&gt;&lt;EM&gt;Update-Module -Name Az -Force&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Restart PowerShell after the update so that the session does not continue using an older module already loaded in memory.&lt;/P&gt;
&lt;P&gt;To confirm which module version provides a cmdlet in the current session, run:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;STRONG&gt;&lt;EM&gt;&amp;nbsp;(Get-Command Get-AzADUser).Module | Select-Object Name, Version, Path&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;After upgrading, review the documented Azure PowerShell migration changes because parameter names, input and output types, and object properties changed. If you encounter a problem after upgrading, report it in the &lt;A href=&quot;https://github.com/Azure/azure-powershell/issues/new/choose&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Azure PowerShell GitHub repository&lt;/A&gt; and include the Az.Resources version, PowerShell version, affected cmdlet, and a minimal reproduction with secrets removed.&lt;/P&gt;
&lt;H3 id=&quot;community-4562225-toc-hId--198066752&quot;&gt;Check for direct endpoint calls&lt;/H3&gt;
&lt;P&gt;Tool versions do not identify custom code that bypasses az ad or the Az cmdlets. Search your repositories, pipeline definitions, runbooks, and configuration files for graph.windows.net. Pay particular attention to calls made through &lt;EM&gt;az rest&lt;/EM&gt;, curl, &lt;EM&gt;Invoke-RestMethod&lt;/EM&gt;, or custom HTTP and SDK clients. Any direct call to that host must be migrated to Microsoft Graph regardless of the installed Azure CLI or Azure PowerShell version.&lt;/P&gt;
&lt;P&gt;If you need help upgrading, locating the source of Azure AD Graph traffic, or troubleshooting an issue related to the retirement, you can ask a question in the &lt;A href=&quot;https://github.com/Azure/azure-cli/issues/new/choose&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Azure CLI GitHub repository&lt;/A&gt; or the &lt;A href=&quot;https://github.com/Azure/azure-powershell/issues/new/choose&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Azure PowerShell GitHub repository&lt;/A&gt;, as appropriate. Include the available version information, affected command or cmdlet, execution environment, error message, and a minimal reproduction or relevant logs with all secrets and personal or tenant-sensitive information removed. The Azure CLI and Azure PowerShell teams can then help you investigate and provide guidance.&lt;/P&gt;
&lt;H2 id=&quot;community-4562225-toc-hId--208569856&quot;&gt;What you should do&lt;/H2&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Make sure you&#39;re on a current, supported version of Azure CLI or Azure PowerShell.&lt;/STRONG&gt; Run the checks above and update if you&#39;re on an old release. Do not rely on the two-month buffer period: legacy access will be progressively disabled after October 6, 2026, so an old release may stop working before the end of that period.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;If you use the standalone legacy AzureAD or MSOnline PowerShell modules&lt;/STRONG&gt;, these are a separate deprecation track from Az and need their own migration to the Microsoft.Graph PowerShell SDK. This is &lt;STRONG&gt;not&lt;/STRONG&gt; something updating the Az module alone resolves — see the dedicated migration guidance referenced below.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;If you have custom code or scripts calling graph.windows.net directly&lt;/STRONG&gt;, those calls will fail outright post-retirement regardless of what version of Azure CLI/PowerShell you run, since this isn&#39;t a CLI/PowerShell-specific concern — it&#39;s any direct caller of the retired endpoint. Migrate those calls to the Microsoft Graph SDK/API directly.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;If you received a targeted notification referencing a specific tenant ID&lt;/STRONG&gt;, that means telemetry showed residual traffic from that tenant specifically — check any automation, scheduled scripts, or older images/containers associated with that tenant for one of the causes above.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 id=&quot;community-4562225-toc-hId--2016024319&quot;&gt;References&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href=&quot;https://devblogs.microsoft.com/microsoft365dev/migrate-from-azure-ad-graph-to-microsoft-graph/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Migrate from Azure AD Graph to Microsoft Graph - Microsoft 365 Developer Blog&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;https://learn.microsoft.com/en-us/graph/migrate-azure-ad-graph-faq&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Azure AD Graph to Microsoft Graph migration FAQ - Microsoft Graph | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;https://learn.microsoft.com/cli/azure/microsoft-graph-migration&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Impact of Microsoft Graph migration in Azure CLI&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;https://learn.microsoft.com/powershell/azure/azps-msgraph-migration-changes&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Azure AD to Microsoft Graph migration changes in Azure PowerShell&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;https://learn.microsoft.com/en-us/cli/azure/install-azure-cli&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Install Azure CLI&lt;/A&gt; / &lt;A href=&quot;https://learn.microsoft.com/powershell/azure/install-azure-powershell&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Install Azure PowerShell&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;https://aka.ms/azureadmigration&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Migrate from the AzureAD and MSOnline PowerShell modules to Microsoft Graph PowerShell &lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
					<guid>https://techcommunity.microsoft.com/blog/AzureToolsBlog/azure-ad-graph-api-retirement-action-required-for-older-versions-of-azure-cli-an/4562225</guid>
                    <dc:creator>Alex-wdy</dc:creator>
					<pubDate>Mon, 5 Oct 2026 15:25:40 PDT</pubDate>
				</item>
				<item>
				<title>Introducing bicep docs: generate documentation from your Bicep modules</title>
					<link>https://techcommunity.microsoft.com/blog/AzureToolsBlog/introducing-bicep-docs-generate-documentation-from-your-bicep-modules/4559737</link>
					<description>&lt;P&gt;&lt;STRONG&gt;TL;DR:&lt;/STRONG&gt; The Bicep CLI has a new experimental command, &lt;CODE&gt;bicep docs generate&lt;/CODE&gt;. Point it at a Bicep module and it writes a &lt;CODE&gt;README.md&lt;/CODE&gt; next to it that describes the module&#39;s resources, parameters, types, outputs and usage examples, all read straight from your code. You can change the layout with your own templates, add details that aren&#39;t in the code, and document every module in a repository with one command. It&#39;s available now in Bicep CLI v0.47.16 and later.&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-powershell&quot;&gt;&lt;code&gt;bicep docs generate ./main.bicep&lt;/code&gt;&lt;/pre&gt;
&lt;H2 id=&quot;community-4559737-toc-hId-1365453814&quot;&gt;Why we built it&lt;/H2&gt;
&lt;P&gt;Module documentation has a habit of drifting away from the code it describes. Someone renames a parameter, adds an output or changes an allowed value, and the README quietly goes out of date. Teams that publish a lot of modules often end up writing their own scripts to keep the two in step.&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;bicep docs&lt;/CODE&gt; moves that job into the Bicep CLI. It compiles your module and uses the compiler&#39;s own understanding of it, so it picks up the details Bicep already knows: &lt;CODE&gt;metadata&lt;/CODE&gt;, &lt;CODE&gt;@description&lt;/CODE&gt; decorators, default values, allowed values, length limits, user-defined types, exported types, variables and functions, outputs, and the local modules it references. Run it again whenever the module changes, and the documentation will match the code.&lt;/P&gt;
&lt;H2 id=&quot;community-4559737-toc-hId--442000649&quot;&gt;Get started&lt;/H2&gt;
&lt;P&gt;You need Bicep CLI v0.47.16 or later. Check your version with &lt;CODE&gt;bicep --version&lt;/CODE&gt;, and see &lt;A href=&quot;https://learn.microsoft.com/azure/azure-resource-manager/bicep/install&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Install Bicep tools&lt;/A&gt; if you need to upgrade. There&#39;s no feature flag to turn on.&lt;/P&gt;
&lt;P&gt;Here&#39;s a small storage account module:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-bicep&quot;&gt;&lt;code&gt;metadata name = &#39;Storage Account&#39;
metadata description = &#39;Deploys a storage account with secure defaults.&#39;

@description(&#39;Required. The name of the storage account. Must be globally unique.&#39;)
@minLength(3)
@maxLength(24)
param name string

@description(&#39;Optional. The Azure region to deploy the storage account to.&#39;)
param location string = resourceGroup().location

@description(&#39;Optional. The storage account SKU.&#39;)
@allowed([
  &#39;Standard_LRS&#39;
  &#39;Standard_GRS&#39;
  &#39;Standard_ZRS&#39;
])
param skuName string = &#39;Standard_LRS&#39;

resource storageAccount &#39;Microsoft.Storage/storageAccounts@2025-06-01&#39; = {
  name: name
  location: location
  kind: &#39;StorageV2&#39;
  sku: {
    name: skuName
  }
  properties: {
    allowBlobPublicAccess: false
    minimumTlsVersion: &#39;TLS1_2&#39;
  }
}

@description(&#39;The resource ID of the storage account.&#39;)
output resourceId string = storageAccount.id&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;Generate its documentation:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-powershell&quot;&gt;&lt;code&gt;bicep docs generate ./modules/storage-account/main.bicep&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;Bicep writes &lt;CODE&gt;README.md&lt;/CODE&gt; next to &lt;CODE&gt;main.bicep&lt;/CODE&gt;. For this module, the built-in layout includes a list of sections, the resource types, a usage example (more on those below), the parameters with the details of each one, and the outputs. When a module has them, it also covers exported types, variables and functions, and referenced modules. Here&#39;s an excerpt:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-markdown&quot;&gt;&lt;code&gt;# Storage Account

Deploys a storage account with secure defaults.

## Parameters

| Name | Type | Required | Description |
| :-- | :-- | :-- | :-- |
| `location` | `string` | No | Optional. The Azure region to deploy the storage account to. |
| `name` | `string` | Yes | Required. The name of the storage account. Must be globally unique. |
| `skuName` | `string` | No | Optional. The storage account SKU. |

### `location`

- Default value: `resourceGroup().location`

### `name`

- Min length: 3

- Max length: 24

### `skuName`

- Default value: `&#39;Standard_LRS&#39;`

- Allowed values: `Standard_GRS`, `Standard_LRS`, `Standard_ZRS`&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;A couple of options you&#39;ll use often:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;--stdout&lt;/CODE&gt; prints the result to the terminal instead of writing a file, which is handy for a quick preview.&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;--outfile&lt;/CODE&gt; writes to a file of your choice, and &lt;CODE&gt;--outdir&lt;/CODE&gt; writes the documentation into another folder.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Because the command is experimental, Bicep prints a warning each time you run it.&lt;/P&gt;
&lt;H2 id=&quot;community-4559737-toc-hId-2045512184&quot;&gt;Usage examples are included automatically&lt;/H2&gt;
&lt;P&gt;Examples are often the most useful part of module documentation, so &lt;CODE&gt;bicep docs&lt;/CODE&gt; looks for them next to your module. By default it picks up:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;.bicep&lt;/CODE&gt; files in an &lt;CODE&gt;examples&lt;/CODE&gt; folder, and &lt;CODE&gt;main.bicep&lt;/CODE&gt; files in its subfolders&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;*.test.bicep&lt;/CODE&gt; files anywhere under a &lt;CODE&gt;tests&lt;/CODE&gt; folder&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Files named &lt;CODE&gt;dependencies*.bicep&lt;/CODE&gt; are skipped. Each example&#39;s heading comes from its &lt;CODE&gt;metadata name&lt;/CODE&gt;. Without one, Bicep uses the name of the folder the example is in, or its file name if it&#39;s not in a subfolder. The description comes from &lt;CODE&gt;metadata description&lt;/CODE&gt;, or else the &lt;CODE&gt;//&lt;/CODE&gt; comments at the top of the file. For example, this file in &lt;CODE&gt;modules/storage-account/examples&lt;/CODE&gt; becomes a &quot;Zone-redundant storage account&quot; example in the README:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-bicep&quot;&gt;&lt;code&gt;metadata name = &#39;Zone-redundant storage account&#39;
metadata description = &#39;Deploys a storage account that keeps copies of your data in three availability zones.&#39;

module storageAccount &#39;../main.bicep&#39; = {
  params: {
    name: &#39;stdocsdemo001&#39;
    skuName: &#39;Standard_ZRS&#39;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;If your examples live somewhere else, list their locations in &lt;CODE&gt;documentation.examples.sources&lt;/CODE&gt; in &lt;CODE&gt;bicepconfig.json&lt;/CODE&gt;. Your list replaces the default locations.&lt;/P&gt;
&lt;H2 id=&quot;community-4559737-toc-hId-238057721&quot;&gt;Make it your own with templates&lt;/H2&gt;
&lt;P&gt;The built-in layout is a good start, but you&#39;ll probably have your own conventions. &lt;CODE&gt;bicep docs&lt;/CODE&gt; renders documentation with &lt;A href=&quot;https://github.com/scriban/scriban&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Scriban&lt;/A&gt;, a lightweight text templating language. Write a template, then point to it from &lt;CODE&gt;bicepconfig.json&lt;/CODE&gt;:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-json&quot;&gt;&lt;code&gt;{
  &quot;documentation&quot;: {
    &quot;template&quot;: {
      &quot;file&quot;: &quot;templates/readme.scriban&quot;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;The template path is relative to the &lt;CODE&gt;bicepconfig.json&lt;/CODE&gt; file. As with its other settings, Bicep uses the &lt;CODE&gt;bicepconfig.json&lt;/CODE&gt; nearest to each module.&lt;/P&gt;
&lt;P&gt;This template writes a parameters table and an outputs table:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-&quot;&gt;&lt;code&gt;# {{ module.name }}

{{ module.description }}

## Parameters

| Name | Type | Required | Description |
| :-- | :-- | :-- | :-- |
{{~ for parameter in module.parameters ~}}
| `{{ parameter.name }}` | `{{ parameter.type }}` | {{ if parameter.required }}Yes{{ else }}No{{ end }} | {{ parameter.description }} |
{{~ end ~}}

## Outputs

| Name | Type | Description |
| :-- | :-- | :-- |
{{~ for output in module.outputs ~}}
| `{{ output.name }}` | `{{ output.type }}` | {{ output.description }} |
{{~ end ~}}&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;The &lt;CODE&gt;~&lt;/CODE&gt; inside the braces removes the spaces and line breaks next to a tag, so the loops don&#39;t add blank lines that would break the tables. Your template receives a &lt;CODE&gt;module&lt;/CODE&gt; object with the module&#39;s &lt;CODE&gt;name&lt;/CODE&gt;, &lt;CODE&gt;description&lt;/CODE&gt;, &lt;CODE&gt;targetScope&lt;/CODE&gt;, &lt;CODE&gt;resourceTypes&lt;/CODE&gt;, &lt;CODE&gt;parameters&lt;/CODE&gt;, &lt;CODE&gt;exportedTypes&lt;/CODE&gt;, &lt;CODE&gt;exportedVariables&lt;/CODE&gt;, &lt;CODE&gt;exportedFunctions&lt;/CODE&gt;, &lt;CODE&gt;outputs&lt;/CODE&gt;, &lt;CODE&gt;references&lt;/CODE&gt; and &lt;CODE&gt;usageExamples&lt;/CODE&gt;. The &lt;A href=&quot;https://github.com/Azure/bicep/blob/main/docs/experimental/docs-commands.md#template-model&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;command documentation&lt;/A&gt; lists every field.&lt;/P&gt;
&lt;P&gt;A couple of tips:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Split a big template into smaller files with Scriban&#39;s &lt;CODE&gt;include&lt;/CODE&gt;, and set &lt;CODE&gt;documentation.template.includeRoot&lt;/CODE&gt; to the folder that holds them.&lt;/LI&gt;
&lt;LI&gt;The &lt;A href=&quot;https://github.com/Azure/bicep/blob/main/src/Bicep.Core/Documentation/Templates/Markdown.scriban&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;built-in Markdown template&lt;/A&gt; is a Scriban template too, so it&#39;s a good place to start.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id=&quot;community-4559737-toc-hId--1569396742&quot;&gt;Add details that aren&#39;t in your code&lt;/H2&gt;
&lt;P&gt;Some information doesn&#39;t belong in Bicep, such as the team that owns a module, where to get support, or the module&#39;s version. Pass it in as custom values and use them in your template as &lt;CODE&gt;custom.&amp;lt;key&amp;gt;&lt;/CODE&gt;:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-&quot;&gt;&lt;code&gt;**Owner:** {{ custom.owner }} | **Version:** {{ custom.version }} | [Get support]({{ custom.supportUrl }})&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;Supply values one at a time with &lt;CODE&gt;--custom-template-value&lt;/CODE&gt;, or load several from a JSON file with &lt;CODE&gt;--custom-template-value-file-path&lt;/CODE&gt;:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-powershell&quot;&gt;&lt;code&gt;bicep docs generate ./modules/storage-account/main.bicep `
    --custom-template-value owner=&quot;Platform Team&quot; `
    --custom-template-value-file-path ./docs-values.json&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;Where &lt;CODE&gt;docs-values.json&lt;/CODE&gt; contains:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-json&quot;&gt;&lt;code&gt;{
  &quot;supportUrl&quot;: &quot;https://contoso.example/support&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;Both options can be repeated. If the same key is set more than once, the last one on the command line wins.&lt;/P&gt;
&lt;H2 id=&quot;community-4559737-toc-hId-918116091&quot;&gt;Go beyond Markdown&lt;/H2&gt;
&lt;P&gt;Scriban writes whatever text your template contains, so the output doesn&#39;t have to be Markdown. A template could produce JSON for a module catalogue, HTML for an internal portal, or input for another tool. This template produces JSON, and Scriban&#39;s &lt;CODE&gt;object.to_json&lt;/CODE&gt; function takes care of quotes and escaping:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: {{ module.name | object.to_json }},
  &quot;description&quot;: {{ module.description | object.to_json }},
  &quot;parameters&quot;: [
{{~ for parameter in module.parameters ~}}
    {
      &quot;name&quot;: {{ parameter.name | object.to_json }},
      &quot;type&quot;: {{ parameter.type | object.to_json }},
      &quot;required&quot;: {{ parameter.required | object.to_json }}
    }{{ if !for.last }},{{ end }}
{{~ end ~}}
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;Set &lt;CODE&gt;documentation.template.file&lt;/CODE&gt; to this template, then use &lt;CODE&gt;--outfile&lt;/CODE&gt; to save the result with a &lt;CODE&gt;.json&lt;/CODE&gt; file name:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-powershell&quot;&gt;&lt;code&gt;bicep docs generate ./modules/storage-account/main.bicep --outfile ./modules/storage-account/module.json&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;To change the default file name for every module instead, set &lt;CODE&gt;documentation.output.file&lt;/CODE&gt; in &lt;CODE&gt;bicepconfig.json&lt;/CODE&gt;.&lt;/P&gt;
&lt;P&gt;Each module uses the one template set in its nearest &lt;CODE&gt;bicepconfig.json&lt;/CODE&gt;. To get both Markdown and JSON from the same modules, make that template a small switch that includes the right template based on a custom value:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-&quot;&gt;&lt;code&gt;{{~ if custom.format == &quot;json&quot; ~}}
{{~ include &quot;catalog.scriban&quot; ~}}
{{~ else ~}}
{{~ include &quot;readme.scriban&quot; ~}}
{{~ end ~}}&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;Set &lt;CODE&gt;documentation.template.includeRoot&lt;/CODE&gt; to the folder that holds the templates. Then run the command as normal for the README, and add &lt;CODE&gt;--custom-template-value format=json --outfile ./modules/storage-account/module.json&lt;/CODE&gt; for the JSON.&lt;/P&gt;
&lt;H2 id=&quot;community-4559737-toc-hId--889338372&quot;&gt;Document every module in one go&lt;/H2&gt;
&lt;P&gt;Use &lt;CODE&gt;--pattern&lt;/CODE&gt; to document every module that matches a wildcard:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-powershell&quot;&gt;&lt;code&gt;bicep docs generate --pattern &#39;./modules/**/main.bicep&#39;&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;Each module gets its own &lt;CODE&gt;README.md&lt;/CODE&gt; next to its &lt;CODE&gt;main.bicep&lt;/CODE&gt;. Add &lt;CODE&gt;--outdir ./docs&lt;/CODE&gt; to put them in a separate folder instead, and Bicep recreates the folder structure beneath it. If a module has compile errors, Bicep reports them, carries on documenting the other modules, and returns exit code 1 at the end.&lt;/P&gt;
&lt;P&gt;To see this at scale, the &lt;A href=&quot;https://aka.ms/bicep/docs/demo&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;demo repository&lt;/A&gt; generates &lt;A href=&quot;https://aka.ms/avm&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Azure Verified Modules&lt;/A&gt; (AVM) style documentation for 20 App Service modules, including their child modules, with a single command. Its template works out each module&#39;s registry reference and main resource type from the module itself. The AVM team is standardising and consolidating its tooling, and &lt;CODE&gt;bicep docs&lt;/CODE&gt; is part of that work.&lt;/P&gt;
&lt;H2 id=&quot;community-4559737-toc-hId-1598174461&quot;&gt;Keep documentation up to date in CI&lt;/H2&gt;
&lt;P&gt;Because the documentation comes from the code, your pipeline can check that it&#39;s current. Regenerate it, then fail the build if anything changed:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-powershell&quot;&gt;&lt;code&gt;bicep docs generate --pattern &#39;./modules/**/main.bicep&#39;
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }

$changes = git status --porcelain
if ($changes) {
    $changes
    throw &#39;Module documentation is out of date. Run bicep docs generate and commit the result.&#39;
}&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;The generated documentation is only as good as your descriptions, so the new description linter rules in Bicep v0.47 make a good partner. They&#39;re off by default and flag missing or empty &lt;CODE&gt;@description&lt;/CODE&gt; decorators. Turn on the ones you need in &lt;CODE&gt;bicepconfig.json&lt;/CODE&gt;:&lt;/P&gt;
&lt;pre class=&quot;lia-code-sample language-json&quot;&gt;&lt;code&gt;{
  &quot;analyzers&quot;: {
    &quot;core&quot;: {
      &quot;rules&quot;: {
        &quot;use-description-params&quot;: { &quot;level&quot;: &quot;warning&quot; },
        &quot;use-description-outputs&quot;: { &quot;level&quot;: &quot;warning&quot; },
        &quot;use-description-types&quot;: { &quot;level&quot;: &quot;warning&quot; },
        &quot;use-description-type-properties&quot;: { &quot;level&quot;: &quot;warning&quot; }
      }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;P&gt;There&#39;s also &lt;CODE&gt;use-description-vars&lt;/CODE&gt; for variables. Thanks to &lt;A href=&quot;https://github.com/johnlokerse&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;@johnlokerse&lt;/A&gt; for contributing these rules!&lt;/P&gt;
&lt;H2 id=&quot;community-4559737-toc-hId--209280002&quot;&gt;Building tools on top of Bicep?&lt;/H2&gt;
&lt;P&gt;The same generator is available through the Bicep CLI&#39;s JSON-RPC interface as &lt;CODE&gt;bicep/generateDocs&lt;/CODE&gt;. It returns the rendered text and leaves writing files to you. For .NET, the &lt;A href=&quot;https://www.nuget.org/packages/Azure.Bicep.RpcClient&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Azure.Bicep.RpcClient&lt;/A&gt; package wraps it.&lt;/P&gt;
&lt;H2 id=&quot;community-4559737-toc-hId--2016734465&quot;&gt;It&#39;s experimental, and we&#39;d love your feedback&lt;/H2&gt;
&lt;P&gt;&lt;CODE&gt;bicep docs&lt;/CODE&gt; is experimental. The command options, configuration, template model and built-in layout may change between releases without a breaking-change notice.&lt;/P&gt;
&lt;P&gt;One change is already on the way. In v0.47 you can also choose a template with the &lt;CODE&gt;--template-file&lt;/CODE&gt; and &lt;CODE&gt;--template-root&lt;/CODE&gt; options. The next release removes these options, so templates are set only with &lt;CODE&gt;documentation.template.file&lt;/CODE&gt; and &lt;CODE&gt;documentation.template.includeRoot&lt;/CODE&gt; in &lt;CODE&gt;bicepconfig.json&lt;/CODE&gt;. The examples in this post already use &lt;CODE&gt;bicepconfig.json&lt;/CODE&gt;, so they&#39;ll keep working.&lt;/P&gt;
&lt;P&gt;Try it on your own modules and tell us what works and what&#39;s missing by &lt;A href=&quot;https://github.com/Azure/bicep/issues&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;opening an issue&lt;/A&gt; in the Bicep repository.&lt;/P&gt;
&lt;H2 id=&quot;community-4559737-toc-hId-2144548107&quot;&gt;Learn more&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href=&quot;https://github.com/Azure/bicep/blob/main/docs/experimental/docs-commands.md&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;bicep docs command documentation&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;https://aka.ms/bicep/docs/demo&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Demo repository&lt;/A&gt;, with step-by-step demos from the built-in layout to AVM-style documentation&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;https://github.com/Azure/bicep/releases/tag/v0.47.16&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Bicep v0.47.16 release notes&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;https://scriban.github.io/docs/language/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Scriban language reference&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;bicep docs&lt;/CODE&gt; is also featured in the September 2026 Bicep community call. Community call recordings are on the &lt;A href=&quot;https://www.youtube.com/channel/UCZZ3-oMrVI5ssheMzaWC4uQ/videos&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Azure Deployments &amp;amp; Governance YouTube channel&lt;/A&gt;, and you can &lt;A href=&quot;https://aka.ms/armnews&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;sign up&lt;/A&gt; to join future calls.&lt;/LI&gt;
&lt;/UL&gt;</description>
					<guid>https://techcommunity.microsoft.com/blog/AzureToolsBlog/introducing-bicep-docs-generate-documentation-from-your-bicep-modules/4559737</guid>
                    <dc:creator>jaredfholgate</dc:creator>
					<pubDate>Thu, 24 Sep 2026 12:55:33 PDT</pubDate>
				</item>
				<item>
				<title>Azure Key Vault Control Plane API Update: Required Upgrade for Azure CLI and Azure PowerShell Users</title>
					<link>https://techcommunity.microsoft.com/blog/AzureToolsBlog/azure-key-vault-control-plane-api-update-required-upgrade-for-azure-cli-and-azur/4552476</link>
					<description>&lt;DIV class=&quot;styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN&quot;&gt;&lt;table border=&quot;1&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Deadline: February 27, 2027&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;All Azure Key Vault control plane (management) API versions released before 2026-02-01 will stop working on February 27, 2027.&lt;/P&gt;
&lt;P&gt;This does NOT affect the data plane (getting/setting secrets, keys, and certificates) — only vault and access-control management operations are impacted.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 100.00%&quot; /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H1 id=&quot;community-4552476-toc-hId--1132773420&quot;&gt;TL;DR — What you need to do&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;Upgrade Azure CLI to &lt;STRONG&gt;2.90.0 or later&lt;/STRONG&gt; (run az upgrade).&lt;/LI&gt;
&lt;LI&gt;Upgrade Az PowerShell&#39;s Az.KeyVault module to &lt;STRONG&gt;6.6.1 or later&lt;/STRONG&gt;, or upgrade the Az package to &lt;STRONG&gt;16.3.0 or later&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Do this before February 27, 2027 to avoid any interruption to vault management operations.&lt;/LI&gt;
&lt;LI&gt;No data plane changes are required — reading/writing secrets, keys, and certificates is unaffected.&lt;/LI&gt;
&lt;LI&gt;For details, see &lt;A href=&quot;https://aka.ms/keyvault-api-update&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Prepare for Key Vault API version 2026-02-01 and later&lt;/A&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1 id=&quot;community-4552476-toc-hId-1354739413&quot;&gt;What is changing&lt;/H1&gt;
&lt;P&gt;Current releases of &lt;STRONG&gt;Azure CLI 2.90.0 or later&lt;/STRONG&gt; and &lt;STRONG&gt;Az PowerShell 16.3.0 or later&lt;/STRONG&gt; (including &lt;STRONG&gt;Az.KeyVault 6.6.1 or later&lt;/STRONG&gt;) already use Key Vault control plane API version &lt;STRONG&gt;2026-02-01&lt;/STRONG&gt;. Upgrade to these versions before &lt;STRONG&gt;February 27, 2027&lt;/STRONG&gt;; after that date, earlier control plane API versions will no longer be served.&lt;/P&gt;
&lt;H1 id=&quot;community-4552476-toc-hId--452715050&quot;&gt;Who is affected&lt;/H1&gt;
&lt;P&gt;You are affected if you use either of the following:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Azure CLI scripts or automation that call az keyvault management commands (create, update, network-rule, access-policy, etc.).&lt;/LI&gt;
&lt;LI&gt;Az PowerShell scripts that use the Az.KeyVault module&#39;s management cmdlets (New-AzKeyVault, Set-AzKeyVault, Update-AzKeyVault, etc.).&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 id=&quot;community-4552476-toc-hId-2034797783&quot;&gt;Minimum versions to upgrade to&lt;/H1&gt;
&lt;DIV class=&quot;styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN&quot;&gt;&lt;table border=&quot;1&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Tool / SDK&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Minimum version&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;How to upgrade&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Azure CLI&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;A href=&quot;https://learn.microsoft.com/cli/azure/install-azure-cli?view=azure-cli-latest&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;STRONG&gt;2.90.0&lt;/STRONG&gt; or later&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;az upgrade&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Az PowerShell (Az.KeyVault module)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;A href=&quot;https://www.powershellgallery.com/packages/Az.KeyVault/&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow noreferrer&quot;&gt;&lt;STRONG&gt;Az.KeyVault 6.6.1&lt;/STRONG&gt;&amp;nbsp;or later&lt;/A&gt;; or &lt;A href=&quot;https://learn.microsoft.com/powershell/azure/install-azure-powershell&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;STRONG&gt;Az 16.3.0&lt;/STRONG&gt; or later&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Update-Module Az -Force&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 33.33%&quot; /&gt;&lt;col style=&quot;width: 33.33%&quot; /&gt;&lt;col style=&quot;width: 33.33%&quot; /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1 id=&quot;community-4552476-toc-hId-227343320&quot;&gt;Impact if you take no action&lt;/H1&gt;
&lt;DIV class=&quot;styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN&quot;&gt;&lt;table border=&quot;1&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;What breaks on and after February 27, 2027 if you have not upgraded&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Key Vault management operations (create/update/delete vault, change network rules, change access policies or RBAC settings, etc.) issued with a pre-2026-02-01 API version will fail.&lt;/P&gt;
&lt;P&gt;You’ll get the following error message: “Due to an RBAC security default, Key Vault&#39;s Resource Manager API versions older than 2026-02-01 will retire on 2027-04-01.”&lt;/P&gt;
&lt;P&gt;Your vaults are NOT deleted and existing secrets/keys/certificates remain fully accessible via the data plane — only management (control plane) operations are blocked.&lt;/P&gt;
&lt;P&gt;There is no way to opt out or request an extension once the retirement takes effect on February 27, 2027.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 100.00%&quot; /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H1 id=&quot;community-4552476-toc-hId--1580111143&quot;&gt;How to check your installed versions&lt;/H1&gt;
&lt;H2 id=&quot;community-4552476-toc-hId--889549669&quot;&gt;Check your Azure CLI version&lt;/H2&gt;
&lt;P&gt;Run the following command:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; &amp;nbsp;az version&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Check the azure-cli value. If the installed version is earlier than 2.90.0, upgrade Azure CLI before February 27, 2027 by running az upgrade.&lt;/P&gt;
&lt;H2 id=&quot;community-4552476-toc-hId-1597963164&quot;&gt;Check your Az PowerShell version&lt;/H2&gt;
&lt;P&gt;Run the following commands:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &lt;EM&gt;Get-InstalledModule Az, Az.KeyVault | Select-Object Name, Version&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;If Az.KeyVault is earlier than &lt;STRONG&gt;6.6.1&lt;/STRONG&gt;, or the installed Az package is earlier than 16.3.0, upgrade before February 27, 2027. To upgrade the complete Az package, run:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &lt;EM&gt;Update-Module Az -Force&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Alternatively, to update only the Az.KeyVault module to the latest version, run:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &lt;EM&gt;Update-Module Az.KeyVault -Force&lt;/EM&gt;&lt;/P&gt;
&lt;H1 id=&quot;community-4552476-toc-hId-1587460060&quot;&gt;Timeline&lt;/H1&gt;
&lt;DIV class=&quot;styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN&quot;&gt;&lt;table border=&quot;1&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Date&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Milestone&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;March 2026&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Control plane API version 2026-02-01 generally available across public Azure regions, Azure Government, and Azure operated by 21Vianet.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Today → February 27, 2027&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Preparation window. Upgrade to Azure CLI 2.90.0 or later, Az.KeyVault &lt;STRONG&gt;6.6.1&lt;/STRONG&gt; or later, or Az 16.3.0 or later before February 27, 2027.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;February 27, 2027&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;All control plane API versions released before 2026-02-01 are retired and stop being served.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style=&quot;width: 50.00%&quot; /&gt;&lt;col style=&quot;width: 50.00%&quot; /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1 id=&quot;community-4552476-toc-hId--219994403&quot;&gt;Questions?&lt;/H1&gt;
&lt;P&gt;For any questions about Azure CLI or Azure PowerShell, please submit feedback through GitHub:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href=&quot;https://github.com/Azure/azure-powershell/issues&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Azure CLI GitHub issues&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href=&quot;https://github.com/Azure/azure-cli/issues&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Azure PowerShell GitHub issues&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
					<guid>https://techcommunity.microsoft.com/blog/AzureToolsBlog/azure-key-vault-control-plane-api-update-required-upgrade-for-azure-cli-and-azur/4552476</guid>
                    <dc:creator>Alex-wdy</dc:creator>
					<pubDate>Tue, 1 Sep 2026 23:16:45 PDT</pubDate>
				</item>
	</channel>
</rss>
