Bicep для развертывания виртуальной сети, управляемой фабрикой данных

azure-data-factory #azure-resource-manager #azure-bicep

#azure-data-factory #azure-resource-manager #azure-bicep

Вопрос:

Я пытаюсь создать модуль bicep, который будет развертывать фабрику данных вместе с управляемой виртуальной сетью. Вот что у меня есть:

 param dfName string
 param sqlId string
    
 resource df 'Microsoft.DataFactory/factories@2018-06-01' = {
   name: dfName
   location: resourceGroup().location
   identity: {
     type: 'SystemAssigned'
   }
 }
    
 resource integrationRuntime 'Microsoft.DataFactory/factories/integrationRuntimes@2018-06-01' = {
   name: '${dfName}/managedVnetIr' 
   properties: {
     type: 'Managed'
     typeProperties: {
       computeProperties: {
         location: 'AutoResolve'
         dataFlowProperties: {
           computeType: 'General'
           coreCount: 8
           timeToLive: 0
         }
       }
     }
   }
   dependsOn: [
     df
   ]
 }
    
 resource managedVnet 'Microsoft.DataFactory/factories/managedVirtualNetworks@2018-06-01' = {
   name: '${dfName}/vnet'
   properties: { 
   }
   dependsOn: [
     integrationRuntime
   ]
 }
    
 resource managedPrivateEndpoint 'Microsoft.DataFactory/factories/managedVirtualNetworks/managedPrivateEndpoints@2018-06-01' = {
   name: '${dfName}/vnet/pe'
   properties: {
     privateLinkResourceId:sqlId
     groupId: 'sql'
   }
   dependsOn: [
     managedVnet
   ]
 }
    
 output dfId string = df.identity.principalId
 

При запуске этого модуля я получаю следующую ошибку:

«статус»: «Сбой», «ошибка»: { «код»: «Ресурс не найден», «сообщение»: «Ресурс не найден. Идентификатор ресурса: ‘/subscriptions/8210b2ab-404f-40a5-baba-1cde6d89c670/resourceGroups/rg-contactcentre-dev-001/providers/Microsoft.DataFactory/factories/df-ccsurvey-dev-001/managedvirtualnetworks/vnet’. » }

Я также попробовал следующее (на основе ответа от AnsumanBal-MT)

 param dfName string
param sqlId string
param vnetName string

resource df 'Microsoft.DataFactory/factories@2018-06-01' = {
  name: dfName
  location: resourceGroup().location
  identity: {
    type: 'SystemAssigned'
  }
}

resource integrationRuntime 'Microsoft.DataFactory/factories/integrationRuntimes@2018-06-01' = {
  parent: df
  name: '${dfName}-managedVnetIr' 
  properties: {
    type: 'Managed'
    typeProperties: {
      computeProperties: {
        location: 'AutoResolve'
        dataFlowProperties: {
          computeType: 'General'
          coreCount: 8
          timeToLive: 0
        }
      }
    }
  }
}

resource managedVnet 'Microsoft.DataFactory/factories/managedVirtualNetworks@2018-06-01' = {
  parent:df
  name: vnetName
  properties: { 
  }
  dependsOn: [
    integrationRuntime
  ]
}

resource managedPrivateEndpoint 'Microsoft.DataFactory/factories/managedVirtualNetworks/managedPrivateEndpoints@2018-06-01' = {
  parent:managedVnet
  name: '${vnetName}-sql-pe'
  properties: {
    privateLinkResourceId:sqlId
    groupId: 'sql'
  }
  dependsOn: [
    managedVnet
  ]
}

output dfId string = df.identity.principalId
 

но это выдает следующую ошибку:

{ «статус»: «Сбой», «ошибка»: { «код»: «ResourceDeploymentFailure», «сообщение»: «Операция с ресурсом завершена с состоянием подготовки терминала «Сбой»». } }

Кто-нибудь может определить, что я сделал неправильно, или направить меня к рабочему образцу, пожалуйста?

Комментарии:

1. Привет, @Rob Bowman, я протестировал базу данных SQL и добавил обновление для ответа, пожалуйста, дайте мне знать, если это сработает..

2. Привет, @Rob Bowman, я обновил код в соответствии с вашим сценарием и необходимыми конфигурациями. Я протестировал его, и он был успешно развернут . Пожалуйста, используйте весь код, который я предоставил в разделе обновление : 2 . Он создаст виртуальную сеть, затем sql server и adf и, наконец, управляемую частную конечную точку для sql в adf.

Ответ №1:

Для создания управляемой виртуальной сети на фабрике данных необходимо сослаться на существующую виртуальную сеть в вашей группе ресурсов.

Обновление: 1

При тестировании создания управляемой частной конечной точки для базы данных sql я столкнулся с той же ошибкой, что и вы, используя ваш код, он не удался через 1 час 18 минут при сбое инициализации.

Когда я тестировал SQL server, я обнаружил две проблемы, которые groupId должны быть sqlServer , а также управляемая виртуальная сеть для adf не сможет взаимодействовать с sql Server, поскольку она не добавлена firewall and virtual networks .

Для решения проблемы необходимо выполнить следующие два шага :

  1. Если вы ссылаетесь Microsoft.SQL/Servers , пожалуйста, измените идентификатор группы на sqlServer , и если вы ссылаетесь на «Microsoft.Synapse / Workspaces», вы можете сохранить его как sql . Вы можете обратиться к этому документу Microsoft для получения имени вложенных ресурсов частной конечной точки.
  2. Пожалуйста, добавьте существующую виртуальную сеть, которую вы используете для создания управляемой виртуальной сети для ADF на сервере SQL . (Если вы ссылаетесь на synapse, перейдите в Synapse>> Сеть>> Разрешить службам и ресурсам Azure доступ к этой рабочей области)

введите описание изображения здесь

После выполнения вышеуказанных 2 шагов развертывание завершится успешно.


Обновление: 2

Сценарий: создайте сервер SQL с виртуальной сетью, а затем обратитесь к виртуальной сети и sql для создания виртуальной сети, управляемой adf, и частной конечной точки.

Пожалуйста, используйте приведенный ниже код, который я протестировал в соответствии с вашими требованиями :

 param serverName string = uniqueString('sql', resourceGroup().id)
param sqlDBName string = 'SampleDB'
param administratorLogin string
@secure()
param administratorLoginPassword string
param virtualNetworkName string = 'azure_mysql_vnet'
param subnetName string = 'azure_mysql_subnet'
param virtualNetworkRuleName string = 'AllowSubnet'
param vnetAddressPrefix string = '10.0.0.0/16'
param subnetPrefix string = '10.0.0.0/16'
param dfName string

resource virtualNetworkName_resource 'Microsoft.Network/virtualNetworks@2020-06-01' = {
  name: virtualNetworkName
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        vnetAddressPrefix
      ]
    }
  }
}

resource virtualNetworkName_subnetName 'Microsoft.Network/virtualNetworks/subnets@2020-06-01' = {
  parent: virtualNetworkName_resource
  name: subnetName
  location: resourceGroup().location
  properties: {
    addressPrefix: subnetPrefix
  }
}

resource serverName_resource 'Microsoft.Sql/servers@2020-02-02-preview' = {
  name: serverName
  location: resourceGroup().location
  properties: {
    administratorLogin: administratorLogin
    administratorLoginPassword: administratorLoginPassword
  }
}

resource serverName_sqlDBName 'Microsoft.Sql/servers/databases@2020-08-01-preview' = {
  parent: serverName_resource
  name: sqlDBName
  location: resourceGroup().location
  sku: {
    name: 'Standard'
    tier: 'Standard'
  }
}

resource serverName_virtualNetworkRuleName 'Microsoft.Sql/servers/virtualNetworkRules@2021-02-01-preview' = {
  parent: serverName_resource
  name: virtualNetworkRuleName
  properties: {
    virtualNetworkSubnetId: virtualNetworkName_subnetName.id
    ignoreMissingVnetServiceEndpoint: true
  }
}

 resource df 'Microsoft.DataFactory/factories@2018-06-01' = {
   name: dfName
   location: resourceGroup().location
   identity: {
     type: 'SystemAssigned'
   }
 } 

 resource integrationRuntime 'Microsoft.DataFactory/factories/integrationRuntimes@2018-06-01' = {
   parent: df
   name: '${dfName}-managedVnetIr' 
   properties: {
     type: 'Managed'
     typeProperties: {
       computeProperties: {
         location: 'AutoResolve'
         dataFlowProperties: {
           computeType: 'General'
           coreCount: 8
           timeToLive: 0
         }
       }
     }
   }
 } 
 resource managedVnet 'Microsoft.DataFactory/factories/managedVirtualNetworks@2018-06-01' = {
   parent:df
   name: virtualNetworkName
   properties: { 
   }
   dependsOn: [
     integrationRuntime
   ]
 }
    
 resource managedPrivateEndpoint 'Microsoft.DataFactory/factories/managedVirtualNetworks/managedPrivateEndpoints@2018-06-01' = {
   parent:managedVnet
   name: '${virtualNetworkName}-${serverName}-pe'
   properties: {
     privateLinkResourceId: serverName_resource.id
     groupId: 'sqlServer'
   }
   dependsOn: [
     managedVnet
   ]
 }
 

Вывод:

введите описание изображения здесь

введите описание изображения здесь

Примечание: После успешного развертывания необходимо вручную утвердить запрос частной конечной точки, который находится в состоянии ожидания, от SQL Server, как показано ниже:

введите описание изображения здесь

Комментарии:

1. Я внес поправку, как вы предложили. Теперь мой модуль bicep получает имя существующей виртуальной сети и использует его в свойстве name управляемого ресурса виртуальной сети. Развертывание выполнялось в течение 1 часа 18 минут, но не удалось при развертывании типа «managedPrivateEndpoints» с ошибкой: операция с ресурсом завершена с состоянием подготовки терминала «Сбой».

2. Привет, он развертывает конечную точку для sql. Идентификатор sql — это выходные данные модуля bicep, который вызывается ранее в последовательности для создания экземпляра sql: resource sqlServerName_resource ‘Microsoft.Sql/servers@2015-05-01-preview ‘ = { имя: sqlServerName местоположение: ResourceGroup().свойства местоположения: { administratorLogin: sqlAdminUsername administratorLoginPassword: sqlAdminPwd } } вывод строки sqlId = sqlServerName_resource.id

3. Привет @AnsumanBal-MT, боюсь, это не сработает. Пожалуйста, посмотрите мой первый комментарий в ответ на ваш ответ

4. @RobBowman, я обновил ответ новым кодом и обновил несколько шагов, которые необходимо выполнить после развертывания SQL .. позвольте мне попробовать с последовательным развертыванием и тем, что необходимо настроить при развертывании SQL server, а также после этого я попробую развернуть adf с управляемой частной конечной точкой для SQL server в качестве вспомогательного ресурса. Я постараюсь обновить вас после тестирования.. Дайте мне знать, если я ошибаюсь в сценарии, который вы пытаетесь..

5. Я думаю, вы правы в сценарии. У меня есть «основной» шаблон bicep, который получает имя уже существующей виртуальной сети в качестве параметра. Main вызывает шаблон «Sql», когда возвращает идентификатор созданного экземпляра sql. Затем он передает это вместе с именем виртуальной сети в шаблон bicep «DataFactory», который пытается создать: фабрику данных, среду выполнения интеграции, управляемую виртуальную сеть, управляемую частную конечную точку