Skip to content

Commit fe20dc5

Browse files
author
Mike Swantek
committed
Update scripts and docs to reflect Fabric mode/preset parameters and correct output→script mappings
1 parent a23d648 commit fe20dc5

24 files changed

Lines changed: 359 additions & 30 deletions

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,15 +121,17 @@ Follow the deployment guide to deploy this solution to your own Azure subscripti
121121
| Requirement | Details |
122122
|-------------|---------|
123123
| **Azure Subscription** | Owner or Contributor + User Access Administrator permissions |
124-
| **Microsoft Fabric** | Access to create capacity, workspace (or existing Fabric capacity ID) |
124+
| **Microsoft Fabric** | Optional. Either access to create capacity/workspace, or provide existing Fabric capacity/workspace IDs, or disable Fabric automation |
125125
| **Microsoft Purview** | Existing tenant-level Purview account (or ability to create one) |
126126
| **Azure CLI** | Version 2.61.0 or later |
127127
| **Azure Developer CLI** | Version 1.15.0 or later |
128128
| **Quota** | Sufficient Azure OpenAI quota ([check here](./docs/quota_check.md)) |
129129
130-
> **Note:** If you enable Fabric capacity deployment, you must supply at least one valid Fabric capacity admin principal (Entra user UPN email or object ID) via `fabricCapacityAdmins`.
130+
> **Note:** Fabric automation is optional. To disable all Fabric automation, set `fabricCapacityPreset = 'none'` and `fabricWorkspacePreset = 'none'` in `infra/main.bicepparam`.
131131
132-
> **Note:** If you enable Fabric provisioning, the user running `azd` must have the **Fabric Administrator** role (or equivalent Fabric/Power BI tenant admin permissions) to call the required admin APIs.
132+
> **Note:** If you enable Fabric capacity deployment (`fabricCapacityPreset='create'`), you must supply at least one valid Fabric capacity admin principal (Entra user UPN email or object ID) via `fabricCapacityAdmins`.
133+
134+
> **Note:** If you enable Fabric provisioning (`fabricWorkspacePreset='create'`), the user running `azd` must have the **Fabric Administrator** role (or equivalent Fabric/Power BI tenant admin permissions) to call the required admin APIs.
133135
134136
</details>
135137
@@ -141,7 +143,7 @@ Follow the deployment guide to deploy this solution to your own Azure subscripti
141143
| Azure AI Foundry | Standard | [Pricing](https://azure.microsoft.com/pricing/details/machine-learning/) |
142144
| Azure OpenAI | Pay-per-token | [Pricing](https://azure.microsoft.com/pricing/details/cognitive-services/openai-service/) |
143145
| Azure AI Search | Standard | [Pricing](https://azure.microsoft.com/pricing/details/search/) |
144-
| Microsoft Fabric | F8 Capacity | [Pricing](https://azure.microsoft.com/pricing/details/microsoft-fabric/) |
146+
| Microsoft Fabric | F8 Capacity (if enabled) | [Pricing](https://azure.microsoft.com/pricing/details/microsoft-fabric/) |
145147
| Virtual Network + Bastion | Standard | [Pricing](https://azure.microsoft.com/pricing/details/azure-bastion/) |
146148
147149
> **Cost Optimization:** Fabric capacity can be paused when not in use. Use `az fabric capacity suspend` to stop billing.
@@ -171,8 +173,6 @@ After deployment, you'll have a complete, enterprise-ready platform that unifies
171173
| **Governance** | Microsoft Purview with cataloging, scans, and DSPM | Track data lineage, enforce policies, and maintain compliance visibility |
172174
| **Security** | Private endpoints, managed identities, RBAC, network isolation | Zero public internet exposure—all traffic stays on the Microsoft backbone |
173175
174-
> 💡 **Note:** When Microsoft Fabric automation supports private link provisioning, the entire solution will operate with full network isolation end-to-end.
175-
176176
<br/>
177177
178178
### Key Features

azure.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,16 @@ metadata:
1515
# Pre/Post-provision automation hooks
1616
hooks:
1717
preprovision:
18+
# AI Landing Zone preprovision: generates submodule deploy/ files and (optionally) Template Specs.
19+
# On Windows, `shell: sh` may not be available; fall back to the PowerShell script.
1820
- shell: sh
1921
run: ./submodules/ai-landing-zone/bicep/scripts/preprovision.sh
2022
interactive: true
23+
continueOnError: true
24+
25+
- shell: pwsh
26+
run: ./submodules/ai-landing-zone/bicep/scripts/preprovision.ps1
27+
interactive: true
2128
continueOnError: false
2229

2330
postprovision:

docs/DeploymentGuide.md

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,22 @@ Edit `infra/main.bicepparam` or set environment variables:
152152
| Parameter | Description | Example |
153153
|-----------|-------------|---------|
154154
| `purviewAccountResourceId` | Resource ID of existing Purview account | `/subscriptions/.../Microsoft.Purview/accounts/...` |
155-
| `aiSearchAdditionalAccessObjectId` | Array of ObjectId's to apply RBAC role for Search Access | `["user@contoso.com"]` |
156-
| `fabricCapacitySku` | Fabric capacity SKU | `F8` (default) |
157-
| `fabricCapacityAdmins` | Fabric capacity admin principals (UPN emails or Entra object IDs) | `["user@contoso.com"]` |
158-
| `desiredFabricWorkspaceName` | Name for Fabric workspace | `workspace-myenv` |
155+
| `aiSearchAdditionalAccessObjectIds` | Array of Entra object IDs to grant Search roles | `["00000000-0000-0000-0000-000000000000"]` |
156+
| `fabricCapacityMode` | Fabric capacity mode: `create`, `byo`, or `none` | `create` |
157+
| `fabricWorkspaceMode` | Fabric workspace mode: `create`, `byo`, or `none` | `create` |
158+
| `fabricCapacitySku` | Fabric capacity SKU (only used when `fabricCapacityMode=create`) | `F8` (default) |
159+
| `fabricCapacityAdmins` | Fabric capacity admin principals (UPN emails or Entra object IDs) (required when `fabricCapacityMode=create`) | `["user@contoso.com"]` |
160+
| `fabricCapacityResourceId` | Existing Fabric capacity ARM resource ID (required when `fabricCapacityMode=byo`) | `/subscriptions/.../providers/Microsoft.Fabric/capacities/...` |
161+
| `fabricWorkspaceId` | Existing Fabric workspace ID (GUID) (required when `fabricWorkspaceMode=byo`) | `00000000-0000-0000-0000-000000000000` |
162+
| `fabricWorkspaceName` | Existing Fabric workspace name (used when `fabricWorkspaceMode=byo`) | `my-existing-workspace` |
159163

160164
```bash
161165
# Example: Set Purview account
162166
azd env set purviewAccountResourceId "/subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.Purview/accounts/<account-name>"
167+
168+
# Example: Disable all Fabric automation
169+
azd env set fabricCapacityMode none
170+
azd env set fabricWorkspaceMode none
163171
```
164172

165173
</details>

docs/PARAMETER_GUIDE.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
# Parameter Guide for AI Landing Zone Deployment
22

3-
This guide explains every parameter in `infra/main.parameters.json` and how to customize your deployment.
3+
This guide focuses on configuration concepts for the **AI Landing Zone**.
4+
5+
> **Important**: This repository deploys using Bicep parameter files, not `infra/main.parameters.json`.
6+
>
7+
> - Primary parameters file: `infra/main.bicepparam`
8+
> - AI Landing Zone submodule parameters file (if you deploy it directly): `submodules/ai-landing-zone/bicep/infra/main.bicepparam`
9+
>
10+
> **Fabric options in this repo** are configured in `infra/main.bicepparam` via:
11+
> - `fabricCapacityPreset` (`create` | `byo` | `none`)
12+
> - `fabricWorkspacePreset` (`create` | `byo` | `none`)
13+
> - BYO inputs: `fabricCapacityResourceId`, `fabricWorkspaceId`, `fabricWorkspaceName`
414
515
## Table of Contents
616
1. [Basic Parameters](#basic-parameters)

docs/automation-outputs-mapping.md

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,13 @@ The postprovision automation scripts consume deployment outputs via the `AZURE_O
2020

2121
| Bicep Output | Script Variable | Used By | Purpose |
2222
|-------------|-----------------|---------|---------|
23+
| `fabricCapacityMode` | `fabricCapacityMode` | Multiple Fabric scripts | Whether capacity is `create`, `byo`, or `none` |
24+
| `fabricWorkspaceMode` | `fabricWorkspaceMode` | Multiple Fabric scripts | Whether workspace is `create`, `byo`, or `none` |
2325
| `fabricCapacityId` | `FABRIC_CAPACITY_ID` | `ensure_active_capacity.ps1` | ARM resource ID of Fabric capacity |
2426
| `fabricCapacityResourceId` | `fabricCapacityId` | `create_fabric_workspace.ps1` | Resource ID for capacity assignment |
25-
| `desiredFabricWorkspaceName` | `FABRIC_WORKSPACE_NAME` | Multiple Fabric scripts | Target workspace name |
27+
| `fabricWorkspaceId` | `FABRIC_WORKSPACE_ID` | Multiple Fabric scripts | Existing or created Fabric workspace ID |
28+
| `fabricWorkspaceName` | `FABRIC_WORKSPACE_NAME` | Multiple Fabric scripts | Target workspace name |
29+
| `desiredFabricWorkspaceName` | `FABRIC_WORKSPACE_NAME` | Multiple Fabric scripts | Back-compat alias for `fabricWorkspaceName` |
2630
| `desiredFabricDomainName` | `domainName` | `create_fabric_domain.ps1` | Target domain name |
2731
| `fabricCapacityName` | - | - | Display name (optional) |
2832

@@ -79,7 +83,11 @@ When `azd up` completes, it sets:
7983
```bash
8084
export AZURE_OUTPUTS_JSON='{
8185
"fabricCapacityId": {"type":"String","value":"/subscriptions/.../fabricCapacities/fabric-xyz"},
82-
"desiredFabricWorkspaceName": {"type":"String","value":"ai-workspace"},
86+
"fabricCapacityMode": {"type":"String","value":"create"},
87+
"fabricWorkspaceMode": {"type":"String","value":"create"},
88+
"fabricWorkspaceName": {"type":"String","value":"workspace-myenv"},
89+
"fabricWorkspaceId": {"type":"String","value":""},
90+
"desiredFabricWorkspaceName": {"type":"String","value":"workspace-myenv"},
8391
"aiSearchName": {"type":"String","value":"search-xyz"},
8492
"aiSearchResourceGroup": {"type":"String","value":"rg-ai-landing-zone"},
8593
...
@@ -93,7 +101,10 @@ Scripts parse this JSON:
93101
if (-not $WorkspaceName -and $env:AZURE_OUTPUTS_JSON) {
94102
try {
95103
$out = $env:AZURE_OUTPUTS_JSON | ConvertFrom-Json
96-
$WorkspaceName = $out.desiredFabricWorkspaceName.value
104+
$WorkspaceName = $out.fabricWorkspaceName.value
105+
if (-not $WorkspaceName) {
106+
$WorkspaceName = $out.desiredFabricWorkspaceName.value
107+
}
97108
} catch {}
98109
}
99110
```
@@ -121,8 +132,8 @@ azd env get-value aiSearchName
121132

122133
## Related Files
123134

124-
- **Infrastructure**: `/infra/main-orchestrator.bicep` (lines 313-349)
125-
- **Parameters**: `/infra/main-orchestrator.bicepparam`
135+
- **Infrastructure**: `/infra/main.bicep`
136+
- **Parameters**: `/infra/main.bicepparam`
126137
- **Automation Workflow**: `/azure.yaml` (postprovision hooks)
127138
- **Scripts**: `/scripts/automationScripts/`
128139

infra/main.bicep

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,31 @@ param apimDefinition types.apimDefinitionType?
8080
@description('Deploy Fabric capacity')
8181
param deployFabricCapacity bool = true
8282

83+
@description('Fabric capacity mode. Use create to provision a capacity, byo to reuse an existing capacity, or none to disable Fabric capacity.')
84+
@allowed([
85+
'create'
86+
'byo'
87+
'none'
88+
])
89+
param fabricCapacityMode string = (deployFabricCapacity ? 'create' : 'none')
90+
91+
@description('Optional. Existing Fabric capacity resource ID (required when fabricCapacityMode=byo).')
92+
param fabricCapacityResourceId string = ''
93+
94+
@description('Fabric workspace mode. Use create to create a workspace in postprovision, byo to reuse an existing workspace, or none to disable Fabric workspace automation.')
95+
@allowed([
96+
'create'
97+
'byo'
98+
'none'
99+
])
100+
param fabricWorkspaceMode string = (fabricCapacityMode == 'none' ? 'none' : 'create')
101+
102+
@description('Optional. Existing Fabric workspace ID (GUID) (required when fabricWorkspaceMode=byo).')
103+
param fabricWorkspaceId string = ''
104+
105+
@description('Optional. Existing Fabric workspace name (used when fabricWorkspaceMode=byo).')
106+
param fabricWorkspaceName string = ''
107+
83108
@description('Fabric capacity SKU')
84109
@allowed(['F2', 'F4', 'F8', 'F16', 'F32', 'F64', 'F128', 'F256', 'F512', 'F1024', 'F2048'])
85110
param fabricCapacitySku string = 'F8'
@@ -123,13 +148,16 @@ module aiLandingZone '../submodules/ai-landing-zone/bicep/deploy/main.bicep' = {
123148
// FABRIC CAPACITY DEPLOYMENT
124149
// ========================================
125150

151+
var effectiveFabricCapacityMode = fabricCapacityMode
152+
var effectiveFabricWorkspaceMode = fabricWorkspaceMode
153+
126154
var envSlugSanitized = replace(replace(replace(replace(replace(replace(replace(replace(toLower(environmentName), ' ', ''), '-', ''), '_', ''), '.', ''), '/', ''), '\\', ''), ':', ''), ',', '')
127155

128156
var envSlugTrimmed = substring(envSlugSanitized, 0, min(40, length(envSlugSanitized)))
129157
var capacityNameBase = !empty(envSlugTrimmed) ? 'fabric${envSlugTrimmed}' : 'fabric${baseName}'
130158
var capacityName = substring(capacityNameBase, 0, min(50, length(capacityNameBase)))
131159

132-
module fabricCapacity 'modules/fabric-capacity.bicep' = if (deployFabricCapacity) {
160+
module fabricCapacity 'modules/fabric-capacity.bicep' = if (effectiveFabricCapacityMode == 'create') {
133161
name: 'fabric-capacity'
134162
params: {
135163
capacityName: capacityName
@@ -162,11 +190,32 @@ output jumpboxSubnetResourceId string = '${aiLandingZone.outputs.virtualNetworkR
162190
output agentSubnetResourceId string = '${aiLandingZone.outputs.virtualNetworkResourceId}/subnets/agent-subnet'
163191

164192
// Fabric outputs
165-
output fabricCapacityResourceId string = deployFabricCapacity ? fabricCapacity!.outputs.resourceId : ''
166-
output fabricCapacityName string = deployFabricCapacity ? fabricCapacity!.outputs.name : ''
167-
output fabricCapacityId string = deployFabricCapacity ? fabricCapacity!.outputs.capacityId : ''
193+
output fabricCapacityMode string = effectiveFabricCapacityMode
194+
output fabricWorkspaceMode string = effectiveFabricWorkspaceMode
195+
196+
var effectiveFabricCapacityResourceId = effectiveFabricCapacityMode == 'create'
197+
? fabricCapacity!.outputs.resourceId
198+
: (effectiveFabricCapacityMode == 'byo' ? fabricCapacityResourceId : '')
199+
200+
var effectiveFabricCapacityName = effectiveFabricCapacityMode == 'create'
201+
? fabricCapacity!.outputs.name
202+
: (!empty(effectiveFabricCapacityResourceId) ? last(split(effectiveFabricCapacityResourceId, '/')) : '')
203+
204+
output fabricCapacityResourceId string = effectiveFabricCapacityResourceId
205+
output fabricCapacityName string = effectiveFabricCapacityName
206+
output fabricCapacityId string = effectiveFabricCapacityResourceId
207+
208+
var effectiveFabricWorkspaceName = effectiveFabricWorkspaceMode == 'byo'
209+
? (!empty(fabricWorkspaceName) ? fabricWorkspaceName : (!empty(environmentName) ? 'workspace-${environmentName}' : 'workspace-${baseName}'))
210+
: (!empty(environmentName) ? 'workspace-${environmentName}' : 'workspace-${baseName}')
211+
212+
var effectiveFabricWorkspaceId = effectiveFabricWorkspaceMode == 'byo' ? fabricWorkspaceId : ''
213+
214+
output fabricWorkspaceName string = effectiveFabricWorkspaceName
215+
output fabricWorkspaceId string = effectiveFabricWorkspaceId
216+
168217
output desiredFabricDomainName string = !empty(environmentName) ? 'domain-${environmentName}' : 'domain-${baseName}'
169-
output desiredFabricWorkspaceName string = !empty(environmentName) ? 'workspace-${environmentName}' : 'workspace-${baseName}'
218+
output desiredFabricWorkspaceName string = effectiveFabricWorkspaceName
170219

171220
// Purview outputs (for post-provision scripts)
172221
output purviewAccountResourceId string = purviewAccountResourceId

scripts/automationScripts/FabricPurviewAutomation/connect_log_analytics.ps1

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,22 @@ $ErrorActionPreference = 'Stop'
2121
function Log([string]$m){ Write-Host "[fabric-loganalytics] $m" }
2222
function Warn([string]$m){ Write-Warning "[fabric-loganalytics] $m" }
2323

24+
# Skip when Fabric workspace automation is disabled
25+
$fabricWorkspaceMode = $env:fabricWorkspaceMode
26+
if (-not $fabricWorkspaceMode -and $env:AZURE_OUTPUTS_JSON) {
27+
try { $fabricWorkspaceMode = ($env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop).fabricWorkspaceMode.value } catch { }
28+
}
29+
if (-not $fabricWorkspaceMode) {
30+
try {
31+
$azdMode = & azd env get-value fabricWorkspaceMode 2>$null
32+
if ($LASTEXITCODE -eq 0 -and $azdMode) { $fabricWorkspaceMode = $azdMode.Trim() }
33+
} catch { }
34+
}
35+
if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -eq 'none') {
36+
Warn "Fabric workspace mode is 'none'; skipping Log Analytics linkage."
37+
exit 0
38+
}
39+
2440
if (-not $FabricWorkspaceName) {
2541
# try .azure env
2642
$envDir = $env:AZURE_ENV_NAME

scripts/automationScripts/FabricPurviewAutomation/create_purview_collection.ps1

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,17 @@ function Log([string]$m){ Write-Host "[purview-collection] $m" }
1717
function Warn([string]$m){ Write-Warning "[purview-collection] $m" }
1818
function Fail([string]$m){ Write-Error "[script] $m"; Clear-SensitiveVariables -VariableNames @("accessToken", "fabricToken", "purviewToken", "powerBIToken", "storageToken"); exit 1 }
1919

20+
# Skip when Fabric workspace automation is disabled
21+
$fabricWorkspaceMode = $env:fabricWorkspaceMode
22+
if (-not $fabricWorkspaceMode -and $env:AZURE_OUTPUTS_JSON) {
23+
try { $fabricWorkspaceMode = ($env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop).fabricWorkspaceMode.value } catch { }
24+
}
25+
if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -eq 'none') {
26+
Warn "Fabric workspace mode is 'none'; skipping Purview collection setup."
27+
Clear-SensitiveVariables -VariableNames @('accessToken', 'fabricToken', 'purviewToken', 'powerBIToken', 'storageToken')
28+
exit 0
29+
}
30+
2031
function Get-AzdEnvValue([string]$key){
2132
$value = $null
2233
try { $value = & azd env get-value $key 2>$null } catch { $value = $null }

scripts/automationScripts/FabricPurviewAutomation/trigger_purview_scan_for_fabric_workspace.ps1

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@ function Log([string]$m){ Write-Host "[purview-scan] $m" }
2626
function Warn([string]$m){ Write-Warning "[purview-scan] $m" }
2727
function Fail([string]$m){ Write-Error "[script] $m"; Clear-SensitiveVariables -VariableNames @("accessToken", "fabricToken", "purviewToken", "powerBIToken", "storageToken"); exit 1 }
2828

29+
# Skip when Fabric workspace automation is disabled
30+
$fabricWorkspaceMode = $env:fabricWorkspaceMode
31+
if (-not $fabricWorkspaceMode -and $env:AZURE_OUTPUTS_JSON) {
32+
try { $fabricWorkspaceMode = ($env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop).fabricWorkspaceMode.value } catch { }
33+
}
34+
if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -eq 'none') {
35+
Warn "Fabric workspace mode is 'none'; skipping Purview scan trigger."
36+
exit 0
37+
}
38+
2939
function Resolve-PurviewFromResourceId([string]$resourceId) {
3040
if ([string]::IsNullOrWhiteSpace($resourceId)) { return $null }
3141
$parts = $resourceId.Split('/', [System.StringSplitOptions]::RemoveEmptyEntries)

scripts/automationScripts/FabricWorkspace/CreateWorkspace/assign_workspace_to_domain.ps1

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@ function Log([string]$m){ Write-Host "[assign-domain] $m" }
1919
function Warn([string]$m){ Write-Warning "[assign-domain] $m" }
2020
function Fail([string]$m){ Write-Error "[assign-domain] $m"; Clear-SensitiveVariables -VariableNames @('accessToken', 'fabricToken'); exit 1 }
2121

22+
# Skip when Fabric workspace automation is disabled or BYO
23+
$fabricWorkspaceMode = $env:fabricWorkspaceMode
24+
if (-not $fabricWorkspaceMode -and $env:AZURE_OUTPUTS_JSON) {
25+
try { $fabricWorkspaceMode = ($env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop).fabricWorkspaceMode.value } catch {}
26+
}
27+
if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -ne 'create') {
28+
Warn "Fabric workspace mode is '$fabricWorkspaceMode'; skipping assign-to-domain step."
29+
Clear-SensitiveVariables -VariableNames @('accessToken', 'fabricToken')
30+
exit 0
31+
}
32+
2233
# Load from azd environment
2334
try {
2435
$azdEnvValues = azd env get-values 2>$null

0 commit comments

Comments
 (0)