Skip to content

Commit f6b4d88

Browse files
Optimize the network module
1 parent f421cd5 commit f6b4d88

File tree

7 files changed

+471
-799
lines changed

7 files changed

+471
-799
lines changed

infra/main.bicep

Lines changed: 105 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
302302
var 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
321407
var 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
9601047
output 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.')
9661053
output AZURE_CONTAINER_REGISTRY_NAME string = avmContainerRegistry.outputs.name

0 commit comments

Comments
 (0)