Automatyczne wstrzymywanie zadania przy użyciu programu PowerShell i usługi Azure Functions lub Azure Automation

Niektóre aplikacje wymagają podejścia do przetwarzania strumieniowego (na przykład za pośrednictwem usługi Azure Stream Analytics), ale nie muszą być uruchamiane w sposób ciągły. Przyczyny to:

  • Dane wejściowe, które są dostarczane zgodnie z harmonogramem (na przykład w górnej części godziny)
  • Rozrzedłe lub małe ilości danych przychodzących (kilka rekordów na minutę)
  • Procesy biznesowe, które korzystają z możliwości okien czasowych, ale są uruchamiane w partii w trybie wsadowym (na przykład finanse lub kadry)
  • Pokazy, prototypy lub testy, które obejmują długotrwałe zadania na małą skalę

Zaletą braku ciągłego uruchamiania tych zadań jest oszczędność kosztów, ponieważ zadania usługi Stream Analytics są rozliczane na jednostkę przesyłania strumieniowego w czasie.

W tym artykule wyjaśniono, jak skonfigurować automatyczne wstrzymanie dla zadania usługi Azure Stream Analytics. Konfigurujesz zadanie, które automatycznie wstrzymuje i wznawia zadanie zgodnie z harmonogramem. Okres wstrzymania oznacza, że stan zadania to Zatrzymano, aby uniknąć naliczania opłat.

W tym artykule omówiono ogólny projekt, wymagane składniki i szczegóły implementacji.

Uwaga

Istnieją wady automatycznego wstrzymujące zadanie. Głównymi wadami są utrata możliwości małych opóźnień/w czasie rzeczywistym i potencjalne ryzyko związane z zezwoleniem na wzrost listy prac zdarzeń wejściowych w celu zwiększenia nienadzorowanej podczas wstrzymania zadania. Organizacje nie powinny uwzględniać automatycznego wstrzymania w przypadku większości scenariuszy produkcyjnych, które działają na dużą skalę.

Projektowanie

W tym przykładzie w tym artykule chcesz, aby zadanie było uruchamiane przez N minut przed wstrzymaniem go przez M minut. Po wstrzymaniu zadania dane wejściowe nie są używane i gromadzą się w górę. Po rozpoczęciu zadania dogoni ten zaległości i przetwarza szudżenie danych przed ponownym zamknięciem.

Diagram that illustrates the behavior of an automatically paused job over time.

Gdy zadanie jest uruchomione, zadanie nie powinno zatrzymać zadania, dopóki jego metryki nie będą w dobrej kondycji. Metryki zainteresowania są listą prac wejściowych i znakiem wodnym. Sprawdzisz, czy obie znajdują się w punkcie odniesienia przez co najmniej N minut. To zachowanie przekłada się na dwie akcje:

  • Zatrzymane zadanie jest uruchamiane ponownie po minucie M .
  • Uruchomione zadanie jest zatrzymywane w dowolnym momencie po N minutach, gdy tylko jego metryki listy prac i znaku wodnego są w dobrej kondycji.

Diagram that shows the possible states of a job.

Rozważmy na przykład, że N = 5 minut i M = 10 minut. W przypadku tych ustawień zadanie ma co najmniej 5 minut na przetworzenie wszystkich danych odebranych w 15. Potencjalne oszczędności kosztów wynoszą do 66%.

Aby ponownie uruchomić zadanie, użyj opcji Po zatrzymaniu ostatniegozatrzymania. Ta opcja informuje usługę Stream Analytics o przetworzeniu wszystkich zdarzeń, które zostały wycofane w górę od momentu zatrzymania zadania.

W tej sytuacji istnieją dwa zastrzeżenia. Najpierw zadanie nie może pozostać zatrzymane dłużej niż okres przechowywania strumienia wejściowego. Jeśli uruchamiasz zadanie tylko raz dziennie, musisz upewnić się, że okres przechowywania zdarzeń wynosi więcej niż jeden dzień. Po drugie, zadanie musi zostać uruchomione co najmniej raz, aby tryb Po ostatniej zatrzymaniu został zaakceptowany (lub inaczej dosłownie nigdy wcześniej nie został zatrzymany). Dlatego pierwsze uruchomienie zadania musi być ręczne lub trzeba rozszerzyć skrypt, aby obsłużyć ten przypadek.

