<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://woivre.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://woivre.com/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-07-21T17:30:23+00:00</updated><id>https://woivre.com/feed.xml</id><title type="html">Wilfried Woivré</title><subtitle>Personal Blog by Wilfried Woivré. My favorites subjects are Azure, Cloud, Serverless, Container, ...</subtitle><author><name>Wilfried Woivré</name></author><entry><title type="html">Azure Keyvault - How to restore when you have Azure Policies</title><link href="https://woivre.com/blog/2026/06/azure-keyvault-how-to-restore-when-you-have-azure-policies" rel="alternate" type="text/html" title="Azure Keyvault - How to restore when you have Azure Policies" /><published>2026-06-26T00:00:00+00:00</published><updated>2026-06-26T00:00:00+00:00</updated><id>https://woivre.com/blog/2026/06/azure-keyvault-how-to-restore-when-you-have-azure-policies</id><content type="html" xml:base="https://woivre.com/blog/2026/06/azure-keyvault-how-to-restore-when-you-have-azure-policies"><![CDATA[<p>For governance requirements, you may have Azure Policies applied to your Key Vaults.
For example:</p>

<ul>
  <li>Enable purge protection on your Key Vaults</li>
  <li>Enable soft delete on your Key Vaults</li>
  <li>Enforce network rules on your Key Vaults</li>
  <li>Deny creation of Key Vaults in specific regions</li>
  <li>Enforce the use of private endpoints on your Key Vaults</li>
</ul>

<p>You are usually very happy with these policies. But now consider the following use case: a Key Vault was deleted by mistake and you want to restore it.</p>

<p>It is very likely that when you try to restore it, you get an error like this:</p>

<pre><code class="language-powershell">➜  $removeKeyvault | Undo-AzKeyVaultRemoval
Undo-AzKeyVaultRemoval: Resource 'kvipbd7f00' was disallowed by policy. Policy identifiers: '[{"policyAssignment":{"name":"Deny Key Vaults without IP rules","id":"/subscriptions/subId/resourcegroups/rg-kv-iprules-lab-20260624/providers/Microsoft.Authorization/policyAssignments/assign-keyvault-ip-rule-deny"},"policyDefinition":{"name":"Key Vaults must define at least one IP rule","id":"/subscriptions/subId/providers/Microsoft.Authorization/policyDefinitions/deny-keyvault-without-ip-rules","version":"1.0.0"}}]'.
</code></pre>

<p>So you followed Microsoft documentation to restore your Key Vault, but it still fails because of a policy. In this case, the policy checks that at least one IP is configured in the Key Vault network rules.</p>

<p>To work around this issue, the simplest solution is to disable the policy that blocks the Key Vault restoration, restore the Key Vault, and then re-enable the policy. Of course, this only works if you have permissions to disable the policy, and disabling a policy can impact your governance, especially if it affects a large number of resources on a heavily used platform.</p>

<p>There is another solution that is less simple, but more elegant and does not require disabling the policy. It consists of recreating the Key Vault through an ARM or Bicep template. Here I will do it with ARM, but you can convert it to Bicep if you want.</p>

<p>Let’s start by looking at what a deleted Key Vault looks like in JSON.</p>

<pre><code class="language-json">{
  "Id": "/subscriptions/subId/providers/Microsoft.KeyVault/locations/westeurope/deletedVaults/kvipbd7f00",
  "DeletionDate": "2026-06-24T12:07:06Z",
  "ScheduledPurgeDate": "2026-09-22T12:07:06Z",
  "PublicNetworkAccess": null,
  "VaultUri": null,
  "TenantId": "00000000-0000-0000-0000-000000000000",
  "TenantName": null,
  "Sku": null,
  "EnabledForDeployment": false,
  "EnabledForTemplateDeployment": null,
  "EnabledForDiskEncryption": null,
  "EnableSoftDelete": null,
  "EnablePurgeProtection": true,
  "EnableRbacAuthorization": null,
  "SoftDeleteRetentionInDays": null,
  "AccessPolicies": null,
  "AccessPoliciesText": "",
  "NetworkAcls": null,
  "NetworkAclsText": "",
  "OriginalVault": null,
  "ResourceId": "/subscriptions/subId/resourceGroups/rg-kv-iprules-lab-20260624/providers/Microsoft.KeyVault/vaults/kvipbd7f00",
  "VaultName": "kvipbd7f00",
  "ResourceGroupName": null,
  "Location": "westeurope",
  "Tags": {},
  "TagsTable": null
}
</code></pre>

