20 de junho de 202612 min de leitura

Opções de Conectividade Cross-Region no Microsoft Foundry: Padrões, Tradeoffs e uma Implementação com APIM em VNet

rayankhoury

Azure

Banner - Opções de Conectividade Cross-Region no Microsoft Foundry: Padrões, Tradeoffs e uma Implementação com APIM em VNet

A disponibilidade de modelos no Microsoft Foundry varia por região. Pode ser que a região aprovada para seu projeto não ofereça o modelo ou o suporte do Foundry Agent Service necessário. Isso gera uma decisão de arquitetura: conectar-se diretamente a outro recurso Foundry, ou adicionar uma camada de gateway para mais controle e governança. Este artigo complementa a documentação oficial Bring Your Own Model com foco em cenários cross-region, tradeoffs e padrões de implantação empresarial.

TL;DR: O Microsoft Foundry oferece duas formas suportadas de acessar modelos entre regiões: conexão direta a outro recurso Foundry, ou via Azure API Management (APIM) como gateway. A escolha depende da necessidade de governança, roteamento e observabilidade. Este artigo detalha a implementação do padrão APIM em uma topologia VNet-secured, com autenticação por managed identity, tráfego privado via private endpoints e compatibilidade parcial com ferramentas como avaliações e Content Safety.

Qual padrão de conectividade cross-region escolher?

A imagem abaixo mostra os dois padrões principais: conexão direta (sem gateway) e Azure API Management como AI Gateway.

Conexão Direta (sem gateway)

Diagrama Conexão Direta

Use quando o objetivo é alcançar modelos em outro recurso Foundry com o mínimo de componentes.

Azure API Management AI Gateway

Diagrama APIM Gateway

Use quando o time de plataforma deseja uma superfície governada e um plano de controle próprio na frente do tráfego de modelos.

Variante VNet-secured com APIM

Diagrama VNet-secured APIM

Nesta variante, o APIM tem seu inbound também atrás de um private endpoint no VNet do projeto. Toda a requisição (caller → APIM → backend) trafega na backbone Azure sem nenhum hostname público.

Tabela Comparativa dos Padrões

Padrão Melhor para Modelo de controle e autenticação Tradeoffs
Conexão direta a outro Foundry Equipes que precisam do caminho mais simples, sem gateway adicional A conexão aponta diretamente para o endpoint do Foundry backend. Autenticação via API key ou managed identity. Menor sobrecarga arquitetural, mas sem camada de política, roteamento ou observabilidade centralizada.
Conexão via Azure API Management Times de plataforma que querem um gateway estável com roteamento, throttling e telemetria A conexão aponta para o endpoint APIM, que normaliza autenticação, aplica políticas e encaminha ao backend. Adiciona um hop a mais e exige design do APIM, planejamento de subnets e ownership operacional.
APIM na frente da superfície do agente Governança e telemetria no ingress do agente (throttling, logging, validação de schema) O tráfego de entrada passa pelo APIM, mas o Foundry continua validando o token do caller diretamente (MCP OBO). APIM não substitui a identidade na superfície do agente – deve ser tratado como camada de governança, não de autenticação.

Na prática, as equipes têm duas formas suportadas de acessar modelos entre regiões. Conexão direta é o ponto de partida mais simples. O APIM é útil quando a plataforma quer governança centralizada. A escolha depende de ownership, necessidade de controle e overhead operacional.

O que esta arquitetura prova: agents, modelos e tracing continuam funcionando

Essa arquitetura responde a uma pergunta chave: a experiência se mantém íntegra quando os modelos são alcançados cross-region através de um gateway? Sim. Tanto Foundry agents (com estado no Playground) quanto prompt agents (invocações via Responses API) executam end-to-end contra modelos alcançados via APIM.

Os fluxos operacionais permanecem intactos. O tracing do APIM mostra a URL do backend reescrita e o caminho do token de managed identity. Valores por requisição como apim-request-id e apim-trace-id fluem pela telemetria padrão do APIM. A política de roteamento é reutilizável entre deployments porque o caminho /inference/deployments/{deploymentName}/chat/completions é parametrizado. Para expor um novo modelo, basta implantá-lo no Foundry backend e registrá-lo na configuração do AI Gateway no projeto.

Dynamic Connection

Para roteamento baseado em payload (Responses API, que carrega o nome do modelo no corpo JSON), o Foundry oferece a dynamic model connection: ela resolve model → backend no lado do projeto no momento da invocação. A vantagem é que o APIM nunca precisa inspecionar o corpo; a desvantagem é que a decisão de roteamento sai do APIM, então a URL observável única não cobre mais todas as chamadas. Times que adotam a Responses API em escala devem combinar APIM (para acesso backend + managed identity) com a dynamic connection (para despacho por chamada).

Compatibilidade de funcionalidades BYOM via APIM (na data de publicação)

A tabela abaixo resume como as funcionalidades atuais do Foundry interagem com BYOM via APIM. A experiência continua evoluindo.

