从不同的 ARM 模板向 Azure 应用程序网关添加 Url 规则
Add Url Rule to Azure Application Gateway from a different ARM template
我有一个资源组 ARM 模板,用于创建为 url 路由配置的应用程序网关。它根据 url 路径规则将流量发送到该资源组中的不同 Web 应用程序。我部署了基本资源组 ARM 模板,然后每个 Web 应用程序都有自己的 ARM 模板,用于在应用程序服务计划上设置 Web 应用程序。我想弄清楚如何在应用程序网关上的现有 Url 路径映射中添加规则,而无需在每个模板中定义整个应用程序网关。这样,我可以简单地添加 Web 应用程序并让它们 "register" 到具有特定路径规则的应用程序网关。
我考虑过做一个链接模板,我的基本模板将包含所有共享资源(数据库、应用程序服务计划和应用程序网关),但即使使用链接模板,我也不认为我可以添加规则到应用程序网关。
更新
因此,我通过添加对现有应用程序网关的引用来修改我的模板,然后为新的 BackEndPoolAddress 和新的 Path Rule 添加变量。它最终是这样的(仅缩写为相关部分):
"variables": {
"appGateway": "[reference(concat('Microsoft.Network/applicationGateways/', 'appGateWay-', uniqueString(resourceGroup().id)), '2017-06-01')]",
"pathRule": {
"name": "[concat(parameters('websiteName'), '- RoutingRule')]",
"properties": {
"paths": [
"[parameters('routingRule')]"
],
"backendAddressPool": {
"id": "[concat(variables('appGateway').id, '/backendAddressPools/',parameters('websiteName'), 'BackEndPool')]"
},
"backendHttpSettings": {
"id": "[variables('appGateway').backendHttpSettingsCollection[0]]"
}
}
},
"backendPool": {
"name": "[concat(parameters('websiteName'), 'BackEndPool')]",
"properties": {
"IpAddress": "[reference(variables('webSiteName')).defaultHostName]"
}
}
},
"resources": [
...
{
"apiVersion": "2017-06-01",
"name": "[variables('appGateway').name]",
"type": "Microsoft.Network/applicationGateways",
"location": "[resourceGroup().location]",
"properties": {
"backendAddressPools": "[concat(variables('appGateway').backendAddressPools, variables('backendPool'))]",
"urlPathMaps": [
{
"name": "[variables('appGateway').urlPathMaps[0]]",
"pathRules": "[concat(variables('appGateway').urlPathMaps[0].pathRules, variables('pathRule'))]"
}
]
}
}
],
但是我收到一个模板验证错误,提示我无法使用“变量”部分中的引用函数。如果我不在变量部分添加它,我如何在我的变量部分为池和 pathRule 构建正确的路径?
您可以使用 reference()
函数、数组操作和嵌套模板来实现此目的(即使没有这些也可能有效,最坏的情况下您将需要它们)。示例:
"outputs": {
"httpListeners": {
"type": "array",
"value": "[reference('application_gateway_id', '2018-08-01', 'Full').properties.httpListeners]"
}
}
请问return你是数组还是httpListeners。您可以获得所有相关的应用程序网关属性并使用 concat()
添加新的(附加)属性并将结果分配给 属性(属性):
"httpListeners": "[concat(reference('application_gateway_id', '2018-08-01', 'Full').properties.httpListeners, variables('newListener'))]"
您只需要确保 2 个部署不会同时启动,一个可能会覆盖另一个
这是我最终使用 Azure CLI 得到的解决方案。这个脚本是幂等的,在我的发布过程中运行。
echo "Logging into AKS Cluster"
az aks get-credentials --resource-group $RESOURCEGROUP_NAME --name $AKSNAME
echo "Get the created service's ip address"
SERVICEIP=$(kubectl get service --namespace $AKSNAMESPACE $APPNAME-service -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
echo "Creating backend pool - IP $SERVICEIP"
az network application-gateway address-pool create \
--gateway-name $APPGATEWAYNAME \
--resource-group $RESOURCEGROUP_NAME \
--name "$APPNAME-pool" \
--servers $SERVICEIP
echo "Creating probe"
az network application-gateway probe create \
--gateway-name $APPGATEWAYNAME \
--name "$APPNAME-probe" \
--path $APPPROBE \
--resource-group $RESOURCEGROUP_NAME \
--protocol Http \
--resource-group $RESOURCEGROUP_NAME \
--host-name-from-http-settings true
echo "Creating HTTP Settings"
az network application-gateway http-settings create \
--gateway-name $APPGATEWAYNAME \
--name "$APPNAME-settings" \
--port 80 \
--resource-group $RESOURCEGROUP_NAME \
--host-name-from-backend-pool \
--probe "$APPNAME-probe" \
--protocol Http
echo "Creating URL Path Map"
az network application-gateway url-path-map rule create \
--gateway-name $APPGATEWAYNAME \
--name "$APPNAME-rule" \
--paths $RULEPATH \
--path-map-name $RULENAME \
--resource-group $RESOURCEGROUP_NAME \
--http-settings "$APPNAME-settings" \
--address-pool "$APPNAME-pool"
我有一个资源组 ARM 模板,用于创建为 url 路由配置的应用程序网关。它根据 url 路径规则将流量发送到该资源组中的不同 Web 应用程序。我部署了基本资源组 ARM 模板,然后每个 Web 应用程序都有自己的 ARM 模板,用于在应用程序服务计划上设置 Web 应用程序。我想弄清楚如何在应用程序网关上的现有 Url 路径映射中添加规则,而无需在每个模板中定义整个应用程序网关。这样,我可以简单地添加 Web 应用程序并让它们 "register" 到具有特定路径规则的应用程序网关。
我考虑过做一个链接模板,我的基本模板将包含所有共享资源(数据库、应用程序服务计划和应用程序网关),但即使使用链接模板,我也不认为我可以添加规则到应用程序网关。
更新 因此,我通过添加对现有应用程序网关的引用来修改我的模板,然后为新的 BackEndPoolAddress 和新的 Path Rule 添加变量。它最终是这样的(仅缩写为相关部分):
"variables": {
"appGateway": "[reference(concat('Microsoft.Network/applicationGateways/', 'appGateWay-', uniqueString(resourceGroup().id)), '2017-06-01')]",
"pathRule": {
"name": "[concat(parameters('websiteName'), '- RoutingRule')]",
"properties": {
"paths": [
"[parameters('routingRule')]"
],
"backendAddressPool": {
"id": "[concat(variables('appGateway').id, '/backendAddressPools/',parameters('websiteName'), 'BackEndPool')]"
},
"backendHttpSettings": {
"id": "[variables('appGateway').backendHttpSettingsCollection[0]]"
}
}
},
"backendPool": {
"name": "[concat(parameters('websiteName'), 'BackEndPool')]",
"properties": {
"IpAddress": "[reference(variables('webSiteName')).defaultHostName]"
}
}
},
"resources": [
...
{
"apiVersion": "2017-06-01",
"name": "[variables('appGateway').name]",
"type": "Microsoft.Network/applicationGateways",
"location": "[resourceGroup().location]",
"properties": {
"backendAddressPools": "[concat(variables('appGateway').backendAddressPools, variables('backendPool'))]",
"urlPathMaps": [
{
"name": "[variables('appGateway').urlPathMaps[0]]",
"pathRules": "[concat(variables('appGateway').urlPathMaps[0].pathRules, variables('pathRule'))]"
}
]
}
}
],
但是我收到一个模板验证错误,提示我无法使用“变量”部分中的引用函数。如果我不在变量部分添加它,我如何在我的变量部分为池和 pathRule 构建正确的路径?
您可以使用 reference()
函数、数组操作和嵌套模板来实现此目的(即使没有这些也可能有效,最坏的情况下您将需要它们)。示例:
"outputs": {
"httpListeners": {
"type": "array",
"value": "[reference('application_gateway_id', '2018-08-01', 'Full').properties.httpListeners]"
}
}
请问return你是数组还是httpListeners。您可以获得所有相关的应用程序网关属性并使用 concat()
添加新的(附加)属性并将结果分配给 属性(属性):
"httpListeners": "[concat(reference('application_gateway_id', '2018-08-01', 'Full').properties.httpListeners, variables('newListener'))]"
您只需要确保 2 个部署不会同时启动,一个可能会覆盖另一个
这是我最终使用 Azure CLI 得到的解决方案。这个脚本是幂等的,在我的发布过程中运行。
echo "Logging into AKS Cluster"
az aks get-credentials --resource-group $RESOURCEGROUP_NAME --name $AKSNAME
echo "Get the created service's ip address"
SERVICEIP=$(kubectl get service --namespace $AKSNAMESPACE $APPNAME-service -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
echo "Creating backend pool - IP $SERVICEIP"
az network application-gateway address-pool create \
--gateway-name $APPGATEWAYNAME \
--resource-group $RESOURCEGROUP_NAME \
--name "$APPNAME-pool" \
--servers $SERVICEIP
echo "Creating probe"
az network application-gateway probe create \
--gateway-name $APPGATEWAYNAME \
--name "$APPNAME-probe" \
--path $APPPROBE \
--resource-group $RESOURCEGROUP_NAME \
--protocol Http \
--resource-group $RESOURCEGROUP_NAME \
--host-name-from-http-settings true
echo "Creating HTTP Settings"
az network application-gateway http-settings create \
--gateway-name $APPGATEWAYNAME \
--name "$APPNAME-settings" \
--port 80 \
--resource-group $RESOURCEGROUP_NAME \
--host-name-from-backend-pool \
--probe "$APPNAME-probe" \
--protocol Http
echo "Creating URL Path Map"
az network application-gateway url-path-map rule create \
--gateway-name $APPGATEWAYNAME \
--name "$APPNAME-rule" \
--paths $RULEPATH \
--path-map-name $RULENAME \
--resource-group $RESOURCEGROUP_NAME \
--http-settings "$APPNAME-settings" \
--address-pool "$APPNAME-pool"