<p>As you can see, there is not much information about the deleted Key Vault. There are no networkAcls and no network rules. Clearly, a lot of information is missing to recreate the Key Vault.</p>

<p>This helps explain why the Key Vault is restored in public mode: that information is lost. Now, if we dig a bit into the API documentation, we find the <a href="https://learn.microsoft.com/en-us/rest/api/keyvault/vaults/create-or-update#vaultcreateorupdateparameters">createMode</a> option, which allows you to create a Key Vault in “Recover” mode.</p>

<p>So we can create a Key Vault using the following ARM template:</p>

<pre><code class="language-json">{
	"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
	"contentVersion": "1.0.0.0",
	"parameters": {
		"keyVaultName": {
			"type": "string",
			"metadata": {
				"description": "Name of the Azure Key Vault to create or recover."
			}
		},
		"location": {
			"type": "string",
			"defaultValue": "[resourceGroup().location]",
			"metadata": {
				"description": "Location for the Key Vault resource."
			}
		},
		"tenantId": {
			"type": "string",
			"defaultValue": "[subscription().tenantId]",
			"metadata": {
				"description": "Azure AD tenant ID for the Key Vault."
			}
		},
		"skuName": {
			"type": "string",
			"defaultValue": "standard",
			"allowedValues": [
				"standard",
				"premium"
			],
			"metadata": {
				"description": "SKU for the Key Vault."
			}
		},
		"ipRules": {
			"type": "array",
			"defaultValue": [],
			"metadata": {
				"description": "Array of public IPv4 CIDR strings allowed to access the Key Vault (for example: 203.0.113.10/32)."
			}
		},
		"defaultAction": {
			"type": "string",
			"defaultValue": "Deny",
			"allowedValues": [
				"Allow",
				"Deny"
			],
			"metadata": {
				"description": "Default network ACL action."
			}
		},
		"bypass": {
			"type": "string",
			"defaultValue": "AzureServices",
			"allowedValues": [
				"AzureServices",
				"None"
			],
			"metadata": {
				"description": "Traffic that can bypass network ACLs."
			}
		}
	},
	"variables": {
		"ipRuleObjects": "[map(parameters('ipRules'), lambda('ip', createObject('value', lambdaVariables('ip'))))]"
	},
	"resources": [
		{
			"type": "Microsoft.KeyVault/vaults",
			"apiVersion": "2023-07-01",
			"name": "[parameters('keyVaultName')]",
			"location": "[parameters('location')]",
			"properties": {
                "createMode": "recover",
				"tenantId": "[parameters('tenantId')]",
				"sku": {
					"family": "A",
					"name": "[parameters('skuName')]"
				},
				"enabledForDeployment": false,
				"enabledForDiskEncryption": false,
				"enabledForTemplateDeployment": false,
				"publicNetworkAccess": "Enabled",
				"networkAcls": {
					"bypass": "[parameters('bypass')]",
					"defaultAction": "[parameters('defaultAction')]",
					"ipRules": "[variables('ipRuleObjects')]",
				}
			}
		}
	],
	"outputs": {
		"keyVaultResourceId": {
			"type": "string",
			"value": "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"
		}
	}
}

</code></pre>

<p>This template can be called as follows:</p>

<pre><code class="language-powershell">New-AzResourceGroupDeployment -name "recover-keyvault" -ResourceGroupName $removekeyvault.ResourceId.split('/')[4] -TemplateFile .\recover-keyvault.json -keyvaultName $removeKeyVault.VaultName  -ipRules @("1.1.1.1/32")
</code></pre>

<p>Almost like magic, your Key Vault is properly restored without changing policies.
Of course, this template should be adapted to the policies you use.</p>

