Włączanie i wyłączanie VM w Azure za pomocą MS Flow

Witajcie.

Automation

Większość maszyn wirtualnych, które trzymamy w chmurze zapewne nie musi pracować 24 godziny na dobę. Po godzinach pracy możemy je spokojnie wyłączyć, co pozwoli nam na spore oszczędności. Jeśli przyjmiemy, że maszyny działają 8 godzin dziennie i tylko w dni powszednie – to koszt maszyn może spaść nawet o 60%. To bardzo dużo i warto o tym pomyśleć.

W chwili obecnej każda maszyna wirtualna może być wyłączana automatycznie o określonej godzinie, a w niedługim czasie zostanie dodana funkcjonalność włączająca VM wg. harmonogramu. Nie mniej jednak przy użyciu funkcji Automation możemy już teraz ten proces zautomatyzować. Wystarczy prosty skrypt w PowerShell i możemy zacząć oszczędzać.

No dobrze, ale co jeśli szef do nas zadzwoni w sobotę, że potrzebuje jednego z serwerów do pracy?

Oczywiście możemy zalogować się do portalu i włączyć maszynę, no ale jeśli jesteśmy poza domem… trochę głupia sprawa. Jest na to proste rozwiązanie – powiązanie Automation z MS Flow.

MS Flow

MS Flow jest bardzo ciekawym produktem Microsoftu, dostępnym za darmo lub z pakietem Office 365. Pozwala on w wielkim skrócie na tworzenie przebiegów bizesowych, które są wyzwalane automatycznie lub przez określone zdarzenia. Sam proces może składać się z wielu akcji, weryfikowanych przez warunki – słowem bardzo rozbudowane “skrypty”.

Mocną stroną produktu są konektory to kilkuset różnych usług zarówno Microsoft jak i zewnętrznych. Proces Flow może zostać zainicjowany np. przez utworzenie jakiegoś zdarzenia na Facebook, otrzymaniu maila w Outlook czy też Gmail czy inne zdarzenie. Akcją może być choćby dodanie wpisu do Excela, wysłanie powiadomienia na telefon, utworzenia sprawy w Dynamics CRM.

Przebiegi można też uruchamiać ręcznie np. z poziomu aplikacji, którą możemy zainstalować na telefonie.

Dziś skupimy się na tym by MS Flow uruchamiał nam wybrany skrypt w Azure Automation po kliknięciu guzika w aplikacji na komórce…

Proces konfiguracji rozwiązania podzieliłem na kilka części:

  • Konfiguracja Automation, tworzenie skryptu Runbook oraz wyzwalacza (webhook)
  • Tworzenie przebiegu MS Flow
  • Uruchamianie przebiegu i diagnostyka po stronie Automation.

Konfiguracja Automation

Zakładam, że wiesz jak utworzyć Automation, jeśli nie, proszę zapoznaj się z tym dokumentem. Create a standalone Azure Automation account

Rozpoczniemy od utworzenia nowego Runbooka. Runbook to taki zestaw poleceń PowerShell lub Python, który służy do realizacji jakiegoś procesu. Nazwijmy to dla uproszenia skryptem. Tworzymy nowy Runbook typu PowerShell Workflow. Czemu nie typowy PowerShell, bowiem do Runbooka Workflow możemy w prosty sposób przekazać dodatkowe parametry. Np. nazwę maszyny, którą chcemy włączyć lub wyłączyć, operację jaką chcemy przeprowadzić – włączanie albo wyłączanie.

Warto do Runbooka dodać opis (Description) przydaje się jak mamy później wiele skryptów i trzeba wiedzieć który jest do czego 🙂

Gdy utworzymy swój Runbook pojawi nam się okno edytora. Do tego okna możemy wprowadzić całą treść naszego kodu. Możemy oczywiście przygotować kod wcześniej w własnym edytorze (np. w Visual Code), albo możemy napisać odrazu tutaj. Edytor zapewnia nam kolorowanie treści więc nasz kod będzie czytelny…

Treść kodu jaki dla Was przygotowałem dla przykładowego rozwiązania:

