Digital by Design
BlogAbout

Troy Hite

Cloud & AI Infrastructure Solution Engineer sharing insights on cloud technologies and software engineering.

Quick Links

HomeBlogAboutRSS Feed

Connect

I am an employee of Microsoft Corporation. The opinions and views expressed on this site are my own and do not necessarily reflect the official policy, position, or views of Microsoft Corporation or any affiliated entities.

© 2026 Troy Hite. All rights reserved.

Built with Next.js, TypeScript & Tailwind CSS

Home→Blog→Private Networking for Azure AI Services: The Part Everyone Underestimates
← Back to all posts
September 17, 202611 min read

Private Networking for Azure AI Services: The Part Everyone Underestimates

AzureAzure AINetworkingPrivate LinkAI Landing ZonesAzure AI SearchMicrosoft Foundry

I recently put together an internal session for AI Apps Solution Engineers on private networking across Azure AI services. The more I worked through the material, the more obvious the real problem became.

Private networking for Azure AI services

Everybody wants the simple version: "turn off public access and add private endpoints."

That sentence is not wrong. It is just wildly incomplete.

In a normal web app conversation, private networking usually means a fairly familiar chain: client, DNS, gateway, backend, data store. There are still plenty of ways to mess that up, but the mental model is stable.

AI apps stretch that model. A single Azure AI workload might involve Microsoft Foundry, Agents, Azure AI Search, Storage, Cosmos DB, Key Vault, Container Apps, App Configuration, Application Insights, and sometimes API Management as an AI gateway. Some traffic comes from users. Some comes from app runtimes. Some comes from managed services like Search indexers. Some comes from agent infrastructure that does not behave like a VM you own.

So the better question is not "does this resource have a private endpoint?"

The better question is: which caller, from which network, under which identity, is trying to reach which dependency?

The AI Landing Zone is the right starting point

I grounded the session in the Azure AI Landing Zones work because it gives us an implementation-backed reference architecture instead of another pretty whiteboard diagram.

The AI Landing Zone is an application landing zone for AI Apps and Agents. It is meant to sit either on its own or inside a broader enterprise platform landing zone. That distinction matters.

Standalone environment

For greenfield or isolated deployments, the landing zone can provide the complete foundation:

  • VNet, subnets, and private endpoints
  • Private DNS, firewall, gateway, and WAF
  • APIM, monitoring, and administrative access
  • Foundry, Search, Storage, Cosmos DB, and Key Vault

Enterprise integration

For an established platform landing zone, the application should consume centrally managed controls:

  • Hub-spoke routing and network policy
  • DNS forwarding and private zone ownership
  • Shared firewall, gateway, and APIM services
  • Existing governance and monitoring patterns

That is usually the first design fork:

  • Are we deploying a standalone AI app environment?
  • Or are we integrating into an existing enterprise platform landing zone?

If you skip that question, the rest of the network conversation gets messy fast.

Private connectivity is a path, not a checkbox

This is the mental model I kept coming back to during the presentation.

Private networking only makes sense when you can describe the whole path:

1. Origin

Where does the traffic start?

2. Route

How does it reach a private IP?

3. Name

What does DNS resolve from that origin?

4. Identity

Who is authorized on the data plane?

5. Dependency

What else does this service need to reach?

That sounds basic, but it catches a lot of real-world misses. Consider three paths that might appear on the same architecture diagram:

Application path

Origin: Container Apps

Destination: Microsoft Foundry

Key question: Does the app runtime have private routing, DNS resolution, and data-plane access?

Developer path

Origin: Browser over VPN

Destination: Foundry portal

Key question: Does the developer network resolve and route to the private endpoint?

Managed service path

Origin: Azure AI Search indexer

Destination: Locked-down Storage

Key question: Does Search have an approved shared private link and the correct identity permissions?

The resources are related, but the network pattern for each path is different.

Foundry has three networking conversations

Microsoft Foundry network isolation is easier to reason about when you split it into three areas.

Inbound access

Users and applications reach Foundry accounts and projects through public access controls, selected IPs, or private endpoints with private DNS.

Service outbound

Foundry reaches customer-owned Storage, Azure AI Search, Cosmos DB, Key Vault, and monitoring services that support the workload.

Agent client outbound

The platform injects the agent client into a delegated customer subnet so it can reach approved private data sources and PaaS dependencies.

Why the distinction matters

The customer is not managing generic Foundry compute like a VM. Describing VNet injection too loosely can lead security and network teams to assume they own infrastructure that the platform actually manages.

Azure AI Search is where people get tripped up

Azure AI Search has two private-link conversations, and mixing them up causes a lot of confusion.

Private endpoint

Direction: Clients to Search

Your app or user reaches the Search service over a private IP. This protects query and indexing API calls from clients in the VNet.

Shared private link

Direction: Search to dependencies

Indexers and skills reach locked-down services such as Storage, Cosmos DB, SQL, Key Vault, Foundry, or APIM.

Here is the field example:

You create a private endpoint for Azure AI Search. You disable public access on the Storage account. Then the indexer fails.

The private endpoint helped your clients reach Search. It did not help Search reach Storage. For that, Search needs a shared private link to the storage subresource, and the target resource owner has to approve the connection.

Private endpoint for clients to Search. Shared private link for Search to dependencies.

That one sentence has saved me a lot of whiteboard time.

DNS is usually where the design breaks

Private DNS is the part everyone nods at and then underestimates.

The connection string usually does not change. The hostname stays the same. What changes is name resolution from the network where the request starts.

From inside the linked VNet, the service hostname should resolve to the private endpoint IP. From outside, it may still resolve through the public CNAME chain. That is normal.

The dangerous assumption is treating DNS resolution as proof of access. It is not.

A public DNS lookup can prove a resource name exists. It does not prove the caller can reach the private endpoint. It does not prove public network access is enabled. It does not prove the caller has data-plane permission.

For customers with custom DNS or on-premises DNS, someone has to own forwarding or delegation for the privatelink zones. In a mature enterprise, that is usually the platform team, not the app team. This is why I keep asking the same boring question in design reviews:

Who owns DNS?

If nobody can answer that quickly, the private networking design is not done.

DNS resolution is not proof of access

A successful lookup does not prove that the caller can route to the private endpoint, that public network access is enabled, or that its identity has data-plane permission.

Design review question: Who owns forwarding and delegation for the privatelink zones?

The "looks private" trap

There are a few patterns that look secure on paper but fail in production.

DNS resolves. Great. From where?

Public network access is disabled. Great. Does every required caller have a private path?

The portal opens. Great. Is that the same origin as the app runtime or Search indexer?

A private endpoint exists. Great. Is it approved, linked to the right DNS zone, reachable over the route table and firewall, and paired with the correct managed identity permissions?

The validation sequence should be boring and specific:

Validate from the real origin

  1. Run nslookup from the actual origin subnet.
  2. Confirm the hostname resolves to the private endpoint IP.
  3. Test TCP 443 to the private IP.
  4. Make a real data-plane call using the same identity the app will use.

Anything less is a partial test.

APIM changes the conversation

API Management is not required for every Azure AI app. I would not force it into a simple design just to make the diagram look more enterprise-y.

But once a customer has multiple teams calling models, APIM starts to make a lot of sense as an AI gateway. It gives the platform a place to handle policy, routing, throttling, header normalization, backend selection, observability, and governance across model endpoints.

Policy

Apply authentication, authorization, quotas, and content controls consistently.

Routing

Normalize requests and select model backends without changing every client.

Operations

Centralize throttling, observability, and governance across teams and endpoints.

That is why the AI Landing Zones work includes both a Foundry Landing Zone and an AI Gateway Landing Zone. Some customers will deploy both. Some will integrate with a gateway the platform team already owns.

This is another place where the platform landing zone question matters. If the central team already runs APIM, the AI app should probably integrate with it. If the AI app team deploys its own APIM without talking to the platform team, they may have built a duplicate control plane by accident.

The field-ready checklist

This is the slide I would keep handy for any Azure AI private networking review.

Before calling an AI app privately networked, answer these five questions:

Origin

Browser, build agent, Container Apps environment, Search indexer, Foundry agent client, or on-premises client?

Route

VNet integration, VNet injection, private endpoint, shared private link, VPN, ExpressRoute, or hub-spoke peering?

Name

What does DNS return from that origin? Are private zones and custom forwarding configured correctly?

Identity

Which user, managed identity, Search identity, or deployment principal makes the call, and does it have the right data-plane role?

Dependency

Does the target need Storage, Search, Cosmos DB, SQL, Key Vault, App Configuration, ACR, App Insights, APIM, or internet endpoints?

If you cannot answer all five, the architecture may be private in one place and broken in three others.

The part I would teach first

If I only had ten minutes with an app team, I would not start with the private endpoint wizard.

I would start with a blank page and draw the callers:

  • Who is the user?
  • Where does the app run?
  • What does Search index?
  • Where does agent state live?
  • Which identity performs each action?
  • Who owns DNS and egress?

Then I would map those answers back to the AI Landing Zone pattern.

Private networking for Azure AI is not one setting. It is a chain of named, routed, authorized paths across the app.

Once you see it that way, the service-specific details stop feeling random. Foundry, AI Search, Storage, Cosmos DB, Key Vault, and APIM all have their own knobs, but the review pattern stays the same:

origin, route, name, identity, dependency.

That is the part worth memorizing.


Resources:

  • Azure AI Landing Zones
  • Azure/AI-Landing-Zones on GitHub
  • AI Landing Zone Portal Deployment Guide
  • Configure network isolation for Microsoft Foundry
  • Configure virtual networks for Foundry Tools
  • Create a private endpoint for Azure AI Search
  • Connect through a shared private link in Azure AI Search
  • Azure Private Endpoint private DNS zone values

Share this article

Share on RedditShare on LinkedInShare on X