<p>There is no longer any excuse to disable governance in your production environments.
Of course, I recommend testing this template in a test environment before using it in production, especially not as an emergency fix in the middle of the night.</p>]]></content><author><name>Wilfried Woivré</name></author><category term="Azure" /><category term="KeyVault" /><category term="Policy" /><summary type="html"><![CDATA[For governance requirements, you may have Azure Policies applied to your Key Vaults. For example:]]></summary></entry><entry><title type="html">Azure Monitor - Follow global storage you used</title><link href="https://woivre.com/blog/2026/05/azure-monitor-follow-global-storage-you-used" rel="alternate" type="text/html" title="Azure Monitor - Follow global storage you used" /><published>2026-05-27T00:00:00+00:00</published><updated>2026-05-27T00:00:00+00:00</updated><id>https://woivre.com/blog/2026/05/azure-monitor-follow-global-storage-you-used</id><content type="html" xml:base="https://woivre.com/blog/2026/05/azure-monitor-follow-global-storage-you-used"><![CDATA[<p>As part of a governance approach, it can be useful to inventory everything you use in the public cloud.
And it is often a bit complicated to find everything on the platform, especially when it comes to service-related metrics.</p>

<p>Of course, there is the classic inventory needed to answer simple questions such as:</p>

<ul>
  <li>How many VMs are currently in use, by OS and SKU?</li>
  <li>How many databases are currently in production?</li>
  <li>How many storage accounts are available?</li>
</ul>

<p>All of these inventory questions are very easy to answer through Azure Resource Graph.</p>

<p>Now let’s consider the following question:</p>

<ul>
  <li>What is the total storage capacity across all Azure Storage accounts?</li>
</ul>

<p>Well, this is where it gets a bit more complicated, because although the metric is available, it is exposed per storage account and, by default, not aggregated.</p>

<p>You can find this answer by looking at each storage account and summing the results of the “Used Capacity” metric.</p>

<p>Otherwise, there is another way through Azure Workbook, which I will show you.</p>

<p>So let’s start by creating a new one (the default one does not suit me in this specific context). We’ll do it through the portal, because building a workbook via infrastructure as code is more of an epic journey than a walk in the park.</p>

<p>Let’s start by adding two filters for subscriptions and resources, as shown below:</p>

<p><img src="https://woivre.com/images/2026/05/27/azure-monitor-follow-global-storage-you-used-img1.png" alt="alt text" /></p>

<p>For the different resource pickers, make sure to select “Required” and “Allow multiple selection” for both filters, and include the “All” field.</p>

<p>Then it is possible to run a Kusto query to link resources and metrics.</p>

<p>Let’s start by generating a list with all the values for each storage account:</p>

<p><img src="https://woivre.com/images/2026/05/27/azure-monitor-follow-global-storage-you-used-img2.png" alt="alt text" /></p>

<p>To make it readable, go to the advanced settings and modify the <em>Value</em> field to change the format to <em>Bytes</em>.</p>

<p>And to get an aggregate of the used capacity, simply sum all values using the <em>Stat</em> visualization and select “Sum” in the aggregation options.</p>

<p><img src="https://woivre.com/images/2026/05/27/azure-monitor-follow-global-storage-you-used-img3.png" alt="alt text" /></p>

<p>There you go! If you would like me to write more articles related to workbooks, feel free to let me know in the comments.</p>

<p>And of course, here is a link to the workbook I created for this use case: <a href="https://github.com/wilfriedwoivre/azure-workbooks/tree/main/workbooks/storage/storage-size-monitoring">Github link</a></p>]]></content><author><name>Wilfried Woivré</name></author><category term="Azure" /><category term="Monitoring" /><summary type="html"><![CDATA[As part of a governance approach, it can be useful to inventory everything you use in the public cloud. And it is often a bit complicated to find everything on the platform, especially when it comes to service-related metrics.]]></summary></entry><entry><title type="html">Azure - Find the availability zone for your subscription</title><link href="https://woivre.com/blog/2026/04/azure-find-the-availability-zone-for-your-subscription" rel="alternate" type="text/html" title="Azure - Find the availability zone for your subscription" /><published>2026-04-10T00:00:00+00:00</published><updated>2026-04-10T00:00:00+00:00</updated><id>https://woivre.com/blog/2026/04/azure-find-the-availability-zone-for-your-subscription</id><content type="html" xml:base="https://woivre.com/blog/2026/04/azure-find-the-availability-zone-for-your-subscription"><![CDATA[<p>It is sometimes necessary to find the physical zone that matches the logical zone assigned to your Azure subscription.</p>

<p>Why, you may ask? For compliance, performance, or latency reasons, it can be crucial to know where your Azure resources are physically located. It can also be important for capacity planning, to verify whether the relevant zones have enough resources to host your infrastructure.</p>

<p>This also helps you manage your CI/CD settings to ensure resources are deployed in zones where capacity is available.</p>

