Azure函数应用程序Powershell触发两次/三次

时间:2019-11-14 10:08:27

标签: azure powershell azure-functions

我收到了一个Azure警报,其中包含一个包含我的Azure Function应用程序的操作组。
功能应用已列入消费计划
但是,当发出1条警报时,我得到两个,有时三个功能应用程序的答复。目前正在使用电子邮件进行测试,但是可以是Teams / Slack / Twilio或其他

我已经检查了我的代码几次,但是找不到为什么它多次运行。
难道这是一个冷门问题?
我不应该超时,因为它会在几秒钟内完成
我需要以下代码块吗?

Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = $status
})

例如警报触发时间为11/14/2019,4:59:02 AM
该功能应用产生了三个答复:

  • 05:00
  • 05:00
  • 05:01
using namespace System.Net
using namespace System.Web

# Input bindings are passed in via param block.
param($Request) 
# Write to the Azure Functions log stream.
$alert = $Request.RawBody | convertfrom-json

function New-TypeTable([object[]]$columns)
{
    $hash = [ordered]@{}
    foreach ($c in $columns)
    {
        switch ($c.type)
        {
            "datetime" { $type = [datetime] }
            "real" { $type = [decimal] }
            default { $type = [string] }
        }
        $hash.Add($c.name, $type)
    }
    $hash
}

function Set-Culture([System.Globalization.CultureInfo] $culture)
{
    [System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture
    [System.Threading.Thread]::CurrentThread.CurrentCulture = $culture
}

#Set locale to swedish for datetime
Set-Culture sv-SE
#Set variables for later use
$alertRule = $alert.data.essentials.alertRule
$alertDescription = $alert.data.essentials.description
$tables = $alert.data.alertContext.SearchResults.tables

foreach ($table in $tables)
{
    $cHash = New-TypeTable -columns $table.columns
    [string[]]$keys = $cHash.Keys
    $tableInfo = foreach ($row in $table.rows)
    {
        $psObj = New-Object PSObject
        for ($i = 0; $i -lt $row.Count; $i++)
        {
            $value = $row[$i]
            $type = $cHash[$i]
            #Round the value of AggregatedValue and CounterValue
            if ($keys[$i] -eq "AggregatedValue" -Or $keys[$i] -eq "CounterValue") {
                $value = [math]::Round($value,1)
            }
            #Set the value of TimeGenerated to a specific format
            if ($keys[$i] -eq "TimeGenerated") {
                $value = "{0:yyyy-MM-dd HH:mm:ss}" -f $value
            }
            #Don't add Null values
            if($value) {
                $psObj | Add-Member -MemberType NoteProperty -Name $keys[$i] -Value ($value -as $type)
            }
        }
        $psObj
    }
}
#Write-Information $tableInfo -verbose
$Header = @"
<style>
TABLE {width: 750px; border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@
#Create HTML-table from the object
$Body = $tableInfo | ConvertTo-Html -head $Header

我已经向函数添加了RunOnStartup = false,没有区别。好像它被警报触发了三次。但是警报仅触发一次。

DATE (UTC) SUCCESS RESULT CODE DURATION (MS) 
2019-11-18 20:31:16.092 204 799.4648 
2019-11-18 20:29:32.032 204 23197.282 
2019-11-18 20:29:17.956 204 41919.4075

1 个答案:

答案 0 :(得分:1)

好吧,这是经过长时间使用Azure支持后的更新。如果有人到这里结束。

使用Azure App Function的Azure警报操作组的核心是Webhook调用。这意味着它具有与常规Webhook相同的限制/约束。 参见Microsoft docs

10秒后重试,再过100秒后重试。如果您在消耗时使用Azure应用功能,则应用功能可能需要更长的时间才能冷启动。这意味着它最多可以被调用三次,因为即使冷启动该函数需要花费时间,该应用程序函数也会在每次调用时运行(有时它启动得更快,您只能运行两次,而如果已经运行,则可以运行一次) )。

取决于您正在执行的操作,这可能是一个问题。我可能的解决方案是粗体中Azure支持的建议(请注意,我的建议会产生费用

  • 使函数幂等
  • 使功能具有状态
  • 始终启用应用服务计划
  • 使用逻辑应用程序
  • 如果Powershell使用自动化帐户运行手册