0

我正在尝试在 Azure 二头肌资源/模块中设置警报。目标是拥有 3 个文件,其中一个是创建和参数化初始资源结构的文件:

param metricAlertsName string
param description string
param severity int
param enabled bool = true
param scopes array = []
param evaluationFrequency string
param windowSize string
param targetResourceRegion string = resourceGroup().location
param allOf array = []
param actionGroupName string

var actionGroupId = resourceId(resourceGroup().name, 'microsoft.insights/actionGroups', actionGroupName)

resource dealsMetricAlerts 'Microsoft.Insights/metricAlerts@2018-03-01' = [for appService in appServices : {
  name: metricAlertsName
  location: 'global'
  tags: {}
  properties: {
    description: description
    severity: severity
    enabled: enabled
    scopes: scopes
    evaluationFrequency: evaluationFrequency
    windowSize: windowSize
    targetResourceRegion: targetResourceRegion
    criteria: {
      'odata.type': 'Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria'
      allOf: allOf
    }
    actions: [
      {
        actionGroupId: actionGroupId
      }
    ]
  }
}]

第二个文件 main.bicep 我所有的资源都作为模块使用:

module dealsMetricAlerts '../modules/management/metric-alert.bicep' = [for (alert, index) in alertConfig.metricAlerts: {
  name: alert.name
  params: {
    metricAlertsName: alert.params.metricAlertsName
    actionGroupName: actionGroupName
    description: alert.params.description
    evaluationFrequency: alert.params.evaluationFrequency
    severity: alert.params.severity
    windowSize: alert.params.windowSize
    allOf: alert.params.allOf
    scopes: [
      resourceId(resourceGroup().name,'Microsoft.Web/sites', 'gbt-${env1}-${env}-${location}-webapp')
    ]
  }
}]

第三个文件是一个参数文件,我可以在其中循环,将其值输入到 main.bicep 中的模块中,以创建多个资源,而无需编写多个模块:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "alertConfig": {
      "value": {
        "metricAlerts": [
          {
            "name": "403ErrorTest",
            "params": {
              "metricAlertsName": "AppService403ErrorTest",
              "actionGroupName": "actionGroupName",
              "description": "Alert fires whenever the App Service throws a 403 error",
              "evaluationFrequency": "PT5M",
              "severity": 2,
              "windowSize": "PT15M",
              "allOf": [
                {
                  "name": "403errorTest",
                  "metricName": "Http403",
                  "dimensions": [],
                  "operator": "GreaterThan",
                  "threshold": 0,
                  "timeAggregation": "Count"
                }
              ]
            }
          },
          {
            "name": "5XXErrorTest",
            "params": {
             // Values for 500 error
            }
          }
        ]
      }
    }
  }
}

我总共有 5 个应用服务、1 个 Web 应用和 4 个功能应用。如果我要像上面那样硬编码应用程序服务的名称,那么部署一个 Web 应用程序时会出现 2 个错误。

我遇到的问题是尝试在范围参数上使用另一个循环,以将 2 个错误附加到所有 5 个应用程序服务。

我试过类似的东西:

// Created an array with the names of the app services
var appServices = [
  'dda-webApp'
  'dealservice-fnapp'
  'itemdata-fnapp'
  'refdata-fnapp'
  'userprofile-fnapp'
]

// Update the scopes param to loop through the names\
scopes: [for appService in appServices: [
  resourceId(resourceGroup().name,'Microsoft.Web/sites', 'gbt-${env1}-${env}-${location}-${appService}')
]]

这通常给我一个错误说:Unexpected token array in scopes[0].

我相信发生的事情是,当它试图在 resourceId 中按名称查找资源时,它会遍历所有 appServices 名称并将整个数组附加到资源名称上,使其无效。

是否有另一种方法可以遍历这些范围,以便将 403 和 500 警报附加到我的 5 个应用程序服务中的每一个?

4

1 回答 1

0

查看文档,您不能执行内部循环:

在二头肌中使用循环有以下限制:

  • 循环迭代不能为负数或超过 800 次迭代。
  • 无法循环具有嵌套子资源的资源。将子资源更改为顶级资源。请参阅子资源的迭代
  • 不能循环多个级别的属性。

在您的情况下,您可以定义一个变量并在模块循环之外创建数组:

// Created an array with the names of the app services
var appServices = [
  'dda-webApp'
  'dealservice-fnapp'
  'itemdata-fnapp'
  'refdata-fnapp'
  'userprofile-fnapp'
]

// Create an array of app service resource ids
var appServiceIds = [for appService in appServices: resourceId(resourceGroup().name,'Microsoft.Web/sites', 'gbt-${env1}-${env}-${location}-${appService}')]


// Set the scope param with this variable
module dealsMetricAlerts '../modules/management/metric-alert.bicep' = [for (alert, index) in alertConfig.metricAlerts: {
  name: alert.name
  params: {
    ...
    scopes: appServiceIds
  }
}]
于 2021-11-01T19:35:22.440 回答