¿Por qué etiquetar tus recursos en Microsoft Azure?

Desde hace tiempo existe una funcionalidad dentro de la plataforma de Microsoft Azure que te permite etiquetar los recursos o grupos de recursos que hay en ella.

Azure Resource - Tags
Azure Resource – Tags

Estas etiquetas te ofrecen fundamentalmente dos cosas: por un lado agrupar recursos a nivel de facturación, lo cual es interesante cuando no solo necesitas saber el coste a nivel de suscripción o grupo de recurso sino de recursos específicos que no tienen por qué estar dentro del mismo grupo y, por otro lado, también te permiten buscar recursos por estos tags, tanto desde el propio portal como desde Azure CLI o PowerShell.

En este post te voy a mostrar un caso práctico para el uso de estos tags, y uno de los más útiles que es automátizar tareas con Azure Automation. Uno de mis clientes necesita apagar/encender ciertas máquinas que están en grupos de recursos diferentes. No es posible hacerlo por grupo de recurso ya que dentro del mismo puede haber máquinas a las que no deba afectarle esta tarea. Por este motivo, hemos recurrido a los tags.

workflow ShutDownStartByTag
{
		Param(
		[Parameter(Mandatory=$true)]
        [String]
		$TagName,
		[Parameter(Mandatory=$true)]
        [String]
		$TagValue,
		[Parameter(Mandatory=$true)]
        [Boolean]
		$Shutdown
		)
	
	$connectionName = "AzureRunAsConnection";
	try
	{
    	# Get the connection "AzureRunAsConnection "
    	$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         
    	"Logging in to Azure..."
    	Add-AzureRmAccount `
        	-ServicePrincipal `
        	-TenantId $servicePrincipalConnection.TenantId `
        	-ApplicationId $servicePrincipalConnection.ApplicationId `
        	-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
	}
	catch {
		if (!$servicePrincipalConnection)
    	{
        	$ErrorMessage = "Connection $connectionName not found."
        	throw $ErrorMessage
    	} else{
        	Write-Error -Message $_.Exception
        	throw $_.Exception
   	 	}
	}
		
	
	$vms = Find-AzureRmResource -TagName $TagName -TagValue $TagValue | where {$_.ResourceType -like "Microsoft.Compute/virtualMachines"}
	
	Foreach -Parallel ($vm in $vms){
		
		$vm;
		
		if($Shutdown){
			Write-Output "Stopping $($vm.Name)";		
			Stop-AzureRmVm -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Force;
		}
		else{
			Write-Output "Starting $($vm.Name)";		
			Start-AzureRmVm -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName;
		}
	}
}

Como puedes ver, la linea que te permite buscar por tags puede recibir tanto el nombre de la etiqueta a través de -TagName como el valor de la misma con -TagValue. Por otro lado, si esta etiqueta se hubiera utilizado en otros recursos que no fueran máquinas virtuales sería necesario filtrar el resultado a través de | where {$_.ResourceType -like «Microsoft.Compute/virtualMachines»}

¡Saludos!