@@ -233,7 +233,7 @@ module avmPrivateDnsZones 'br/public:avm/res/network/private-dns-zone:0.7.1' = [
233233 name : zone
234234 tags : tags
235235 enableTelemetry : enableTelemetry
236- virtualNetworkLinks : [{ virtualNetworkResourceId : network !.outputs .vnetResourceId }]
236+ virtualNetworkLinks : [{ virtualNetworkResourceId : virtualNetwork !.outputs .resourceId }]
237237 }
238238 }
239239]
@@ -302,21 +302,107 @@ module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0
302302}
303303var logAnalyticsWorkspaceResourceId = useExistingLogAnalytics ? existingLogAnalyticsWorkspaceId : logAnalyticsWorkspace !.outputs .resourceId
304304
305- // ========== Network Module ========== //
306- module network 'modules/network .bicep' = if (enablePrivateNetworking ) {
307- name : take ('network- ${solutionSuffix }-deployment ' , 64 )
305+ // Virtual Network with NSGs and Subnets
306+ module virtualNetwork 'modules/virtualNetwork .bicep' = if (enablePrivateNetworking ) {
307+ name : take ('module.virtualNetwork. ${solutionSuffix }' , 64 )
308308 params : {
309- resourcesName : solutionSuffix
310- logAnalyticsWorkSpaceResourceId : logAnalyticsWorkspaceResourceId
311- vmAdminUsername : vmAdminUsername ?? 'JumpboxAdminUser'
312- vmAdminPassword : vmAdminPassword ?? 'JumpboxAdminP@ssw0rd1234!'
313- vmSize : vmSize ?? 'Standard_DS2_v2' // Default VM size
309+ name : 'vnet-${solutionSuffix }'
310+ addressPrefixes : ['10.0.0.0/20' ] // 4096 addresses (enough for 8 /23 subnets or 16 /24)
314311 location : solutionLocation
315312 tags : tags
313+ logAnalyticsWorkspaceId : logAnalyticsWorkspaceResourceId
314+ resourceSuffix : solutionSuffix
316315 enableTelemetry : enableTelemetry
317316 }
318317}
318+ // Azure Bastion Host
319+ var bastionHostName = 'bas-${solutionSuffix }'
320+ module bastionHost 'br/public:avm/res/network/bastion-host:0.6.1' = if (enablePrivateNetworking ) {
321+ name : take ('avm.res.network.bastion-host.${bastionHostName }' , 64 )
322+ params : {
323+ name : bastionHostName
324+ skuName : 'Standard'
325+ location : solutionLocation
326+ virtualNetworkResourceId : virtualNetwork !.outputs .resourceId
327+ diagnosticSettings : [
328+ {
329+ name : 'bastionDiagnostics'
330+ workspaceResourceId : logAnalyticsWorkspaceResourceId
331+ logCategoriesAndGroups : [
332+ {
333+ categoryGroup : 'allLogs'
334+ enabled : true
335+ }
336+ ]
337+ }
338+ ]
339+ tags : tags
340+ enableTelemetry : enableTelemetry
341+ publicIPAddressObject : {
342+ name : 'pip-${bastionHostName }'
343+ zones : []
344+ }
345+ }
346+ }
319347
348+ // Jumpbox Virtual Machine
349+ var jumpboxVmName = take ('vm-jumpbox-${solutionSuffix }' , 15 )
350+ module jumpboxVM 'br/public:avm/res/compute/virtual-machine:0.15.0' = if (enablePrivateNetworking ) {
351+ name : take ('avm.res.compute.virtual-machine.${jumpboxVmName }' , 64 )
352+ params : {
353+ name : take (jumpboxVmName , 15 ) // Shorten VM name to 15 characters to avoid Azure limits
354+ vmSize : vmSize ?? 'Standard_DS2_v2'
355+ location : solutionLocation
356+ adminUsername : vmAdminUsername ?? 'JumpboxAdminUser'
357+ adminPassword : vmAdminPassword ?? 'JumpboxAdminP@ssw0rd1234!'
358+ tags : tags
359+ zone : 0
360+ imageReference : {
361+ offer : 'WindowsServer'
362+ publisher : 'MicrosoftWindowsServer'
363+ sku : '2019-datacenter'
364+ version : 'latest'
365+ }
366+ osType : 'Windows'
367+ osDisk : {
368+ name : 'osdisk-${jumpboxVmName }'
369+ managedDisk : {
370+ storageAccountType : 'Standard_LRS'
371+ }
372+ }
373+ encryptionAtHost : false // Some Azure subscriptions do not support encryption at host
374+ nicConfigurations : [
375+ {
376+ name : 'nic-${jumpboxVmName }'
377+ ipConfigurations : [
378+ {
379+ name : 'ipconfig1'
380+ subnetResourceId : virtualNetwork !.outputs .jumpboxSubnetResourceId
381+ }
382+ ]
383+ diagnosticSettings : [
384+ {
385+ name : 'jumpboxDiagnostics'
386+ workspaceResourceId : logAnalyticsWorkspaceResourceId
387+ logCategoriesAndGroups : [
388+ {
389+ categoryGroup : 'allLogs'
390+ enabled : true
391+ }
392+ ]
393+ metricCategories : [
394+ {
395+ category : 'AllMetrics'
396+ enabled : true
397+ }
398+ ]
399+ }
400+ ]
401+ }
402+ ]
403+ enableTelemetry : enableTelemetry
404+ }
405+ }
320406// ========== User Assigned Identity ========== //
321407// WAF best practices for identity and access management: https://learn.microsoft.com/en-us/azure/well-architected/security/identity-access
322408var userAssignedIdentityResourceName = 'id-${solutionSuffix }'
@@ -390,7 +476,7 @@ module avmCosmosDB 'br/public:avm/res/document-db/database-account:0.15.0' = {
390476 ]
391477 }
392478 service : 'MongoDB'
393- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId // Use the backend subnet
479+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId // Use the private endpoints subnet
394480 }
395481 ]
396482 : []
@@ -572,7 +658,7 @@ module avmAppConfigUpdated 'br/public:avm/res/app-configuration/configuration-st
572658 }
573659 ]
574660 }
575- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
661+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
576662 }
577663 ]
578664 : []
@@ -624,7 +710,7 @@ module avmStorageAccount 'br/public:avm/res/storage/storage-account:0.20.0' = {
624710 }
625711 ]
626712 }
627- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
713+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
628714 service : 'blob'
629715 }
630716 {
@@ -637,7 +723,7 @@ module avmStorageAccount 'br/public:avm/res/storage/storage-account:0.20.0' = {
637723 }
638724 ]
639725 }
640- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
726+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
641727 service : 'queue'
642728 }
643729 ]
@@ -699,7 +785,7 @@ module avmSearchSearchServices 'br/public:avm/res/search/search-service:0.11.1'
699785 { privateDnsZoneResourceId : avmPrivateDnsZones [dnsZoneIndex .search ]!.outputs .resourceId }
700786 ]
701787 }
702- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
788+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
703789 }
704790 ]
705791 : []
@@ -733,7 +819,7 @@ module avmOpenAi 'br/public:avm/res/cognitive-services/account:0.13.2' = {
733819 ? [
734820 {
735821 name : 'pep-openai-${solutionSuffix }'
736- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
822+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
737823 service : 'account'
738824 privateDnsZoneGroup : {
739825 privateDnsZoneGroupConfigs : [
@@ -793,7 +879,7 @@ module documentIntelligence 'br/public:avm/res/cognitive-services/account:0.13.2
793879 ? [
794880 {
795881 name : 'pep-docintel-${solutionSuffix }'
796- subnetResourceId : network !.outputs .subnetPrivateEndpointsResourceId
882+ subnetResourceId : virtualNetwork !.outputs .pepsSubnetResourceId
797883 service : 'account'
798884 privateDnsZoneGroup : {
799885 privateDnsZoneGroupConfigs : [
@@ -852,7 +938,8 @@ module managedCluster 'br/public:avm/res/container-service/managed-cluster:0.10.
852938 enableAutoScaling : true
853939 scaleSetEvictionPolicy : 'Delete'
854940 scaleSetPriority : 'Regular'
855- vnetSubnetResourceId : enablePrivateNetworking ? network !.outputs .subnetWebResourceId : null
941+ // Use the dedicated AKS subnet to avoid subnet delegation conflicts
942+ vnetSubnetResourceId : enablePrivateNetworking ? virtualNetwork !.outputs .webSubnetResourceId : null
856943 }
857944 ]
858945 autoNodeOsUpgradeProfileUpgradeChannel : 'Unmanaged'
@@ -961,7 +1048,7 @@ output AZURE_SEARCH_SERVICE_NAME string = avmSearchSearchServices.outputs.name
9611048output AZURE_AKS_NAME string = managedCluster .outputs .name
9621049
9631050@description ('Contains Azure AKS Managed Identity ID.' )
964- output AZURE_AKS_MI_ID string = managedCluster .outputs .systemAssignedMIPrincipalId
1051+ output AZURE_AKS_MI_ID string = managedCluster .outputs .systemAssignedMIPrincipalId ?? ''
9651052
9661053@description ('Contains Azure Container Registry Name.' )
9671054output AZURE_CONTAINER_REGISTRY_NAME string = avmContainerRegistry .outputs .name
0 commit comments