workflow startstop-vm-from-webhook
{
    param (
        [object]$WebhookData
    )

    $connection = Get-AutomationConnection -Name AzureRunAsConnection
    Add-AzureRMAccount -ServicePrincipal -Tenant $connection.TenantID -ApplicationId $connection.ApplicationID -CertificateThumbprint $connection.CertificateThumbprint

    if ($WebhookData -ne $null)
    {

        $WebhookName    =     $WebhookData.WebhookName
        $WebhookHeaders =     $WebhookData.RequestHeader
        $WebhookBody    =     $WebhookData.RequestBody

        $params = ConvertFrom-Json -InputObject $WebhookBody

        $VMName = $params.vmname
        $status = $params.status

        $VM = Get-AzureRmVM | ? { $_.Name -eq $VMName }

        if ($VM -ne $null)
        {
            if ($status -eq "start")
            {
                Write-Output "Starting VM: $($VM.Name)"
                Start-AzureRmVM -Name $VM.Name -ResourceGroupName $VM.ResourceGroupName
                Write-Output "... VM was started"
            }
            elseif($status -eq "stop")
            {
                Write-Output "Stopping VM: $($VM.Name)"
                Stop-AzureRmVM -Name $VM.Name -ResourceGroupName $VM.ResourceGroupName -Force
                Write-Output "... VM was stopped"
            }
        }
    }

}

Nasz kod jest już na miejscu, więc zapisujemy Runbook i klikamy na górze przycisk Publish. Spowoduje to publikację kodu jako gotowego do wykonania. Nie jest to już wersja robocza.

W naszym przykładzie założyłem, że Runbook będzie wywoływany z MS Flow, więc potrzebujemy mieć do tego celu adres URL, który pozwoli na wywołanie kodu. Aby to uzyskać musimy utworzyć webhook czyli adres URL wywołujący Runbook.

Parametry webhooka są dość proste – do kiedy jest ważny i czy ma być od razu włączony. Sam adres URL zawiera token autoryzujący, więc ważne by nie dzielić się z tym adresem na prawo i lewo… bo nie wymaga on dodatkowej autoryzacji.

Podpowiedź. Osoby bardziej zaawansowane zorientują się, że taki adres nie jest do końca bezpieczny. Każdy kto go posiada może kontrolować naszą maszynę. Prawda, dlatego powinniśmy dodatkowo wprowadzić np. jakiś dodatkowy parametr autoryzujący, schowany w treści wywołania (w POST), ale dla poniższego przykładu nie będę tego omawiać.

Uwaga! Link do webhooka trzeba skopiować zanim klikniemy OK, gdyż później nie da się już go pobrać. Co najwyżej można wygenerować kolejny.

Konfiguracja MS Flow

Po zalogowaniu się do konta MS Flow przystępujemy do tworzenia nowego przebiegu. Wybierzemy z listy “Create from blank“, bowiem nie potrzebujemy gotowego szablonu i w wyszukiwarce wyszukujemy wyzwalacz (trigger) o nazwie “button“.

Będziemy mieć tylko jeden taki wyzwalacz – przycisk (button), który umożliwia wywołanie przebiegu ręcznie – na żądanie.

Klikamy na nasz “button” aby rozwinąć jego właściwości i wprowadzamy parametry, które użytkownik będzie musiał wprowadzić aby uruchomić nasz proces. W poniższym przypadku wybrałem pola typu lista – aby użytkownik nie musiał wpisywać wartości a jedynie wybrał je z listy i wprowadziłem dwa parametry:

  • status – operację jaką realizujemy – włączanie lub wyłączanie VM. Oczywiście możemy tutaj dodać kolejne operacje. Np. żądanie skalowania VM w górę lub w dół, dodanie dysku, itp. …
  • vmname – nazwę maszyny dla której operację realizujemy. Podanie jej z listy uchroni nas przed błędem jeśli ktoś wprowadzi coś nieprawidłowego, dodatkowo ograniczamy zastosowanie skryptu dla konkretnych maszyn.

Następnie dodajemy akcję (Action) jaka ma być wywołana po naciśnięciu przycisku. Szukamy po nazwie “HTTP” i wybieramy z listy akcję HTTP – HTTP. Będzie to prosta akcja, która pozwala na wywołanie dowolnego adresu URL z metodą POST i wrzucenie do treści dodatkowych parametrów.

Znów zaawansowani użytkownicy pewnie zauważą, że w Akcjach można znaleść Azure Automation. Fakt. Niestety nie udało mi się tego skutecznie uruchomić, ponadto Flow w tym przypadku wymaga autoryzacji do Azure – a tego chcę uniknąć. Niech nasz przykładowy klient nie ma dostępu do Azure wogóle, a jedynie do guzika 🙂

