Skip to content

Commit a13b50e

Browse files
feat: EXP Changes to reuse existing log analytics workspace (#66)
* feat: Implemented EXP changes * docs: Added Step to use log analytics workspace * docs: Added the docs for log analytics
1 parent f19cd07 commit a13b50e

9 files changed

Lines changed: 158 additions & 95 deletions

File tree

142 KB
Loading
196 KB
Loading
88.9 KB
Loading

docs/local_environment_steps.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,12 @@ Optionally set environment variables via the following commands:
3434
azd env set 'AZURE_VM_ADMIN_PASSWORD' '<secure password>'
3535
```
3636

37+
Optionally you can use the existing log analyitcs workspace if required.
38+
39+
Follow this guide to set the existing log analytics workspace [Existing Workspace ID](/docs/re-use-log-analytics.md)
40+
3741
# Deploy
3842

39-
> ⚠️ **Note:** The latest version of the Azure Developer CLI (AZD) is currently limited on prompting for missing parameters. The feature flag parameters in this solution have been temporarily defaulted to `'disabled'` until this limitation is lifted and prompting will resume.
4043

4144
To provision the necessary Azure resources and deploy the application, run the azd up command:
4245
```powershell

docs/re-use-log-analytics.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
[← Back to *DEPLOYMENT* guide](local_environment_steps.md#deploy)
2+
3+
# Reusing an Existing Log Analytics Workspace
4+
To configure your environment to use an existing Log Analytics Workspace, follow these steps:
5+
---
6+
### 1. Go to Azure Portal
7+
Go to https://portal.azure.com
8+
9+
### 2. Search for Log Analytics
10+
In the search bar at the top, type "Log Analytics workspaces" and click on it and click on the workspace you want to use.
11+
12+
![alt text](./images/re_use_log/logAnalyticsList.png)
13+
14+
### 3. Copy Resource ID
15+
In the Overview pane, Click on JSON View
16+
17+
![alt text](./images/re_use_log/logAnalytics.png)
18+
19+
Copy Resource ID that is your Workspace ID
20+
21+
![alt text](./images/re_use_log/logAnalyticsJson.png)
22+
23+
### 4. Set the Workspace ID in Your Environment
24+
Run the following command in your terminal
25+
```bash
26+
azd env set AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID '<Existing Log Analytics Workspace Id>'
27+
```
28+
Replace `<Existing Log Analytics Workspace Id>` with the value obtained from Step 3.
29+
30+
### 5. Continue Deployment
31+
Proceed with the next steps in the [deployment guide](local_environment_steps.md#deploy).

infra/main.bicep

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@ param authClientId string?
114114
@description('Client secret for registered application in Entra for use with app authentication.')
115115
param authClientSecret string?
116116

117+
@description('Optional: Existing Log Analytics Workspace Resource ID')
118+
param existingLogAnalyticsWorkspaceId string = ''
119+
120+
var useExistingLogAnalytics = !empty(existingLogAnalyticsWorkspaceId)
121+
var existingLawSubscription = useExistingLogAnalytics ? split(existingLogAnalyticsWorkspaceId, '/')[2] : ''
122+
var existingLawResourceGroup = useExistingLogAnalytics ? split(existingLogAnalyticsWorkspaceId, '/')[4] : ''
123+
var existingLawName = useExistingLogAnalytics ? split(existingLogAnalyticsWorkspaceId, '/')[8] : ''
124+
117125
var defaultTags = {
118126
'azd-env-name': name
119127
}
@@ -134,7 +142,12 @@ module appIdentity 'br/public:avm/res/managed-identity/user-assigned-identity:0.
134142
}
135143
}
136144

137-
module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0.11.0' = {
145+
resource existingLogAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2023-09-01' existing = if (useExistingLogAnalytics) {
146+
name: existingLawName
147+
scope: resourceGroup(existingLawSubscription, existingLawResourceGroup)
148+
}
149+
150+
module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0.11.0' = if (!useExistingLogAnalytics) {
138151
name: take('${name}-log-analytics-deployment', 64)
139152
params: {
140153
name: toLower('log-${name}')
@@ -145,13 +158,15 @@ module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0
145158
}
146159
}
147160

161+
var logAnalyticsWorkspaceResourceId = useExistingLogAnalytics ? existingLogAnalyticsWorkspace.id : logAnalyticsWorkspace.outputs.resourceId
162+
148163
module applicationInsights 'br/public:avm/res/insights/component:0.6.0' = {
149164
name: take('${name}-app-insights-deployment', 64)
150165
params: {
151166
name: toLower('appi-${name}')
152167
location: location
153168
tags: allTags
154-
workspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
169+
workspaceResourceId: logAnalyticsWorkspaceResourceId
155170
}
156171
}
157172

