<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sai Medarametla</title>
    <description>The latest articles on DEV Community by Sai Medarametla (@saimedarametla).</description>
    <link>https://dev.to/saimedarametla</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4243205%2F46f0bfc6-f2b4-4fcb-9f4e-af08f33f9165.png</url>
      <title>DEV Community: Sai Medarametla</title>
      <link>https://dev.to/saimedarametla</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saimedarametla"/>
    <language>en</language>
    <item>
      <title>Upgrading AKS Terraform modules from azurerm 3.x to 5.x: what broke and how I fixed it</title>
      <dc:creator>Sai Medarametla</dc:creator>
      <pubDate>Fri, 13 Nov 2026 15:32:07 +0000</pubDate>
      <link>https://dev.to/saimedarametla/upgrading-aks-terraform-modules-from-azurerm-3x-to-5x-what-broke-and-how-i-fixed-it-227b</link>
      <guid>https://dev.to/saimedarametla/upgrading-aks-terraform-modules-from-azurerm-3x-to-5x-what-broke-and-how-i-fixed-it-227b</guid>
      <description>&lt;p&gt;I maintain reusable Terraform modules for AKS on GitHub: &lt;a href="https://github.com/saimedarametla/terraform-aks-modules" rel="noopener noreferrer"&gt;terraform-aks-modules&lt;/a&gt;. They were pinned to azurerm 3.x, two major versions behind, so I upgraded them to 5.x. Here's what broke.&lt;/p&gt;

&lt;h2&gt;
  
  
  The expected changes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Provider &lt;code&gt;~&amp;gt; 3.100&lt;/code&gt; → &lt;code&gt;~&amp;gt; 5.13&lt;/code&gt;, and Terraform &lt;code&gt;&amp;gt;= 1.7&lt;/code&gt; (needed for mock providers in tests)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;enable_auto_scaling&lt;/code&gt; → &lt;code&gt;auto_scaling_enabled&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;automatic_channel_upgrade&lt;/code&gt; → &lt;code&gt;automatic_upgrade_channel&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;managed&lt;/code&gt; removed from the Entra ID block (always on now)&lt;/li&gt;
&lt;li&gt;New required &lt;code&gt;node_provisioning_profile { mode = "Manual" }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Key Vault needs &lt;code&gt;rbac_authorization_enabled&lt;/code&gt; set explicitly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What CI caught
&lt;/h2&gt;

&lt;p&gt;After those changes, 6 of 14 checks still failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Entra ID needs a tenant or admin groups&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Missing required argument
one of `admin_group_object_ids,tenant_id` must be specified
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="n"&gt;azure_active_directory_role_based_access_control&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;tenant_id&lt;/span&gt;              &lt;span class="o"&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;azurerm_client_config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;
  &lt;span class="n"&gt;admin_group_object_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;admin_group_object_ids&lt;/span&gt;
  &lt;span class="n"&gt;azure_rbac_enabled&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Service endpoints became a block&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="n"&gt;service_endpoint&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Microsoft.KeyVault"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. A test used the old shape.&lt;/strong&gt; A splat expression fixed it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;azurerm_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service_endpoint&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Microsoft.KeyVault"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. The mock provider invented an invalid tenant ID&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expected tenant_id to be a valid UUID, got 5mg23f4a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix: give the mock a realistic value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="n"&gt;mock_data&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_client_config"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;defaults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;tenant_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"11111111-1111-1111-1111-111111111111"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lesson
&lt;/h2&gt;

&lt;p&gt;Read the upgrade guide, but trust your tests more. Two of these four weren't obvious from the changelog.&lt;/p&gt;

&lt;p&gt;Released as &lt;a href="https://github.com/saimedarametla/terraform-aks-modules/releases/tag/v3.0.0" rel="noopener noreferrer"&gt;v3.0.0&lt;/a&gt;. If you're doing the same upgrade, tell me what broke for you in the comments.&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>azure</category>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
