88
99targetScope = 'resourceGroup'
1010metadata description = 'Deploys AI Landing Zone with Fabric capacity extension'
11- import * as types from '../submodules/ai-landing-zone/bicep/infra/common/types .bicep'
11+ import * as const from '../submodules/ai-landing-zone/constants/constants .bicep'
1212
1313// ========================================
14- // PARAMETERS - AI LANDING ZONE (Required )
14+ // PARAMETERS - AI LANDING ZONE (Pass-through )
1515// ========================================
1616
17- @description ('Per-service deployment toggles for the AI Landing Zone submodule .' )
18- param deployToggles object = {}
17+ @description ('Name of the Azure Developer CLI environment .' )
18+ param environmentName string
1919
20- @description ('Optional. Enable platform landing zone integration.' )
21- param flagPlatformLandingZone bool = false
22-
23- @description ('Optional. Existing resource IDs to reuse.' )
24- param resourceIds types .resourceIdsType = {}
25-
26- @description ('Optional. Azure region for resources.' )
20+ @description ('Azure region for resources.' )
2721param location string = resourceGroup ().location
2822
29- @description ('Optional. Environment name for resource naming .' )
30- param environmentName string = ''
23+ @description ('Azure region for Cosmos DB .' )
24+ param cosmosLocation string = resourceGroup (). location
3125
32- @description ('Optional. Resource naming token .' )
33- param resourceToken string = toLower ( uniqueString ( subscription (). id , resourceGroup (). name , location ))
26+ @description ('Principal ID for role assignments .' )
27+ param principalId string
3428
35- @description ('Optional. Base name for resources.' )
29+ @description ('Principal type for role assignments.' )
30+ @allowed ([
31+ 'User'
32+ 'ServicePrincipal'
33+ 'Group'
34+ ])
35+ param principalType string = 'User'
36+
37+ @description ('Tags for all resources.' )
38+ param deploymentTags object = {}
39+
40+ @description ('App Configuration label.' )
41+ param appConfigLabel string = 'ai-lz'
42+
43+ @description ('Enable network isolation.' )
44+ param networkIsolation bool = false
45+
46+ @description ('Use an existing VNet.' )
47+ param useExistingVNet bool = false
48+
49+ @description ('Existing VNet resource ID.' )
50+ param existingVnetResourceId string = ''
51+
52+ @description ('Subnet names.' )
53+ param agentSubnetName string = 'agent-subnet'
54+ param peSubnetName string = 'pe-subnet'
55+ param gatewaySubnetName string = 'gateway-subnet'
56+ param azureBastionSubnetName string = 'AzureBastionSubnet'
57+ param azureFirewallSubnetName string = 'AzureFirewallSubnet'
58+ param azureAppGatewaySubnetName string = 'AppGatewaySubnet'
59+ param jumpboxSubnetName string = 'jumpbox-subnet'
60+ param apiManagementSubnetName string = 'api-management-subnet'
61+ param acaEnvironmentSubnetName string = 'aca-environment-subnet'
62+ param devopsBuildAgentsSubnetName string = 'devops-build-agents-subnet'
63+
64+ @description ('VNet address prefixes.' )
65+ param vnetAddressPrefixes array = [
66+ '192.168.0.0/21'
67+ ]
68+
69+ @description ('Subnet address prefixes.' )
70+ param agentSubnetPrefix string = '192.168.0.0/24'
71+ param acaEnvironmentSubnetPrefix string = '192.168.1.0/24'
72+ param peSubnetPrefix string = '192.168.2.0/26'
73+ param azureBastionSubnetPrefix string = '192.168.2.64/26'
74+ param azureFirewallSubnetPrefix string = '192.168.2.128/26'
75+ param gatewaySubnetPrefix string = '192.168.2.192/26'
76+ param azureAppGatewaySubnetPrefix string = '192.168.3.0/27'
77+ param apimSubnetPrefix string = '192.168.3.32/27'
78+ param jumpboxSubnetPrefix string = '192.168.3.64/27'
79+ param devopsBuildAgentsSubnetPrefix string = '192.168.3.96/27'
80+
81+ @description ('Feature flags.' )
82+ param deployGroundingWithBing bool = true
83+ param deployAiFoundry bool = true
84+ param deployAiFoundrySubnet bool = true
85+ param deployAppConfig bool = true
86+ param deployKeyVault bool = true
87+ param deployVmKeyVault bool = true
88+ param deployLogAnalytics bool = false
89+ param deployAppInsights bool = true
90+ param deploySearchService bool = true
91+ param deployStorageAccount bool = true
92+ param deployCosmosDb bool = true
93+ param deployContainerApps bool = true
94+ param deployContainerRegistry bool = true
95+ param deployContainerEnv bool = true
96+ param deployVM bool = true
97+ param deploySubnets bool = true
98+ param deployNsgs bool = true
99+ param sideBySideDeploy bool = true
100+ param deploySoftware bool = true
101+ param deployApim bool = false
102+ param deployAfProject bool = true
103+ param deployAAfAgentSvc bool = true
104+ param enableAgenticRetrieval bool = false
105+
106+ @description ('Existing resource IDs to reuse.' )
107+ param aiSearchResourceId string = ''
108+ param aiFoundryStorageAccountResourceId string = ''
109+ param aiFoundryCosmosDBAccountResourceId string = ''
110+ param keyVaultResourceId string = ''
111+
112+ @description ('Identity options.' )
113+ param useUAI bool = false
114+ param useCAppAPIKey bool = false
115+ param useZoneRedundancy bool = false
116+
117+ @description ('Resource naming token.' )
118+ param resourceToken string = toLower (uniqueString (subscription ().id , environmentName , location ))
119+
120+ @description ('Short base name for resource naming.' )
36121param baseName string = substring (resourceToken , 0 , 12 )
37122
38- @description ('Optional. AI Search settings.' )
39- param aiSearchDefinition types .kSAISearchDefinitionType ?
40-
41- @description ('Optional. Additional Entra object IDs (users or groups) granted AI Search contributor roles.' )
42- param aiSearchAdditionalAccessObjectIds array = []
43-
44- @description ('Optional. Enable telemetry.' )
45- param enableTelemetry bool = true
46-
47- @description ('Optional. Tags for all resources.' )
48- param tags object = {}
49-
50- // All other optional parameters from AI Landing Zone - pass as needed
51- @description ('Optional. Private DNS Zone configuration.' )
52- param privateDnsZonesDefinition types .privateDnsZonesDefinitionType = {}
53-
54- @description ('Optional. Enable Defender for AI.' )
55- param enableDefenderForAI bool = true
56-
57- @description ('Optional. NSG definitions per subnet.' )
58- param nsgDefinitions types .nsgPerSubnetDefinitionsType ?
59-
60- @description ('Optional. Virtual Network configuration.' )
61- param vNetDefinition types .vNetDefinitionType ?
62-
63- @description ('Optional. AI Foundry configuration.' )
64- param aiFoundryDefinition types .aiFoundryDefinitionType = {}
65-
66- @description ('Optional. API Management configuration.' )
67- param apimDefinition types .apimDefinitionType ?
68-
69- // Add more parameters as needed from AI Landing Zone...
123+ @description ('Resource names.' )
124+ param aiFoundryAccountName string = '${const .abbrs .ai .aiFoundry }${resourceToken }'
125+ param aiFoundryProjectName string = '${const .abbrs .ai .aiFoundryProject }${resourceToken }'
126+ param aiFoundryStorageAccountName string = replace ('${const .abbrs .storage .storageAccount }${const .abbrs .ai .aiFoundry }${resourceToken }' , '-' , '' )
127+ param aiFoundrySearchServiceName string = '${const .abbrs .ai .aiSearch }${const .abbrs .ai .aiFoundry }${resourceToken }'
128+ param aiFoundryCosmosDbName string = '${const .abbrs .databases .cosmosDBDatabase }${const .abbrs .ai .aiFoundry }${resourceToken }'
129+ param bingSearchName string = '${const .abbrs .ai .bing }${resourceToken }'
130+ param appConfigName string = '${const .abbrs .configuration .appConfiguration }${resourceToken }'
131+ param appInsightsName string = '${const .abbrs .managementGovernance .applicationInsights }${resourceToken }'
132+ param containerEnvName string = '${const .abbrs .containers .containerAppsEnvironment }${resourceToken }'
133+ param containerRegistryName string = '${const .abbrs .containers .containerRegistry }${resourceToken }'
134+ param dbAccountName string = '${const .abbrs .databases .cosmosDBDatabase }${resourceToken }'
135+ param dbDatabaseName string = '${const .abbrs .databases .cosmosDBDatabase }db${resourceToken }'
136+ param keyVaultName string = '${const .abbrs .security .keyVault }${resourceToken }'
137+ param logAnalyticsWorkspaceName string = '${const .abbrs .managementGovernance .logAnalyticsWorkspace }${resourceToken }'
138+ param searchServiceName string = '${const .abbrs .ai .aiSearch }${resourceToken }'
139+ param storageAccountName string = '${const .abbrs .storage .storageAccount }${resourceToken }'
140+ param vnetName string = '${const .abbrs .networking .virtualNetwork }${resourceToken }'
141+
142+ @description ('Model deployments and container app configuration.' )
143+ param modelDeploymentList array
144+ param containerAppsList array
145+ param workloadProfiles array = []
146+
147+ @description ('Miscellaneous settings.' )
148+ param acrDnsSuffix string = (environment ().name == 'AzureUSGovernment' ? 'azurecr.us' : environment ().name == 'AzureChinaCloud' ? 'azurecr.cn' : 'azurecr.io' )
149+ param databaseContainersList array
150+ param vmName string = ''
151+ param vmUserName string = ''
152+ @secure ()
153+ param vmAdminPassword string
154+ param vmSize string = 'Standard_D8s_v5'
155+ param vmImageSku string = 'win11-25h2-ent'
156+ param vmImagePublisher string = 'MicrosoftWindowsDesktop'
157+ param vmImageOffer string = 'windows-11'
158+ param vmImageVersion string = 'latest'
159+ param storageAccountContainersList array
70160
71161// ========================================
72162// PARAMETERS - FABRIC EXTENSION
@@ -113,32 +203,6 @@ param purviewAccountResourceId string = ''
113203@description ('Optional. Existing Purview collection name' )
114204param purviewCollectionName string = ''
115205
116- // ========================================
117- // AI LANDING ZONE DEPLOYMENT
118- // ========================================
119-
120- module aiLandingZone '../submodules/ai-landing-zone/bicep/deploy/main.bicep' = {
121- name : 'ai-landing-zone'
122- params : {
123- deployToggles : deployToggles
124- flagPlatformLandingZone : flagPlatformLandingZone
125- resourceIds : resourceIds
126- location : location
127- resourceToken : resourceToken
128- baseName : baseName
129- enableTelemetry : enableTelemetry
130- tags : tags
131- privateDnsZonesDefinition : privateDnsZonesDefinition
132- enableDefenderForAI : enableDefenderForAI
133- nsgDefinitions : nsgDefinitions
134- vNetDefinition : vNetDefinition
135- aiFoundryDefinition : aiFoundryDefinition
136- apimDefinition : apimDefinition
137- aiSearchDefinition : aiSearchDefinition
138- // Add more parameters as needed...
139- }
140- }
141-
142206// ========================================
143207// FABRIC CAPACITY DEPLOYMENT
144208// ========================================
@@ -159,30 +223,42 @@ module fabricCapacity 'modules/fabric-capacity.bicep' = if (effectiveFabricCapac
159223 location : location
160224 sku : fabricCapacitySku
161225 adminMembers : fabricCapacityAdmins
162- tags : tags
226+ tags : deploymentTags
163227 }
164- dependsOn : [
165- aiLandingZone
166- ]
167228}
168229
169230// ========================================
170231// OUTPUTS - Pass through from AI Landing Zone
171232// ========================================
172233
173- output virtualNetworkResourceId string = aiLandingZone .outputs .virtualNetworkResourceId
174- output keyVaultResourceId string = aiLandingZone .outputs .keyVaultResourceId
175- output storageAccountResourceId string = aiLandingZone .outputs .storageAccountResourceId
176- output aiFoundryProjectName string = aiLandingZone .outputs .aiFoundryProjectName
177- output logAnalyticsWorkspaceResourceId string = aiLandingZone .outputs .logAnalyticsWorkspaceResourceId
178- output aiSearchResourceId string = aiLandingZone .outputs .aiSearchResourceId
179- output aiSearchName string = aiLandingZone .outputs .aiSearchName
180- output aiSearchAdditionalAccessObjectIds array = aiSearchAdditionalAccessObjectIds
181-
182- // Subnet IDs (constructed from VNet ID using AI Landing Zone naming convention)
183- output peSubnetResourceId string = '${aiLandingZone .outputs .virtualNetworkResourceId }/subnets/pe-subnet'
184- output jumpboxSubnetResourceId string = '${aiLandingZone .outputs .virtualNetworkResourceId }/subnets/jumpbox-subnet'
185- output agentSubnetResourceId string = '${aiLandingZone .outputs .virtualNetworkResourceId }/subnets/agent-subnet'
234+ var effectiveVnetResourceId = useExistingVNet && !empty (existingVnetResourceId )
235+ ? existingVnetResourceId
236+ : resourceId ('Microsoft.Network/virtualNetworks' , vnetName )
237+
238+ var effectiveKeyVaultResourceId = !empty (keyVaultResourceId )
239+ ? keyVaultResourceId
240+ : resourceId ('Microsoft.KeyVault/vaults' , keyVaultName )
241+
242+ var effectiveAiSearchResourceId = !empty (aiSearchResourceId )
243+ ? aiSearchResourceId
244+ : resourceId ('Microsoft.Search/searchServices' , searchServiceName )
245+
246+ var effectiveStorageAccountResourceId = resourceId ('Microsoft.Storage/storageAccounts' , storageAccountName )
247+ var effectiveLogAnalyticsWorkspaceResourceId = resourceId ('Microsoft.OperationalInsights/workspaces' , logAnalyticsWorkspaceName )
248+
249+ output virtualNetworkResourceId string = effectiveVnetResourceId
250+ output keyVaultResourceId string = effectiveKeyVaultResourceId
251+ output storageAccountResourceId string = effectiveStorageAccountResourceId
252+ output aiFoundryProjectName string = aiFoundryProjectName
253+ output logAnalyticsWorkspaceResourceId string = effectiveLogAnalyticsWorkspaceResourceId
254+ output aiSearchResourceId string = effectiveAiSearchResourceId
255+ output aiSearchName string = searchServiceName
256+ output aiSearchAdditionalAccessObjectIds array = []
257+
258+ // Subnet IDs (constructed from VNet ID and subnet names)
259+ output peSubnetResourceId string = '${effectiveVnetResourceId }/subnets/${peSubnetName }'
260+ output jumpboxSubnetResourceId string = '${effectiveVnetResourceId }/subnets/${jumpboxSubnetName }'
261+ output agentSubnetResourceId string = '${effectiveVnetResourceId }/subnets/${agentSubnetName }'
186262
187263// Fabric outputs
188264output fabricCapacityModeOut string = effectiveFabricCapacityMode
0 commit comments