Adding tags to resources


Adding tags to resources helps us to organize our resources and to automate some tasks. Here is a small intro on how to use tags in the Azure portal, in templates, or with PowerShell. In this article we will use tags only for virtual machines, but you can add tags to any resource created with the Azure Resource Manager (including resourcegroups).

Tags are simple name-value pairs that we can define the way we like it. An (often used) example is the tagging of a resource with the appropriate cost center (like "Department" = "Sales"), or to separate development from production ("Environment" = "Test"), or whatever else we have in mind to organize.

Portal

If you look at the resource in the portal, there is a "Tags" entry. Click on it (1), enter a name-value pair (2) and hit "Save" (3). That's it. You can choose from previously used tags by selecting from the dropdown menu.

using tags

Using tags in the Azure portal

Here we use the name "purpose" and the value "blog-example" to make it easier to delete resources that we needed for screenshots... 🙂

We can add more tags to a resource, up to 15 per resource. And there is a main "Tags" menu (1) that we can use to search across all our resources for special tags (2):

Templates

When using templates to deploy resources (which is a very good idea by the way...) simply add them (as a list) into the template:

...
    "resources": [
    {
      "apiVersion": "2016-01-01",
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[concat('storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "tags": {
        "Dept": "Finance",
        "Environment": "Production"
      },
...

Here we set two tags, "Dept" and "Environment", at a storage resource. This is really simple... and of course those resources and tags can be found via the portal also. If you use parameters for the tags, you will be - as usual - prompted before the deployment to enter values for those tags.

...
    "resources": [
    {
      "apiVersion": "2016-01-01",
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[concat('storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "tags": {
        "Dept": "[parameters('DepartmentTag')]",
        "Environment": "[parameters('EnvironmentTag')]"
      },
...

Note that it is not possible to set tags on resourcegroups with a template, only to resources. If you want to add tags to resourcegroups, you must do this via the portal or PowerShell.

PowerShell

Tags are a property of a resource or a resourcegroup object. To list them, simply enter Get-AzureRmResourceGroup and you might get something like this:

C:> Get-AzureRmResourceGroup -Name test01-rg

ResourceGroupName : test01-rg
Location          : germanycentral
ProvisioningState : Succeeded
Tags              :
                    Name     Value
                    =======  ===============
                    purpose  unknown
                    status   unknown/unknown

ResourceId        : /subscriptions/06(...)/resourceGroups/test01-rg

Similar for a resource inside a resourcegroup:

C:> Get-AzureRmResource -ResourceGroupName test01-rg -ResourceName rw01-vm1

Name              : rw01-vm1
ResourceId        : /subscriptions/06(...)/virtualMachines/rw01-vm1
ResourceName      : rw01-vm1
ResourceType      : Microsoft.Compute/virtualMachines
ResourceGroupName : test01-rg
Location          : germanycentral
SubscriptionId    : 06d(...)
Tags              : {purpose}

Tags are dictionary objects, so we can work with them once we saved the object:

C:> $tags = (Get-AzureRmResource -ResourceGroupName test01-rg -ResourceName rw01-vm1).Tags
C:> $tags

Name                           Value
----                           -----
purpose                        VM

We can add name/value pairs:

C:> $tags.Add("status","active")
C:> $tags

Name                           Value
----                           -----
purpose                        VM
status                         active

We can modify them (like adding some text):

C:> $tags.Item("status") += " (do not delete)"
C:> $tags

Name                           Value
----                           -----
purpose                        VM
status                         active (do not delete)

or we can delete pairs:

C:> $tags.Remove("status")

Once we are finished with modifying the dictionary object, we can write it back by using the "Set- instead of the "Get-" cmdlet:

C:> Set-AzureRmResource -ResourceGroupName test01-rg -ResourceName rw01-vm1 -Tags $tags

C:> Set-AzureRmResourceGroup -Name test01-rg -Tags $tags

Summary

Tags are a great way to organize resources just the way you like it. And if you think further, it is easy to assign tasks to all resources with a special value for a key, like garbage collection for all resources with "Status" = "delete me".

To be consequent, use Azure policies to make sure that all your resources or resourcegroups at least have a tag.


Comments (0)

Skip to main content