Skip to content

Commit 5a4b478

Browse files
author
Mike Swantek
committed
Update submodule integration flow
1 parent 1f3bc19 commit 5a4b478

6 files changed

Lines changed: 534 additions & 281 deletions

File tree

.gitmodules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
[submodule "submodules/ai-landing-zone"]
22
path = submodules/ai-landing-zone
3-
url = https://github.com/Azure/AI-Landing-Zones.git
3+
url = https://github.com/Azure/bicep-ptn-aiml-landing-zone

azure.yaml

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,8 @@ metadata:
1616
hooks:
1717
preprovision:
1818
# Integrated preprovision:
19-
# - Runs AI Landing Zone preprovision to generate deploy/ files and Template Specs
20-
# - Ensures our wrapper points to deploy/main.bicep (Template Spec-based) to avoid ARM 4MB template limit
21-
# On Windows, `shell: sh` may not be available; the PowerShell script is a fallback.
22-
- shell: sh
23-
run: ./scripts/preprovision-integrated.sh
24-
interactive: false
25-
continueOnError: true
26-
19+
# - Deploys the AI Landing Zone submodule separately to avoid ARM 4MB template limit
20+
# PowerShell is the supported entrypoint in this repo.
2721
- shell: pwsh
2822
run: ./scripts/preprovision-integrated.ps1
2923
interactive: false
@@ -144,8 +138,3 @@ hooks:
144138
shell: pwsh
145139
continueOnError: false
146140

147-
# Stage 19: Clean up AI Landing Zone template specs
148-
- run: ./submodules/ai-landing-zone/bicep/scripts/postprovision.ps1
149-
interactive: false
150-
shell: pwsh
151-
continueOnError: false

infra/main.bicep

Lines changed: 167 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -8,65 +8,155 @@
88

99
targetScope = 'resourceGroup'
1010
metadata 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.')
2721
param 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.')
36121
param 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')
114204
param 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
188264
output fabricCapacityModeOut string = effectiveFabricCapacityMode

0 commit comments

Comments
 (0)