Azure automation: eliminar resource groups vacíos automáticamente

Me gusta mantener mi suscripción de Microsoft Azure limpia, pero en ocasiones existen desajustes entre el portal antiguo y el nuevo, o incluso eliminamos recursos dejando resource groups completamente vacíos, haciendo que nuestra lista de elementos crezca cuando en realidad no hay nada en ellos.

Empty resource groups
Empty resource groups

Por ello, he creado un workflow de PowerShell que revisa los resource groups que tengo en mi cuenta y si no tienen ningún recurso asociado los elimina.

Antes de poder ejecutar este script es necesario que subas la última versión del módulo AzureResourceManager como ya se explicó en este post anterior. El mismo se encuentra en C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ResourceManager y sólo tienes que generar un zip con la carpeta AzureResourceManager y subirla como módulo dentro de cuenta de Azure Automation a través de Assets > Modules > Add Module.

Azure Automation - Add Module
Azure Automation – Add Module – AzureResourceManager.zip

Una vez subido y procesado podrás verlo con el resto de módulos disponibles en la cuenta.

Azure Automation Modules - AzureResourceManager
Azure Automation Modules – AzureResourceManager

También vas a necesitar añadir un asset de tipo Credential como también se mostró en el post Azure Resource Manager automatizado con Azure Automation. En el portal nuevo es bastante similar: Assets > Credentials y añades tu usuario de Azure Active Directory que además es administrador de tu cuenta.

Crea un nuevo runbook de tipo PowerShell. En mi ejemplo lo he llamado Delete-Empty-Resource-Groups y he añadido lo siguiente:

workflow Delete-Empty-Resource-Groups
{
	#The name of the Automation Credential Asset this runbook will use to authenticate to Azure.
    $CredentialAssetName = "DefaultAzureCredential";
	
	#Get the credential with the above name from the Automation Asset store
    $Cred = Get-AutomationPSCredential -Name $CredentialAssetName;
    if(!$Cred) {
       	Throw "Could not find an Automation Credential Asset named '${CredentialAssetName}'. Make sure you have created one in this Automation Account."
    }
   	#Connect to your Azure Account   	
	Add-AzureRmAccount -Credential $Cred;
	
	#Get Azure Resource Groups
	$rgs = Get-AzureRmResourceGroup;
	
	if(!$rgs){
		Write-Output "No resource groups in your subscription";
	}
	else{
		
		Write-Output "You have $($(Get-AzureRmResourceGroup).Count) resource groups in your subscription";
		
		foreach($resourceGroup in $rgs){
			$name=  $resourceGroup.ResourceGroupName;
			$count = (Get-AzureRmResource | where { $_.ResourceGroupName -match $name }).Count;
			if($count -eq 0){
				Write-Output "The resource group $name has $count resources. Deleting it...";
				Remove-AzureRmResourceGroup -Name $name -Force;
			}
			else{
				Write-Output "The resource group $name has $count resources";
			}
		}
		
		Write-Output "Now you have $((Get-AzureRmResourceGroup).Count) resource group(s) in your subscription";
		
	}  
}

Una vez que has completado estos pasos puedes lanzar el script a través del Test pane y comprobar que todo funciona correctamente.

Azure Automation - Test pane
Azure Automation – Test pane

En el verás el resultado del script y los posibles errores antes de publicarlo y programarlo.

Azure Automation - Test pane - Delete Empty Resource Groups
Azure Automation – Test pane – Delete Empty Resource Groups

Si prefieres no crearte el runbook desde cero, he subido el script a la galería para que esté disponible para todos.

Azure Automation - Browse Gallery
Azure Automation – Browse Gallery

¡Saludos!