Ostatnim zagadnieniem jest wykonanie tych akcji idempotentnych. Następnie można je powtórzyć bez skutków ubocznych, zarówno dla łatwości stosowania, jak i odporności.

Składniki

Wywołania interfejsu API

W tym artykule przewiduje się konieczność interakcji z usługą Stream Analytics w następujących aspektach:

  • Uzyskaj bieżący stan zadania (zarządzanie zasobami usługi Stream Analytics):
    • Jeśli zadanie jest uruchomione:
      • Uzyskaj czas od rozpoczęcia zadania (dzienniki).
      • Pobierz bieżące wartości metryk (metryki).
      • Jeśli ma to zastosowanie, zatrzymaj zadanie (zarządzanie zasobami usługi Stream Analytics).
    • Jeśli zadanie zostało zatrzymane:
      • Pobierz czas od zatrzymania zadania (dzienniki).
      • Jeśli ma to zastosowanie, uruchom zadanie (zarządzanie zasobami usługi Stream Analytics).

W przypadku zarządzania zasobami usługi Stream Analytics można użyć interfejsu API REST, zestawu SDK platformy .NET lub jednej z bibliotek interfejsu wiersza polecenia (interfejsu wiersza polecenia platformy Azure lub programu PowerShell).

W przypadku metryk i dzienników wszystko na platformie Azure jest scentralizowane w usłudze Azure Monitor z podobnym wyborem powierzchni interfejsu API. Dzienniki i metryki są zawsze od 1 do 3 minut po wysłaniu zapytania do interfejsów API. Dlatego ustawienie N na 5 zwykle oznacza, że zadanie działa od 6 do 8 minut w rzeczywistości.

Inną kwestią jest to, że metryki są zawsze emitowane. Po zatrzymaniu zadania interfejs API zwraca puste rekordy. Musisz wyczyścić dane wyjściowe wywołań interfejsu API, aby skoncentrować się na odpowiednich wartościach.

Język skryptów

W tym artykule zaimplementowane jest automatyczne wstrzymanie w programie PowerShell. Pierwszym powodem tego wyboru jest to, że program PowerShell jest teraz międzyplatformowy. Może działać w dowolnym systemie operacyjnym, co ułatwia wdrażanie. Drugą przyczyną jest to, że przyjmuje i zwraca obiekty, a nie ciągi. Obiekty ułatwiają analizowanie i przetwarzanie zadań automatyzacji.

W programie PowerShell użyj modułu Az programu PowerShell (który rozpoczyna moduł Az.Monitor i Az.StreamAnalytics), aby uzyskać wszystko, czego potrzebujesz:

Usługa hostingu

Do hostowania zadania programu PowerShell potrzebna jest usługa oferująca zaplanowane uruchomienia. Istnieje wiele opcji, ale poniżej przedstawiono dwie opcje bezserwerowe:

  • Azure Functions — aparat obliczeniowy, który może uruchamiać prawie każdy fragment kodu. Oferuje wyzwalacz czasomierza, który może działać do każdej sekundy.
  • Azure Automation, zarządzana usługa do obsługi obciążeń i zasobów w chmurze. Jego przeznaczenie jest odpowiednie, ale minimalny interwał harmonogramu wynosi 1 godzinę (mniej z obejściami).

Jeśli nie masz nic przeciwko obejściom, usługa Azure Automation jest łatwiejszym sposobem wdrożenia zadania. Jednak w tym artykule najpierw napiszesz skrypt lokalny, aby można było porównać. Po utworzeniu działającego skryptu należy wdrożyć go zarówno w usłudze Functions, jak i na koncie usługi Automation.

Narzędzia deweloperskie

Zdecydowanie zalecamy programowanie lokalne za pomocą programu Visual Studio Code w przypadku funkcji i usługi Stream Analytics. Użycie lokalnego środowiska deweloperskiego umożliwia korzystanie z kontroli źródła i ułatwia powtarzanie wdrożeń. Jednak ze względu na zwięzłość w tym artykule przedstawiono proces w witrynie Azure Portal.

Lokalne pisanie skryptu programu PowerShell