<p>For example, Azure Firewall currently has capacity constraints, as shown here: <a href="https://learn.microsoft.com/en-us/azure/firewall/firewall-known-issues?WT.mc_id=AZ-MVP-4039694#current-capacity-constraints">Azure Documentation</a></p>

<p>You can find which zone your subscription uses with the following command:</p>

<pre><code class="language-bash">az account list-locations --query "[?availabilityZoneMappings].{availabilityZoneMappings: availabilityZoneMappings, displayName: displayName, name: name}"
</code></pre>

<p>This command returns a list of all regions available for your subscription, along with the availability zone mappings for each region. You can then identify the physical zone that matches the logical zone used by your Azure resources.</p>

<p>If you prefer a graphical interface, I recommend <a href="https://app.az-scout.com/">App Scout</a>, which lets you visualize different zones and their capacities in real time. It is a very practical tool for managing your Azure resources efficiently. Here is an example for the West Europe region:</p>

<p><img src="https://woivre.com/images/2026/04/10/azure-find-the-availability-zone-for-your-subscription-img0.png" alt="alt text" /></p>]]></content><author><name>Wilfried Woivré</name></author><category term="Azure" /><summary type="html"><![CDATA[It is sometimes necessary to find the physical zone that matches the logical zone assigned to your Azure subscription.]]></summary></entry><entry><title type="html">Azure Sandbox - A small improvment for Copilot users through VSCode</title><link href="https://woivre.com/blog/2026/03/azure-sandbox-a-small-improvment-for-copilot-users-through-vscode" rel="alternate" type="text/html" title="Azure Sandbox - A small improvment for Copilot users through VSCode" /><published>2026-03-24T00:00:00+00:00</published><updated>2026-03-24T00:00:00+00:00</updated><id>https://woivre.com/blog/2026/03/azure-sandbox-a-small-improvment-for-copilot-users-through-vscode</id><content type="html" xml:base="https://woivre.com/blog/2026/03/azure-sandbox-a-small-improvment-for-copilot-users-through-vscode"><![CDATA[<p>Like everyone else, you probably noticed the AI shift. I assume you are using it more and more, just like all of us.</p>

<p>A few years ago, I built an Azure Sandbox system that lets me create ephemeral resource groups. With a simple script, I could create a resource group, run my tests, and then deletion would happen automatically based on the date set in a tag. Nothing could be simpler.</p>

<p>Today, to do this, I mainly use a function in my PowerShell profile to create resource groups: the well-known <em>New-AzTestResourceGroup</em> function, which some of you may already have seen in my demos.</p>

<p>Now with AI, it is much faster to tell Copilot: “Create a resource group named <em>demo-rg</em> in <em>France Central</em> and add a storage account.” Great time savings, especially since it can also generate the deployment file for you. However, the resource group does not always include the right tags.</p>

<p>There is a very simple way to add this: just ask Copilot to add the tags you want each time you create a resource group. You can scope this to your workspace, or apply it globally by adding a file in your user directory.</p>

<p>Here is an example of a file you can add in your user directory so Copilot can automatically add tags whenever you create a resource group.</p>

<pre><code class="language-markdown"># Azure Resource Group Tagging Convention

## Mandatory Tags for Resource Groups
When creating Azure resource groups, always add the following tags:

- **AutoDelete**: `true`
- **ExpirationDate**: Current date in format `YYYY-MM-DD` (e.g., 2026-03-05)

## Implementation
- Apply these tags when using Bicep, Terraform, ARM templates, or Azure CLI
- Use `resourceGroup()` function in Bicep or equivalent in other IaC tools
- Set tags at resource group creation time, not as an afterthought
</code></pre>

<p>And the path is: <em>C:\Users\YourUserName\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\memory-tool\memories</em></p>

<p>And to finish, here is the article link for the sandbox (in french sorry): <a href="https://woivre.fr/blog/2018/11/sandbox-azure-pour-tout-le-monde">https://woivre.fr/blog/2018/11/sandbox-azure-pour-tout-le-monde</a></p>

