Menjeda pekerjaan secara otomatis dengan menggunakan PowerShell dan Azure Functions atau Azure Automation

Beberapa aplikasi memerlukan pendekatan pemrosesan aliran (seperti melalui Azure Stream Analytics) tetapi tidak perlu berjalan terus menerus. Alasan tersebut antara lain:

  • Input data yang tiba sesuai jadwal (misalnya, di atas jam)
  • Volume data masuk yang jarang atau rendah (beberapa rekaman per menit)
  • Proses bisnis yang mendapat manfaat dari kemampuan jendela waktu tetapi berjalan dalam batch berdasarkan esensi (misalnya, keuangan atau SDM)
  • Demonstrasi, prototipe, atau pengujian yang melibatkan pekerjaan jangka panjang dalam skala rendah

Manfaat tidak menjalankan pekerjaan ini terus menerus adalah penghematan biaya, karena pekerjaan Azure Stream Analytics ditagih per Unit Streaming dari waktu ke waktu.

Artikel ini menjelaskan cara menyiapkan jeda otomatis untuk pekerjaan Azure Stream Analytics. Anda mengonfigurasi tugas yang secara otomatis menjeda dan melanjutkan pekerjaan sesuai jadwal. Istilah jeda berarti bahwa status pekerjaan Dihentikan untuk menghindari penagihan apa pun.

Artikel ini membahas desain keseluruhan, komponen yang diperlukan, dan beberapa detail implementasi.

Note

Ada kelemahan untuk menjeda pekerjaan secara otomatis. Kelemahan utama adalah hilangnya kemampuan latensi rendah/real-time dan potensi risiko dari memungkinkan backlog peristiwa input tumbuh tanpa pengawasan saat pekerjaan dijeda. Organisasi tidak boleh mempertimbangkan jeda otomatis untuk sebagian besar skenario produksi yang berjalan dalam skala besar.

Design

Untuk contoh dalam artikel ini, Anda ingin pekerjaan Anda berjalan selama N menit sebelum menjedanya selama M menit. Saat pekerjaan dijeda, data input tidak digunakan dan mengakumulasi hulu. Setelah pekerjaan dimulai, ia mengejar ketinggalan dengan backlog itu dan memproses data yang menetes sebelum dimatikan lagi.

Diagram yang mengilustrasikan perilaku pekerjaan yang dijeda secara otomatis dari waktu ke waktu.

Ketika pekerjaan berjalan, tugas tidak boleh menghentikan pekerjaan sampai metriknya sehat. Metrik yang menarik adalah backlog input dan marka air. Anda akan memeriksa bahwa keduanya berada di garis besar mereka setidaknya selama N menit. Perilaku ini diterjemahkan ke dua tindakan:

  • Pekerjaan yang dihentikan dimulai ulang setelah M menit.
  • Pekerjaan yang sedang berjalan dihentikan kapan saja setelah N menit, segera setelah metrik backlog dan marka airnya sehat.

Diagram yang menunjukkan kemungkinan status pekerjaan.

Sebagai contoh, pertimbangkan bahwa N = 5 menit dan M = 10 menit. Dengan pengaturan ini, pekerjaan memiliki setidaknya 5 menit untuk memproses semua data yang diterima dalam 15. Potensi penghematan biaya hingga 66%.

Untuk memulai ulang pekerjaan, gunakan opsi MulaiKapan Terakhir Dihentikan. Opsi ini memberi tahu Stream Analytics untuk memproses semua peristiwa yang di-backlogg upstream sejak pekerjaan dihentikan.

Ada dua peringatan dalam situasi ini. Pertama, pekerjaan tidak dapat dihentikan lebih lama dari periode retensi aliran input. Jika Anda menjalankan pekerjaan hanya sekali sehari, Anda perlu memastikan bahwa periode retensi untuk peristiwa lebih dari satu hari. Kedua, pekerjaan harus dimulai setidaknya sekali untuk mode Ketika Terakhir Dihentikan untuk diterima (atau jika tidak, itu benar-benar belum pernah dihentikan sebelumnya). Jadi eksekusi pertama pekerjaan perlu manual, atau Anda perlu memperluas skrip untuk menutupi kasus tersebut.