Najlepszym sposobem tworzenia skryptu jest lokalnie. Ponieważ program PowerShell jest międzyplatformowy, można napisać skrypt i przetestować go w dowolnym systemie operacyjnym. W systemie Windows można użyć Terminal Windows z programem PowerShell 7 i programem Azure PowerShell.

Końcowy skrypt używany w tym artykule jest dostępny dla usług Azure Functions i Azure Automation. Różni się on od poniższego skryptu, który jest podłączony do środowiska hostingu (Functions lub Automation). W tym artykule omówiono ten aspekt później. Najpierw należy przejść przez wersję skryptu, która działa tylko lokalnie.

Ten skrypt jest celowo napisany w prostej formie, więc każdy może go zrozumieć.

U góry ustawisz wymagane parametry i sprawdzisz stan zadania początkowego:


# Setting variables
$restartThresholdMinute = 10 # This is M
$stopThresholdMinute = 5 # This is N

$maxInputBacklog = 0 # The amount of backlog you tolerate when stopping the job (in event count, 0 is a good starting point)
$maxWatermark = 10 # The amount of watermark you tolerate when stopping the job (in seconds, 10 is a good starting point at low Streaming Units)

$subscriptionId = "<Replace with your Subscription Id - not the name>"
$resourceGroupName = "<Replace with your Resource Group Name>"
$asaJobName = "<Replace with your Stream Analytics job name>"

$resourceId = "/subscriptions/$($subscriptionId )/resourceGroups/$($resourceGroupName )/providers/Microsoft.StreamAnalytics/streamingjobs/$($asaJobName)"

# If not already logged, uncomment and run the two following commands:
# Connect-AzAccount
# Set-AzContext -SubscriptionId $subscriptionId

# Check current Stream Analytics job status
$currentJobState = Get-AzStreamAnalyticsJob  -ResourceGroupName $resourceGroupName -Name $asaJobName | Foreach-Object {$_.JobState}
Write-Output "asaRobotPause - Job $($asaJobName) is $($currentJobState)."

Jeśli zadanie jest uruchomione, sprawdź, czy zadanie zostało uruchomione co najmniej N minut. Sprawdzasz również listę prac i jej znak wodny.


# Switch state
if ($currentJobState -eq "Running")
{
    # First, look up the job start time with Get-AzActivityLog
    ## Get-AzActivityLog issues warnings about deprecation coming in future releases. Here you ignore them via -WarningAction Ignore.
    ## You check in 1,000 records of history, to make sure you're not missing what you're looking for. It might need adjustment for a job that has a lot of logging happening.
    ## There's a bug in Get-AzActivityLog that triggers an error when Select-Object First is in the same pipeline (on the same line). So you move it down.
    $startTimeStamp = Get-AzActivityLog -ResourceId $resourceId -MaxRecord 1000 -WarningAction Ignore | Where-Object {$_.EventName.Value -like "Start Job*"}
    $startTimeStamp = $startTimeStamp | Select-Object -First 1 | Foreach-Object {$_.EventTimeStamp}

    # Then gather the current metric values
    ## Get-AzMetric issues warnings about deprecation coming in future releases. Here you ignore them via -WarningAction Ignore.
    $currentBacklog = Get-AzMetric -ResourceId $resourceId -TimeGrain 00:01:00 -MetricName "InputEventsSourcesBacklogged" -DetailedOutput -WarningAction Ignore
    $currentWatermark = Get-AzMetric -ResourceId $resourceId -TimeGrain 00:01:00 -MetricName "OutputWatermarkDelaySeconds" -DetailedOutput -WarningAction Ignore

    # Metrics are always lagging 1-3 minutes behind, so grabbing the last N minutes actually means checking N+3. This might be overly safe and can be fine-tuned down per job.
    $Backlog =  $currentBacklog.Data |
                    Where-Object {$_.Maximum -ge 0} | # Remove the empty records (when the job is stopped or starting)
                    Sort-Object -Property Timestamp -Descending |
                    Where-Object {$_.Timestamp -ge $startTimeStamp} | # Keep only the records of the latest run
                    Select-Object -First $stopThresholdMinute | # Take the last N records
                    Measure-Object -Sum Maximum # Sum over those N records
    $BacklogSum = $Backlog.Sum

    $Watermark = $currentWatermark.Data |
                    Where-Object {$_.Maximum -ge 0} |
                    Sort-Object -Property Timestamp -Descending |
                    Where-Object {$_.Timestamp -ge $startTimeStamp} |
                    Select-Object -First $stopThresholdMinute |
                    Measure-Object -Average Maximum # Here you average
    $WatermarkAvg = [int]$Watermark.Average # Rounding the decimal value and casting it to integer

    # Because you called Get-AzMetric with a TimeGrain of a minute, counting the number of records gives you the duration in minutes
    Write-Output "asaRobotPause - Job $($asaJobName) is running since $($startTimeStamp) with a sum of $($BacklogSum) backlogged events, and an average watermark of $($WatermarkAvg) sec, for $($Watermark.Count) minutes."

    # -le for lesser or equal, -ge for greater or equal
    if (
        ($BacklogSum -ge 0) -and ($BacklogSum -le $maxInputBacklog) -and ` # is not null and is under the threshold
        ($WatermarkAvg -ge 0) -and ($WatermarkAvg -le $maxWatermark) -and ` # is not null and is under the threshold
        ($Watermark.Count -ge $stopThresholdMinute) # at least N values
        )
    {
        Write-Output "asaRobotPause - Job $($asaJobName) is stopping..."
        Stop-AzStreamAnalyticsJob -ResourceGroupName $resourceGroupName -Name $asaJobName
    }
    else {
        Write-Output "asaRobotPause - Job $($asaJobName) is not stopping yet, it needs to have less than $($maxInputBacklog) backlogged events and under $($maxWatermark) sec watermark for at least $($stopThresholdMinute) minutes."
    }
}