Funcionalidade Foundry Status com BYOM via APIM Notas
Chat completions / Responses API ✅ Funciona Ambas as superfícies invocam a conexão BYO; APIM encaminha e retorna a resposta sem alterações.
Foundry agents (Assistants / Threads / Runs) ✅ Funciona O estado do agente fica no projeto; apenas a chamada do modelo atravessa o APIM.
Prompt agents (Responses API) ✅ Funciona Invocações passam pela conexão BYO a cada chamada.
Ferramentas 1P on-behalf-of (SharePoint Grounding, Fabric Data Agent, etc.) ❌ Não suportado Foundry retorna bad_request porque o contexto de tenant 1P vazaria para fora do limite de confiança da Microsoft. Use conexão direta ou divida em dois agents.
Avaliações offline (sobre dataset) ⚠️ Parcial Avaliações que chamam o modelo via BYO funcionam, mas métricas de introspecção (token-level scoring, log-probs) podem degradar.
Avaliações contínuas (produção) ⚠️ Parcial Mesma limitação das avaliações offline.
Red teaming / testes adversarial ✅ Funciona Sondas são em nível de payload; nenhum hook first-party necessário.
Foundry IQ (sugestões de avaliação) ⚠️ Fidelidade reduzida Recomendações são mais grosseiras porque o tráfego BYO aparece como uso opaco em nível de conexão.
Content Safety no Foundry Control Plane ⚠️ Configurar no APIM Filtros do Foundry não se aplicam automaticamente a conexões BYO. Anexe a política Content Safety no APIM.
Prompt Shields (jailbreak / injeção indireta) ⚠️ Configurar no APIM Mesmo caso: anexe a política Prompt Shields no APIM.
Fine-tuning ❌ Não aplicável à conexão Fine-tuning é feito diretamente no deployment do Foundry backend; o APIM não participa.
Batch API ⚠️ Apenas direto Jobs batch usam APIs de longa duração que não cabem no modelo síncrono do APIM. Submeta batch diretamente contra o backend Foundry.

Topologia de Exemplo: APIM em VNet e Componentes Core

Esta implementação usa dois recursos Foundry com papéis distintos. O recurso do projeto (project-side) hospeda o agente na região aprovada, integrado à VNet. O recurso backend hospeda os modelos na região de capacidade, exposto apenas via private endpoint. O APIM fica entre eles como gateway gerenciado, com DNS privado resolvendo os FQDNs do backend para IPs privados.

Componente Recurso Notas
Project resource <foundry-account> / <project-name> (ex.: canadaeast) Hospeda o projeto do agente. Integrado à VNet, usa system managed identity.
APIM AI Gateway <apim-name> (StandardV2) Gateway gerenciado. Sua managed identity recebe a role Cognitive Services User no backend para encaminhar chamadas sem API keys.
Backend account <backend-account> (ex.: japaneast) Hospeda os modelos. Após setup, public network access é desabilitado.
Private endpoint <backend-account>-pe na subnet backend-pe Caminho privado cross-region. DNS privado resolve o hostname do backend para o endpoint privado.
AI Gateway connection <connection-name> no projeto Conexão usada pelo projeto para enviar chamadas ao APIM com managed identity e lista de modelos disponíveis.

Juntos, esses componentes tornam o padrão prático para produção: nomes de serviço resolvem privadamente, acesso público desabilitado, autenticação por managed identity, e todos os modelos alcançáveis por uma única URL observável.

O que está realmente dentro da VNet hoje

Hoje, a VNet do projeto contém quatro subnets:

  • agent-subnet — delegada a Microsoft.App/environments para o runtime do agente.
  • pe-subnet — private endpoints para o Foundry account, Storage, Cosmos DB, AI Search.
  • apim-outbound — integração outbound do APIM SV2, sem acesso de saída público implícito.
  • backend-pe — private endpoint cross-region para o Foundry account backend, também sem acesso de saída público.

Diagrama subnets VNet

A tabela abaixo mostra a cadeia de autenticação hop a hop:

Hop Artefato de auth Identidade usada Configurado por
Agent → Project Nenhum (in-process) n/a Foundry SDK
Project → APIM Token AAD bearer Managed identity do projeto Política validate-azure-ad-token (precisa do projectMiClientId)
APIM → Backend Token AAD bearer novo Managed identity do APIM Política authentication-managed-identity + role Cognitive Services User
Caminho de rede Privado o tempo todo n/a Backend publicNetworkAccess: Disabled; resolução via zonas DNS privatelink

Nenhuma API key é armazenada. Nenhuma subscription key do APIM é necessária. A rotação de tokens é automática pelas managed identities.

Como consumir a conexão a partir de um agente

Uma vez que a conexão existe, qualquer superfície do Foundry que aceite um nome de deployment — agents, prompt agents, chamadas chat-completions e Responses do SDK, Playground — aceita o alias <connection-name>/<deployment-name>:

from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential

project = AIProjectClient(
    endpoint="https://<foundry-account>.services.ai.azure.com/api/projects/<project-name>",
    credential=DefaultAzureCredential(),
)

agent = project.agents.create_agent(
    model="ai-gateway/gpt-5",        # <connection-name>/<deployment-name>
    name="cross-region-agent",
    instructions="You are a helpful assistant.",
)

