A medida que nuestra infraestructura en Azure crece es básico mantener sobre todos los recursos un exhaustivo nivel de control, tanto a nivel económico como organizativo. Para conseguir esto podemos utilizar los tags, hoy vamos a ver cómo podemos llevar esta gestión de manera efectiva a través de Powershell, paso previo a lo que sería una organización a largo plazo a base de políticas.

azure tag

 

En Azure los tags nos permiten añadir metadata a nuestros recursos, organizándolos de manera que nos sea luego sencillo localizarlos o trabajar sobre ellos. Un tag no es más que un nombre de tag asociado a un valor, unos ejemplos típicos serías el tag “estado” con valores como “producción, desarrollo, desasignado..” o el tag “departamento” asociado a “contabilidad, administración”..

Una vez se asignan los tags a los recursos en Azure, se pueden consultar a través de los tags los recursos que lo contienen a través de los grupos de recursos, de esta manera podemos ver recursos relacionados independientemente de su pertenencia a uno u otro grupo de recursos. Como decíamos también son esenciales en temas de facturación ya que permiten ver que recursos son usados por cada departamento y de esa manera poder sacar un reporte de los mismos para cargar esos gastos (chargeback) o para mostrarlos y que el propio departamento tenga consciencia de los mismos (showback).

Los tags se deben aplicar a nivel de recurso, ya que si los aplicamos a nivel de grupo de recurso, estos no se heredan, además de no dar un nivel de detalle suficiente después. Idealmente los tags deben aplicarse de manera automática a través de Azure policy, pero en este post vamos a ver cómo se pueden gestionar de manera manual.

A la hora de trabajar con tags hay que tener en cuenta diversos factores, como que no todos los recursos soportan tags, que cada recurso admite un máximo de 15 tags, que el nombre de tag tiene un máximo de 512 caracteres (idealmente 128), que los valores de un nombre de tag tienen un máximo de 256 caracteres, que las VM no pueden exceder de 2048 caracteres para todos los nombres de tags y valores asignados, que los tags no se heredan de grupo de recursos a recursos, que existen una serie de caracteres prohibidos como <, >, %, &, \, ?, / y por último pero no menos importante que los tags no se pueden asignar a recursos clásicos y sólo a aquellos creados a través del modelo de Resource Manager.

Teniendo esto claro, para aplicar un tag a un recurso deberemos tener sobre el mismo permiso de escritura a través del rol de contributor o superior. Además de a través de Powershell como veremos a continuación, tener presente que los tags pueden ser asignados a través del portal de Azure, Azure CLI, templates de Resource Manager y REST APIs de Resource Manager.

 

Gestión de tags para grupos de recursos

Para aplicar un tag a un grupo de recursos que no tenga ningún tag previamente añadido podemos usar el cmdlet Set-AzResourceGroup. En el siguiente ejemplo vemos cómo añadimos un par de tags al grupo de recursos grupo1

Set-AzResourceGroup -Name grupo1 -Tag @{ Code=1001; Environment=Production }

En el caso que el grupo de recursos ya contenga algún tag, deberemos recoger los mismos primero y luego a través del método .Add() añadir los nuevos. Esto lo hacemos en tres pasos como vemos a continuación. Primero recogemos en una variable los tags del grupo de recursos para después añadirle el nuevo tag y finalmente modificar el grupo de recursos con la lista actualizada.

$tags=(Get-AzResourceGroup -Name grupo1).Tags
$tags.Add("owner", "[email protected]")
Set-AzResourceGroup -Tag $tags -Name grupo1

Para eliminar todos los tags de un grupo de recursos, pasaremos una tabla hash vacía al mismo con

Set-AzResourceGroup -Tag @{} -Name grupo1

 

Gestión de tags para recursos

En el caso de trabajar directamente con recursos el proceso es prácticamente igual, pero utilizando el cmdlet Set-AzResource

En este primer ejemplo, vamos a añadir un tag a un recursos que no tenga otros tags previos (en caso que los tenga estos se sobreescribiran)

$r = Get-AzResource -ResourceName recurso1 -ResourceGroupName grupo1
Set-AzResource -Tag @{ CostCode="1001"; Environment="Production" } -ResourceId $r.ResourceId -Force

Para añadir tags a un recurso que ya tenga otros tags, como antes utilizaremos el método .Add(). Primero recuperamos la lista de tags del objeto, la modificamos y volcamos los cambios de nuevo al objeto.

$r = Get-AzResource -ResourceName recurso1 -ResourceGroupName grupo1
$r.Tags.Add("owner", "[email protected]”)
Set-AzResource -Tag $r.Tags -ResourceId $r.ResourceId -Force

Para eliminar todos los tags de un objeto, pasaremos una tabla hash vacia al mismo con

$r = Get-AzResource -ResourceName recurso1 -ResourceGroupName grupo1
Set-AzResource -Tag @{} -Name hrgroup -ResourceId $r.ResourceId -Force

 

Filtrar grupos de recursos por tag

Una vez asignados tags a nuestros grupo de recursos, podemos buscar a través del cmdlet Get-AzResourceGroup utilizando la opción -Tag como vemos en el siguiente ejemplo en el que pedimos de vuelta solo el nombre del grupo de recursos

(Get-AzResourceGroup -Tag @{ Owner="[email protected]" }).ResourceGroupName

 

Filtrar recursos por tag

A nivel de recurso, de nuevo vuelve a ser muy similar, utilizando el cmdlet Get-AzResource, pudiendo filtrar por tag y valor o solo por tag como vemos a continuación

(Get-AzResource -Tag @{ Owner="[email protected]"}).Name

(Get-AzResource -TagName CostCode).Name