You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定时执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:17:09