@@ -160,7 +175,7 @@ module network 'modules/virtualNetwork.bicep' = if (networkIsolation) {
160175
params: {
161176
resourceToken: resourceToken
162177
allowedIpAddress: allowedIpAddress
163-
logAnalyticsWorkspaceId: logAnalyticsWorkspace.outputs.resourceId
178+
logAnalyticsWorkspaceId: logAnalyticsWorkspaceResourceId
164179
location: location
165180
tags: allTags
166181
}
@@ -174,7 +189,7 @@ module keyvault 'modules/keyvault.bicep' = {
174189
networkIsolation: networkIsolation
175190
virtualNetworkResourceId: networkIsolation ? network.outputs.resourceId : ''
176191
virtualNetworkSubnetResourceId: networkIsolation ? network.outputs.defaultSubnetResourceId : ''
177-
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
192+
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspaceResourceId
178193
roleAssignments: concat(empty(userObjectId) ? [] : [
179194
{
180195
principalId: userObjectId
@@ -206,7 +221,7 @@ module containerRegistry 'modules/containerRegistry.bicep' = if (acrEnabled) {
206221
networkIsolation: networkIsolation
207222
virtualNetworkResourceId: networkIsolation ? network.outputs.resourceId : ''
208223
virtualNetworkSubnetResourceId: networkIsolation ? network.outputs.defaultSubnetResourceId : ''
209-
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
224+
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspaceResourceId
210225
tags: allTags
211226
}
212227
}
@@ -219,7 +234,7 @@ module storageAccount 'modules/storageAccount.bicep' = {
219234
networkIsolation: networkIsolation
220235
virtualNetworkResourceId: networkIsolation ? network.outputs.resourceId : ''
221236
virtualNetworkSubnetResourceId: networkIsolation ? network.outputs.defaultSubnetResourceId : ''
222-
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
237+
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspaceResourceId
223238
roleAssignments: concat(empty(userObjectId) ? [] : [
224239
{
225240
principalId: userObjectId
@@ -254,7 +269,7 @@ module cognitiveServices 'modules/cognitive-services/main.bicep' = {
254269
virtualNetworkResourceId: networkIsolation ? network.outputs.resourceId : ''
255270
virtualNetworkSubnetResourceId: networkIsolation ? network.outputs.defaultSubnetResourceId : ''
256271
principalIds: deploySampleApp ? [appIdentity.outputs.principalId] : []
257-
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
272+
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspaceResourceId
258273
aiModelDeployments: [
259274
for model in [aiEmbeddingModelDeployment, aiGPTModelDeployment]: {
260275
name: empty(model.?name) ? model.modelName : model.?name
@@ -303,7 +318,7 @@ module aiSearch 'modules/aisearch.bicep' = if (searchEnabled) {
303318
networkIsolation: networkIsolation
304319
virtualNetworkResourceId: networkIsolation ? network.outputs.resourceId : ''
305320
virtualNetworkSubnetResourceId: networkIsolation ? network.outputs.defaultSubnetResourceId : ''
306-
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
321+
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspaceResourceId
307322
roleAssignments: union(empty(userObjectId) ? [] : [
308323
{
309324
principalId: userObjectId
@@ -354,9 +369,10 @@ module virtualMachine './modules/virtualMachine.bicep' = if (networkIsolation)
354369
enableAcceleratedNetworking: true
355370
enableMicrosoftEntraIdAuth: true
356371
userObjectId: userObjectId
357-
workspaceId: logAnalyticsWorkspace.outputs.resourceId
372+
workspaceId: logAnalyticsWorkspaceResourceId
358373
location: location
359374
tags: allTags
375+
dcrLocation: useExistingLogAnalytics ? existingLogAnalyticsWorkspace.location : logAnalyticsWorkspace.outputs.location
360376
}
361377
dependsOn: networkIsolation ? [storageAccount] : []
362378
}
@@ -370,7 +386,7 @@ module apim 'modules/apim.bicep' = if (apiManagementEnabled) {
370386
publisherName: '${name} API Management'
371387
sku: 'Developer'
372388
networkIsolation: networkIsolation
373-
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
389+
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspaceResourceId
374390
virtualNetworkResourceId: networkIsolation ? network.outputs.resourceId : ''
375391
virtualNetworkSubnetResourceId: networkIsolation ? network.outputs.defaultSubnetResourceId : ''
376392
tags: allTags
@@ -385,7 +401,7 @@ module cosmosDb 'modules/cosmosDb.bicep' = if (cosmosDbEnabled) {
385401
networkIsolation: networkIsolation
386402
virtualNetworkResourceId: networkIsolation ? network.outputs.resourceId : ''
387403
virtualNetworkSubnetResourceId: networkIsolation ? network.outputs.defaultSubnetResourceId : ''
388-
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
404+
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspaceResourceId
389405
databases: cosmosDatabases
390406
sqlRoleAssignmentsPrincipalIds: deploySampleApp ? [appIdentity.outputs.principalId] : []
391407
tags: allTags
@@ -415,7 +431,7 @@ module appService 'modules/appservice.bicep' = if (deploySampleApp) {
415431
userAssignedIdentityName: appIdentity.outputs.name
416432
appInsightsName: applicationInsights.outputs.name
417433
keyVaultName: keyvault.outputs.name
418-
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId
434+
logAnalyticsWorkspaceResourceId: logAnalyticsWorkspaceResourceId
419435
skuName: 'B3'
420436
skuCapacity: 1
421437
imagePath: 'sampleappaoaichatgpt.azurecr.io/sample-app-aoai-chatgpt'
@@ -475,7 +491,7 @@ output AZURE_VM_RESOURCE_ID string = networkIsolation ? virtualMachine.outputs.i
475491
output AZURE_VM_USERNAME string = servicesUsername
476492
output AZURE_APP_INSIGHTS_NAME string = applicationInsights.outputs.name
477493
output AZURE_CONTAINER_REGISTRY_NAME string = acrEnabled ? containerRegistry.outputs.name : ''
478-
output AZURE_LOG_ANALYTICS_WORKSPACE_NAME string = logAnalyticsWorkspace.outputs.name
494+
output AZURE_LOG_ANALYTICS_WORKSPACE_NAME string = useExistingLogAnalytics ? existingLogAnalyticsWorkspace.name : logAnalyticsWorkspace.outputs.name
479495
output AZURE_STORAGE_ACCOUNT_NAME string = storageAccount.outputs.storageName
480496
output AZURE_API_MANAGEMENT_NAME string = apiManagementEnabled ? apim.outputs.name : ''
481497
output AZURE_VIRTUAL_NETWORK_NAME string = networkIsolation ? network.outputs.name : ''

0 commit comments

Comments
 (0)