Pertimbangan terakhir adalah membuat tindakan ini idempotensi. Anda kemudian dapat mengulanginya sesering mungkin tanpa efek samping, untuk kemudahan penggunaan dan ketahanan.

Components

Panggilan API

Artikel ini mengantisipasi kebutuhan untuk berinteraksi dengan Azure Stream Analytics pada aspek-aspek berikut:

  • Dapatkan status pekerjaan saat ini (manajemen sumber daya Azure Stream Analytics):
    • Jika pekerjaan sedang berjalan:
      • Dapatkan waktu sejak pekerjaan dimulai (log).
      • Dapatkan nilai metrik saat ini (metrik).
      • Jika berlaku, hentikan pekerjaan (manajemen sumber daya Azure Stream Analytics).
    • Jika pekerjaan dihentikan:
      • Dapatkan waktu sejak pekerjaan berhenti (log).
      • Jika berlaku, mulai pekerjaan (manajemen sumber daya Azure Stream Analytics).

Untuk manajemen sumber daya Azure Stream Analytics, Anda dapat menggunakan REST API, .NET SDK, atau salah satu pustaka CLI (Azure CLI atau PowerShell).

Untuk metrik dan log, semua yang ada di Azure dipusatkan di bawah Azure Monitor, dengan pilihan permukaan API yang sama. Log dan metrik selalu tertinggal 1 hingga 3 menit saat Anda mengkueri API. Jadi pengaturan N pada 5 biasanya berarti pekerjaan berjalan 6 hingga 8 menit pada kenyataannya.

Pertimbangan lain adalah bahwa metrik selalu dipancarkan. Ketika pekerjaan dihentikan, API mengembalikan rekaman kosong. Anda harus membersihkan output panggilan API Anda untuk fokus pada nilai yang relevan.

Bahasa pembuatan skrip

Artikel ini menerapkan jeda otomatis di PowerShell. Alasan pertama untuk pilihan ini adalah bahwa PowerShell sekarang lintas platform. Ini dapat berjalan pada sistem operasi apa pun, yang membuat penyebaran lebih mudah. Alasan kedua adalah bahwa ia mengambil dan mengembalikan objek daripada string. Objek membuat penguraian dan pemrosesan lebih mudah untuk tugas otomatisasi.

Di PowerShell, gunakan modul Az PowerShell (yang memulai Az.Monitor dan Az.StreamAnalytics) untuk semua yang Anda butuhkan:

Layanan hosting

Untuk menghosting tugas PowerShell, Anda memerlukan layanan yang menawarkan eksekusi terjadwal. Ada banyak opsi, tetapi berikut adalah dua opsi tanpa server:

  • Azure Functions, mesin komputasi yang dapat menjalankan hampir semua bagian kode. Ini menawarkan pemicu timer yang dapat berjalan hingga setiap detik.
  • Azure Automation, layanan terkelola untuk mengoperasikan beban kerja dan sumber daya cloud. Tujuannya sesuai, tetapi interval jadwal minimalnya adalah 1 jam (kurang dengan solusi).

Jika Anda tidak keberatan dengan solusinya, Azure Automation adalah cara yang lebih mudah untuk menyebarkan tugas. Tetapi dalam artikel ini, Anda menulis skrip lokal terlebih dahulu sehingga Anda dapat membandingkan. Setelah Anda memiliki skrip yang berfungsi, Anda menyebarkannya baik di Functions maupun di akun Automation.

Alat pengembang

Kami sangat merekomendasikan pengembangan lokal melalui Visual Studio Code, untuk Functions dan Stream Analytics. Menggunakan lingkungan pengembangan lokal memungkinkan Anda menggunakan kontrol sumber dan membantu Anda mengulangi penyebaran dengan mudah. Tetapi demi kesederhanaan, artikel ini menggambarkan proses di portal Microsoft Azure.

Menulis skrip PowerShell secara lokal

Cara terbaik untuk mengembangkan skrip adalah secara lokal. Karena PowerShell adalah lintas platform, Anda dapat menulis skrip dan mengujinya pada sistem operasi apa pun. Di Windows, Anda dapat menggunakan Terminal Windows dengan PowerShell 7 dan Azure PowerShell.

