WIKI
AI-103 AI Apps and Agents Developer

03 · Gérer, surveiller et sécuriser les systèmes d'IA

34 min de lecture Mis à jour le 21 octobre 2026
Sur cette page

Version : 1.1 · Date : 2026-10-21 · Domaine 1 de l'examen : Plan and manage an Azure AI solution (25 à 30 %)

En une phrase : une application Foundry en production se pilote avec trois leviers : gérer la capacité (quota TPM/RPM, PTU, Batch, coûts), surveiller ce qui se passe (metrics, logs, traces OpenTelemetry, evaluations continues, santé d'Azure AI Search) et sécuriser l'accès (Entra ID sans clé, managed identities, rôles Foundry, Private Endpoint, CMK, Azure Policy).

Vue d'ensemble : gérer, surveiller et sécuriser une charge de travail Foundry

Ce que l'examen demande#

Bloc Manage, monitor, and secure AI systems, repris mot pour mot du guide d'étude AI-103 (compétences mesurées au 16 avril 2026) :

# Compétence mesurée (guide officiel, en anglais) Section de ce chapitre
1 Manage quotas, scaling, rate limits, and cost footprints for model and agent workloads 2
2 Monitor model performance, drift, safety events, and grounding quality 3
3 Monitor data ingestion quality, search index health, and relevance performance 4
4 Configure security, including managed identity, private networking, keyless credentials, and role policies 5

Les types de déploiement (Global Standard, Provisioned, Batch…) sont présentés au chapitre 02 ; les guardrails et evaluators sous l'angle de l'IA responsable au chapitre 04. Pour la sécurité générique (Conditional Access, Private Endpoint, DNS privé, AI gateway), voir le cours SC-500 : 01 Entra ID, 06 Réseau et 07 IA.


1. Les bases à maîtriser#

1.1 Plan de contrôle et plan de données#

Foundry sépare deux surfaces, chacune avec ses autorisations RBAC :

Plan Ce qu'on y fait Outils Autorisation RBAC
Control plane Créer la Foundry resource et les projects, déployer un modèle, configurer réseau, chiffrement, connexions, faire tourner les clés Portail Azure, Azure CLI, Bicep, Terraform Actions
Data plane Inférence, création et exécution d'agents, evaluations, tracing, fine-tuning SDK, API REST, playground DataActions

Conséquence très testée : un rôle comme Contributor permet de déployer un modèle (plan de contrôle) mais pas de créer un agent (plan de données) ; à l'inverse Foundry User construit dans un project mais ne déploie pas de modèle (section 5.3).

1.2 Les trois questions de ce chapitre#

Question Outil principal Section
Ai-je assez de capacité, et combien ça coûte ? Quota (TPM/RPM), PTU, Batch, prompt caching, Cost Management 2
Mon application répond-elle bien, vite et sans danger ? Azure Monitor metrics, diagnostic settings, Application Insights, continuous evaluation 3
Mes données d'ancrage sont-elles fraîches et pertinentes ? Indexer status, metrics Azure AI Search, evaluators Retrieval 4
Qui peut accéder à quoi, par quel chemin ? Entra ID sans clé, rôles Foundry, managed identities, Private Endpoint, CMK, Azure Policy 5

2. Quotas, limites de débit, mise à l'échelle et coûts#

2.1 Le quota#

Le quota est attribué à la subscription, par région, par modèle et par type de déploiement, en TPM (tokens per minute). Chaque deployment reçoit une part de ce quota ; la somme des parts ne peut pas dépasser le quota.

Le quota se partage entre les deployments

  • Exemple officiel : avec 240 000 TPM de GPT-4o en East US, on peut créer un seul deployment de 240 000 TPM, deux de 120 000, etc.
  • Le RPM (requests per minute) n'est pas réglable séparément : le quota est alloué en unités de capacité, chacune correspondant à un couple RPM/TPM fixé par modèle (par exemple 6 RPM pour 1 000 TPM pour les anciens modèles de chat, 1 RPM pour 1 000 TPM pour o3 et o4-mini).
  • Le quota TPM n'a rien à voir avec la taille maximale d'une invite (limite d'entrée du modèle).
  • Limites utiles : 30 ressources Azure OpenAI par région et par subscription ; 32 deployments standard par ressource.
  • Quota tiers : sept niveaux (Free, puis 1 à 6) ; le niveau est évalué par subscription et monte automatiquement avec l'usage. On peut refuser la montée automatique (tierUpgradePolicy: NoAutoUpgrade, en préversion) et toujours demander plus de quota par le formulaire de demande (traité en priorité pour les clients qui utilisent déjà leur quota).
  • Gestion au niveau de la subscription : depuis le 7 mai 2026, Foundry commence à suivre le quota par subscription plutôt que par ressource ou région (d'abord Realtime Translate et Realtime Whisper, puis tous les modèles) : pool commun Global Standard pour toutes les régions, pool par data zone pour Data Zone Standard.

Lire le quota demande le rôle Cognitive Services Usages Reader assigné à l'étendue de la subscription (une attribution au niveau du resource group ou de la ressource ne suffit pas). Deux API Resource Manager :

API Question Exemple
Usages (…/locations/{location}/usages) Combien de quota ai-je consommé dans cette région ? currentValue / limit par ligne OpenAI.Standard.gpt-4o
Model capacities (…/modelCapacities) Où puis-je déployer ce modèle, avec quelle capacité libre ? availableCapacity par région et SKU
az rest --method get \
  --url "https://management.azure.com/subscriptions/$SUB/providers/Microsoft.CognitiveServices/locations/eastus/usages?api-version=2024-10-01"

Deux détails d'exploitation : une modification de quota met jusqu'à 15 minutes à se propager ; une ressource supprimée par l'API (sans supprimer ses deployments d'abord) bloque son quota 48 heures, sauf si on la purge.

2.2 Comment la limite de débit est calculée#

  • TPM : à la réception de chaque requête, le service estime le nombre maximal de jetons : texte de l'invite + max_tokens + best_of. Cette estimation (pas les jetons facturés) s'ajoute au compteur de la minute ; à la limite, tout nouvel appel reçoit un 429.
  • RPM : évalué sur de courtes fenêtres de 1 ou 10 secondes. Un deployment de 600 RPM limite dès qu'il reçoit plus de 10 requêtes dans une seconde, même si la minute reste sous 600.
  • Les requêtes rejetées comptent quand même dans la limite : renvoyer en boucle sans attendre aggrave la limitation.

D'où le piège classique : 429 alors que la métrique de jetons est sous le quota. Les metrics montrent les jetons facturés des requêtes réussies, la limitation porte sur l'estimation de toutes les requêtes reçues.

Type de 429 Indice Bonne réaction
Limite du deployment dépassée « rate limit is exceeded » Augmenter le TPM du deployment, rééquilibrer, demander du quota
Capacité système saturée « temporarily unable to process », « high demand » Retry après retry-after-ms ; si persistant, PTU
Ajustement temporaire de la limite (pool partagé) x-ratelimit-limit-tokens inférieur au TPM configuré Retry avec backoff ; se résout en quelques heures ; PTU si besoin de constance
Budget de jetons gonflé par la requête métriques de jetons faibles Réduire max_tokens à la taille de réponse attendue

Piège : demander une augmentation de quota pour une saturation temporaire de capacité ne sert à rien. Toujours lire le message d'erreur et les en-têtes avant d'agir.

2.3 Absorber les 429 dans le code#

Absorber un 429 : retry, spillover et AI gateway

En-tête de réponse Rôle
x-ratelimit-limit-requests / x-ratelimit-limit-tokens Limites effectives du deployment
x-ratelimit-remaining-requests / x-ratelimit-remaining-tokens Ce qui reste avant le 429 : à surveiller pour ralentir avant
x-ratelimit-reset-requests / x-ratelimit-reset-tokens Délai avant réinitialisation
retry-after-ms (et retry-after) Présent sur un 429 : temps d'attente conseillé

Le SDK Python openai (v1+) réessaie automatiquement les 429 et erreurs transitoires avec backoff exponentiel et jitter, en respectant retry-after : 2 nouvelles tentatives par défaut, réglables avec max_retries.

from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(DefaultAzureCredential(), "https://ai.azure.com/.default")
client = OpenAI(
    base_url="https://<resource>.openai.azure.com/openai/v1/",
    api_key=token_provider,       # jeton Entra ID, pas de clé (section 5.1)
    max_retries=5,                # au lieu de 2 par défaut
)
response = client.with_options(max_retries=8).responses.create(model="<deployment>", input="Bonjour")

Piège : avec une bibliothèque de retry personnalisée (tenacity, Polly…), mettre max_retries=0 sur le client ; sinon chaque tentative externe déclenche aussi les tentatives du SDK.

sequenceDiagram
    participant App as Application (SDK)
    participant Dep as Deployment Foundry
    App->>Dep: Requête (invite + max_tokens)
    Dep-->>App: 429 + retry-after-ms: 2000
    Note over App: Attendre 2 s (ou backoff exponentiel + jitter)
    App->>Dep: Nouvelle tentative
    Dep-->>App: 200 + x-ratelimit-remaining-tokens
    Note over App: Ralentir si remaining-tokens devient faible

Autres bonnes pratiques officielles : réduire max_tokens et best_of (1), raccourcir les invites, monter la charge progressivement, répartir sur plusieurs deployments ou régions, passer en traitement asynchrone (file d'attente, Batch) quand la réponse immédiate n'est pas requise.

2.4 Provisioned throughput (PTU)#

Les deployments Provisioned réservent une capacité exprimée en PTU : débit prévisible, faible variance de latence.

Type sku-name Traitement des données
Global Provisioned GlobalProvisionedManaged Toute région Azure
Data Zone Provisioned DataZoneProvisionedManaged Dans la data zone (US, EU)
Regional Provisioned ProvisionedManaged Dans la région du deployment
  • Surveillance : metric Provisioned-managed Utilization V2 (fenêtres d'une minute ; l'ancienne version est dépréciée), à découper par deployment (Apply splitting).
  • Calcul : variante du leaky bucket. Chaque requête ajoute une estimation (jetons d'invite moins les jetons en cache + max_tokens), corrigée à la fin avec le réel ; l'utilisation se vide à un rythme proportionnel aux PTU déployés. À 100 %, le service répond immédiatement 429 avec retry-after-ms : les requêtes acceptées gardent une latence prévisible.
  • Un 429 en PTU n'est pas une erreur : c'est un signal de gestion du trafic. Deux réponses : rediriger (latence minimale) ou réessayer (débit maximal par PTU).
  • Spillover (débordement) : option qui renvoie automatiquement le trafic d'un deployment provisioned saturé (réponse non 200, comme un 429) vers un deployment standard de la même Foundry resource ; activable pour tout le deployment ou requête par requête avec l'en-tête x-ms-spillover-deployment. Pris en charge par les modèles Azure OpenAI éligibles au provisioned, pas par les modèles d'autres fournisseurs (DeepSeek, Llama). Dimension IsSpillover dans la metric Azure OpenAI Requests.
  • Dimensionnement : capacity calculator de la page Quota, puis benchmark avec un trafic réel. Fixer max_tokens au plus près de la taille réelle des réponses augmente la concurrence.
  • Reservations (1 mois ou 1 an) : remise sur le tarif horaire des PTU. Une reservation Global, Data Zone ou Regional n'est pas interchangeable ; elle ne garantit pas la capacité (créer le deployment avant d'acheter) ; supprimer un deployment n'annule pas la reservation (l'annuler ou l'échanger dans Azure Reservations).

2.5 Mettre à l'échelle#

Besoin Solution
Plus de débit pour un deployment Augmenter ses TPM (rééquilibrer le quota), demander une augmentation
Débit constant et latence stable Provisioned (PTU), éventuellement avec spillover vers Standard
Gros volumes non urgents Global Batch / Data Zone Batch : quota séparé (jetons en file), objectif 24 h, -50 % par rapport à Global Standard, sans perturber le trafic en ligne
Plusieurs deployments ou régions, quotas par consommateur AI gateway dans Azure API Management : load balancing, circuit breaker, llm-token-limit (voir SC-500, 07)
Rester sous la latence attendue en Standard Respecter les usage tiers : au-delà du volume mensuel du modèle (par exemple 30 milliards de jetons pour gpt-4.1), la latence peut plus que doubler ; solution : PTU

2.6 Maîtriser les coûts#

Levier Effet
Choix du type de déploiement Global Standard = prix le plus bas pour le paiement au jeton ; Batch = -50 % ; PTU = coût fixe horaire, réservable
Prompt caching Invite d'au moins 1 024 jetons dont les 1 024 premiers sont identiques : jetons en cache facturés avec une remise (Standard) et jusqu'à 100 % de remise sur l'utilisation PTU. Activé par défaut sur les modèles pris en charge ; cache vidé après 5 à 10 minutes d'inactivité, toujours sous une heure, jamais partagé entre subscriptions. Mettre le contenu stable (system prompt, définitions d'outils) au début
max_tokens / max_output_tokens Plafonne les jetons générés, y compris les jetons de raisonnement (facturés comme sortie)
Routage vers un plus petit modèle Modèles mini ou nano pour les tâches simples, model router
Cost Management Cost analysis (grouper par Resource puis Meter ; Azure OpenAI apparaît sous Cognitive Services, filtrer Service tier : Azure OpenAI), budgets et alertes, export des coûts
Foundry portal Monitor d'un modèle : coût total et estimé ; Operate > Overview : coût estimé des agents

Piège : contrairement à OpenAI, Azure OpenAI n'a pas de limite dure de dépense. Un budget alerte ; pour couper, il faut automatiser via un action group (développement spécifique). Le quota n'est pas un outil de facturation (Microsoft le déconseille).

Rôles : Cost Management Reader pour voir les coûts, Foundry User pour relier coûts et ressources. Les outils d'agent ont leurs propres frais : par exemple File search est facturé en plus des jetons du modèle. Les données envoyées à Azure Monitor (logs, traces) sont aussi facturées, hors de la Foundry resource.


3. Surveiller les modèles et les agents#

La chaîne d'observabilité d'une application Foundry

Signal Collecte Où le lire
Platform metrics Automatique Azure Monitor > Metrics, dashboards de la ressource, alertes
Resource logs Seulement après création d'un diagnostic setting Log Analytics (AzureDiagnostics), Storage, Event Hubs
Traces (OpenTelemetry) Application Insights connecté au project + instrumentation Foundry portal (Traces, onglet Monitor), Application Insights
Evaluations Evaluations planifiées ou continues Foundry portal (Evaluations, Monitor)

3.1 Les metrics Azure Monitor#

Je veux surveiller… Metric Nom REST
Temps de réponse total Time to Last Byte AzureOpenAITTLTInMS
Premier jeton (streaming) Time to Response AzureOpenAITimeToResponse
Vitesse de génération Time Between Tokens AzureOpenAINormalizedTBTInMS
Premier jeton normalisé par la taille de l'invite Normalized Time to First Byte AzureOpenAINormalizedTTFTInMS
Jetons en sortie / en entrée Generated Completion Tokens / Processed Prompt Tokens GeneratedTokens / ProcessedPromptTokens
Utilisation PTU Provisioned-managed Utilization V2 AzureOpenAIProvisionedManagedUtilizationV2
Volume et erreurs (429…) Azure OpenAI Requests (dimensions StatusCode, IsSpillover, ModelDeploymentName) AzureOpenAIRequests
Taux de cache Prompt Token Cache Match Rate —

Règles d'interprétation officielles :

  • Toujours associer une latence à un nombre de jetons : 5 secondes pour 2 000 jetons n'a rien à voir avec 5 secondes pour 50.
  • La metric héritée Latency (catégorie Cognitive Services - HTTP Requests) n'est pas faite pour Azure OpenAI : résultats trompeurs.
  • Selon la page de référence, Tokens per Second, Time to Response et Time Between Tokens ne sont pas encore disponibles pour les deployments Standard.
  • Si TTLT monte sans hausse des jetons : pression de capacité (utilisation PTU, ou 429 et concurrence en Standard).

Safety events : metrics de Content Safety disponibles sur la ressource : Blocked Volume, Harmful Volume Detected, Potential Abusive User Count, Safety System Event, Total Volume Sent for Safety Check. Les attaques (jailbreak, injection d'invite indirecte, fuite de données) sont détectées par le plan Defender for AI services de Defender for Cloud (SC-500, 07).

3.2 Les resource logs#

Catégories de Microsoft.CognitiveServices/accounts, toutes dans la table AzureDiagnostics : Audit, RequestResponse, Trace, AzureOpenAIRequestUsage, et ManagedNetworkEvent (réseau managé). Elles ne sont collectées qu'après un diagnostic setting (portail, CLI, ou Azure Policy Enable logging by category group for Cognitive Services… en DeployIfNotExists).

// Premier aperçu des journaux de la ressource
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| summarize count() by Category, OperationName, bin(TimeGenerated, 1h)
| order by TimeGenerated desc

3.3 Le tracing OpenTelemetry#

Le tracing capture le déroulé d'une requête : appels au modèle, appels d'outils, décisions de l'agent, dépendances. Il repose sur OpenTelemetry (conventions sémantiques gen_ai) et Application Insights, et fonctionne avec Microsoft Agent Framework, Semantic Kernel (natif), LangChain, LangGraph et OpenAI Agents SDK.

  1. Connecter une ressource Application Insights au project Foundry.
  2. Instrumenter le code (préversion pour le tracing côté client) :
import os
os.environ["AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING"] = "true"     # avant l'instrumentation

from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from azure.monitor.opentelemetry import configure_azure_monitor

project = AIProjectClient(endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"], credential=DefaultAzureCredential())
configure_azure_monitor(connection_string=project.telemetry.get_application_insights_connection_string())
  1. Les traces apparaissent en 2 à 5 minutes dans Traces et dans Azure Monitor.
Variable d'environnement Défaut Effet
AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING false Active l'instrumentation GenAI
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT false Content recording : contenu des messages et arguments d'outils
AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA false Inclut images et fichiers dans les spans

Piège : le content recording enregistre les entrées, sorties et arguments d'outils (données personnelles possibles) : à activer en développement seulement. Pour lire les traces il faut Log Analytics Reader sur les données (plus Privileged Monitoring Data Reader si les tables sont Protected).

Un agent hébergé ailleurs que dans Foundry peut être suivi au même endroit : l'enregistrer dans le Foundry Control Plane (via AI Gateway), respecter les conventions OpenTelemetry gen_ai et envoyer sa télémétrie au même Application Insights.

3.4 Évaluer en production : qualité, dérive, ancrage#

Après le déploiement, Microsoft recommande quatre pratiques : operational metrics, continuous evaluation (qualité et sécurité du trafic réel, sur un échantillon), scheduled evaluation (sur un jeu de test fixe, pour détecter la dérive du système) et scheduled red teaming (attaques simulées régulières).

Type de recurring evaluation Source Sert à
Continuous evaluation Live traffic (traces), échantillonnage aléatoire ou intelligent sampling Qualité et sécurité au fil de l'eau
Scheduled evaluation Dataset (golden dataset) Comparer dans le temps : dérive après changement de modèle, d'invite ou de données

Configuration : Build > Evaluations > Recurring Configs > Create (ou SDK azure-ai-projects), puis lecture dans l'onglet Monitor de l'agent (Agent Monitoring Dashboard, préversion : tokens, latence, taux de succès, scores). Limite par défaut : 100 exécutions par heure (max_hourly_runs) ; en SDK, la project managed identity doit avoir Foundry User.

flowchart LR
    A["Trafic réel de l'agent"] --> B["Traces dans Application Insights"]
    B --> C["Continuous evaluation (échantillon)"]
    D["Golden dataset"] --> E["Scheduled evaluation"]
    C --> F["Scores : groundedness, relevance, sécurité"]
    E --> F
    F --> G{"Sous le seuil ?"}
    G -- Oui --> H["Alerte et analyse des traces"]
    H --> I["Corriger l'invite, les données ou le modèle"]
    I --> A
    G -- Non --> A

Qualité d'ancrage (grounding quality) : evaluator Groundedness (score 1 à 5, seuil par défaut 3 : la réponse ne contient rien qui sorte du contexte, c'est l'aspect précision) ; Groundedness Pro (préversion, s'appuie sur Azure AI Content Safety, résultat vrai/faux, sans deployment de juge) ; Response Completeness (préversion, aspect rappel face à une vérité terrain). Le détail des evaluators est au chapitre 04.


4. Surveiller l'ingestion, l'index et la pertinence#

Surveiller l'ingestion, l'index et la pertinence dans Azure AI Search

4.1 Qualité de l'ingestion : l'indexer#

Où Ce qu'on voit
Portail, page Indexers Statut In Progress, Success, Failed (erreurs au-delà de Max failed items), Reset (change tracking réinitialisé, réindexation complète) ; Docs Succeeded ; détail d'une exécution téléchargeable en CSV
API Get Indexer Status Statut de l'indexer (running = disponible, pas forcément en cours) et historique des 50 dernières exécutions : success, transientFailure, persistentFailure, reset
Errors / warnings Problèmes par document (contenu illisible, skill en échec…)

Piège : une exécution Success peut contenir des erreurs de documents, tant qu'elles restent sous Max failed items. Il faut lire les errors et warnings, pas seulement le statut.

GET https://<service>.search.windows.net/indexers/<indexer>/status?api-version=2026-04-01
Authorization: Bearer <jeton Entra ID>

L'en-tête api-key (clé admin) devient facultatif quand le service accepte les rôles et qu'un jeton Bearer est fourni. Les objets comme les indexers relèvent du rôle Search Service Contributor ; les rôles Search Index Data ne portent que sur les documents (chargement, requêtes).

4.2 Santé du service et de l'index#

Metric Signification
SearchLatency Durée des requêtes (moyenne, max, total sur la minute)
SearchQueriesPerSecond Charge (QPS), fenêtre fixe d'une minute
ThrottledSearchQueriesPercentage Pourcentage de requêtes abandonnées : mémoire, CPU, E/S au-dessus d'un seuil ; requêtes et indexation partagent les mêmes ressources
  • Les metrics sont gardées 30 jours ; au-delà, et pour avoir les chaînes de requête, activer un diagnostic setting vers Log Analytics (recommandé).
  • Une requête limitée renvoie « You are sending too many requests » ou un 503. Hausse fréquente pendant l'indexation ou quand un replica sort de la rotation : décaler l'indexation, ajouter des replicas (requêtes) ou partitions (stockage).
  • Alertes usuelles : latence, throttling, seuil de QPS.
// Durée moyenne par opération d'Azure AI Search
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.SEARCH"
| summarize avg(DurationMs), count() by OperationName, bin(TimeGenerated, 1h)

4.3 Pertinence : mesurer puis régler#

Mesurer avec les evaluators RAG de Foundry :

Evaluator Il faut Mesure
Retrieval query, context (+ deployment juge) Pertinence des extraits récupérés, sans vérité terrain
Document Retrieval retrieval_ground_truth (labels de pertinence), retrieved_documents Fidelity, NDCG, XDCG, Max Relevance, Holes : métriques de moteur de recherche, pour comparer des réglages (parameter sweep : top_k, taille des chunks, vecteur ou sémantique)
Groundedness, Relevance réponse + contexte / requête Qualité de la réponse finale

Régler avec les leviers d'Azure AI Search :

Levier Effet
Scoring profiles Booste des champs ou des fonctions (fraîcheur, distance, magnitude) ; champs non vectoriels ; jusqu'à 100 par index, un seul par requête
Hybrid search Texte (BM25) + vecteurs (HNSW ou KNN exhaustif) fusionnés par RRF
Vector weighting Poids d'une requête vectorielle dans le RRF (défaut 1.0)
Semantic ranker Reclassement L2 (@search.rerankerScore de 0 à 4) des meilleurs résultats ; fonctionnalité premium ; obligatoire pour l'agentic retrieval
debug dans la requête Décompose le score en sous-scores pour régler le poids des vecteurs

5. Sécuriser identités, rôles, réseau et chiffrement#

5.1 Entra ID plutôt que les clés#

Une architecture sans clé : Entra ID, managed identities et rôles Foundry

Microsoft Entra ID (keyless) API keys
Nature Jeton OAuth 2.0, scope https://ai.azure.com/.default Secret statique de la ressource
Granularité RBAC au moindre privilège, par principal Tout ou rien sur la ressource
Traçabilité Par utilisateur (tenant ID et object ID dans le jeton) Aucune
Révocation Retirer le rôle ou désactiver le principal Régénérer la clé
Conditional Access, MFA, managed identities Oui Non
Foundry Agent Service, evaluations, toolbox Oui (seule méthode) Non
Usage conseillé Production Prototype rapide, test isolé

Prérequis : la ressource doit avoir un custom subdomain (sinon l'authentification par jeton échoue). En production, Microsoft conseille de remplacer DefaultAzureCredential par une credential déterministe (ManagedIdentityCredential, ou un ChainedTokenCredential réduit). Erreurs fréquentes : 401 (jeton absent ou mauvais scope), 403 (rôle manquant).

Désactiver les clés une fois tous les appelants passés à Entra ID :

Méthode Comment
Azure Policy Azure AI Services resources should have key access disabled (disable local authentication) à la subscription ou au resource group
Bicep / ARM Propriété disableLocalAuth: true
PowerShell Set-AzCognitiveServicesAccount -ResourceGroupName rg -Name res -DisableLocalAuth $true (vérifier avec Get-AzCognitiveServicesAccount)

Piège : l'effet n'est pas immédiat : la passerelle peut accepter les anciennes clés quelques minutes à plusieurs heures. Vérifier par un appel avec l'ancienne clé (attendu : 401) et régénérer Key1 et Key2.

5.2 Managed identities et ressources liées#

Deux identités côté Foundry : celle de la Foundry resource et celle de chaque Foundry project (project managed identity). Les rôles sur les ressources dépendantes s'attribuent à ces identités :

Ressource Rôle à donner (identité) Pourquoi
Foundry resource Foundry User (project managed identity) Accès du project aux fonctionnalités (attribué automatiquement à la création par le portail si on peut attribuer des rôles)
Azure AI Search Search Index Data Reader (lecture) ; Search Index Data Contributor + Search Service Contributor (Standard agent setup, création d'index) Requêter ou alimenter l'index sans clé
Storage account Storage Blob Data Reader / Contributor ; Storage Blob Data Owner sur le conteneur des agents (Standard setup) Lire les documents, déposer des fichiers
Azure Cosmos DB (Standard setup) Cosmos DB Built-in Data Contributor Fils de conversation des agents
Key Vault (CMK) Key Vault Crypto User (RBAC) Chiffrement par clé client (5.5)
Foundry resource ← Azure AI Search Cognitive Services User / Cognitive Services Data User (identité du service de recherche) Vectorisation intégrée, knowledge base

Piège : dans le nouveau Foundry, les permissions ne sont pas héritées de l'utilisateur : si un agent n'arrive pas à lire l'index alors que l'index fonctionne, vérifier d'abord les rôles de la project managed identity (puis le réseau).

5.3 Les rôles Foundry (role policies)#

Les rôles ont été renommés récemment ; les anciens noms apparaissent encore. Dans le code, utiliser le GUID.

Rôle (ancien nom) GUID Peut
Foundry Agent Consumer eed3b665-ab3a-47b6-8f48-c9382fb1dad6 Seulement appeler les endpoints d'agents (moindre privilège pour les applications et utilisateurs finaux)
Foundry User (Azure AI User) 53ca6127-db72-4b80-b1b0-d745d6d5456d Construire et développer dans un project (data actions), lecture ; pas de déploiement de modèle
Foundry Project Manager (Azure AI Project Manager) eadc314b-1a2d-4efa-be10-5d325db5065e Gérer les projects, construire, publier des agents, attribuer Foundry User (sous condition) ; pas de gestion des modèles (ni déploiement, ni fine-tuning)
Foundry Account Owner (Azure AI Account Owner) e47c6f54-e4a2-4754-9501-8e0985b135e1 Créer comptes et projects, gérer les modèles, attribuer Foundry User, ACR, monitoring ; pas de data actions
Foundry Owner (Azure AI Owner) c883944f-8b7b-4483-af10-35834be79c4a Tout (contrôle + données) : rôle libre-service très privilégié
Rôle Azure générique Créer projects / comptes Data actions Gérer les modèles
Owner Oui Non Oui
Contributor Oui Non Oui (peut déployer des modèles)
Reader Non Non Non

Règles à connaître :

  • Ne pas utiliser les rôles commençant par Cognitive Services pour Foundry (prévus pour l'accès direct aux AI Services), sauf Cognitive Services Usages Reader pour le quota.
  • Ne pas utiliser Azure AI Developer : il vise les workspaces Azure Machine Learning et les hubs, pas les Foundry projects.
  • Étendues : Foundry resource > Foundry project > agent (évaluée seulement pour l'accès à l'endpoint de cet agent). Le portail n'attribue Foundry Agent Consumer qu'au niveau du compte : pour le project ou l'agent, passer par la CLI.
  • Fine-tuning : il faut plan de données + plan de contrôle : Foundry Owner, ou Foundry User + Foundry Account Owner.
  • Publier un agent : Foundry Project Manager au minimum. Observabilité : Foundry User + Monitoring Reader sur Application Insights.
  • Les rôles mettent jusqu'à 5 minutes à se propager.
# Foundry Agent Consumer sur un seul agent (moindre privilège)
az role assignment create --assignee-object-id "<principalId>" --assignee-principal-type ServicePrincipal \
  --role "eed3b665-ab3a-47b6-8f48-c9382fb1dad6" \
  --scope "/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<compte>/projects/<project>/agents/<agent>"

Un rôle personnalisé se construit avec Actions (plan de contrôle) et DataActions (plan de données, par exemple Microsoft.CognitiveServices/accounts/AIServices/agents/*) ; il faut Owner sur l'étendue pour le créer.

5.4 Le réseau privé#

Foundry en réseau privé : entrant par Private Endpoint, sortant par VNet injection

Sens Options À retenir
Entrant (qui atteint l'endpoint Foundry) Public network access : Enabled, Selected IP addresses, ou Disabled + Private Endpoint Sous-ressource account ; trois zones DNS : privatelink.cognitiveservices.azure.com, privatelink.openai.azure.com, privatelink.services.ai.azure.com
Sortant (comment les agents et evaluations atteignent les données) Public egress, BYO VNet (VNet injection), Managed virtual network VNet injection : subnet délégué à Microsoft.App/environments, taille /27 ou plus ; managed VNet : Microsoft gère le réseau (utile si les plages IP se chevauchent), régions limitées
  • Avec la sortie isolée, l'entrée passe aussi par un Private Endpoint.
  • Les Private Endpoints vers Azure AI Search, Storage et Cosmos DB ne sont pas créés automatiquement : les ajouter sur chaque ressource (zones privatelink.search.windows.net, privatelink.blob.core.windows.net, privatelink.documents.azure.com).
  • Le réseau sortant ne peut pas être modifié après création (pas d'ajout de VNet injection, pas de changement de subnet) : il faut redéployer la Foundry resource.
  • Avec un pare-feu en sortie, autoriser notamment login.microsoftonline.com, *.identity.azure.net (agents) et les FQDN d'Application Insights (evaluations et traces).
  • Limites : Workflow Agents (sortie isolée non prise en charge), AI Gateway créé depuis le portail public par défaut (à isoler dans le portail Azure), certains outils d'agent partiellement pris en charge.

5.5 Customer-managed keys (CMK)#

Les données sont chiffrées au repos avec des clés Microsoft ; une CMK apporte le contrôle (rotation, révocation, audit).

Exigence Détail
Key store Key Vault ou Managed HSM, même région que la Foundry resource
Protection Soft delete et purge protection obligatoires
Identité Managed identity de la ressource (system-assigned ou user-assigned)
Droits RBAC : Key Vault Crypto User ; access policies : Encrypt, Decrypt, Wrap Key, Unwrap Key, Sign, Verify ; Managed HSM : Managed HSM Crypto User
Pare-feu du Key Vault Autoriser les trusted Microsoft services

Piège : supprimer ou rendre inaccessible la clé rend les données chiffrées inutilisables. Les pages classic d'Azure OpenAI citent d'autres exigences (clés RSA 2048, rôle Key Vault Crypto Service Encryption User) : à l'examen, retenir le principe identité + Key Vault protégé + droits wrap/unwrap.

5.6 Azure Policy pour Foundry#

Définition intégrée Effets Usage
Foundry model deployments should only use approved models Audit, Deny, Disabled Liste blanche d'éditeurs (allowedPublishers) ou d'asset IDs (préfixe : terminer par / pour ne viser qu'un modèle)
Foundry model deployments should meet eligibility requirements (marquée préversion dans la liste des définitions) Audit, Deny denyPreviewModels, onlyAllowDirectFromAzure
Azure AI Services resources should have key access disabled Audit, Deny Imposer Entra ID
Azure AI Services resources should encrypt data at rest with a customer-managed key (CMK) Audit, Deny Imposer la CMK
Enable logging by category group for Cognitive Services… DeployIfNotExists Créer les diagnostic settings
Stratégie personnalisée sur Microsoft.CognitiveServices/accounts/deployments/sku.name Deny Interdire un type de déploiement (par exemple GlobalStandard pour la résidence des données)

Les politiques de modèles s'évaluent au déploiement : le modèle reste visible dans le catalogue, mais Deploy est désactivé avec le nom de la policy. Il faut Owner ou Resource Policy Contributor pour assigner, et jusqu'à 15 minutes de propagation.


6. Labs conseillés#

Dans une subscription de test. Coût : quelques centimes de jetons, plus Log Analytics et Application Insights (petits volumes) ; supprimer le resource group à la fin. Éviter tout PTU (facturé à l'heure).

  1. Provoquer et lire un 429 : déployer un modèle mini en Global Standard avec un très petit TPM ; envoyer 30 requêtes en rafale avec max_tokens élevé puis faible. Attendu : des 429 avec retry-after-ms, moins de 429 quand max_tokens baisse ; comparer avec la metric Azure OpenAI Requests découpée par StatusCode.
  2. Sans clé de bout en bout : attribuer Foundry User à son compte, appeler le modèle avec get_bearer_token_provider, puis disableLocalAuth et un appel avec la clé. Attendu : l'appel Entra ID réussit ; l'appel par clé finit en 401.
  3. Tracing et evaluation continue : connecter Application Insights au project, activer le tracing d'un agent, générer du trafic, créer une Continuous evaluation (Groundedness, Relevance). Attendu : traces visibles en 2 à 5 minutes, scores dans l'onglet Monitor.
  4. Santé d'Azure AI Search : indexer quelques PDF depuis Blob Storage (avec un fichier corrompu), activer un diagnostic setting. Attendu : exécution Success avec un warning/error de document, requête KQL sur MICROSOFT.SEARCH dans Log Analytics.
  5. Policy de modèles : assigner Foundry model deployments should only use approved models en Deny avec un seul modèle autorisé. Attendu : le bouton Deploy est désactivé pour les autres modèles, avec le nom de la policy.

7. Pièges d'examen#

Situation dans la question Réponse attendue Pourquoi
429 alors que les metrics de jetons sont sous le quota Estimation max_tokens, rafales sur 1 à 10 s, requêtes rejetées La limite porte sur l'estimation à la réception, pas sur les jetons facturés
Un 429 sur un deployment PTU Rediriger (spillover) ou réessayer après retry-after-ms Signal de gestion du trafic, pas une panne
Débordement automatique d'un PTU saturé Spillover vers un deployment Standard de la même ressource Fonction native (x-ms-spillover-deployment)
Traiter des millions de documents la nuit au moindre coût Global Batch (-50 %, 24 h, quota séparé) N'affecte pas le quota en ligne
Lire le quota disponible, moindre privilège Cognitive Services Usages Reader sur la subscription Pas au resource group
Bloquer toute dépense au-delà d'un montant Budget + action group automatisé Azure OpenAI n'a pas de limite dure
Réduire le coût d'un long system prompt répété Prompt caching (≥ 1 024 jetons identiques en tête) Remise sur les jetons en cache
Surveiller la latence Azure OpenAI Time to Response / Time to Last Byte, avec un nombre de jetons (en Standard, Time to Last Byte : Time to Response et Time Between Tokens n'y sont pas encore disponibles) Jamais la metric héritée Latency
Les journaux RequestResponse sont vides Créer un diagnostic setting Les resource logs ne sont pas collectés par défaut
Détecter une dérive de qualité dans le temps Scheduled evaluation sur un golden dataset La continuous evaluation échantillonne le trafic réel
Voir le contenu des messages dans les traces OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true, en dev seulement Données sensibles
Indexer « Success » mais documents manquants Lire errors/warnings, Max failed items Le statut global masque les erreurs par document
Requêtes Azure AI Search abandonnées pendant l'indexation ThrottledSearchQueriesPercentage ; décaler l'indexation, ajouter des replicas Mêmes ressources pour requêtes et indexation
Comparer des réglages de recherche avec des labels de pertinence Evaluator Document Retrieval (NDCG, XDCG, Fidelity) Retrieval sert sans vérité terrain
Une application ne doit qu'appeler un agent Foundry Agent Consumer (au project ou à l'agent, par CLI) Moindre privilège
Un développeur crée des agents mais ne déploie pas de modèles Foundry User Data actions sans gestion des modèles
Contributor ne peut pas créer d'agent Normal : pas de data actions Ajouter Foundry User
Rôle à attribuer pour le fine-tuning Foundry Owner, ou Foundry User + Foundry Account Owner Il faut les deux plans
Rôle « Azure AI Developer » ou « Cognitive Services OpenAI User » pour un Foundry project À éviter Hubs / accès direct AI Services ; sauf Usages Reader
Agent Service avec une API key Impossible Agents et evaluations exigent Entra ID
Authentification par jeton qui échoue « custom subdomain required » Configurer un custom subdomain Prérequis du jeton
Les clés marchent encore après disableLocalAuth Propagation jusqu'à plusieurs heures ; régénérer les clés Pas de coupure immédiate
Ajouter une VNet injection à une Foundry existante Impossible : redéployer Le réseau sortant n'est pas modifiable
Private Endpoint créé mais résolution publique Les trois zones DNS (cognitiveservices, openai, services.ai) Trois FQDN par ressource
Subnet pour l'Agent Service Délégué à Microsoft.App/environments, /27 minimum Exigence de la VNet injection
CMK refusée Key Vault même région, soft delete + purge protection, rôle Key Vault Crypto User Prérequis obligatoires
N'autoriser que GPT-5 et pas GPT-5.2 Asset ID terminé par / dans la policy d'approved models Correspondance par préfixe

8. Scénarios d'entraînement#

1. Une application reçoit des 429 aux heures de pointe sur un deployment Global Standard de 300 000 TPM, alors que la metric de jetons plafonne à 180 000 par minute. Les requêtes fixent max_tokens: 4000 pour des réponses d'environ 300 jetons.

La limite TPM compte l'estimation (invite + max_tokens) : chaque requête « réserve » 4 000 jetons. Réduire max_tokens vers 400, lisser les rafales (fenêtres RPM de 1 à 10 s), garder les retries du SDK avec retry-after-ms. Demander du quota ne s'impose qu'ensuite.

2. Un service client critique exige une latence stable, mais les pics dépassent parfois la capacité réservée. Que configurer ?

Un deployment Provisioned (PTU) dimensionné avec le capacity calculator, le spillover vers un deployment Standard de la même ressource pour les pics, la metric Provisioned-managed Utilization V2 découpée par deployment avec une alerte, et une reservation PTU (après création du deployment).

3. Chaque nuit, 2 millions de fiches produit doivent être résumées ; le budget est serré et le trafic en ligne ne doit pas être perturbé.

Global Batch (ou Data Zone Batch pour la résidence) : -50 %, quota de jetons en file séparé, objectif 24 h.

4. La direction veut être prévenue dès 80 % du budget mensuel IA et couper les appels au-delà de 100 %.

Budget Cost Management avec alertes à 80 % et 100 % ; Azure OpenAI n'a pas de plafond dur : déclencher un action group (runbook ou Function) qui, par exemple, réduit les TPM ou désactive l'application. Rôle de lecture : Cost Management Reader.

5. Après une mise à jour du system prompt, les utilisateurs signalent des réponses inventées. Comment le détecter automatiquement la prochaine fois ?

Scheduled evaluation sur un golden dataset avant et après chaque changement (dérive), continuous evaluation du trafic réel avec Groundedness et Relevance, alerte sous le seuil, puis analyse des traces de l'agent.

6. Un agent Foundry n'arrive pas à interroger un index Azure AI Search qui répond pourtant dans Search explorer.

Donner à la project managed identity le rôle Search Index Data Reader (ou Data Contributor + Search Service Contributor en Standard setup) ; vérifier ensuite le réseau (Private Endpoint de Search et zone privatelink.search.windows.net si l'accès public est coupé).

7. La sécurité impose : aucune clé, accès uniquement depuis le réseau d'entreprise, agents qui n'accèdent aux données qu'en privé.

disableLocalAuth (et la policy key access disabled), applications en managed identity avec les rôles Foundry ; Public network access : Disabled + Private Endpoint + les trois zones DNS ; VNet injection (subnet délégué Microsoft.App/environments, /27+) ou managed virtual network, décidé à la création ; Private Endpoints vers Search, Storage et Cosmos DB.

8. Une application web doit seulement converser avec un agent précis, rien d'autre.

Managed identity de l'App Service avec Foundry Agent Consumer à l'étendue de cet agent (attribution par CLI, le portail ne propose que le niveau compte).

9. L'équipe conformité veut interdire les modèles en préversion et n'autoriser que les modèles OpenAI.

Policies Foundry model deployments should meet eligibility requirements (denyPreviewModels: true) et …should only use approved models (allowedPublishers: ["OpenAI"]) en Deny, à la subscription ; le bouton Deploy est désactivé pour le reste.

10. Des requêtes Azure AI Search échouent en 503 chaque matin à 8 h, pendant la réindexation complète.

Throttling (ThrottledSearchQueriesPercentage) : requêtes et indexation partagent les ressources. Décaler l'indexation, passer en change tracking (incrémental), ajouter des replicas ; alerte sur le throttling.


9. Pour aller plus loin#

  • Priority processing (Data Zone Standard) : réponses plus rapides en paiement à l'usage, pour les charges sensibles à la latence sans PTU.
  • Instant access (préversion) : appeler certains modèles par leur nom sans créer de deployment, pour prototyper.
  • Chargeback par project (préversion) dans Cost Management, et tags de deployment pour répartir les coûts.
  • Azure Monitor Private Link Scope : faire passer la télémétrie d'Application Insights en privé dans une architecture isolée.
  • Microsoft Defender for Cloud : AI-SPM (posture des ressources IA) et Defender for AI services (SC-500, 07).
  • Foundry Control Plane : inventaire et supervision centralisés des agents, y compris ceux hébergés hors de Foundry.

10. Fiche à retenir#

  • Quota = subscription + région + modèle + type de déploiement, en TPM ; RPM fixé par unité de capacité.
  • Limite TPM = estimation (invite + max_tokens + best_of) ; RPM sur des fenêtres de 1 à 10 s ; les rejets comptent.
  • En-têtes : x-ratelimit-remaining-*, retry-after-ms ; SDK : 2 retries par défaut, max_retries=0 avec tenacity.
  • PTU : Provisioned-managed Utilization V2 ; 429 immédiat à 100 % ; spillover vers Standard de la même ressource.
  • Reservations PTU : 1 mois / 1 an, non interchangeables, pas de garantie de capacité.
  • Batch : -50 %, 24 h, quota séparé. Prompt caching : 1 024 jetons identiques en tête.
  • Pas de limite dure de dépense : budget + action group ; rôle Cost Management Reader.
  • Quota lisible avec Cognitive Services Usages Reader à la subscription.
  • Metrics auto ; logs (Audit, RequestResponse, Trace) via diagnostic setting ; traces via Application Insights du project.
  • Latence : Time to Response / Time to Last Byte, toujours avec un nombre de jetons ; jamais Latency héritée.
  • Continuous evaluation (trafic réel) vs scheduled evaluation (golden dataset, dérive) ; Groundedness 1 à 5, seuil 3.
  • Content recording : dev uniquement.
  • Indexer : 50 dernières exécutions, Success possible avec erreurs ; Search : SearchLatency, QPS, Throttled %, 503.
  • Pertinence : Document Retrieval (NDCG, XDCG, Fidelity) avec labels ; scoring profiles, semantic ranker, vector weighting.
  • Entra ID : scope https://ai.azure.com/.default, custom subdomain ; Agent Service et evaluations sans clé uniquement.
  • disableLocalAuth: true / policy key access disabled ; propagation jusqu'à plusieurs heures.
  • Rôles : Agent Consumer < Foundry User < Project Manager ; Account Owner (contrôle) ; Foundry Owner (tout).
  • Pas de rôles Cognitive Services (sauf Usages Reader) ni Azure AI Developer pour Foundry.
  • Réseau : PE + 3 zones DNS ; sortie par VNet injection (Microsoft.App/environments, /27) ou managed VNet ; non modifiable.
  • CMK : Key Vault même région, soft delete + purge protection, Key Vault Crypto User.
  • Policies : approved models, eligibility, key access disabled, CMK, diagnostic logs (DINE).

Références#

Toutes lues le 21/10/2026 sur Microsoft Learn :

Sur cette page
Échap

Tape au moins 2 lettres. Plusieurs mots : tous doivent apparaître.