Jeśli zadanie zostało zatrzymane, sprawdź dziennik, aby sprawdzić, kiedy wystąpiła ostatnia Stop Job akcja:


elseif ($currentJobState -eq "Stopped")
{
    # First, look up the job start time with Get-AzActivityLog
    ## Get-AzActivityLog issues warnings about deprecation coming in future releases. Here you ignore them via -WarningAction Ignore.
    ## You check in 1,000 records of history, to make sure you're not missing what you're looking for. It might need adjustment for a job that has a lot of logging happening.
    ## There's a bug in Get-AzActivityLog that triggers an error when Select-Object First is in the same pipeline (on the same line). So you move it down.
    $stopTimeStamp = Get-AzActivityLog -ResourceId $resourceId -MaxRecord 1000 -WarningAction Ignore | Where-Object {$_.EventName.Value -like "Stop Job*"}
    $stopTimeStamp = $stopTimeStamp | Select-Object -First 1 | Foreach-Object {$_.EventTimeStamp}

    # Get-Date returns a local time. You project it to the same time zone (universal) as the result of Get-AzActivityLog that you extracted earlier.
    $minutesSinceStopped = ((Get-Date).ToUniversalTime()- $stopTimeStamp).TotalMinutes

    # -ge for greater or equal
    if ($minutesSinceStopped -ge $restartThresholdMinute)
    {
        Write-Output "asaRobotPause - Job $($jobName) was paused $([int]$minutesSinceStopped) minutes ago, set interval is $($restartThresholdMinute), it is now starting..."
        Start-AzStreamAnalyticsJob -ResourceGroupName $resourceGroupName -Name $asaJobName -OutputStartMode LastOutputEventTime
    }
    else{
        Write-Output "asaRobotPause - Job $($jobName) was paused $([int]$minutesSinceStopped) minutes ago, set interval is $($restartThresholdMinute), it will not be restarted yet."
    }
}
else {
    Write-Output "asaRobotPause - Job $($jobName) is not in a state I can manage: $($currentJobState). Let's wait a bit, but consider helping is that doesn't go away!"
}

Na końcu zarejestruj ukończenie zadania:


# Final Stream Analytics job status check
$newJobState = Get-AzStreamAnalyticsJob  -ResourceGroupName $resourceGroupName -Name $asaJobName | Foreach-Object {$_.JobState}
Write-Output "asaRobotPause - Job $($asaJobName) was $($currentJobState), is now $($newJobState). Job completed."

Opcja 1. Hostowanie zadania w usłudze Azure Functions

W celu uzyskania informacji zespół usługi Azure Functions utrzymuje wyczerpujący przewodnik dewelopera programu PowerShell.

