@@ -232,7 +232,7 @@ module avmPrivateDnsZones 'br/public:avm/res/network/private-dns-zone:0.7.1' = [
232232 name : zone
233233 tags : tags
234234 enableTelemetry : enableTelemetry
235- virtualNetworkLinks : [{ virtualNetworkResourceId : network !.outputs .vnetResourceId }]
235+ virtualNetworkLinks : [{ virtualNetworkResourceId : virtualNetwork !.outputs .resourceId }]
236236 }
237237 }
238238]
@@ -301,21 +301,107 @@ module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0
301301}
302302var logAnalyticsWorkspaceResourceId = useExistingLogAnalytics ? existingLogAnalyticsWorkspaceId : logAnalyticsWorkspace !.outputs .resourceId
303303
304- // ========== Network Module ========== //
305- module network 'modules/network .bicep' = if (enablePrivateNetworking ) {
306- name : take ('network- ${solutionSuffix }-deployment ' , 64 )
304+ // Virtual Network with NSGs and Subnets
305+ module virtualNetwork 'modules/virtualNetwork .bicep' = if (enablePrivateNetworking ) {
306+ name : take ('module.virtualNetwork. ${solutionSuffix }' , 64 )
307307 params : {
308- resourcesName : solutionSuffix
309- logAnalyticsWorkSpaceResourceId : logAnalyticsWorkspaceResourceId
310- vmAdminUsername : vmAdminUsername ?? 'JumpboxAdminUser'
311- vmAdminPassword : vmAdminPassword ?? 'JumpboxAdminP@ssw0rd1234!'
312- vmSize : vmSize ?? 'Standard_DS2_v2' // Default VM size
308+ name : 'vnet-${solutionSuffix }'
309+ addressPrefixes : ['10.0.0.0/20' ] // 4096 addresses (enough for 8 /23 subnets or 16 /24)
313310 location : solutionLocation
314311 tags : tags
312+ logAnalyticsWorkspaceId : logAnalyticsWorkspaceResourceId
313+ resourceSuffix : solutionSuffix
315314 enableTelemetry : enableTelemetry
316315 }
317316}
317+ // Azure Bastion Host
318+ var bastionHostName = 'bas-${solutionSuffix }'
319+ module bastionHost 'br/public:avm/res/network/bastion-host:0.6.1' = if (enablePrivateNetworking ) {
320+ name : take ('avm.res.network.bastion-host.${bastionHostName }' , 64 )
321+ params : {
322+ name : bastionHostName
323+ skuName : 'Standard'
324+ location : solutionLocation
325+ virtualNetworkResourceId : virtualNetwork !.outputs .resourceId
326+ diagnosticSettings : [
327+ {
328+ name : 'bastionDiagnostics'
329+ workspaceResourceId : logAnalyticsWorkspaceResourceId
330+ logCategoriesAndGroups : [
331+ {
332+ categoryGroup : 'allLogs'
333+ enabled : true
334+ }
335+ ]
336+ }
337+ ]
338+ tags : tags
339+ enableTelemetry : enableTelemetry
340+ publicIPAddressObject : {
341+ name : 'pip-${bastionHostName }'
342+ zones : []
343+ }
344+ }
345+ }
318346
347+ // Jumpbox Virtual Machine
348+ var jumpboxVmName = take ('vm-jumpbox-${solutionSuffix }' , 15 )
349+ module jumpboxVM 'br/public:avm/res/compute/virtual-machine:0.15.0' = if (enablePrivateNetworking ) {
350+ name : take ('avm.res.compute.virtual-machine.${jumpboxVmName }' , 64 )
351+ params : {
352+ name : take (jumpboxVmName , 15 ) // Shorten VM name to 15 characters to avoid Azure limits
353+ vmSize : vmSize ?? 'Standard_DS2_v2'
354+ location : solutionLocation
355+ adminUsername : vmAdminUsername ?? 'JumpboxAdminUser'
356+ adminPassword : vmAdminPassword ?? 'JumpboxAdminP@ssw0rd1234!'
357+ tags : tags
358+ zone : 0
359+ imageReference : {
360+ offer : 'WindowsServer'
361+ publisher : 'MicrosoftWindowsServer'
362+ sku : '2019-datacenter'
363+ version : 'latest'
364+ }
365+ osType : 'Windows'
366+ osDisk : {
367+ name : 'osdisk-${jumpboxVmName }'
368+ managedDisk : {
369+ storageAccountType : 'Standard_LRS'
370+ }
371+ }
372+ encryptionAtHost : false // Some Azure subscriptions do not support encryption at host
373+ nicConfigurations : [
374+ {
375+ name : 'nic-${jumpboxVmName }'
376+ ipConfigurations : [
377+ {
378+ name : 'ipconfig1'
379+ subnetResourceId : virtualNetwork !.outputs .jumpboxSubnetResourceId
380+ }
381+ ]
382+ diagnosticSettings : [
383+ {
384+ name : 'jumpboxDiagnostics'
385+ workspaceResourceId : logAnalyticsWorkspaceResourceId
386+ logCategoriesAndGroups : [
387+ {
388+ categoryGroup : 'allLogs'
389+ enabled : true
390+ }
391+ ]
392+ metricCategories : [
393+ {
394+ category : 'AllMetrics'
395+ enabled : true
396+ }
397+ ]
398+ }
399+ ]
400+ }
401+ ]
402+ enableTelemetry : enableTelemetry
403+ }
404+ }
319405// ========== User Assigned Identity ========== //
320406// WAF best practices for identity and access management: https://learn.microsoft.com/en-us/azure/well-architected/security/identity-access
321407var userAssignedIdentityResourceName = 'id-${solutionSuffix }'
@@ -389,7 +475,7 @@ module avmCosmosDB 'br/public:avm/res/document-db/database-account:0.15.0' = {
389475 ]
390476 }
391477 service : 'MongoDB'
392- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId // Use the backend subnet
478+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId // Use the private endpoints subnet
393479 }
394480 ]
395481 : []
@@ -571,7 +657,7 @@ module avmAppConfigUpdated 'br/public:avm/res/app-configuration/configuration-st
571657 }
572658 ]
573659 }
574- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
660+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
575661 }
576662 ]
577663 : []
@@ -623,7 +709,7 @@ module avmStorageAccount 'br/public:avm/res/storage/storage-account:0.20.0' = {
623709 }
624710 ]
625711 }
626- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
712+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
627713 service : 'blob'
628714 }
629715 {
@@ -636,7 +722,7 @@ module avmStorageAccount 'br/public:avm/res/storage/storage-account:0.20.0' = {
636722 }
637723 ]
638724 }
639- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
725+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
640726 service : 'queue'
641727 }
642728 ]
@@ -698,7 +784,7 @@ module avmSearchSearchServices 'br/public:avm/res/search/search-service:0.11.1'
698784 { privateDnsZoneResourceId : avmPrivateDnsZones [dnsZoneIndex .search ]!.outputs .resourceId }
699785 ]
700786 }
701- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
787+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
702788 }
703789 ]
704790 : []
@@ -732,7 +818,7 @@ module avmOpenAi 'br/public:avm/res/cognitive-services/account:0.13.2' = {
732818 ? [
733819 {
734820 name : 'pep-openai-${solutionSuffix }'
735- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
821+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
736822 service : 'account'
737823 privateDnsZoneGroup : {
738824 privateDnsZoneGroupConfigs : [
@@ -792,7 +878,7 @@ module documentIntelligence 'br/public:avm/res/cognitive-services/account:0.13.2
792878 ? [
793879 {
794880 name : 'pep-docintel-${solutionSuffix }'
795- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
881+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
796882 service : 'account'
797883 privateDnsZoneGroup : {
798884 privateDnsZoneGroupConfigs : [
@@ -851,7 +937,8 @@ module managedCluster 'br/public:avm/res/container-service/managed-cluster:0.10.
851937 enableAutoScaling : true
852938 scaleSetEvictionPolicy : 'Delete'
853939 scaleSetPriority : 'Regular'
854- vnetSubnetResourceId : enablePrivateNetworking ? network !.outputs .subnetWebResourceId : null
940+ // Use the dedicated AKS subnet to avoid subnet delegation conflicts
941+ vnetSubnetResourceId : enablePrivateNetworking ? virtualNetwork !.outputs .aksSubnetResourceId : null
855942 }
856943 ]
857944 autoNodeOsUpgradeProfileUpgradeChannel : 'Unmanaged'
@@ -960,7 +1047,7 @@ output AZURE_SEARCH_SERVICE_NAME string = avmSearchSearchServices.outputs.name
9601047output AZURE_AKS_NAME string = managedCluster .outputs .name
9611048
9621049@description ('Contains Azure AKS Managed Identity ID.' )
963- output AZURE_AKS_MI_ID string = managedCluster .outputs .systemAssignedMIPrincipalId
1050+ output AZURE_AKS_MI_ID string = managedCluster .outputs .systemAssignedMIPrincipalId ?? ''
9641051
9651052@description ('Contains Azure Container Registry Name.' )
9661053output AZURE_CONTAINER_REGISTRY_NAME string = avmContainerRegistry .outputs .name
0 commit comments