Skip to content

Commit a23d648

Browse files
author
Mike Swantek
committed
Remove unsupported Fabric private link scripts and update docs
1 parent 16167a7 commit a23d648

13 files changed

Lines changed: 45 additions & 2063 deletions

azure.yaml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,6 @@ hooks:
4545
shell: pwsh
4646
continueOnError: false
4747

48-
# Stage 3.3: Create Private Link Service Resource (prerequisite for private endpoint)
49-
- run: ./scripts/automationScripts/FabricWorkspace/SecureWorkspace/create_fabric_private_link_service.ps1
50-
interactive: false
51-
shell: pwsh
52-
continueOnError: false
53-
54-
# Stage 3.7: Setup Workspace Private Endpoint (for secure VNet access)
55-
- run: ./scripts/automationScripts/FabricWorkspace/SecureWorkspace/setup_workspace_private_endpoint.ps1
56-
interactive: false
57-
shell: pwsh
58-
continueOnError: false
59-
6048
# Stage 4: Assign Workspace to Domain
6149
- run: ./scripts/automationScripts/FabricWorkspace/CreateWorkspace/assign_workspace_to_domain.ps1
6250
interactive: false

docs/examples/azure.yaml.private-networking.sample

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,7 @@ hooks:
2020
interactive: false
2121
continueOnError: false
2222

23-
# Step 1: Create or update the Fabric private link service resource in Azure
24-
- shell: pwsh
25-
run: ./scripts/automationScripts/FabricWorkspace/SecureWorkspace/create_fabric_private_link_service.ps1
26-
interactive: false
27-
continueOnError: false
28-
29-
# Step 2: Create/refresh the private endpoint and DNS configuration in the target VNet
30-
- shell: pwsh
31-
run: ./scripts/automationScripts/FabricWorkspace/SecureWorkspace/setup_workspace_private_endpoint.ps1
32-
interactive: false
33-
continueOnError: false
34-
35-
# Step 3: Lock down the Fabric workspace so that only private endpoints are allowed
23+
# Step 1: Lock down the Fabric workspace so that only private endpoints are allowed
3624
- shell: pwsh
3725
run: ./scripts/automationScripts/FabricWorkspace/SecureWorkspace/enable_fabric_workspace_inbound_protection.ps1
3826
interactive: false

docs/fabric-onelake-private-networking.md