Najpierw potrzebna jest nowa aplikacja funkcji. Aplikacja funkcji jest podobna do rozwiązania, które może hostować wiele funkcji.

Pełną procedurę można uzyskać, ale ist ma przejść w witrynie Azure Portal i utworzyć nową aplikację funkcji za pomocą polecenia:

  • Publikowanie: kod
  • Środowisko uruchomieniowe: PowerShell Core
  • Wersja: 7+

Po aprowizacji aplikacji funkcji rozpocznij od jej ogólnej konfiguracji.

Tożsamość zarządzana dla usługi Azure Functions

Funkcja musi mieć uprawnienia do uruchamiania i zatrzymywania zadania usługi Stream Analytics. Te uprawnienia są przypisywane przy użyciu tożsamości zarządzanej.

Pierwszym krokiem jest włączenie tożsamości zarządzanej przypisanej przez system dla funkcji, wykonując tę procedurę.

Teraz możesz udzielić odpowiednich uprawnień do tej tożsamości w zadaniu usługi Stream Analytics, które chcesz automatycznie wstrzymać. W tym zadaniu w obszarze portalu zadania usługi Stream Analytics (a nie funkcji) w obszarze Kontrola dostępu (zarządzanie dostępem i tożsamościami) dodaj przypisanie roli do roli Współautor dla członka typu Tożsamość zarządzana. Wybierz nazwę funkcji z wcześniejszej wersji.

Screenshot of access control settings for a Stream Analytics job.

W skrytecie programu PowerShell można dodać kontrolę, aby upewnić się, że tożsamość zarządzana jest ustawiona prawidłowo. (Ostatni skrypt jest dostępny w witrynie GitHub.)


# Check if a managed identity has been enabled and granted access to a subscription, resource group, or resource
$AzContext = Get-AzContext -ErrorAction SilentlyContinue
if (-not $AzContext.Subscription.Id)
{
    Throw ("Managed identity is not enabled for this app or it has not been granted access to any Azure resources. Please see /azure/app-service/overview-managed-identity for additional details.")
}

Dodaj informacje rejestrowania, aby upewnić się, że funkcja jest wyzwalana:


$currentUTCtime = (Get-Date).ToUniversalTime()

# Write an information log with the current time.
Write-Host "asaRobotPause - PowerShell timer trigger function is starting at time: $currentUTCtime"

Parametry usługi Azure Functions

Najlepszym sposobem przekazania parametrów do skryptu w usłudze Functions jest użycie ustawień aplikacji funkcji jako zmiennych środowiskowych.

Pierwszym krokiem jest wykonanie procedury w celu zdefiniowania parametrów jako app Ustawienia na stronie aplikacji funkcji. Należy wykonać:

Nazwa/nazwisko Wartość
maxInputBacklog Ilość zaległości tolerowanych podczas zatrzymywania zadania. W liczbie 0 zdarzeń jest dobrym punktem wyjścia.
maxWatermark Ilość znaku wodnego tolerowanego podczas zatrzymywania zadania. W sekundach 10 jest dobrym punktem wyjścia w przypadku niskich jednostek przesyłania strumieniowego.
restartThresholdMinute M: czas (w minutach) do momentu ponownego uruchomienia zatrzymanego zadania.
stopThresholdMinute N: czas (w minutach) ochładzania do momentu zatrzymania uruchomionego zadania. Zaległości wejściowe muszą pozostać w 0 tym czasie.
subscriptionId Identyfikator subskrypcji (a nie nazwa) zadania usługi Stream Analytics do automatycznego wstrzymania.
resourceGroupName Nazwa grupy zasobów zadania usługi Stream Analytics do automatycznego wstrzymania.
asaJobName Nazwa zadania usługi Stream Analytics do automatycznego wstrzymania.

Następnie zaktualizuj skrypt programu PowerShell, aby odpowiednio załadować zmienne:

$maxInputBacklog = $env:maxInputBacklog
$maxWatermark = $env:maxWatermark

$restartThresholdMinute = $env:restartThresholdMinute
$stopThresholdMinute = $env:stopThresholdMinute

$subscriptionId = $env:subscriptionId
$resourceGroupName = $env:resourceGroupName
$asaJobName = $env:asaJobName