<p>That is a small tip so you do not forget to clean up your resources after your tests.</p>]]></content><author><name>Wilfried Woivré</name></author><category term="Azure" /><summary type="html"><![CDATA[Like everyone else, you probably noticed the AI shift. I assume you are using it more and more, just like all of us.]]></summary></entry><entry><title type="html">Azure Advisor - Manage recommendations at scale</title><link href="https://woivre.com/blog/2026/02/azure-advisor-manage-recommendations-at-scale" rel="alternate" type="text/html" title="Azure Advisor - Manage recommendations at scale" /><published>2026-02-11T00:00:00+00:00</published><updated>2026-02-11T00:00:00+00:00</updated><id>https://woivre.com/blog/2026/02/azure-advisor-manage-recommendations-at-scale</id><content type="html" xml:base="https://woivre.com/blog/2026/02/azure-advisor-manage-recommendations-at-scale"><![CDATA[<p>Azure Advisor is an Azure service that provides many recommendations for your environments, whether in terms of security, cost, or resilience. This tool is great, but it can be quite time-consuming to manage and account for all recommendations across an enterprise.</p>

<p>If you have an Azure environment that is fairly standardized and spans multiple subscriptions, you may want to dismiss some recommendations or at least postpone them.</p>

<p>You can do this quickly with a PowerShell script (or another automation approach).
To start, you can list the different recommendations with the following command:</p>

<pre><code class="language-powershell">Get-AzAdvisorRecommendation -SubscriptionId &lt;SubscriptionId&gt;
</code></pre>

<p>Then, you can filter the recommendations you want to dismiss or postpone. For example, if you want to postpone a recommendation for 90 days, you can use the following command:</p>

<pre><code class="language-powershell">Disable-AzAdvisorRecommendation -RecommendationName e33855d4-7579-e4d0-c459-23fad3665bd6 -Day 90
</code></pre>

<p>And if you simply want to postpone one recommendation type globally, you can use the following command:</p>

<pre><code class="language-powershell">get-azAdvisorRecommendation | Where { $_.RecommendationTypeId -eq $recommendationId } | % { $_ | Disable-AzAdvisorRecommendation -Day 120 }
</code></pre>

<p>Let’s make 2026 the year we manage recommendations at scale—and leave no active recommendation without a planned action!</p>]]></content><author><name>Wilfried Woivré</name></author><category term="Azure" /><category term="Azure Advisor" /><summary type="html"><![CDATA[Azure Advisor is an Azure service that provides many recommendations for your environments, whether in terms of security, cost, or resilience. This tool is great, but it can be quite time-consuming to manage and account for all recommendations across an enterprise.]]></summary></entry><entry><title type="html">Azure VM - Update your boot diagnostics</title><link href="https://woivre.com/blog/2026/01/azure-vm-update-your-boot-diagnostics" rel="alternate" type="text/html" title="Azure VM - Update your boot diagnostics" /><published>2026-01-27T00:00:00+00:00</published><updated>2026-01-27T00:00:00+00:00</updated><id>https://woivre.com/blog/2026/01/azure-vm-update-your-boot-diagnostics</id><content type="html" xml:base="https://woivre.com/blog/2026/01/azure-vm-update-your-boot-diagnostics"><![CDATA[<p>As you all know, logs are important. One log that is often underestimated is boot diagnostics, at least to confirm whether the VM started correctly.
Previously in Azure, you could configure boot diagnostics by relying on a storage account to store the different data.</p>

<p>For some time now, Microsoft has updated the boot diagnostics configuration for Azure virtual machines. From now on, you can configure boot diagnostics without creating a dedicated storage account. In other words, it is now fully managed by Microsoft.</p>

<p>Here is a Graph query to detect all your VMs that have not yet switched to this new boot diagnostics mode:</p>

<pre><code class="language-kql">resources
| where type =~ "microsoft.compute/virtualMachines"
| where properties.diagnosticsProfile.bootDiagnostics.enabled == true
| where isnotnull(properties.diagnosticsProfile.bootDiagnostics.storageUri)
</code></pre>

<p>If this can help you avoid dedicated storage accounts for boot diagnostics, that is one less resource to manage and secure, and it simplifies the configuration of your virtual machines.</p>]]></content><author><name>Wilfried Woivré</name></author><category term="Azure" /><category term="Virtual Machines" /><summary type="html"><![CDATA[As you all know, logs are important. One log that is often underestimated is boot diagnostics, at least to confirm whether the VM started correctly. Previously in Azure, you could configure boot diagnostics by relying on a storage account to store the different data.]]></summary></entry><entry><title type="html">Azure Network - No more public subnets</title><link href="https://woivre.com/blog/2025/12/azure-network-no-more-public-subnets" rel="alternate" type="text/html" title="Azure Network - No more public subnets" /><published>2025-12-15T00:00:00+00:00</published><updated>2025-12-15T00:00:00+00:00</updated><id>https://woivre.com/blog/2025/12/azure-network-no-more-public-subnets</id><content type="html" xml:base="https://woivre.com/blog/2025/12/azure-network-no-more-public-subnets"><![CDATA[<p>In late March 2026, Microsoft announced an important update regarding public subnets in Azure. From now on, subnets will be private by default, which means that resources deployed in these subnets will not have direct Internet access. This decision was made to strengthen the security of Azure environments and encourage best practices in networking.</p>

