Microsoft Azure SQL Database Server – kasowanie pustych serwerów z poziomu PowerShell-a

Jak pisałem już kiedyś, Azure’a wykorzystuję m.in. bardzo mocno w scenariuszu developersko/testowo/prezentacyjnym. Często tworzę jakieś bazy danych, czy to przy prezentacjach, albo testując różne rzeczy. Zazwyczaj przy okazji tworzenia nie tworzę ich na istniejących serwerach tylko tworze nowy serwer. Później kasuję np. Web Site’a i on kasuje samą bazę danych, ale serwera już nie. Pojawia się wtedy problem, że w mojej subskrypcji jest dużo serwerów, które nie mają żadnych baz. Nie jest to jakiś wielki problem, ponieważ taki pusty serwer bez bazy nie generuje żadnych kosztów i na nic nie wpływa, oprócz mojego poczucia estetyki 😉

W portalu bezpośrednio nie ma informacji o tym czy dany serwer ma jakieś bazy danych. Trzeba by się przeklikać po każdym serwerze i zobaczyć czy ma jakieś bazy. Lepszym natomiast rozwiązaniem jest na pewno skorzystanie ze skryptów PowerShella, które ułatwiają wiele czynności, jak m.in. ta, dlatego napisałem mega prosty skrypt, który taką czynność wykonuje.

# Get the list of server from a subscription
$myServers = Get-AzureSqlDatabaseServer | ForEach-Object {$_.ServerName}
# Iterate through the list of server
foreach ($server in $myServers)
{
    # Get the list of databases for the given server
    $databases = Get-AzureSqlDatabase -ServerName $server
    # Check the count od DBs on a given server. One DB means that there is only the master DB on the server
    if ($databases.count -eq 1)
    {
        # Extra check to make sure that the single DB is the master db, so no user DBs are deleted
        $checkArray = $databases | ForEach-Object {$_.Name, $_.Edition}
        if ($checkArray[0] -eq "master" -and $checkArray[1] -eq "System")
        {
            # Deleting the DB
            Remove-AzureSqlDatabaseServer -ServerName $server -Force
            Write-Host "Server: " -NoNewline; Write-Host $server -NoNewline; Write-Host " has been deleted."
        }
    }
}

Działanie jest bardzo proste. Najpierw pobierana jest lista serwerów z subskrypcji. Następnie dla każdego serwera pobierana jest lista baz danych. Jeśli zwracana jest tylko jedna baza danych to jest to kandydat do skasowania. Jedna baza danych oznacza, ze jest to baza master, a nie baza użytkownika. Dodatkowo dodałem sprawdzanie czy faktycznie ta baza to baza master, gdyby nagle w jakiejś wersji cmdletów przestała taka baza być zawracana to wolałbym nie skasować sobie serwera z bazami danych 🙂

Skrypt jest mega prymitywny, można by go pewnie ulepszyć na kilka sposobów, dodać jako workflow itp., ale na moje potrzeby wystarcza. Można go dodatkowo wykorzystać w Azure Automation i dzięki temu np. ustawić, że skrypt ma się uruchomić codziennie o 17 kiedy kończymy pracę, albo raz w tygodniu, dzięki czemu nasza subskrypcja będzie czysta 🙂

Jeśli ktoś nie wie jak skorzystać z cmdletów PowerShell-a do Azure zapraszam do odwiedzenia tej strony.