Konfiguracja akcji jest dość prosta, musimy wprowadzić w poszczególne pola parametry, które zostaną wysłane do usługi Automation w Azure.

  • Metoda – POST. Pozwoli nam to na przekazanie dodatkowych parametrów w sposób zaszyfrowany.
  • Uri – adres URL webhook z Automation. Mam nadzieję, że go zapisaliście 🙂
  • Headers – zostawimy puste
  • Body – tu wprowadzimy kawałek kodu, a właściwie parametry w postaci JSON. Czemu JSON, bowiem ten format jest niejako standardem dla przekazywania parametrów w usługach typu API. A tu właśnie realizujemy proste API.

Kod do wklejenia:

[
  {
    "status": "var_status",
    "vmname": "var_vmname"
  }
]

Wasz kod na pewno nie wygląda jak na zdjęciu powyżej, bowiem trzeba jeszcze wprowadzić do niego parametry. W tym celu należy zaznaczyć wyraz “var_status” i kliknąć  na górze przycisk “Add dynamic content“. Otworzy się Wam nowe okno, które pozwoli na przypisanie do treści dynamicznych parametrów MS Flow.

Wśród różnych parametrów jakie tam będą widoczne – znajdźcie “status“. To jest to samo pole “status” jakie tworzyliśmy wcześniej dla wyzwalacza.

Analogicznie zamieńcie var_vmname na dynamiczną zmienną vmname.

Nasz flow możemy już zamknąć i przetestować. Do uruchomienia służy opcja “… More” na górze i pozycja w menu “Run now“.

Powinniście otrzymać okienko takie jak ja poniżej. W okienku musicie wybrać wartość status – czyli operację jaką będziecie realizować no i wybrać maszynę wirtualną.

Ciekawoska: Jak uruchomicie ten MS Flow z komórki – to tam otrzymacie analogiczne okienko z wyborem akcji i maszyny. Fajne nie?

Monitoring operacji

Monitoring możemy realizować z poziomu MS Flow, gdzie możemy zweryfikować poprawność parametrów przekazywanych do Azure jak i odpowiedź ze strony API Azure. Jednak dużo ciekawsze opcje zapewnia nam konsola w Azure. Dostęp do niej jest z menu “Process Automation / Jobs” lub też z naszego Runbooka – “Resources / Jobs“.

Jeśli otworzymy ją zaraz po uruchomieniu Flow – to będziemy widzieć nasz Runbook ze statusem Queued albo Completed. Queued to moment, w którym skrypt nie został jeszcze uruchomiony. Nie mniej jednak możemy wejść dalej.

Wewnątrz mamy dostęp m.in. do:

  • Przejrzenia tego co nasz skrypt z MS Flow wysłał (Input). Będziemy mieć tu treść zapytania POST wraz z Body, które zawiera nasze parametry.
  • Output – odpowiedzi naszego skryptu. Jeśli któreś polecenie standardowo wyświetla coś w oknie CLI to tu zostanie to wyświetlone, analogicznie pojawią się tutaj wyniki funkcji Write-Output.
  • All Logs – zawiera wszystkie logi jakie wygenerował skryp – tu też będziemy mieć to co w Output + ew. błędy z usługi Automation
  • Errors, Warnings – czyli poprostu wyłapane błędy

Najciekawsza jest pozycja Output, bowiem pozwoli nam na śledzenie czy nasza maszyna się prawidłowo włącza, czy też wyrzuca jakieś błędy…

Udostępnianie MS Flow

Na koniec. Aby z MS Flow mógł skorzystać nasz klient – trzeba mu przycisk udostępnić. Możemy to zrobić na dwa sposoby:

  • Udostępnić przycisk innej osobie.
  • Wygenerować z przycisku szablon i go zaimportować na innym koncie.

Niestety na razie, nie ma możliwości by udostępnić komuś przycisk bez przekazywania dostępu do jego edycji. Ale mam nadzieję, że kiedyś taka funkcjonalność się pojawi.

 

Jeśli masz jakieś uwagi i przemyślenia – zostaw komentarz. Jeśli coś Ci nie działa i potrzebujesz pomocy – daj znać.

Miłej zabawy 🙂

Post Author: chris

Dodaj komentarz

This site uses Akismet to reduce spam. Learn how your comment data is processed.