Lines changed: 12 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ When deploying AI Search, AI Foundry, and Purview within a VNet (as configured i
3838
│ │ │ Lakehouse │ │ Lakehouse │ │ Lakehouse │ │ │
3939
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
4040
│ │ │ │
41-
│ │ Private Link Resource: privateLinkServicesForFabric │ │
41+
│ │ Private Link Resource: Service-managed (no ARM RP) │ │
4242
│ └─────────────────────────────────────────────────────────────┘ │
4343
└───────────────────────────────────────────────────────────────────┘
4444
```
@@ -47,12 +47,12 @@ When deploying AI Search, AI Foundry, and Purview within a VNet (as configured i
4747

4848
### 1. Fabric Workspace Private Links
4949

50-
Microsoft Fabric supports **workspace-level private links** that enable secure, private connectivity from Azure VNets to specific Fabric workspaces and their OneLake lakehouses.
50+
Microsoft Fabric supports **workspace-level private links** that enable secure, private connectivity from Azure VNets to specific Fabric workspaces and their OneLake lakehouses. This is a **service-managed** experience: there is currently **no customer-facing ARM/Bicep resource provider** to deploy or manage these objects.
5151

5252
> **Important:** As of November 2025 Azure AI Search cannot complete a shared private link where `group-id = "workspace"`. Our automation detects the failure message `Cannot create private endpoint for requested type 'workspace'` and skips the shared private link stage so OneLake indexers continue to work over public endpoints. Follow the steps in [Phase 2](#phase-2-configure-shared-private-link-from-ai-search-automated) to re-run the script when Microsoft enables the feature, and keep the workspace communication policy in **Allow** mode until the link can be provisioned.
5353
54-
- **Resource Provider**: `Microsoft.Fabric/privateLinkServicesForFabric`
55-
- **Target Subresource**: `workspace` (workspace-specific) or `tenant` (tenant-wide)
54+
- **Resource Provider**: _Not available in ARM/Bicep; service-managed only_
55+
- **Target Subresource**: `workspace` (workspace-specific) or `tenant` (tenant-wide) — managed by the service
5656
- **Workspace FQDN Format**: `https://{workspaceid}.z{xy}.blob.fabric.microsoft.com`
5757
- `{workspaceid}` = Workspace GUID without dashes
5858
- `{xy}` = First two characters of workspace GUID
@@ -83,7 +83,7 @@ Private DNS zones are required to resolve Fabric workspace FQDNs to private IPs:
8383

8484
### Phase 1: Enable Fabric Workspace Private Link (Manual - Post-Deployment)
8585

86-
> **Note**: Fabric workspace private links cannot be configured via ARM/Bicep as of October 2025. This must be done manually after workspace creation.
86+
> **Note**: Fabric workspace private links cannot be configured via ARM/Bicep. This must be done manually after workspace creation in the Fabric portal.
8787
8888
1. **Create Fabric Workspace** (via postprovision script: `create_fabric_workspace.ps1`)
8989

@@ -95,79 +95,17 @@ Private DNS zones are required to resolve Fabric workspace FQDNs to private IPs:
9595

9696
> **Note**: Once Microsoft enables workspace-targeted shared private links, the connection from AI Search should auto-approve because both resources live in the same subscription/tenant. Until then, the script will exit with a warning and no shared private link is created.
9797
98-
### Phase 2: Configure Shared Private Link from AI Search (Automated)
98+
### Phase 2: Configure Shared Private Link from AI Search (Not yet supported)
9999

100-
This is handled by the Bicep infrastructure in **Stage 7: Fabric Private Networking** and the **`setup_fabric_private_link.ps1`** postprovision script.
101-
102-
**Resources created (when supported)**:
103-
1. Private DNS zones for Fabric endpoints
104-
2. DNS zone virtual network links
105-
3. Shared private link from AI Search to Fabric workspace (via PowerShell script)
100+
Workspace-targeted shared private links from AI Search are not supported today; the automation path is disabled/no-op to avoid failures. Keep workspace communication policy in **Allow** mode until Microsoft enables the feature, then re-enable private access manually.
106101

107102
**RBAC tip:** Add Azure AD group object IDs to the `aiSearchAdditionalAccessObjectIds` parameter (or `azd env set aiSearchAdditionalAccessObjectIds "<objectId>"`) so interactive users inherit the same Search roles that the automation assigns to managed identities.
108103

109-
**Key Benefits of Automatic Approval**:
110-
-**No manual approval needed** - Connection is auto-approved because both resources are in the same subscription/tenant
111-
-**Consistent with other private endpoints** - Works like Storage, Cosmos DB, AI Search private endpoints
112-
-**Faster deployment** - No waiting for manual approval step
113-
-**Production-ready** - Fully automated end-to-end
114-
115-
**Bicep Configuration** (Stage 7):
116-
```bicep
117-
// Private DNS zones created
118-
resource analysisDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01'
119-
resource capacityDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01'
120-
resource powerQueryDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01'
121-
122-
// VNet links for DNS resolution
123-
resource analysisVnetLink 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01'
124-
```
125-
126-
**PowerShell Script** (`setup_fabric_private_link.ps1`):
127-
```powershell
128-
# Step 1: Automatically creates shared private link with same-subscription auto-approval
129-
az search shared-private-link-resource create \
130-
--resource-group <rg-name> \
131-
--service-name <search-name> \
132-
--name fabric-workspace-link \
133-
--group-id workspace \
134-
--resource-id <fabric-workspace-resource-id>
135-
136-
# Connection status will be "Approved" automatically (2-3 minutes provisioning time) once Azure supports workspace shared private links
137-
138-
# Step 2: Configure workspace to deny public access (allow only private link connections)
139-
$policyBody = @{
140-
inbound = @{
141-
publicAccessRules = @{
142-
defaultAction = "Deny"
143-
}
144-
}
145-
} | ConvertTo-Json
146-
147-
Invoke-RestMethod `
148-
-Uri "https://api.fabric.microsoft.com/v1/workspaces/$workspaceId/networking/communicationPolicy" `
149-
-Headers $headers `
150-
-Method Put `
151-
-Body $policyBody `
152-
-ContentType 'application/json'
153-
154-
# Policy takes effect in up to 30 minutes
155-
```
156-
157-
**What Gets Automated (once the platform supports workspace shared private links)**:
158-
1. ✅ Shared private link creation (AI Search → Fabric)
159-
2. ✅ Automatic approval (same subscription/tenant)
160-
3. ✅ Workspace communication policy (deny public access)
161-
4. ✅ Verification of connection status
162-
163-
**Current Behavior (End of 2025)**:
164-
- ⚠️ Shared private link creation fails with `Cannot create private endpoint for requested type 'workspace'`
165-
- ⚠️ Script logs a warning and skips the shared private link stage
166-
- ✅ Workspace remains in **Allow** mode so indexing continues over public endpoints
167-
- ✅ You can re-run the script after Microsoft releases support; no additional changes required
168-
169-
**Remaining Manual Step** (one-time):
170-
- Enable workspace-level private link in Fabric portal (required before shared private link can be created)
104+
**Current Behavior**:
105+
- ⚠️ Workspace shared private link creation fails with `Cannot create private endpoint for requested type 'workspace'`.
106+
- ⚠️ Scripts that tried to deploy `Microsoft.Fabric/privateLinkServicesForFabric` are now disabled and act as no-ops.
107+
- ✅ Keep workspace in **Allow** mode so indexing continues over public endpoints until Microsoft delivers a supported path.
108+
- ✅ You can re-run the connectivity scripts later if the platform exposes a supported resource provider.
171109

172110
### Phase 3: Configure OneLake Data Source (Automated Script)
173111

docs/fabric_private_endpoint_setup.md

Lines changed: 14 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Overview
44

5-
This guide explains how to configure private endpoint access to Microsoft Fabric workspaces from Azure VNet resources (e.g., Jump VM). This enables secure, private access to Fabric when tenant-level private link is enabled.
5+
This guide explains how to configure private access to Microsoft Fabric workspaces from Azure VNet resources (e.g., Jump VM). **Fabric workspace private endpoints are currently service-managed and not deployable via ARM/Bicep/CLI**; customer automation cannot create or poll a `Microsoft.Fabric/privateLinkServicesForFabric` resource. Use the manual steps to enable workspace-level private link in the Fabric portal.
66

77
## Architecture
88

@@ -57,20 +57,9 @@ Run the post-provision script (happens automatically):
5757
./scripts/automationScripts/FabricWorkspace/CreateWorkspace/create_fabric_workspace.ps1
5858
```
5959

60-
### Step 4: Set Up Private Endpoint
60+
### Step 4: Set Up Private Endpoint (Manual)
6161

62-
Run the private endpoint setup script:
63-
64-
```powershell
65-
./scripts/automationScripts/FabricWorkspace/SecureWorkspace/setup_workspace_private_endpoint.ps1
66-
```
67-
68-
This script will:
69-
1. ✅ Get Fabric workspace ID
70-
2. ✅ Enable workspace-level private link
71-
3. ✅ Create private endpoint in jumpbox-subnet
72-
4. ✅ Configure private DNS zones
73-
5. ✅ Set workspace to deny public access (allow only private endpoint)
62+
Automation is not available because the Fabric private link resource is service-managed. In the Fabric portal, enable workspace-level private link and approve the connection when Microsoft exposes it. Keep workspace communication policy in **Allow** mode until private link is functional.
7463

7564
### Step 5: Enable Tenant-Level Private Link
7665

@@ -90,37 +79,16 @@ In Fabric Admin Portal:
9079
3. Navigate to `https://app.powerbi.com` or `https://app.fabric.microsoft.com`
9180
4. Verify you can access the Fabric workspace
9281

93-
## Manual Steps (If Automation Fails)
94-
95-
### Enable Workspace-Level Private Link
82+
### Manual Steps (Required)
9683

97-
If the script cannot enable workspace-level private link automatically:
84+
Enable workspace-level private link in the Fabric portal (portal-only until Microsoft exposes an API/RP):
9885

9986
1. Go to https://app.fabric.microsoft.com
10087
2. Open your workspace
10188
3. **Workspace Settings****Security****Private Link**
102-
4. Enable **"Workspace-level private link"**
103-
5. Click **Apply**
104-
105-
### Approve Private Endpoint Connection
106-
107-
If the connection is pending approval:
108-
109-
1. Go to https://app.fabric.microsoft.com
110-
2. Open your workspace
111-
3. **Workspace Settings****Security****Private Link****Private Endpoints**
112-
4. Find the pending connection
113-
5. Click **Approve**
114-
115-
### Configure Workspace to Deny Public Access
116-
117-
If the script cannot set the communication policy:
118-
119-
1. Go to https://app.fabric.microsoft.com
120-
2. Open your workspace
121-
3. **Workspace Settings****Inbound networking**
122-
4. Select **"Allow connections only from workspace level private links"**
123-
5. Click **Apply**
89+
4. Enable **"Workspace-level private link"** and save
90+
5. If/when private endpoints are exposed, approve the connection in the same blade
91+
6. Set inbound networking to **Allow** until a working private endpoint path exists; then switch to **Deny** once verified
12492

12593
## Verification
12694

@@ -164,14 +132,14 @@ Invoke-RestMethod `
164132

165133
### Issue: DNS_PROBE_FINISHED_NXDOMAIN when accessing Fabric
166134

167-
**Cause**: Private DNS zones exist but no A records (private endpoint not created)
135+
**Cause**: Private DNS zones exist but no private endpoint records (because Fabric private link is not exposed via ARM/CLI).
168136

169137
**Solution**:
170-
1. Run `setup_workspace_private_endpoint.ps1`
171-
2. Or delete empty DNS zones if not using private endpoints:
172-
```bash
173-
az network private-dns zone delete --name privatelink.analysis.windows.net --resource-group rg-{env}
174-
```
138+
1. Use public access (workspace in **Allow** mode) until Fabric exposes a supported private endpoint path.
139+
2. If you prefer public-only, delete empty DNS zones:
140+
```bash
141+
az network private-dns zone delete --name privatelink.analysis.windows.net --resource-group rg-{env}
142+
```
175143

176144
### Issue: Connection Pending Approval
177145

docs/fabric_private_networking_atomic_scripts.md

Lines changed: 12 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -42,38 +42,8 @@ azd env set virtualNetworkId "/subscriptions/.../virtualNetworks/vnet-myproject"
4242
./create_fabric_private_dns_zones.ps1
4343
```
4444

45-
### 2. `create_fabric_workspace_private_endpoint.ps1`
46-
**Purpose:** Create private endpoint for Fabric workspace in VNet
47-
48-
**What it does:**
49-
- Checks if private endpoint is needed (VNet + Fabric capacity deployed)
50-
- Creates private endpoint in jumpbox subnet
51-
- Automatically calls DNS zone script if `FABRIC_AUTO_CREATE_DNS_ZONES=true`
52-
- Links private endpoint to DNS zones
53-
- Gracefully exits if prerequisites not met
54-
55-
**When to use:**
56-
- After Fabric workspace is created (`FABRIC_WORKSPACE_ID` available)
57-
- In network-isolated deployments
58-
- When VNet and Fabric capacity are both deployed
59-
60-
**Usage:**
61-
```powershell
62-
# Automatic usage (in azd post-provision)
63-
# Prerequisites: Workspace created, FABRIC_WORKSPACE_ID exported
64-
./create_fabric_workspace_private_endpoint.ps1
65-
66-
# With auto-DNS creation
67-
azd env set FABRIC_AUTO_CREATE_DNS_ZONES "true"
68-
./create_fabric_workspace_private_endpoint.ps1
69-
70-
# Standalone usage in external environment
71-
azd env set FABRIC_WORKSPACE_ID "12345678-1234-1234-1234-123456789012"
72-
azd env set AZURE_RESOURCE_GROUP "rg-myproject"
73-
azd env set AZURE_SUBSCRIPTION_ID "..."
74-
azd env set virtualNetworkId "..."
75-
./create_fabric_workspace_private_endpoint.ps1
76-
```
45+
### Fabric workspace private endpoints (not automated)
46+
Fabric workspace private endpoints are **service-managed** today. There is no customer-facing ARM/Bicep/CLI resource to deploy or poll. The previous automation scripts have been removed to avoid failed runs. Enable workspace-level private link in the Fabric portal when the platform supports it.
7747

7848
## Deployment Scenarios
7949

@@ -94,21 +64,19 @@ azd env set virtualNetworkId "..."
9464
2. User runs `create_fabric_workspace.ps1` → Workspace created
9565
3. User exports workspace ID: `azd env set FABRIC_WORKSPACE_ID "..."`
9666
4. User runs `create_fabric_private_dns_zones.ps1` → DNS zones created ✓
97-
5. User runs `create_fabric_workspace_private_endpoint.ps1` → Private endpoint created ✓
67+
5. Enable workspace-level private link manually in the Fabric portal (no script available)
9868

99-
**Result:** Manual orchestration, but atomic scripts handle each step
69+
**Result:** Manual orchestration with DNS zones automated; private link enablement is portal-only until Microsoft exposes an API/RP.
10070

10171
---
10272

10373
### Scenario 3: Auto-Create DNS Zones
10474
**Flow:**
10575
1. Bicep deployment without stage 7 (network isolated but no DNS zones)
10676
2. Post-provision stage 3.5 with `FABRIC_AUTO_CREATE_DNS_ZONES=true`
107-
3. Private endpoint script detects missing zones
108-
4. Automatically calls DNS zone script
109-
5. Both DNS zones and private endpoint created ✓
77+
3. DNS zone script creates missing zones; private endpoint remains a manual portal step
11078

111-
**Result:** Self-healing automation
79+
**Result:** DNS zones can self-heal; private link remains manual until platform support.
11280

11381
---
11482

@@ -155,21 +123,13 @@ module fabricNetworking = if (deployToggles.virtualNetwork && deployToggles.fabr
155123
- If stage 7 runs → DNS zones exist → scripts skip creation
156124
- If stage 7 skipped → Scripts can create DNS zones via CLI
157125

158-
## Conditional Logic Summary
126+
### Conditional Logic Summary
159127

160128
### Bicep (Stage 7)
161129
```
162130
Deploy DNS zones IF (virtualNetwork AND fabricCapacity)
163131
```
164132

165-
### PowerShell (Private Endpoint Script)
166-
```
167-
Create private endpoint IF:
168-
1. virtualNetworkId exists (network isolated design)
169-
AND
170-
2. FABRIC_CAPACITY_ID exists (Fabric deployed)
171-
```
172-
173133
### PowerShell (DNS Zone Script)
174134
```
175135
Create DNS zones IF:
@@ -191,13 +151,13 @@ Create DNS zones IF:
191151
- Both scripts are idempotent (safe to re-run)
192152

193153
3. **For automation:** Use `FABRIC_AUTO_CREATE_DNS_ZONES=true`
194-
- Self-healing if DNS zones missing
195-
- No manual intervention required
154+
- Self-healing if DNS zones missing
155+
- Private link remains a manual portal step until platform support
196156

197157
4. **For testing:** Run scripts independently
198-
- Each script has clear prerequisites
199-
- Graceful error handling
200-
- Detailed logging
158+
- Each script has clear prerequisites
159+
- Graceful error handling
160+
- Detailed logging
201161

202162
## Troubleshooting
203163

0 commit comments

Comments
 (0)