Skip to content

Commit 27f8906

Browse files
Merge pull request microsoft#240 from microsoft/hotfix
feat: Implemented reusing of log analytics workspace
2 parents 065c977 + d7fc685 commit 27f8906

File tree

5 files changed

+50
-23
lines changed

5 files changed

+50
-23
lines changed

documentation/DeploymentGuide.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,16 @@ For **production deployments**, the repository also provides [`main.waf-aligned.
4646
- For a WAF-aligned, production-ready deployment, copy the contents of [`main.waf-aligned.bicepparam`](../infra/main.waf-aligned.bicepparam) into `main.bicepparam` before running `azd up`.
4747

4848
> [!TIP]
49-
> Always review and adjust parameter values (such as region, capacity, and security settings) to match your organization’s requirements before deploying. For production, ensure you have sufficient quota and follow the principle of least privilege for all identities and role assignments.
49+
> Always review and adjust parameter values (such as region, capacity, security settings and log analytics workspace configuration) to match your organization’s requirements before deploying. For production, ensure you have sufficient quota and follow the principle of least privilege for all identities and role assignments.
50+
51+
> To reuse an existing Log Analytics workspace, update the existingWorkspaceResourceId field under the logAnalyticsWorkspaceConfiguration parameter in the bicepparam file with the resource ID of your existing workspace.
52+
For example:
53+
```
54+
param logAnalyticsWorkspaceConfiguration = {
55+
dataRetentionInDays: 30
56+
existingWorkspaceResourceId: '/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.OperationalInsights/workspaces/<workspace-name>'
57+
}
58+
```
5059

5160
> [!IMPORTANT]
5261
> The WAF-aligned configuration is under active development. More Azure Well-Architected recommendations will be added in future updates.

infra/main.bicep

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ param logAnalyticsWorkspaceConfiguration logAnalyticsWorkspaceConfigurationType
3434
sku: 'PerGB2018'
3535
tags: tags
3636
dataRetentionInDays: 365
37+
existingWorkspaceResourceId: ''
3738
}
3839

3940
@description('Optional. The configuration to apply for the Multi-Agent Custom Automation Engine Application Insights resource.')
@@ -255,7 +256,10 @@ resource avmTelemetry 'Microsoft.Resources/deployments@2024-03-01' = if (enableT
255256
// Log Analytics configuration defaults
256257
var logAnalyticsWorkspaceEnabled = logAnalyticsWorkspaceConfiguration.?enabled ?? true
257258
var logAnalyticsWorkspaceResourceName = logAnalyticsWorkspaceConfiguration.?name ?? 'log-${solutionPrefix}'
258-
module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0.11.2' = if (logAnalyticsWorkspaceEnabled) {
259+
var existingWorkspaceResourceId = logAnalyticsWorkspaceConfiguration.?existingWorkspaceResourceId ?? ''
260+
var useExistingWorkspace = existingWorkspaceResourceId != ''
261+
262+
module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0.11.2' = if (logAnalyticsWorkspaceEnabled && !useExistingWorkspace) {
259263
name: take('avm.res.operational-insights.workspace.${logAnalyticsWorkspaceResourceName}', 64)
260264
params: {
261265
name: logAnalyticsWorkspaceResourceName
@@ -268,6 +272,8 @@ module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0
268272
}
269273
}
270274

275+
var logAnalyticsWorkspaceId = useExistingWorkspace ? existingWorkspaceResourceId : logAnalyticsWorkspace.outputs.resourceId
276+
271277
// ========== Application Insights ========== //
272278
// WAF best practices for Application Insights: https://learn.microsoft.com/en-us/azure/well-architected/service-guides/application-insights
273279
// Application Insights configuration defaults
@@ -277,12 +283,12 @@ module applicationInsights 'br/public:avm/res/insights/component:0.6.0' = if (ap
277283
name: take('avm.res.insights.component.${applicationInsightsResourceName}', 64)
278284
params: {
279285
name: applicationInsightsResourceName
280-
workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
286+
workspaceResourceId: logAnalyticsWorkspaceId
281287
location: applicationInsightsConfiguration.?location ?? solutionLocation
282288
enableTelemetry: enableTelemetry
283289
tags: applicationInsightsConfiguration.?tags ?? tags
284290
retentionInDays: applicationInsightsConfiguration.?retentionInDays ?? 365
285-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
291+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
286292
kind: 'web'
287293
disableIpMasking: false
288294
flowType: 'Bluefield'
@@ -315,7 +321,7 @@ module networkSecurityGroupBackend 'br/public:avm/res/network/network-security-g
315321
location: networkSecurityGroupBackendConfiguration.?location ?? solutionLocation
316322
tags: networkSecurityGroupBackendConfiguration.?tags ?? tags
317323
enableTelemetry: enableTelemetry
318-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
324+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
319325
securityRules: networkSecurityGroupBackendConfiguration.?securityRules ?? [
320326
// {
321327
// name: 'DenySshRdpOutbound' //Azure Bastion
@@ -346,7 +352,7 @@ module networkSecurityGroupContainers 'br/public:avm/res/network/network-securit
346352
location: networkSecurityGroupContainersConfiguration.?location ?? solutionLocation
347353
tags: networkSecurityGroupContainersConfiguration.?tags ?? tags
348354
enableTelemetry: enableTelemetry
349-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
355+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
350356
securityRules: networkSecurityGroupContainersConfiguration.?securityRules ?? [
351357
// {
352358
// name: 'DenySshRdpOutbound' //Azure Bastion
@@ -377,7 +383,7 @@ module networkSecurityGroupBastion 'br/public:avm/res/network/network-security-g
377383
location: networkSecurityGroupBastionConfiguration.?location ?? solutionLocation
378384
tags: networkSecurityGroupBastionConfiguration.?tags ?? tags
379385
enableTelemetry: enableTelemetry
380-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
386+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
381387
securityRules: networkSecurityGroupBastionConfiguration.?securityRules ?? [
382388
{
383389
name: 'AllowHttpsInBound'
@@ -534,7 +540,7 @@ module networkSecurityGroupAdministration 'br/public:avm/res/network/network-sec
534540
location: networkSecurityGroupAdministrationConfiguration.?location ?? solutionLocation
535541
tags: networkSecurityGroupAdministrationConfiguration.?tags ?? tags
536542
enableTelemetry: enableTelemetry
537-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
543+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
538544
securityRules: networkSecurityGroupAdministrationConfiguration.?securityRules ?? [
539545
// {
540546
// name: 'DenySshRdpOutbound' //Azure Bastion
@@ -651,12 +657,12 @@ module virtualMachine 'br/public:avm/res/compute/virtual-machine:0.13.0' = if (v
651657
name: 'nic-${virtualMachineResourceName}'
652658
//networkSecurityGroupResourceId: virtualMachineConfiguration.?nicConfigurationConfiguration.networkSecurityGroupResourceId
653659
//nicSuffix: 'nic-${virtualMachineResourceName}'
654-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
660+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
655661
ipConfigurations: [
656662
{
657663
name: '${virtualMachineResourceName}-nic01-ipconfig01'
658664
subnetResourceId: virtualMachineConfiguration.?subnetResourceId ?? virtualNetwork.outputs.subnetResourceIds[1]
659-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
665+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
660666
}
661667
]
662668
}
@@ -730,7 +736,7 @@ var aiFoundryAiServicesModelDeployment = {
730736
sku: {
731737
name: 'GlobalStandard'
732738
//Curently the capacity is set to 140 for opinanal performance.
733-
capacity: aiFoundryAiServicesConfiguration.?modelCapcity ?? 140
739+
capacity: aiFoundryAiServicesConfiguration.?modelCapacity ?? 140
734740
}
735741
raiPolicyName: 'Microsoft.Default'
736742
}
@@ -742,7 +748,7 @@ module aiFoundryAiServices 'br/public:avm/res/cognitive-services/account:0.10.2'
742748
tags: aiFoundryAiServicesConfiguration.?tags ?? tags
743749
location: aiFoundryAiServicesConfiguration.?location ?? azureOpenAILocation
744750
enableTelemetry: enableTelemetry
745-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
751+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
746752
sku: aiFoundryAiServicesConfiguration.?sku ?? 'S0'
747753
kind: 'AIServices'
748754
disableLocalAuth: false //Should be set to true for WAF aligned configuration
@@ -841,7 +847,7 @@ module aiFoundryStorageAccount 'br/public:avm/res/storage/storage-account:0.18.2
841847
location: aiFoundryStorageAccountConfiguration.?location ?? azureOpenAILocation
842848
tags: aiFoundryStorageAccountConfiguration.?tags ?? tags
843849
enableTelemetry: enableTelemetry
844-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
850+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
845851
skuName: aiFoundryStorageAccountConfiguration.?sku ?? 'Standard_ZRS'
846852
allowSharedKeyAccess: false
847853
networkAcls: {
@@ -852,7 +858,7 @@ module aiFoundryStorageAccount 'br/public:avm/res/storage/storage-account:0.18.2
852858
deleteRetentionPolicyEnabled: false
853859
containerDeleteRetentionPolicyDays: 7
854860
containerDeleteRetentionPolicyEnabled: false
855-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
861+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
856862
}
857863
publicNetworkAccess: virtualNetworkEnabled ? 'Disabled' : 'Enabled'
858864
allowBlobPublicAccess: virtualNetworkEnabled ? false : true
@@ -912,7 +918,7 @@ module aiFoundryAiHub 'modules/ai-hub.bicep' = if (aiFoundryAiHubEnabled) {
912918
aiFoundryAiServicesName: aiFoundryAiServices.outputs.name
913919
applicationInsightsResourceId: applicationInsights.outputs.resourceId
914920
enableTelemetry: enableTelemetry
915-
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
921+
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspaceId
916922
storageAccountResourceId: aiFoundryStorageAccount.outputs.resourceId
917923
virtualNetworkEnabled: virtualNetworkEnabled
918924
privateEndpoints: virtualNetworkEnabled
@@ -948,7 +954,7 @@ module aiFoundryAiProject 'br/public:avm/res/machine-learning-services/workspace
948954
location: aiFoundryAiProjectConfiguration.?location ?? azureOpenAILocation
949955
tags: aiFoundryAiProjectConfiguration.?tags ?? tags
950956
enableTelemetry: enableTelemetry
951-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
957+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
952958
sku: aiFoundryAiProjectConfiguration.?sku ?? 'Basic'
953959
kind: 'Project'
954960
hubResourceId: aiFoundryAiHub.outputs.resourceId
@@ -991,7 +997,7 @@ module cosmosDb 'br/public:avm/res/document-db/database-account:0.12.0' = if (co
991997
location: cosmosDbAccountConfiguration.?location ?? solutionLocation
992998
tags: cosmosDbAccountConfiguration.?tags ?? tags
993999
enableTelemetry: enableTelemetry
994-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
1000+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
9951001
databaseAccountOfferType: 'Standard'
9961002
enableFreeTier: false
9971003
networkRestrictions: {
@@ -1065,7 +1071,7 @@ module containerAppEnvironment 'modules/container-app-environment.bicep' = if (c
10651071
name: containerAppEnvironmentResourceName
10661072
tags: containerAppEnvironmentConfiguration.?tags ?? tags
10671073
location: containerAppEnvironmentConfiguration.?location ?? solutionLocation
1068-
logAnalyticsResourceName: logAnalyticsWorkspace.outputs.name
1074+
logAnalyticsResourceId: logAnalyticsWorkspaceId
10691075
publicNetworkAccess: 'Enabled'
10701076
zoneRedundant: virtualNetworkEnabled ? true : false
10711077
applicationInsightsConnectionString: applicationInsights.outputs.connectionString
@@ -1210,7 +1216,7 @@ module webServerFarm 'br/public:avm/res/web/serverfarm:0.4.1' = if (webServerFar
12101216
skuName: webServerFarmConfiguration.?skuName ?? 'P1v3'
12111217
skuCapacity: webServerFarmConfiguration.?skuCapacity ?? 3
12121218
reserved: true
1213-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
1219+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
12141220
kind: 'linux'
12151221
zoneRedundant: false //TODO: make it zone redundant for waf aligned
12161222
}
@@ -1231,7 +1237,7 @@ module webSite 'br/public:avm/res/web/site:0.15.1' = if (webSiteEnabled) {
12311237
enableTelemetry: enableTelemetry
12321238
serverFarmResourceId: webSiteConfiguration.?environmentResourceId ?? webServerFarm.?outputs.resourceId
12331239
appInsightResourceId: applicationInsights.outputs.resourceId
1234-
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId }]
1240+
diagnosticSettings: [{ workspaceResourceId: logAnalyticsWorkspaceId }]
12351241
publicNetworkAccess: 'Enabled' //TODO: use Azure Front Door WAF or Application Gateway WAF instead
12361242
siteConfig: {
12371243
linuxFxVersion: 'DOCKER|${webSiteConfiguration.?containerImageRegistryDomain ?? 'biabcontainerreg.azurecr.io'}/${webSiteConfiguration.?containerImageName ?? 'macaefrontend'}:${webSiteConfiguration.?containerImageTag ?? 'latest'}'
@@ -1292,6 +1298,9 @@ type logAnalyticsWorkspaceConfigurationType = {
12921298
@description('Optional. The number of days to retain the data in the Log Analytics Workspace. If empty, it will be set to 365 days.')
12931299
@maxValue(730)
12941300
dataRetentionInDays: int?
1301+
1302+
@description('Optional: Existing Log Analytics Workspace Resource ID')
1303+
existingWorkspaceResourceId: string?
12951304
}
12961305

12971306
@export()

infra/main.bicepparam

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ param solutionLocation = readEnvironmentVariable('AZURE_LOCATION', 'swedencentra
55
param azureOpenAILocation = readEnvironmentVariable('AZURE_ENV_OPENAI_LOCATION', 'swedencentral')
66
param logAnalyticsWorkspaceConfiguration = {
77
dataRetentionInDays: 30
8+
existingWorkspaceResourceId: ''
89
}
910
param applicationInsightsConfiguration = {
1011
retentionInDays: 30

infra/main.waf-aligned.bicepparam

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,7 @@ param virtualMachineConfiguration = {
77
adminUsername: 'adminuser'
88
adminPassword: 'P@ssw0rd1234'
99
}
10+
11+
param logAnalyticsWorkspaceConfiguration = {
12+
existingWorkspaceResourceId: ''
13+
}

infra/modules/container-app-environment.bicep

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
param name string
22
param location string
3-
param logAnalyticsResourceName string
3+
param logAnalyticsResourceId string
44
param tags object
55
param publicNetworkAccess string
66
//param vnetConfiguration object
@@ -10,8 +10,12 @@ param enableTelemetry bool
1010
param subnetResourceId string
1111
param applicationInsightsConnectionString string
1212

13-
resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2023-09-01' existing = {
14-
name: logAnalyticsResourceName
13+
var logAnalyticsResourceGroup = split(logAnalyticsResourceId, '/')[4]
14+
var logAnalyticsName = split(logAnalyticsResourceId, '/')[8]
15+
16+
resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2020-08-01' existing = {
17+
name: logAnalyticsName
18+
scope: resourceGroup(logAnalyticsResourceGroup)
1519
}
1620

1721
// resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2024-08-02-preview' = {

0 commit comments

Comments
 (0)