Próximos Passos

Deployment Walkthrough

A implementação completa está no repositório: foundry-samples/infrastructure/infrastructure-setup-bicep/16-private-network-standard-agent-apim-setup/extensions/byom-cross-region

Pré-requisitos

  • Azure CLI 2.67+ e PowerShell 7+
  • Assinatura Azure com Contributor no resource group alvo
  • Módulo Az PowerShell (Install-Module Az -Scope CurrentUser)
  • Owner ou Contributor + User Access Administrator no resource group (o template cria role assignments)
  • Foundry Account Owner para criar a conta Foundry
  • Quota para gpt-4o/gpt-5/gpt-5.1 na região backend e gpt-4o na região do projeto
  • Quota para APIM StandardV2 na região do projeto
  • O client ID da managed identity do projeto Foundry (projectMiClientId) — necessário para o APIM validar tokens de entrada

Deploy

git clone https://github.com/azure-ai-foundry/foundry-samples.git
cd foundry-samples/samples/microsoft/infrastructure-setup/16-private-network-standard-agent-apim-setup/extensions/byom-cross-region

az group create --name <rg> --location <project-region>

az deployment group create \
   --resource-group <rg> \
   --template-file main.bicep \
   --parameters @samples/parameters-cross-region.json \
   --parameters projectMiClientId=<paste-client-id>

Após o deploy, a URL do gateway está em outputs.apimGatewayUrl. Os modelos conectados aparecem no portal como <connection-name>/<deployment-name> (ex.: ai-gateway/gpt-5).

Smoke Test

A API /inference tem subscriptionRequired: false. Para verificar o gateway:

$apim       = '<your-apim-name>'
$deployment = 'gpt-5'

$token = az account get-access-token --resource 'https://cognitiveservices.azure.com' --query accessToken -o tsv
$body  = @{ messages = @(@{ role = 'user'; content = 'Say hi in five words.' }); max_tokens = 30 } | ConvertTo-Json -Compress

Invoke-RestMethod -Method POST `
   -Uri "https://$apim.azure-api.net/inference/deployments/$deployment/chat/completions?api-version=2024-10-21" `
   -Headers @{ Authorization = "Bearer $token"; 'Content-Type' = 'application/json' } `
   -Body $body

Um 200 com os headers x-aigw-backend e x-aigw-region comprova que a cadeia de políticas (validação MI → reescrita do backend → private endpoint cross-region) está saudável.

Apêndice — O que o trace do APIM prova

Um POST real contra /inference/deployments/gpt-4o/chat/completions confirma a cadeia:

Inbound
   authentication-managed-identity -> token acquired for https://cognitiveservices.azure.com
   set-header Authorization        -> Bearer token from APIM SMI, not the caller
   set-header api-key (delete)     -> removed
   set-backend-service             -> https://ctcfvce-jpe.openai.azure.com/openai
   set-header x-aigw-route         -> customer-apim-fvce to japaneast

Backend
   request-forwarder               -> POST /openai/deployments/gpt-4o/chat/completions
   forward-request                 -> 200 OK, x-ms-region: Japan East

Outbound
   set-header x-aigw-backend       -> apim-fvce-aigw / ctcfvce-jpe
   set-header x-aigw-region        -> canadaeast to japaneast
   transfer-response               -> response sent to caller in full

Perguntas Frequentes

  • Quais são as opções para conectar modelos do Foundry entre regiões?
    Duas opções principais: conexão direta a outro recurso Foundry (mais simples, sem gateway adicional) e conexão via Azure API Management (APIM), que adiciona um gateway gerenciado para políticas, roteamento, throttling e observabilidade.

  • O APIM pode ser usado em uma VNet com endpoints privados?
    Sim. O artigo descreve uma variante VNet-secured onde o APIM tem inbound via private endpoint no VNet do projeto, e o backend Foundry é acessado por outro private endpoint cross-region, mantendo todo o tráfego na backbone Azure sem exposição pública.

  • Quais funcionalidades do Foundry não funcionam com BYOM via APIM?
    Ferramentas first-party on-behalf-of (como SharePoint Grounding e Fabric Data Agent) não são suportadas. Avaliações (offline e contínuas) funcionam parcialmente, com métricas de introspecção degradadas. Fine-tuning e Batch API devem ser feitos diretamente no backend Foundry.

  • Como é feita a autenticação no padrão APIM cross-region?
    A autenticação é end-to-end via managed identity: o projeto Foundry envia um token AAD para o APIM, que valida o token, obtém um novo token com sua própria managed identity e encaminha a requisição ao backend Foundry. Nenhuma API key é armazenada.

  • Como consumir um modelo cross-region a partir de um agente Foundry?
    Basta usar o alias / (ex.: "ai-gateway/gpt-5") no parâmetro model do agente. O SDK do Foundry aceita esse formato em agents, prompt agents, chat completions e no Playground.


Artigo originalmente publicado por rayankhoury em Azure Updates - Latest from Azure Charts.

Gostou? Compartilhe:
Precisa de ajuda?Fale com nossos especialistas 👋
Avatar Walcew - Headset