Skrip akhir yang digunakan artikel ini tersedia untuk Azure Functions dan Azure Automation. Ini berbeda dari skrip berikut karena kabelnya ke lingkungan hosting (Functions atau Automation). Artikel ini membahas aspek tersebut nanti. Pertama, Anda menelusuri versi skrip yang hanya berjalan secara lokal.

Skrip ini sengaja ditulis dalam bentuk sederhana, sehingga semua orang dapat memahaminya.

Di bagian atas, Anda mengatur parameter yang diperlukan dan memeriksa status pekerjaan awal:


# 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)."

Jika pekerjaan berjalan, Anda kemudian memeriksa apakah pekerjaan telah berjalan setidaknya N menit. Anda juga memeriksa backlog dan marka airnya.


# 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."
    }
}

Jika pekerjaan dihentikan, periksa log untuk menemukan kapan tindakan terakhir Stop Job terjadi:


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!"
}

Di akhir, catat penyelesaian pekerjaan:


# 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."

Opsi 1: Menghosting tugas di Azure Functions

Sebagai referensi, tim Azure Functions mempertahankan panduan pengembang PowerShell yang lengkap.

Pertama, Anda memerlukan aplikasi fungsi baru. Aplikasi fungsi mirip dengan solusi yang dapat menghosting beberapa fungsi.

Anda bisa mendapatkan prosedur penuh, tetapi intinya adalah masuk ke portal Microsoft Azure dan membuat aplikasi fungsi baru dengan:

  • Terbitkan: Kode
  • Runtime: PowerShell Core
  • Versi: 7+

Setelah Anda memprovisikan aplikasi fungsi, mulailah dengan konfigurasi keseluruhannya.

Identitas terkelola untuk Azure Functions

Fungsi ini memerlukan izin untuk memulai dan menghentikan pekerjaan Azure Stream Analytics. Anda menetapkan izin ini dengan menggunakan identitas terkelola.

Langkah pertama adalah mengaktifkan identitas terkelola yang ditetapkan sistem untuk fungsi tersebut, dengan mengikuti prosedur ini.

Sekarang Anda dapat memberikan izin yang tepat untuk identitas tersebut pada pekerjaan Azure Stream Analytics yang ingin Anda jeda secara otomatis. Untuk tugas ini, di area portal untuk pekerjaan Azure Stream Analytics (bukan fungsi), di Kontrol akses (IAM), tambahkan penetapan peran ke kontributor peran untuk anggota jenis Identitas Terkelola. Pilih nama fungsi dari sebelumnya.

Cuplikan layar pengaturan kontrol akses untuk pekerjaan Azure Stream Analytics.

Di skrip PowerShell, Anda dapat menambahkan pemeriksaan untuk memastikan bahwa identitas terkelola diatur dengan benar. (Skrip akhir tersedia di 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.")
}

Tambahkan beberapa info pengelogan untuk memastikan bahwa fungsi diaktifkan:


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

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

Parameter untuk Azure Functions

Cara terbaik untuk meneruskan parameter Anda ke skrip di Functions adalah dengan menggunakan pengaturan aplikasi aplikasi fungsi sebagai variabel lingkungan.

Langkah pertama adalah mengikuti prosedur untuk menentukan parameter Anda sebagai Pengaturan Aplikasi di halaman untuk aplikasi fungsi. Kamu butuh:

Name Value
maxInputBacklog Jumlah backlog yang Anda toleransi saat menghentikan pekerjaan. Dalam jumlah peristiwa, 0 adalah titik awal yang baik.
maxWatermark Jumlah marka air yang Anda toleransi saat menghentikan pekerjaan. Dalam detik, 10 adalah titik awal yang baik di Unit Streaming rendah.
restartThresholdMinute M: Waktu (dalam menit) hingga pekerjaan yang dihentikan dimulai ulang.
stopThresholdMinute N: Waktu (dalam menit) cooldown hingga pekerjaan yang sedang berjalan dihentikan. Backlog input perlu tetap berada di 0 selama waktu tersebut.
subscriptionId ID langganan (bukan nama) pekerjaan Azure Stream Analytics untuk dijeda secara otomatis.
resourceGroupName Nama grup sumber daya pekerjaan Azure Stream Analytics untuk dijeda secara otomatis.
asaJobName Nama pekerjaan Azure Stream Analytics yang akan dijeda secara otomatis.