<p>So what exactly changes for you? Well, if you’re in an enterprise with Zero Trust and hub &amp; spoke architecture, this concretely changes nothing for you. Because the subnets in your spokes are already private by nature, since they go through your hub to access the Internet.</p>

<p>However, for smaller environments, you’ll need to think carefully about either making your subnets public again or explicitly enabling Internet access via a NAT Gateway, a Firewall, or a Load Balancer with an outbound rule or a static IP on your VMs.</p>

<p>Concretely, your route table—whether implicit or explicit—to the Internet is disabled, so you need to replace it with a direct route.
The simplest solution is to set up a NAT Gateway, but be careful about the cost of this service since pricing is also based on data passing through it.</p>

<p>Microsoft provides examples for private subnets, I recommend you take a look: <a href="https://github.com/Azure-Samples/azure-networking_private-subnet-routing">GitHub - Azure Networking Private Subnet Routing</a></p>]]></content><author><name>Wilfried Woivré</name></author><category term="Azure" /><category term="Network" /><summary type="html"><![CDATA[In late March 2026, Microsoft announced an important update regarding public subnets in Azure. From now on, subnets will be private by default, which means that resources deployed in these subnets will not have direct Internet access. This decision was made to strengthen the security of Azure environments and encourage best practices in networking.]]></summary></entry><entry><title type="html">Azure VM - RunCommand access</title><link href="https://woivre.com/blog/2025/11/azure-vm-runcommand-access" rel="alternate" type="text/html" title="Azure VM - RunCommand access" /><published>2025-11-04T00:00:00+00:00</published><updated>2025-11-04T00:00:00+00:00</updated><id>https://woivre.com/blog/2025/11/azure-vm-runcommand-access</id><content type="html" xml:base="https://woivre.com/blog/2025/11/azure-vm-runcommand-access"><![CDATA[<p>Just a quick article to talk about the RunCommand permission on virtual machines.</p>

<p>It is very practical, I agree, and I use it regularly, but it can also be dangerous if given to people who shouldn’t have it.</p>

<p>Indeed, the permission on Windows runs as SYSTEM, and can therefore do anything on the virtual machine, including installing malware or stealing sensitive data, or disabling security services.
And on Linux, it’s no better as it runs as sudo, and can also do anything.</p>

<p>And to top it off, once you have run a command, it is not possible to stop it, so do not copy commands that you do not understand, or that you have not verified, and do not run them on production machines without having tested them beforehand in a test environment.</p>

<p>So do not give this permission <em>Microsoft.Compute/virtualMachines/runCommand/action</em> to just anyone, and make sure that the people who have it are trustworthy and know what they are doing. Or give it on machines in sandboxes that do not have access to your production environments.</p>]]></content><author><name>Wilfried Woivré</name></author><category term="Azure" /><category term="Virtual Machines" /><summary type="html"><![CDATA[Just a quick article to talk about the RunCommand permission on virtual machines.]]></summary></entry><entry><title type="html">Azure Network - Increase your subnet is now possible !</title><link href="https://woivre.com/blog/2025/10/azure-network-increase-your-subnet-is-now-possible" rel="alternate" type="text/html" title="Azure Network - Increase your subnet is now possible !" /><published>2025-10-17T00:00:00+00:00</published><updated>2025-10-17T00:00:00+00:00</updated><id>https://woivre.com/blog/2025/10/azure-network-increase-your-subnet-is-now-possible</id><content type="html" xml:base="https://woivre.com/blog/2025/10/azure-network-increase-your-subnet-is-now-possible"><![CDATA[<p>You’ve already found yourself in a situation where you were perhaps too cautious (or optimistic) about managing your IPs, and you assigned only a tiny /28 range to an application without realizing that tomorrow it would explode and you’d need to request a larger range to function.</p>

