INFRA-0001: VNet Integration for App Service → SSRS Connectivity
Status
Accepted
Date
2026-03-25
Context
The eSHARS web app (wa-eshars-nonprod, wa-eshars-prod) renders SSRS reports via the MvcReportViewer NuGet package. The package makes server-side HTTP calls from the App Service to the SSRS server. Until March 2026, this worked via the SSRS VM’s public IP address.
When the public IP was removed from vm-sql16-np (nonprod) to improve security posture, all report viewing broke with “Service unavailable — unable to connect to remote server.” The App Service had no route to the VM’s private IP (10.1.0.4).
The same situation applies to production (vm-ssrs16-prod, private IP 10.0.0.5, public IP 23.99.180.223 still present at time of writing).
Decision
Use Azure App Service VNet Integration to give the App Service outbound access to the VNet, routing traffic to the SSRS VM via private IP.
- Create a dedicated subnet per environment for App Service delegation
- Add VNet integration on each App Service slot pointing to that subnet
- Update app settings to use private IP instead of public IP
Alternatives Considered
Alternative 1: Restore the public IP
Re-add the public IP to the SSRS VM and keep routing traffic over the internet.
Pros: Zero configuration change. Restores previous state immediately.
Cons: Public IP is a security exposure on a VM running Windows Server 2012 R2 (EOL) and SQL Server 2016. Keeping it contradicts the goal of reducing attack surface. Fragile — if IP changes again, everything breaks.
Alternative 2: App Gateway as reverse proxy
Route App Service → App Gateway → SSRS VM (private IP). The App Gateway already fronts nonprodreports.myeshars.com.
Pros: No new Azure networking primitives. App Gateway is already in place.
Cons: Unnecessary hop — App Gateway is designed for inbound HTTP, not as a generic TCP proxy. Adds latency. App Gateway health probes would target SSRS endpoints. The training slot actually uses this pattern (see INFRA-0003) and it works, but it’s the exception not the rule.
Alternative 3: Private Endpoint on the SSRS VM
Expose the SSRS VM via an Azure Private Endpoint.
Cons: Private Endpoints are for Azure PaaS services (SQL, Storage, Key Vault, etc.) — not for IaaS VMs. VMs are reachable via VNet integration natively once the App Service is on the same VNet.
Consequences
Positive
- App Service → SSRS traffic stays entirely within the Azure VNet
- Public IP can be removed from SSRS VMs (reduces attack surface)
- Pattern is consistent across all environments once applied to prod
Negative
- VNet integration is configured per slot, not inherited from the App Service Plan. Each slot (dev, qa, regression, uat, trn, prod) must be configured individually.
- Requires a dedicated subnet per environment (see INFRA-0002)
Neutral
- App setting updates required — both the dot-notation and camelCase keys must be updated (see INFRA-0004)
Implementation
| Environment | Subnet | SSRS Private IP | Status |
|---|---|---|---|
| nonprod (all slots) | sn-webapp-eshars-np (10.1.3.0/24) | 10.1.0.4 | ✅ Complete (2026-03-25) |
| prod | sn-webapp-eshars-prod (10.0.3.0/24) | 10.0.0.5 | Scheduled — see Change Record |