Kemudian, perbarui skrip PowerShell Anda untuk memuat variabel yang sesuai:

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

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

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

Persyaratan modul PowerShell

Cara yang sama seperti Anda harus menginstal Azure PowerShell secara lokal untuk menggunakan perintah Azure Stream Analytics (seperti Start-AzStreamAnalyticsJob), Anda perlu menambahkannya ke host aplikasi fungsi:

  1. Pada halaman untuk aplikasi fungsi, di bawah Fungsi, pilih File aplikasi, lalu pilih requirements.psd1.
  2. Batalkan komentar baris 'Az' = '6.*'.
  3. Untuk membuat perubahan tersebut berlaku, mulai ulang aplikasi.

Cuplikan layar pengaturan file aplikasi untuk aplikasi fungsi.

Membuat fungsi

Setelah menyelesaikan semua konfigurasi tersebut, Anda dapat membuat fungsi tertentu di dalam aplikasi fungsi untuk menjalankan skrip.

Di portal, kembangkan fungsi yang dipicu pada timer. Pastikan bahwa fungsi dipicu setiap menit dengan 0 */1 * * * *, dan berbunyi "pada detik 0 setiap 1 menit."

Cuplikan layar membuat fungsi pemicu timer baru di aplikasi fungsi.

Jika perlu, Anda dapat mengubah nilai timer dalam Integrasi dengan memperbarui jadwal.

Cuplikan layar pengaturan integrasi fungsi.

Kemudian, di Kode + Uji, Anda dapat menyalin skrip Anda di run.ps1 dan mengujinya. Atau Anda dapat menyalin skrip lengkap dari GitHub. Logika bisnis dipindahkan ke pernyataan try/catch untuk menghasilkan kesalahan yang tepat jika ada yang gagal selama pemrosesan.

Cuplikan layar panel Kode+Uji untuk fungsi tersebut.

Anda dapat memeriksa apakah semuanya berjalan dengan baik dengan memilih Uji/Jalankan pada panel Kode + Uji . Anda juga dapat memeriksa panel Monitor , tetapi selalu terlambat oleh beberapa eksekusi.

Cuplikan layar output dari eksekusi yang berhasil.

Mengatur pemberitahuan tentang eksekusi fungsi

Terakhir, Anda ingin diberi tahu melalui pemberitahuan jika fungsi tidak berhasil dijalankan. Pemberitahuan memiliki biaya kecil, tetapi mungkin mencegah situasi yang lebih mahal.

Pada halaman untuk aplikasi fungsi, di bawah Log, jalankan kueri berikut. Ini mengembalikan semua eksekusi yang tidak berhasil dalam 5 menit terakhir.

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

Di editor kueri, pilih Aturan pemberitahuan baru. Pada panel yang terbuka, tentukan Pengukuran sebagai:

  • Ukuran: failedCount
  • Jenis Agregasi: Total
  • Granularitas agregasi: 5 menit

Selanjutnya, siapkan logika Pemberitahuan sebagai berikut:

  • Operator: Lebih besar dari
  • Nilai ambang batas: 0
  • Frekuensi evaluasi: 5 menit

Dari sana, gunakan kembali atau buat grup tindakan baru. Kemudian selesaikan konfigurasi.

Untuk memeriksa apakah Anda menyiapkan pemberitahuan dengan benar, Anda dapat menambahkan throw "Testing the alert" di mana saja di skrip PowerShell lalu menunggu 5 menit untuk menerima email.

Opsi 2: Menghosting tugas di Azure Automation

Pertama, Anda memerlukan akun Automation baru. Akun Automation mirip dengan solusi yang dapat menghosting beberapa runbook.

Untuk prosedur ini, lihat mulai cepat Membuat akun Automation menggunakan portal Microsoft Azure . Anda dapat memilih untuk menggunakan identitas terkelola yang ditetapkan sistem langsung pada tab Tingkat Lanjut .