<p>Previously, the answer was often something like “Sorry, it’s not possible to expand a subnet, you have to create a new one and migrate the resources or keep 2 disjoint subnets. You’ll have to specify it every time you open routes, or when you need to modify route tables”.</p>

<p>But now, good news: it’s possible to add a second address prefix to your subnet like this</p>

<pre><code class="language-powershell">$vnet = Get-AzVirtualNetwork -ResourceGroupName 'test-rg' -Name 'vnet-1'
Set-AzVirtualNetworkSubnetConfig -Name 'subnet-1' -VirtualNetwork $vnet -AddressPrefix '10.0.0.0/24', '10.0.1.0/24'
$vnet | Set-AzVirtualNetwork
</code></pre>

<p>The advantage here is that if you’re lucky enough to have contiguous subnets like in the example above, your route openings simply change from 10.0.0.0/24 to 10.0.0.0/23, which greatly simplifies your operations.</p>

<p>But also your scale set inside your subnet can now scale to 300 nodes without having to move your workload to a new subnet. And this is also possible for GatewaySubnet if you made the mistake of creating it as /29 just for a simple Point to Site, and now you want to do S2S VPN or ExpressRoute.</p>]]></content><author><name>Wilfried Woivré</name></author><category term="Azure" /><category term="Network" /><summary type="html"><![CDATA[You’ve already found yourself in a situation where you were perhaps too cautious (or optimistic) about managing your IPs, and you assigned only a tiny /28 range to an application without realizing that tomorrow it would explode and you’d need to request a larger range to function.]]></summary></entry><entry><title type="html">Azure - Some limits are not so far</title><link href="https://woivre.com/blog/2025/09/azure-some-limits-are-not-so-far" rel="alternate" type="text/html" title="Azure - Some limits are not so far" /><published>2025-09-07T00:00:00+00:00</published><updated>2025-09-07T00:00:00+00:00</updated><id>https://woivre.com/blog/2025/09/azure-some-limits-are-not-so-far</id><content type="html" xml:base="https://woivre.com/blog/2025/09/azure-some-limits-are-not-so-far"><![CDATA[<p>The Cloud is infinite — that is what we often hear. But is that really true? In reality, there are limitations in the Cloud, and Azure is no exception. These limitations can be related to capacity, performance, security, or other aspects.</p>

<p>This is certainly something well known, but I still see many people forget it, or assume they will never be affected by these limitations.</p>

<p>So let’s start with the official Azure documentation that lists the different limits: <a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits?WT.mc_id=AZ-MVP-4039694">https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits</a></p>

<p>These limits may seem far away compared to your current usage, but you can reach them faster than you might expect.</p>

<p>For example, when you set up Azure Policy bundles for each type of resource and risk, there is a limit on the number of custom definitions per scope. This can become a challenge in your governance architecture: you may need to use initiatives, create multiple scopes, or rely more on built-in policies.</p>

<p>Custom role definitions also have a tenant-level limit. So you cannot let all your users create custom roles without control, otherwise you may hit that limit sooner than expected and lose governance over the existing roles.</p>

<p>For heavy Azure API Management users, be aware that there are limits on the number of operations per instance. This count also includes operations present in revisions. By default, the service does not provide a simple metric to check whether you are close to that limit, so you must calculate it yourself and properly manage unused revisions and obsolete APIs.</p>

<p>The same applies to Azure Firewall: there are limits on how many rules you can create. A rule is roughly counted as 1 source, 1 destination, and 1 port. So if you add the rule <strong>Allow TCP 9093 from 10.0.0.0/24 and 10.0.1.0/24 to 10.1.0.0/24</strong>, it counts as 2 rules. To reduce this, you can use IP groups or open access more broadly when possible. But managing these rules can quickly become a challenge, especially if multiple teams manage the firewall.</p>

<p>My advice is this: for every new service you enable on your platform, or every new feature you offer as <em>self-service</em> to your users, ask yourself what the limits are and whether they can be reached.
And remember: even if these limits can evolve over time, you still need to apply all your governance processes around these resources, such as inventory and rigorous lifecycle management.</p>]]></content><author><name>Wilfried Woivré</name></author><category term="Azure" /><summary type="html"><![CDATA[The Cloud is infinite — that is what we often hear. But is that really true? In reality, there are limitations in the Cloud, and Azure is no exception. These limitations can be related to capacity, performance, security, or other aspects.]]></summary></entry></feed>