我想部署一个 Azure 前门,其中自定义规则引擎与其中一个路由规则相关联。
整个问题在于RulesEngine必须与RoutingRule相关联,RoutingRule只能在创建Front Door时创建,但RulesEngine也需要Front Door才能创建。
https://learn.microsoft.com/en-us/azure/templates/microsoft.network/2020-05-01/frontdoors
我后来尝试创建 Microsoft.Network/frontDoors/routingRules 类型的独立资源,但出现资源类型无效的错误。
我是否遗漏了某些内容,或者这在单个 ARM 部署中无法实现?
另一种解决方案是在部署后运行命令式脚本,将routingRule与RulesEngine关联起来。
从今天起将是:
az extension add -n front-door
az network front-door routing-rule update --front-door-name <fd-name> --name <routing-rule-nam> -g <resource-group-name> --rules-engine <rules-engine-name>
这不是最佳选择,但我有一个解决方案。
基本上我需要做的是创建前门,然后创建规则引擎(取决于前门),然后使用嵌套部署模板(取决于规则引擎),它必须重新创建整个前门配置,但现在它可以引用规则引擎资源。
我能够制作一个带有规则引擎和前门的工作单一 ARM 模板。
首先放置没有dependsOn设置的规则引擎资源,然后添加具有规则引擎资源ID的dependsOn设置的前门资源。
通过一些测试,看起来规则引擎资源并不依赖于前门来创建。
以下是 2 个资源的 ARM 模板片段示例:
{
"type": "Microsoft.Network/frontdoors/rulesengines",
"apiVersion": "2021-06-01",
"name": "[concat(parameters('frontDoorName'), '/ruleEngineName')]",
"properties": {
"resourceState": "Enabled",
"rules": [
{
"name": "ruleName",
"priority": 0,
"action": {...},
"matchConditions": [...],
"matchProcessingBehavior": "Continue"
}
]
}
},
{
"type": "Microsoft.Network/frontdoors",
"apiVersion": "2021-06-01",
"name": "[parameters('frontDoorName')]",
"location": "Global",
"dependsOn": [
"[resourceId('Microsoft.Network/frontdoors/rulesengines', parameters('frontDoorName'), 'ruleEngineName')]"
],
"properties": {
"routingRules": [
{
"id": "[concat(resourceId('Microsoft.Network/frontdoors', parameters('frontDoorName')), '/RoutingRules/routeRuleName')]",
"name": "routeRuleName",
"properties": {
"routeConfiguration": {
...
},
"rulesEngine": {
"id": "[resourceId('Microsoft.Network/frontdoors/rulesengines', parameters('frontDoorName'), 'ruleEngineName')]"
},
"resourceState": "Enabled",
"frontendEndpoints": [
...
],
"acceptedProtocols": [
...
],
"patternsToMatch": [
...
],
"enabledState": "Enabled"
}
}
],
"resourceState": "Enabled",
"loadBalancingSettings": [...],
"backendPools": [...],
"frontendEndpoints": [...],
"backendPoolsSettings": {...},
"enabledState": "Enabled",
"friendlyName": "[parameters('frontDoorName')]"
}
}