Sebagai referensi, tim Automation memiliki tutorial untuk memulai runbook PowerShell.

Parameter untuk Azure Automation

Dengan runbook, Anda dapat menggunakan sintaks parameter klasik PowerShell untuk meneruskan argumen:

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

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

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

Identitas terkelola untuk Azure Automation

Akun Automation seharusnya telah menerima identitas terkelola selama provisi. Tetapi jika perlu, Anda dapat mengaktifkan identitas terkelola dengan menggunakan prosedur ini.

Seperti yang Anda lakukan untuk fungsi ini, Anda perlu memberikan izin yang tepat pada pekerjaan Azure Stream Analytics yang ingin Anda jeda secara otomatis.

Untuk memberikan izin, di area portal untuk pekerjaan Azure Stream Analytics (bukan halaman Automation), di Kontrol akses (IAM), tambahkan penetapan peran ke peran Kontributor untuk anggota jenis Identitas Terkelola. Pilih nama akun Automation dari sebelumnya.

Cuplikan layar pengaturan kontrol akses untuk pekerjaan Azure Stream Analytics.

Di skrip PowerShell, Anda dapat menambahkan pemeriksaan untuk memastikan bahwa identitas terkelola diatur dengan benar. (Skrip akhir tersedia di 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
    }

Membuat runbook

Setelah menyelesaikan konfigurasi, Anda dapat membuat runbook tertentu di dalam akun Automation untuk menjalankan skrip Anda. Di sini, Anda tidak perlu menambahkan Azure PowerShell sebagai persyaratan. Ini sudah dibangun.

Di portal, di bawah Otomatisasi Proses, pilih Runbook. Lalu pilih Buat runbook, pilih PowerShell sebagai jenis runbook, dan pilih versi apa pun di atas 7 sebagai versi (saat ini, 7.1 (pratinjau)).

Anda sekarang dapat menempelkan skrip Anda dan mengujinya. Anda dapat menyalin skrip lengkap dari GitHub. Logika bisnis dipindahkan ke pernyataan try/catch untuk menghasilkan kesalahan yang tepat jika ada yang gagal selama pemrosesan.

Cuplikan layar editor skrip runbook di Azure Automation.

Anda dapat memeriksa apakah semuanya terhubung dengan benar di panel Uji.

Setelah itu, Anda perlu menerbitkan pekerjaan (dengan memilih Terbitkan) sehingga Anda dapat menautkan runbook ke jadwal. Membuat dan menautkan jadwal adalah proses yang mudah. Sekarang adalah waktu yang tepat untuk mengingat bahwa ada solusi untuk mencapai interval jadwal di bawah 1 jam.

Terakhir, Anda dapat menyiapkan pemberitahuan. Langkah pertama adalah mengaktifkan log dengan menggunakan pengaturan diagnostik akun Automation. Langkah kedua adalah menangkap kesalahan dengan menggunakan kueri seperti yang Anda lakukan untuk Functions.

Outcome

Dalam pekerjaan Azure Stream Analytics, Anda dapat memverifikasi bahwa semuanya berjalan seperti yang diharapkan di dua tempat.

Berikut adalah log aktivitas:

Cuplikan layar log pekerjaan Azure Stream Analytics.

Dan berikut adalah metriknya:

Cuplikan layar metrik pekerjaan Azure Stream Analytics.

Setelah Anda memahami skrip, mengerjakannya ulang untuk memperluas cakupannya adalah tugas yang mudah. Anda dapat dengan mudah memperbarui skrip untuk menargetkan daftar pekerjaan alih-alih satu. Anda dapat menentukan dan memproses cakupan yang lebih besar dengan menggunakan tag, grup sumber daya, atau bahkan seluruh langganan.

Dapatkan dukungan

Untuk bantuan lebih lanjut, coba halaman Tanya Jawab Microsoft untuk Azure Stream Analytics.

Langkah selanjutnya

Anda mempelajari dasar-dasar penggunaan PowerShell untuk mengotomatiskan manajemen pekerjaan Azure Stream Analytics. Untuk mempelajari selengkapnya, lihat artikel berikut ini: