@@ -329,21 +329,109 @@ module applicationInsights 'br/public:avm/res/insights/component:0.6.0' = if (en
329329 diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
330330 }
331331}
332+ // ========== Virtual Network and Networking Components ========== //
332333
333- module network 'modules/network.bicep' = if (enablePrivateNetworking ) {
334- name : take ('module.network.${solutionSuffix }' , 64 )
334+ // Virtual Network with NSGs and Subnets
335+ module virtualNetwork 'modules/virtualNetwork.bicep' = if (enablePrivateNetworking ) {
336+ name : take ('module.virtualNetwork.${solutionSuffix }' , 64 )
335337 params : {
336- resourcesName : solutionSuffix
337- logAnalyticsWorkSpaceResourceId : logAnalyticsWorkspaceResourceId
338- vmAdminUsername : vmAdminUsername ?? 'JumpboxAdminUser'
339- vmAdminPassword : vmAdminPassword ?? 'JumpboxAdminP@ssw0rd1234!'
340- vmSize : vmSize ?? 'Standard_DS2_v2' // Default VM size
338+ name : 'vnet-${solutionSuffix }'
339+ addressPrefixes : ['10.0.0.0/20' ] // 4096 addresses (enough for 8 /23 subnets or 16 /24)
341340 location : location
342341 tags : tags
342+ logAnalyticsWorkspaceId : logAnalyticsWorkspaceResourceId
343+ resourceSuffix : solutionSuffix
343344 enableTelemetry : enableTelemetry
344345 }
345346}
347+ // Azure Bastion Host
348+ var bastionHostName = 'bas-${solutionSuffix }'
349+ module bastionHost 'br/public:avm/res/network/bastion-host:0.6.1' = if (enablePrivateNetworking ) {
350+ name : take ('avm.res.network.bastion-host.${bastionHostName }' , 64 )
351+ params : {
352+ name : bastionHostName
353+ skuName : 'Standard'
354+ location : location
355+ virtualNetworkResourceId : virtualNetwork !.outputs .resourceId
356+ diagnosticSettings : [
357+ {
358+ name : 'bastionDiagnostics'
359+ workspaceResourceId : logAnalyticsWorkspaceResourceId
360+ logCategoriesAndGroups : [
361+ {
362+ categoryGroup : 'allLogs'
363+ enabled : true
364+ }
365+ ]
366+ }
367+ ]
368+ tags : tags
369+ enableTelemetry : enableTelemetry
370+ publicIPAddressObject : {
371+ name : 'pip-${bastionHostName }'
372+ zones : []
373+ }
374+ }
375+ }
346376
377+ // Jumpbox Virtual Machine
378+ var jumpboxVmName = take ('vm-jumpbox-${solutionSuffix }' , 15 )
379+ module jumpboxVM 'br/public:avm/res/compute/virtual-machine:0.15.0' = if (enablePrivateNetworking ) {
380+ name : take ('avm.res.compute.virtual-machine.${jumpboxVmName }' , 64 )
381+ params : {
382+ name : take (jumpboxVmName , 15 ) // Shorten VM name to 15 characters to avoid Azure limits
383+ vmSize : vmSize ?? 'Standard_DS2_v2'
384+ location : location
385+ adminUsername : vmAdminUsername ?? 'JumpboxAdminUser'
386+ adminPassword : vmAdminPassword ?? 'JumpboxAdminP@ssw0rd1234!'
387+ tags : tags
388+ zone : 0
389+ imageReference : {
390+ offer : 'WindowsServer'
391+ publisher : 'MicrosoftWindowsServer'
392+ sku : '2019-datacenter'
393+ version : 'latest'
394+ }
395+ osType : 'Windows'
396+ osDisk : {
397+ name : 'osdisk-${jumpboxVmName }'
398+ managedDisk : {
399+ storageAccountType : 'Standard_LRS'
400+ }
401+ }
402+ encryptionAtHost : false // Some Azure subscriptions do not support encryption at host
403+ nicConfigurations : [
404+ {
405+ name : 'nic-${jumpboxVmName }'
406+ ipConfigurations : [
407+ {
408+ name : 'ipconfig1'
409+ subnetResourceId : virtualNetwork !.outputs .jumpboxSubnetResourceId
410+ }
411+ ]
412+ diagnosticSettings : [
413+ {
414+ name : 'jumpboxDiagnostics'
415+ workspaceResourceId : logAnalyticsWorkspaceResourceId
416+ logCategoriesAndGroups : [
417+ {
418+ categoryGroup : 'allLogs'
419+ enabled : true
420+ }
421+ ]
422+ metricCategories : [
423+ {
424+ category : 'AllMetrics'
425+ enabled : true
426+ }
427+ ]
428+ }
429+ ]
430+ }
431+ ]
432+ enableTelemetry : enableTelemetry
433+ }
434+ }
347435// ========== Private DNS Zones ========== //
348436var privateDnsZones = [
349437 'privatelink.cognitiveservices.azure.com'
@@ -394,8 +482,8 @@ module avmPrivateDnsZones 'br/public:avm/res/network/private-dns-zone:0.7.1' = [
394482 enableTelemetry : enableTelemetry
395483 virtualNetworkLinks : [
396484 {
397- name : take ('vnetlink-${network !.outputs .vnetName }-${split (zone , '.' )[1 ]}' , 80 )
398- virtualNetworkResourceId : network !.outputs .vnetResourceId
485+ name : take ('vnetlink-${virtualNetwork !.outputs .name }-${split (zone , '.' )[1 ]}' , 80 )
486+ virtualNetworkResourceId : virtualNetwork !.outputs .resourceId
399487 }
400488 ]
401489 }
@@ -463,7 +551,7 @@ module keyvault 'br/public:avm/res/key-vault/vault:0.12.1' = {
463551 ]
464552 }
465553 service : 'vault'
466- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
554+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
467555 }
468556 ]
469557 : []
@@ -698,7 +786,7 @@ module aiFoundryAiServices 'modules/ai-services.bicep' = if (aiFoundryAIservices
698786 {
699787 name : 'pep-${aiFoundryAiServicesResourceName }'
700788 customNetworkInterfaceName : 'nic-${aiFoundryAiServicesResourceName }'
701- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
789+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
702790 privateDnsZoneGroup : {
703791 privateDnsZoneGroupConfigs : [
704792 {
@@ -780,7 +868,7 @@ module cognitiveServicesCu 'br/public:avm/res/cognitive-services/account:0.10.1'
780868 {
781869 name : 'pep-${aiFoundryAiServicesCUResourceName }'
782870 customNetworkInterfaceName : 'nic-${aiFoundryAiServicesCUResourceName }'
783- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
871+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
784872 privateDnsZoneGroup : {
785873 privateDnsZoneGroupConfigs : [
786874 {
@@ -887,7 +975,7 @@ module searchSearchServices 'br/public:avm/res/search/search-service:0.11.1' = {
887975 ]
888976 }
889977 service : 'searchService'
890- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
978+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
891979 }
892980 ]
893981 : []
@@ -990,7 +1078,7 @@ module storageAccount 'br/public:avm/res/storage/storage-account:0.20.0' = {
9901078 {
9911079 name : 'pep-blob-${solutionSuffix }'
9921080 service : 'blob'
993- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
1081+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
9941082 privateDnsZoneGroup : {
9951083 privateDnsZoneGroupConfigs : [
9961084 {
@@ -1003,7 +1091,7 @@ module storageAccount 'br/public:avm/res/storage/storage-account:0.20.0' = {
10031091 {
10041092 name : 'pep-queue-${solutionSuffix }'
10051093 service : 'queue'
1006- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
1094+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
10071095 privateDnsZoneGroup : {
10081096 privateDnsZoneGroupConfigs : [
10091097 {
@@ -1016,7 +1104,7 @@ module storageAccount 'br/public:avm/res/storage/storage-account:0.20.0' = {
10161104 {
10171105 name : 'pep-file-${solutionSuffix }'
10181106 service : 'file'
1019- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
1107+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
10201108 privateDnsZoneGroup : {
10211109 privateDnsZoneGroupConfigs : [
10221110 {
@@ -1029,7 +1117,7 @@ module storageAccount 'br/public:avm/res/storage/storage-account:0.20.0' = {
10291117 {
10301118 name : 'pep-dfs-${solutionSuffix }'
10311119 service : 'dfs'
1032- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
1120+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
10331121 privateDnsZoneGroup : {
10341122 privateDnsZoneGroupConfigs : [
10351123 {
@@ -1115,7 +1203,7 @@ module cosmosDb 'br/public:avm/res/document-db/database-account:0.15.0' = {
11151203 ]
11161204 }
11171205 service : 'Sql'
1118- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
1206+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
11191207 }
11201208 ]
11211209 : []
@@ -1204,7 +1292,7 @@ module sqlDBModule 'br/public:avm/res/sql/server:0.20.1' = {
12041292 ]
12051293 }
12061294 service : 'sqlServer'
1207- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
1295+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
12081296 tags : tags
12091297 }
12101298 ]
@@ -1246,7 +1334,7 @@ module uploadFiles 'br/public:avm/res/resources/deployment-script:0.5.1' = {
12461334 arguments : '${storageAccount .outputs .name } data ${baseUrl } ${userAssignedIdentity .outputs .clientId }'
12471335 storageAccountResourceId : storageAccount .outputs .resourceId
12481336 subnetResourceIds : enablePrivateNetworking ? [
1249- network !.outputs .subnetDeploymentScriptsResourceId
1337+ virtualNetwork !.outputs .deploymentScriptsSubnetResourceId
12501338 ] : null
12511339 tags : tags
12521340 timeout : 'PT1H'
@@ -1278,7 +1366,7 @@ module createIndex 'br/public:avm/res/resources/deployment-script:0.5.1' = {
12781366 cleanupPreference : 'OnSuccess'
12791367 storageAccountResourceId : storageAccount .outputs .resourceId
12801368 subnetResourceIds : enablePrivateNetworking ? [
1281- network !.outputs .subnetDeploymentScriptsResourceId
1369+ virtualNetwork !.outputs .deploymentScriptsSubnetResourceId
12821370 ] : null
12831371 }
12841372 dependsOn :[sqlDBModule ,uploadFiles ]
@@ -1321,7 +1409,7 @@ module createSqlUserAndRole 'br/public:avm/res/resources/deployment-script:0.5.1
13211409 cleanupPreference : 'OnSuccess'
13221410 storageAccountResourceId : storageAccount .outputs .resourceId
13231411 subnetResourceIds : enablePrivateNetworking ? [
1324- network !.outputs .subnetDeploymentScriptsResourceId
1412+ virtualNetwork !.outputs .deploymentScriptsSubnetResourceId
13251413 ] : null
13261414 }
13271415 dependsOn :[sqlDBModule ]
@@ -1471,7 +1559,7 @@ module webSiteBackend 'modules/web-sites.bicep' = {
14711559 // WAF aligned configuration for Private Networking
14721560 vnetRouteAllEnabled : enablePrivateNetworking ? true : false
14731561 vnetImagePullEnabled : enablePrivateNetworking ? true : false
1474- virtualNetworkSubnetId : enablePrivateNetworking ? network !.outputs .subnetWebResourceId : null
1562+ virtualNetworkSubnetId : enablePrivateNetworking ? virtualNetwork !.outputs .webSubnetResourceId : null
14751563 publicNetworkAccess : 'Enabled'
14761564 }
14771565}
@@ -1503,7 +1591,7 @@ module webSiteFrontend 'modules/web-sites.bicep' = {
15031591 ]
15041592 vnetRouteAllEnabled : enablePrivateNetworking ? true : false
15051593 vnetImagePullEnabled : enablePrivateNetworking ? true : false
1506- virtualNetworkSubnetId : enablePrivateNetworking ? network !.outputs .subnetWebResourceId : null
1594+ virtualNetworkSubnetId : enablePrivateNetworking ? virtualNetwork !.outputs .webSubnetResourceId : null
15071595 diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
15081596 publicNetworkAccess : 'Enabled'
15091597 }
0 commit comments