An Azure service that provides an event-driven serverless compute platform.
Thank you for reaching out to Microsoft Q&A.
In Azure Functions Flex Consumption (Linux), the portal experience is different from Premium or Dedicated plans. Kudu / Advanced Tools and the in‑portal Console are not available for Flex Consumption apps. This is by design, not a misconfiguration.
That 403 from Document Intelligence (“Traffic is not from an approved private endpoint”) almost always means your Function App is still talking to the public endpoint instead of your private endpoint. Even though you’ve got a privatelink DNS zone linked and a PE in the VNet, a couple of gotchas tend to sneak in when you’re using a custom subdomain:
DNS for your custom subdomain isn’t resolving to the PE’s private IP
Your Function isn’t routing ALL outbound (including DNS) traffic into the VNet
Here’s what you can try:
Verify DNS resolution
• Spin up a quick VM (or enable SSH on your Flex container – see below) in the same VNet/subnet and run:
nslookup <your-custom-endpoint>.cognitiveservices.azure.com
• You should see the private IP of your PE. If you still get a public IP, DNS isn’t mapping correctly.
Fix your Private DNS zone for the custom domain
Because you enabled a custom subdomain, Azure doesn’t automatically populate that in the standard
privatelink.cognitiveservices.azure.com zone. You need to:
Create (or extend) a Private DNS zone that matches your custom slice – for example:
• If your endpoint is contoso-ai.document-intel.azure.com, you might need a
privatelink.document-intel.azure.com zone
In that zone, add either:
• A CNAME from contoso-ai.document-intel.azure.com → contoso-ai.privatelink.cognitiveservices.azure.com
• Or an A record pointing directly at your PE’s private IP
Link the DNS zone to your VNet.
Force all outbound + DNS traffic into the VNet
In a Flex Consumption plan you need to ensure your app actually sends DNS queries into the VNet:
App Setting WEBSITE_VNET_ROUTE_ALL = 1
If you have a custom DNS server configured on the VNet, also set
WEBSITE_DNS_SERVER = 168.63.129.16
WEBSITE_DNS_SERVER = 168.63.129.16 (Azure’s DNS) so your app picks up the private DNS zones
Enable an SSH console in your Function to validate
On Linux Flex you don’t get Kudu/Console – instead:
Add App Setting
WEBSITE_SSH_ENABLED = true
In the Azure portal, go to your Function > Development Tools > SSH and you’ll land in a shell where you can run nslookup or curl
Once your custom-domain name actually resolves to the private IP and all traffic is VNet-routed, the SDK call will flow over the PE and that 403 will disappear.