How to apply tags to all resources in your subscription

Tags are a useful way to keep track of who owns what resource in a company wide Azure subscription.

You can enforce the creation of tags via the Apply tag and its default value policy you can assign to all or part of your subscription. But this only works for future resource created. What if you already have a lot there?

Set tags at the resource groups

We can create the tags we need at the resource group level with this:

Get-AzureRmResourceGroup | ForEach-Object { Set-AzureRmResourceGroup -Name $_.ResourceGroupName -Tag @{ Key="value" } }

This will set the tag for all resource groups.

Set tags for the resources within the groups

Then to copy the tags at the resource groups and assign them to the resources within the groups you can run the following:

$groups = Get-AzureRmResourceGroup
foreach ($group in $groups)
{
$resources = $group | Find-AzureRmResource
Write-Host "Processing resource group $($group.ResourceGroupName)" -f Cyan
foreach ($r in $resources)
{
$resourcetags = (Get-AzureRmResource -ResourceId $r.ResourceId).Tags
foreach ($key in $group.Tags.Keys)
{
if (($resourcetags) -AND ($resourcetags.ContainsKey($key))) { $resourcetags.Remove($key) }
}
$resourcetags += $group.Tags
Set-AzureRmResource -Tag $resourcetags -ResourceId $r.ResourceId -Force
}
Write-Host
}

Further reading