ARM 模板中用户定义的函数

在模板中,可以创建自己的函数。 这些函数可在模板中使用。 用户定义函数不同于模板中自动可用的标准模板函数。 当有复杂的表达式在模板中重复使用时,请创建自己的函数。

本文介绍如何在 Azure 资源管理器模板(ARM 模板)中添加用户定义的函数。

定义函数

函数需要一个命名空间值以避免命名与模板函数发生冲突。 下面的示例演示一个返回唯一名称的函数:

"functions": [
  {
    "namespace": "contoso",
    "members": {
      "uniqueName": {
        "parameters": [
          {
            "name": "namePrefix",
            "type": "string"
          }
        ],
        "output": {
          "type": "string",
          "value": "[concat(toLower(parameters('namePrefix')), uniqueString(resourceGroup().id))]"
        }
      }
    }
  }
],

使用函数

下面的示例显示了一个模板,其中包含一个用户定义的函数,用于获取存储帐户的唯一名称。 此模板有一个名为 storageNamePrefix 的参数,它将作为参数传递给该函数。

{
 "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
 "contentVersion": "1.0.0.0",
 "parameters": {
   "storageNamePrefix": {
     "type": "string",
     "maxLength": 11
   }
 },
 "functions": [
  {
    "namespace": "contoso",
    "members": {
      "uniqueName": {
        "parameters": [
          {
            "name": "namePrefix",
            "type": "string"
          }
        ],
        "output": {
          "type": "string",
          "value": "[concat(toLower(parameters('namePrefix')), uniqueString(resourceGroup().id))]"
        }
      }
    }
  }
],
 "resources": [
   {
     "type": "Microsoft.Storage/storageAccounts",
     "apiVersion": "2022-09-01",
     "name": "[contoso.uniqueName(parameters('storageNamePrefix'))]",
     "location": "China East",
     "sku": {
       "name": "Standard_LRS"
     },
     "kind": "StorageV2",
     "properties": {
       "supportsHttpsTrafficOnly": true
     }
   }
 ]
}

在部署期间,storageNamePrefix 参数将传递给该函数:

  • 该模板定义了一个名为 storageNamePrefix 的参数。
  • 该函数使用 namePrefix,因为只能使用函数中定义的参数。 有关详细信息,请参阅限制
  • 在此模板的 resources 节中,name 元素使用该函数并将 storageNamePrefix 值传递给该函数的 namePrefix

限制

定义用户函数时,存在一些限制:

  • 该函数不能访问变量。
  • 函数仅可使用函数中定义的参数。 在用户定义函数中使用 parameters 函数时,只能使用该函数的参数。
  • 该函数不能调用其他用户定义的函数。
  • 该函数不能使用 reference 函数或任何 list 函数。
  • 该函数的参数不能具有默认值。

后续步骤