@@ -107,6 +107,12 @@ param frontendContainerImageTag string = 'latest_2025-07-22_895'
107107@description ('Optional. Enable/Disable usage telemetry for module.' )
108108param enableTelemetry bool = true
109109
110+ @description ('Use this parameter to reuse an existing Log Analytics Workspace' )
111+ param existingLogAnalyticsWorkspaceId string = ''
112+
113+ @description ('Use this parameter to reuse an existing AI project resource ID' )
114+ param existingFoundryProjectResourceId string = ''
115+
110116// ============== //
111117// Variables //
112118// ============== //
@@ -191,11 +197,23 @@ resource avmTelemetry 'Microsoft.Resources/deployments@2024-03-01' = if (enableT
191197 }
192198}
193199
200+ // Extracts subscription, resource group, and workspace name from the resource ID when using an existing Log Analytics workspace
201+ var useExistingLogAnalytics = !empty (existingLogAnalyticsWorkspaceId )
202+
203+ var existingLawSubscription = useExistingLogAnalytics ? split (existingLogAnalyticsWorkspaceId , '/' )[2 ] : ''
204+ var existingLawResourceGroup = useExistingLogAnalytics ? split (existingLogAnalyticsWorkspaceId , '/' )[4 ] : ''
205+ var existingLawName = useExistingLogAnalytics ? split (existingLogAnalyticsWorkspaceId , '/' )[8 ] : ''
206+
207+ resource existingLogAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2020-08-01' existing = if (useExistingLogAnalytics ) {
208+ name : existingLawName
209+ scope : resourceGroup (existingLawSubscription , existingLawResourceGroup )
210+ }
211+
194212// ========== Log Analytics Workspace ========== //
195213// WAF best practices for Log Analytics: https://learn.microsoft.com/en-us/azure/well-architected/service-guides/azure-log-analytics
196214// WAF PSRules for Log Analytics: https://azure.github.io/PSRule.Rules.Azure/en/rules/resource/#azure-monitor-logs
197215var logAnalyticsWorkspaceResourceName = 'log-${solutionSuffix }'
198- module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0.12.0' = if (enableMonitoring ) {
216+ module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0.12.0' = if (enableMonitoring && ! useExistingLogAnalytics ) {
199217 name : take ('avm.res.operational-insights.workspace.${logAnalyticsWorkspaceResourceName }' , 64 )
200218 params : {
201219 name : logAnalyticsWorkspaceResourceName
@@ -253,6 +271,11 @@ module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0
253271 : null
254272 }
255273}
274+ // Log Analytics Name, workspace ID, customer ID, and shared key (existing or new)
275+ var logAnalyticsWorkspaceName = useExistingLogAnalytics ? existingLogAnalyticsWorkspace !.name : logAnalyticsWorkspace !.outputs .name
276+ var logAnalyticsWorkspaceResourceId = useExistingLogAnalytics ? existingLogAnalyticsWorkspaceId : logAnalyticsWorkspace !.outputs .resourceId
277+ var logAnalyticsPrimarySharedKey = useExistingLogAnalytics ? existingLogAnalyticsWorkspace !.listKeys ().primarySharedKey : logAnalyticsWorkspace .outputs .primarySharedKey
278+ var logAnalyticsWorkspaceId = useExistingLogAnalytics ? existingLogAnalyticsWorkspace !.properties .customerId : logAnalyticsWorkspace !.outputs .logAnalyticsWorkspaceId
256279
257280// ========== Application Insights ========== //
258281// WAF best practices for Application Insights: https://learn.microsoft.com/en-us/azure/well-architected/service-guides/application-insights
@@ -270,8 +293,8 @@ module applicationInsights 'br/public:avm/res/insights/component:0.6.0' = if (en
270293 disableIpMasking : false
271294 flowType : 'Bluefield'
272295 // WAF aligned configuration for Monitoring
273- workspaceResourceId : enableMonitoring ? logAnalyticsWorkspace !. outputs . resourceId : ''
274- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
296+ workspaceResourceId : enableMonitoring ? logAnalyticsWorkspaceResourceId : ''
297+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
275298 }
276299}
277300
@@ -299,7 +322,7 @@ module networkSecurityGroupBackend 'br/public:avm/res/network/network-security-g
299322 location : location
300323 tags : tags
301324 enableTelemetry : enableTelemetry
302- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
325+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
303326 securityRules : [
304327 {
305328 name : 'deny-hop-outbound'
@@ -329,7 +352,7 @@ module networkSecurityGroupBastion 'br/public:avm/res/network/network-security-g
329352 location : location
330353 tags : tags
331354 enableTelemetry : enableTelemetry
332- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
355+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
333356 securityRules : [
334357 {
335358 name : 'AllowHttpsInBound'
@@ -485,7 +508,7 @@ module networkSecurityGroupAdministration 'br/public:avm/res/network/network-sec
485508 location : location
486509 tags : tags
487510 enableTelemetry : enableTelemetry
488- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
511+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
489512 securityRules : [
490513 {
491514 name : 'deny-hop-outbound'
@@ -515,7 +538,7 @@ module networkSecurityGroupContainers 'br/public:avm/res/network/network-securit
515538 location : location
516539 tags : tags
517540 enableTelemetry : enableTelemetry
518- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
541+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
519542 securityRules : [
520543 {
521544 name : 'deny-hop-outbound'
@@ -545,7 +568,7 @@ module networkSecurityGroupWebsite 'br/public:avm/res/network/network-security-g
545568 location : location
546569 tags : tags
547570 enableTelemetry : enableTelemetry
548- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
571+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
549572 securityRules : [
550573 {
551574 name : 'deny-hop-outbound'
@@ -639,15 +662,15 @@ module bastionHost 'br/public:avm/res/network/bastion-host:0.7.0' = if (enablePr
639662 virtualNetworkResourceId : virtualNetwork !.?outputs .?resourceId
640663 publicIPAddressObject : {
641664 name : 'pip-bas${solutionSuffix }'
642- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
665+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
643666 tags : tags
644667 }
645668 disableCopyPaste : true
646669 enableFileCopy : false
647670 enableIpConnect : false
648671 enableShareableLink : false
649672 scaleUnits : 4
650- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
673+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
651674 }
652675}
653676
@@ -762,7 +785,7 @@ module windowsVmDataCollectionRules 'br/public:avm/res/insights/data-collection-
762785 destinations : {
763786 logAnalytics : [
764787 {
765- workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId
788+ workspaceResourceId : logAnalyticsWorkspaceResourceId
766789 name : 'la--1264800308'
767790 }
768791 ]
@@ -840,14 +863,14 @@ module virtualMachine 'br/public:avm/res/compute/virtual-machine:0.17.0' = if (e
840863 tags : tags
841864 deleteOption : 'Delete'
842865 diagnosticSettings : enableMonitoring //WAF aligned configuration for Monitoring
843- ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }]
866+ ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }]
844867 : null
845868 ipConfigurations : [
846869 {
847870 name : '${virtualMachineResourceName }-nic01-ipconfig01'
848871 subnetResourceId : virtualNetwork !.outputs .subnetResourceIds [1 ]
849872 diagnosticSettings : enableMonitoring //WAF aligned configuration for Monitoring
850- ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }]
873+ ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }]
851874 : null
852875 }
853876 ]
@@ -879,7 +902,7 @@ module virtualMachine 'br/public:avm/res/compute/virtual-machine:0.17.0' = if (e
879902 dataCollectionRuleAssociations : [
880903 {
881904 dataCollectionRuleResourceId : windowsVmDataCollectionRules !.outputs .resourceId
882- name : 'send-${logAnalyticsWorkspace !. outputs . name }'
905+ name : 'send-${logAnalyticsWorkspaceName }'
883906 }
884907 ]
885908 enabled : true
@@ -989,7 +1012,7 @@ module aiFoundryAiServices 'modules/ai-services.bicep' = if (aiFoundryAIservices
9891012 }
9901013 ]
9911014 // WAF aligned configuration for Monitoring
992- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
1015+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
9931016 publicNetworkAccess : enablePrivateNetworking ? 'Disabled' : 'Enabled'
9941017 privateEndpoints : enablePrivateNetworking
9951018 ? ([
@@ -1115,7 +1138,7 @@ module cosmosDb 'br/public:avm/res/document-db/database-account:0.15.0' = {
11151138 }
11161139 ]
11171140 // WAF aligned configuration for Monitoring
1118- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
1141+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
11191142 // WAF aligned configuration for Private Networking
11201143 networkRestrictions : {
11211144 networkAclBypass : 'None'
@@ -1180,8 +1203,8 @@ module containerAppEnvironment 'br/public:avm/res/app/managed-environment:0.11.2
11801203 ? {
11811204 destination : 'log-analytics'
11821205 logAnalyticsConfiguration : {
1183- customerId : logAnalyticsWorkspace !. outputs . logAnalyticsWorkspaceId
1184- sharedKey : logAnalyticsWorkspace . outputs . primarySharedKey
1206+ customerId : logAnalyticsWorkspaceId
1207+ sharedKey : logAnalyticsPrimarySharedKey
11851208 }
11861209 }
11871210 : null
@@ -1389,7 +1412,7 @@ module webServerFarm 'br/public:avm/res/web/serverfarm:0.5.0' = {
13891412 reserved : true
13901413 kind : 'linux'
13911414 // WAF aligned configuration for Monitoring
1392- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
1415+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
13931416 // WAF aligned configuration for Scalability
13941417 skuName : enableScalability || enableRedundancy ? 'P1v3' : 'B3'
13951418 skuCapacity : enableScalability ? 3 : 1
@@ -1431,7 +1454,7 @@ module webSite 'modules/web-sites.bicep' = {
14311454 applicationInsightResourceId : enableMonitoring ? applicationInsights !.outputs .resourceId : null
14321455 }
14331456 ]
1434- diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspace !. outputs . resourceId }] : null
1457+ diagnosticSettings : enableMonitoring ? [{ workspaceResourceId : logAnalyticsWorkspaceResourceId }] : null
14351458 // WAF aligned configuration for Private Networking
14361459 vnetRouteAllEnabled : enablePrivateNetworking ? true : false
14371460 vnetImagePullEnabled : enablePrivateNetworking ? true : false
0 commit comments