Azure bietet (u. a. mit Azure Resource Tags) zahlreiche Funktionen, um anfallende Kosten bedarfsgerecht auszuwerten. Dazu bietet Microsoft u. a. auch Resource-Tags an, um den Resourcen auswertbare Informationen anzuheften. Tags sind wie kleine Beschriftungsaufkleber zu sehen, die dabei helfen Ordnung zu schaffen. Nicht nur bei der Kostenauswertung.
Nun ist im Zuge des Cloud-Projektes eine Konzeption für das Resource-Tagging gemacht worden. Alles gut. Jede neue Resource (auch die vorhandenen) muss bei jedem Deployment zukünftig getaggt werden. Dies kann man in seinen Deployment-Scripten selbstverständlich mitgeben.
Aber die Realität zeigt, dass dies im Projektgeschäft oft einfach vergessen wird. Eine Azure Governance ist hier gefragt.
Daher möchte ich einen praktischen Automatismus für dieses Problem vorstellen.
Überblick
Ein Job wird automatisch täglich ein Powershell Runbook starten. Dieses Powershell Runbook liest die Azure Resource Tags der Resource Group aus und setzt sie in jeder Resource aus der Resource Group.
Somit muss man nur einmal übergeordnet einen Ordnungsrahmen schaffen, der dann automatisch „vererbt“ wird.
Was wird benötigt?
- Zunächst legst Du einen Automation Account an. Darauf gehe ich nicht gesondert ein. Hier ist eine einfache Anleitung:
https://docs.microsoft.com/de-de/azure/automation/automation-create-standalone-account
2. Nun erstellt Du ein PowerShell Script. Dieses Script liest alle Resource Groups in ein Array, wenn dort ein Azure Resource Tag angehängt ist. Dann werden in einer Schleife alle Resourcen aus den Resource Groups ausgelesen und mit Set-AzureRmResource wird dann in einer Schleife das Tag angehängt.
$connectionName = "AzureRunAsConnection" try { $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName 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 } } $rgarray = get-azurermresourcegroup | where-object {$_.Tags -ne $null} foreach ($rg in $rgarray){ $resarray = get-azurermresource | where-object {$_.ResourceGroupName -eq $rg.ResourceGroupName} foreach ($resin$resarray) { if ($rg.Tags -ne $null){ set-azurermresource -tag $rg.Tags -ResourceId $res.ResourceId -Force } } }
2. Nun importierst Du das PowerShell Script in den Automation Account. In diesem Beispiel gehe ich davon aus, dass das Script auf Deinem Rechner liegt.
Import-AzureRmAutomationRunbook -Path .\runbook.ps1 -ResourceGroup "ResourceGroup01" -AutomationAccountName "AutomationAccount01" -Type Powershell
3. Nun erstellst Du ein Schedule im Automation Account . Dieser hier läuft einmal täglich für ein Jahr um 13:00 Uhr.
$StartTime = Get-Date "13:00:00" $EndTime = $StartTime.AddYears(1) New-AzureRmAutomationSchedule -AutomationAccountName "AutomationAccount01" -Name "Schedule02" -StartTime $StartTime -ExpiryTime $EndTime -DailyInterval 1 -ResourceGroupName "ResourceGroup01"
Fazit Azure Resource Tags
Dieses Script überschreibt sämtliche Azure Resource Tags der Ressourcen und das ist auch so gewollt. Da Du ja eine übergeordnete Governance etablieren willst, und meistens viele Mitarbeiter in der Azure Umgebung arbeiten und dabei eigene Konzepte durchsetzen wollen, erzwingst Du hiermit eine übergeordnete Azure Governance Regel.
Viel Spaß beim Nachbauen.