Wymagania dotyczące modułu programu PowerShell

W ten sam sposób, w jaki trzeba było zainstalować program Azure PowerShell lokalnie, aby używać poleceń usługi Stream Analytics (na przykład Start-AzStreamAnalyticsJob), należy dodać go do hosta aplikacji funkcji:

  1. Na stronie aplikacji funkcji w obszarze Funkcje wybierz pozycję Pliki aplikacji, a następnie wybierz pozycję requirements.psd1.
  2. Usuń komentarz z wiersza 'Az' = '6.*'.
  3. Aby wprowadzić zmiany, uruchom ponownie aplikację.

Screenshot of the app files settings for the function app.

Tworzenie funkcji

Po zakończeniu tej konfiguracji możesz utworzyć określoną funkcję w aplikacji funkcji, aby uruchomić skrypt.

W portalu utwórz funkcję wyzwalaną przez czasomierz. Upewnij się, że funkcja jest wyzwalana co minutę za pomocą 0 */1 * * * *polecenia i czy odczytuje wartość "na sekundę co 0 co 1 minutę".

Screenshot of creating a new timer trigger function in a function app.

W razie potrzeby możesz zmienić wartość czasomierza w obszarze Integracja , aktualizując harmonogram.

Screenshot of the integration settings of a function.

Następnie w pliku Code + Test możesz skopiować skrypt w pliku run.ps1 i przetestować go. Możesz też skopiować pełny skrypt z usługi GitHub. Logika biznesowa została przeniesiona do instrukcji try/catch, aby wygenerować odpowiednie błędy, jeśli coś nie powiedzie się podczas przetwarzania.

Screenshot of the Code+Test pane for the function.

Możesz sprawdzić, czy wszystko działa prawidłowo, wybierając pozycję Testuj/Uruchom w okienku Kod i test . Możesz również sprawdzić okienko Monitorowanie , ale zawsze jest późno przez kilka wykonań.

Screenshot of the output of a successful run.

Ustawianie alertu dotyczącego wykonywania funkcji

Na koniec chcesz otrzymywać powiadomienia za pośrednictwem alertu, jeśli funkcja nie zostanie pomyślnie uruchomiona. Alerty mają niewielki koszt, ale mogą zapobiegać droższym sytuacjom.

Na stronie aplikacji funkcji w obszarze Dzienniki uruchom następujące zapytanie. Zwraca wszystkie nieudane przebiegi w ciągu ostatnich 5 minut.

requests
| where success == false
| where timestamp > ago(5min)
| summarize failedCount=sum(itemCount) by operation_Name
| order by failedCount desc

W edytorze zapytań wybierz pozycję Nowa reguła alertu. W otwartym okienku zdefiniuj miarę jako:

  • Miara: failedCount
  • Typ agregacji: Suma
  • Stopień szczegółowości agregacji: 5 minut

Następnie skonfiguruj logikę alertu w następujący sposób:

  • Operator: większe niż
  • Wartość progowa: 0
  • Częstotliwość oceny: 5 minut

W tym miejscu użyj ponownie lub utwórz nową grupę akcji. Następnie ukończ konfigurację.

Aby sprawdzić, czy alert został prawidłowo skonfigurowany, możesz dodać throw "Testing the alert" go w dowolnym miejscu skryptu programu PowerShell, a następnie poczekać 5 minut na odebranie wiadomości e-mail.

Opcja 2. Hostowanie zadania w usłudze Azure Automation

Najpierw potrzebne jest nowe konto usługi Automation. Konto usługi Automation jest podobne do rozwiązania, które może hostować wiele elementów Runbook.

Aby zapoznać się z procedurą, zobacz Przewodnik Szybki start Tworzenie konta usługi Automation przy użyciu witryny Azure Portal . Możesz użyć tożsamości zarządzanej przypisanej przez system bezpośrednio na karcie Zaawansowane .

Aby uzyskać informacje referencyjne, zespół usługi Automation zawiera samouczek dotyczący rozpoczynania pracy z elementami Runbook programu PowerShell.

Parametry dla usługi Azure Automation

Za pomocą elementu Runbook można użyć klasycznej składni parametrów programu PowerShell do przekazywania argumentów:

Param(
    [string]$subscriptionId,
    [string]$resourceGroupName,
    [string]$asaJobName,

    [int]$restartThresholdMinute,
    [int]$stopThresholdMinute,

    [int]$maxInputBacklog,
    [int]$maxWatermark
)

Tożsamość zarządzana dla usługi Azure Automation

Konto usługi Automation powinno otrzymać tożsamość zarządzaną podczas aprowizacji. W razie potrzeby można jednak włączyć tożsamość zarządzaną przy użyciu tej procedury.

Podobnie jak w przypadku funkcji, musisz przyznać odpowiednie uprawnienia do zadania usługi Stream Analytics, które chcesz automatycznie wstrzymać.

Aby przyznać uprawnienia, w obszarze portalu dla zadania usługi Stream Analytics (a nie strony automatyzacji) w obszarze Kontrola dostępu (IAM) dodaj przypisanie roli do roli Współautor dla członka typu Tożsamość zarządzana. Wybierz nazwę konta usługi Automation z wcześniejszej wersji.

Screenshot of access control settings for a Stream Analytics job.

W skrytecie programu PowerShell można dodać kontrolę, aby upewnić się, że tożsamość zarządzana jest ustawiona prawidłowo. (Ostatni skrypt jest dostępny w witrynie GitHub.)

# Ensure that you don't inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process | Out-Null

# Connect by using a managed service identity
try {
        $AzureContext = (Connect-AzAccount -Identity).context
    }
catch{
        Write-Output "There is no system-assigned user identity. Aborting.";
        exit
    }

Tworzenie elementu Runbook

Po zakończeniu konfiguracji możesz utworzyć określony element Runbook na koncie usługi Automation, aby uruchomić skrypt. W tym miejscu nie musisz dodawać programu Azure PowerShell jako wymagania. Jest już wbudowany.

W portalu w obszarze Automatyzacja procesów wybierz pozycję Elementy Runbook. Następnie wybierz pozycję Utwórz element Runbook, wybierz program PowerShell jako typ elementu Runbook i wybierz dowolną wersję powyżej 7 jako wersję (w tej chwili 7.1 (wersja zapoznawcza)).

Teraz możesz wkleić skrypt i przetestować go. Pełny skrypt można skopiować z usługi GitHub. Logika biznesowa została przeniesiona do instrukcji try/catch, aby wygenerować odpowiednie błędy, jeśli coś nie powiedzie się podczas przetwarzania.

Screenshot of the runbook script editor in Azure Automation.

Możesz sprawdzić, czy wszystko jest prawidłowo połączone w okienku testu.

Następnie należy opublikować zadanie (wybierając pozycję Publikuj), aby można było połączyć element Runbook z harmonogramem. Tworzenie i łączenie harmonogramu jest prostym procesem. Teraz warto pamiętać, że istnieją obejścia umożliwiające osiągnięcie interwałów harmonogramu poniżej 1 godziny.

Na koniec możesz skonfigurować alert. Pierwszym krokiem jest włączenie dzienników przy użyciu ustawień diagnostycznych konta usługi Automation. Drugim krokiem jest przechwycenie błędów przy użyciu zapytania, takiego jak w przypadku funkcji.

Wynik

W zadaniu usługi Stream Analytics możesz sprawdzić, czy wszystko działa zgodnie z oczekiwaniami w dwóch miejscach.

Oto dziennik aktywności:

Screenshot of the logs of the Stream Analytics job.

Oto metryki:

Screenshot of the metrics of the Stream Analytics job.

Po zrozumieniu skryptu przerobienie go w celu rozszerzenia zakresu jest prostym zadaniem. Skrypt można łatwo zaktualizować tak, aby był przeznaczony dla listy zadań zamiast pojedynczej. Można definiować i przetwarzać większe zakresy przy użyciu tagów, grup zasobów, a nawet całych subskrypcji.

Uzyskiwanie pomocy technicznej

Aby uzyskać dalszą pomoc, wypróbuj stronę pytań i pytań firmy Microsoft dla usługi Azure Stream Analytics.

Następne kroki

Poznaliśmy podstawy używania programu PowerShell do automatyzowania zarządzania zadaniami usługi Azure Stream Analytics. Więcej informacji można znaleźć w następujących artykułach: