Я работаю над шаблонами ARM. Я создал файл шаблона с двумя или более службами приложений Azure вместе с планом обслуживания приложений, а затем настроил интеграцию VNET для каждой службы приложений.
Это пример кода JSON:
{
"comments": "Web-App-01",
"name": "[variables('app_name_01')]",
"type": "Microsoft.Web/sites",
"location": "[variables('location')]",
"apiVersion": "2016-08-01",
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('asp_name_01'))]"
],
"tags": {
"displayName": "[variables('app_name_01')]"
},
"properties": {
"name": "[variables('app_name_01')]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('asp_name_01'))]",
"siteConfig": {
"alwaysOn": true
}
},
"resources": [
{
"type": "Microsoft.Web/sites/virtualNetworkConnections",
"name": "[concat(variables('app_name_01'), '/', variables('vnet_connection_name'),uniqueString('asdsdaxsdsd'))]",
"apiVersion": "2016-08-01",
"location": "[variables('location')]",
"properties": {
"vnetResourceId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vm_vnet_name'), variables('web_subnet_name'))]"
},
"dependsOn": [
"[resourceId('Microsoft.Web/sites', variables('app_name_01'))]",
"[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vm_vnet_name'), variables('web_subnet_name'))]"
]
}
]
},
{
"comments": "Web-App-02",
"name": "[variables('app_name_02')]",
"type": "Microsoft.Web/sites",
"location": "[variables('location')]",
"apiVersion": "2016-08-01",
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('asp_name_02'))]"
],
"tags": {
"displayName": "[variables('app_name_02')]"
},
"properties": {
"name": "[variables('app_name_02')]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('asp_name_01'))]",
"siteConfig": {
"alwaysOn": true
}
},
"resources": [
{
"type": "Microsoft.Web/sites/virtualNetworkConnections",
"name": "[concat(variables('app_name_02'), '/', variables('vnet_connection_name'),uniqueString('asdsdaxsdsd'))]",
"apiVersion": "2016-08-01",
"location": "[variables('location')]",
"properties": {
"vnetResourceId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vm_vnet_name'), variables('web_subnet_name'))]"
},
"dependsOn": [
"[resourceId('Microsoft.Web/sites', variables('app_name_02'))]",
"[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vm_vnet_name'), variables('web_subnet_name'))]"
]
}
]
}
Приведенный выше код отлично работает для нескольких служб приложений Azure, но для остальных служб приложений я получаю внутреннюю ошибку сервера или конфликт или неверный запрос во время интеграции виртуальной сети со службой приложений Azure.
Note: When I deployed the above the JSON Code, the old VNET integration is configured instead of New VNET (Preview) feature. So, I need to configure New VNET (Preview) feature for each app service.
Итак, может ли кто-нибудь предложить мне, как решить вышеуказанную проблему.
Нет, он случайным образом дает сбой в разных службах приложений.
Отслеживание такой проблемы будет немного сложнее. Вы можете получить бесплатную техническую поддержку, связавшись с @AzureSupport.


Я нашел рабочий пример для этого в сообщении Azure Docs GitHub:
Как интегрировать новую интеграцию vnet с шаблонами ARM?
Похоже, новая интеграция с виртуальной сетью работает по-другому, в которой используется подресурс Microsoft.Web/sites/config с именем virtualNetwork вместо подресурса Microsoft.Web/sites/virtualNetworkConnections.
А также несколько требований, которые необходимо установить в целевой подсети/всети (описано по ссылке). Часть интеграции выглядит примерно так:
{
"apiVersion": "2018-02-01",
"type": "Microsoft.Web/sites",
"name": "[parameters('appName')]",
"location": "[resourceGroup().location]",
...
"resources": [
{
"name": "virtualNetwork",
"type": "config",
"apiVersion": "2018-02-01",
"location": "[resourceGroup().location]",
"properties": {
"subnetResourceid": "[parameters('subnetResourceId')]",
"swiftSupported": true
},
"dependsOn": [
"[resourceId('Microsoft.Web/sites', parameters('appName'))]"
]
}
]
},
Помимо этого, я не нашел много другой документации, за исключением ссылки на него в azure-rest-api-specs, в которой определена конечная точка "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{name}/networkConfig/virtualNetwork":
azure-rest-api-specs / WebApps.json
Также кажется (как предполагает спецификация), что замена "type": "config" на "type": "networkConfig" также работает.
Спасибо за ссылку! Лично я столкнулся с некоторыми несоответствиями вокруг этой функции, мы могли бы открыть проблему, но на данный момент она работает только в том случае, если виртуальная сеть создана в том же шаблоне с указанием зависимости.
Это действительно помогло нам, обязательно установите делегирование в подсети, чтобы это работало. (как также указано в верхней ссылке на github)
Действительно, тем более, что без делегирования просто получаете лаконичные 500 от API; для параметра swift также должно быть установлено значение true.
Я разговаривал с главным инженером Microsoft.
Ключ в том, чтобы заменить шаблон автоматизации
{
"type": "Microsoft.Web/sites/virtualNetworkConnections",
"apiVersion": "2018-11-01",
"name": "[concat(parameters('sites_FelixOFA_name'), '/xxxxxxx_Functions')]",
"location": "West Europe",
"dependsOn": [
"[resourceId('Microsoft.Web/sites', parameters('sites_FelixOFA_name'))]"
],
"properties": {
"vnetResourceId": "[concat(parameters('virtualNetworks_FelixODevPremNet_externalid'), '/subnets/Functions')]",
"isSwift": true
}
}
с участием
{
"type": "Microsoft.Web/sites/networkConfig",
"name": "[concat(parameters('webAppName'),'/VirtualNetwork')]",
"apiVersion": "2016-08-01",
"properties":
{
"subnetResourceId": "[parameters('subnetResourceId')]"
}
}
Где subnetResourceId — идентификатор ресурса их подсети — он должен выглядеть так: /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Network/virtualNetworks/{vnetName}/subnets/{subnetName}
просто чтобы очистить .. sub ожидает идентификатор подписки, где rg ожидает имя группы ресурсов
Чтобы исправить это, я просто изменил параметр isSwift или swiftSupported на false.
Не нужно ничего менять, просто удалите этот параметр целиком, чтобы он заработал.
Я попытался достичь той же функциональности с помощью файла Bicep, наконец, используя
virtualNetworkSubnetId:
работал на меня. Например:
resource webAppName_resource 'Microsoft.Web/sites@2020-12-01' = {
name: '${webAppName}'
location: location
properties: {
serverFarmId: appServicePlanPortalName.id
virtualNetworkSubnetId: '${vnetDeploy_module.outputs.vnetid}/subnets/${vnetDeploy_module.outputs.subnetname}'
siteConfig: {
linuxFxVersion: linuxFxVersion
minTlsVersion: minTlsVersion
http20Enabled: http20Enabled
}
httpsOnly: httpsOnly
}
}
См. шаблоны в https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.web/app-service-regional-vnet-integration.
Результат в ARM:
{
"type": "Microsoft.Web/sites",
"apiVersion": "2021-01-01",
"name": "[parameters('appName')]",
"location": "[parameters('location')]",
"kind": "app",
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]",
"virtualNetworkSubnetId": "[reference(resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))).subnets[0].id]",
"httpsOnly": true,
"siteConfig": {
"vnetRouteAllEnabled": true,
"http20Enabled": true
}
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]",
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
}
Постоянно ли он выходит из строя в одних и тех же сервисах приложений или случайным образом?