如何定时执行PowerShell脚本向Azure Log Analytics上报连接状态?
实现自定义Azure连接状态监控并定时上报至Log Analytics
下面分步骤说明如何完成脚本开发、定时执行和数据上报:
1. 准备Log Analytics必要信息
首先从Azure门户获取你的Log Analytics工作区的两个关键信息:
- 工作区ID:进入Log Analytics工作区 → 左侧「代理管理」→ 复制「工作区ID」
- 主键:同样在「代理管理」页面,复制「主键」(建议用环境变量或密钥管理存储,避免硬编码在脚本中)
2. 完善PowerShell脚本的上报逻辑
你的脚本需要先通过Azure CLI获取连接状态,再将数据格式化为Log Analytics接受的格式,通过Data Collector API上报。以下是示例框架:
# -------------------------- # 1. 获取Azure服务连接状态(替换为你的实际Azure CLI命令) # -------------------------- # 示例:假设你监控的是特定服务的连接信息,替换成你的查询命令 $connectionData = az your-service connection list --resource-group your-rg --query "[].{Name:name, Status:properties.status, UpdateTime:properties.lastModifiedTime}" -o json | ConvertFrom-Json # -------------------------- # 2. 配置Log Analytics参数 # -------------------------- $workspaceId = $env:LOG_ANALYTICS_WORKSPACE_ID # 从环境变量读取,避免硬编码 $workspaceKey = $env:LOG_ANALYTICS_WORKSPACE_KEY $customLogType = "AzureServiceConnectionStatus" # 自定义日志名称,后续查询用 # -------------------------- # 3. 构造符合要求的上报数据 # -------------------------- $timestamp = Get-Date -Format "yyyy-MM-ddTHH:mm:ss.fffZ" $events = $connectionData | ForEach-Object { [PSCustomObject]@{ TimeGenerated = $timestamp ServiceName = "your-target-service" # 可动态获取服务名称 ConnectionName = $_.Name ConnectionStatus = $_.Status LastUpdated = $_.UpdateTime Region = "eastus" # 可动态获取服务区域 } } $jsonPayload = $events | ConvertTo-Json -Depth 10 # -------------------------- # 4. 调用Log Analytics Data Collector API上报 # -------------------------- $method = "POST" $contentType = "application/json" $resource = "/api/logs" $rfc1123date = [DateTime]::UtcNow.ToString("r") $contentLength = $jsonPayload.Length # 生成授权签名 $stringToHash = "$method`n$contentLength`n$contentType`nx-ms-date:$rfc1123date`n$resource" $bytesToHash = [Text.Encoding]::UTF8.GetBytes($stringToHash) $keyBytes = [Convert]::FromBase64String($workspaceKey) $hmacsha256 = New-Object System.Security.Cryptography.HMACSHA256 $hmacsha256.Key = $keyBytes $calculatedHash = $hmacsha256.ComputeHash($bytesToHash) $encodedHash = [Convert]::ToBase64String($calculatedHash) $authorization = "SharedKey $workspaceId`:$encodedHash" # 发送请求 $uri = "https://$workspaceId.ods.opinsights.azure.com$resource?api-version=2016-04-01" $headers = @{ "Authorization" = $authorization "Log-Type" = $customLogType "x-ms-date" = $rfc1123date "time-generated-field" = "TimeGenerated" } try { Invoke-RestMethod -Uri $uri -Method $method -Headers $headers -ContentType $contentType -Body $jsonPayload Write-Host "数据上报成功" } catch { Write-Error "上报失败:$_" }
3. 定时执行脚本的三种方案
方案1:Azure Automation(全托管,推荐)
- 新建Azure Automation账户,启用系统分配托管身份,并给该身份分配读取目标Azure服务的权限(如
Reader角色)。 - 在Automation账户中创建PowerShell Runbook,粘贴上述脚本,将工作区ID和主键存储在Automation的「变量」中,脚本中用
Get-AzAutomationVariable读取。 - 配置计划:设置执行频率(如每小时一次),将计划关联到Runbook。
- 注意:在Automation中需确保已安装Azure CLI模块,或用
az login --identity通过托管身份自动登录Azure。
方案2:Windows任务计划程序(本地/虚拟机)
- 打开「任务计划程序」,创建基本任务:
- 触发器:设置定时执行的频率(如每天、每小时)。
- 操作:选择「启动程序」,程序路径填
powershell.exe,参数填-ExecutionPolicy Bypass -File "C:\Scripts\你的脚本路径.ps1"。 - 权限:确保执行任务的账户已通过
az login完成Azure身份验证(或用服务主体:az login --service-principal -u <客户端ID> -p <客户端密钥> --tenant <租户ID>)。
方案3:Azure Functions(按需执行,低成本)
- 创建PowerShell类型的Azure Function,触发方式选Timer Trigger,设置定时表达式(如
0 */5 * * * *代表每5分钟执行一次)。 - 将工作区ID和主键存储在Function的「应用设置」中,脚本中用
$env:WORKSPACE_ID读取。 - 给Function的托管身份分配目标Azure服务的读取权限,脚本中用
az login --identity自动登录。
4. 验证数据上报
上报后等待10-15分钟,在Log Analytics工作区中执行查询:
AzureServiceConnectionStatus_CL | take 10 | project TimeGenerated, ServiceName, ConnectionName, ConnectionStatus
如果能返回数据,说明上报成功。
内容的提问来源于stack exchange,提问作者R. Maier
相关产品推荐
相关产品推荐

