KI-Plattform: Architektur¶
Diese Seite ist das High-Level-Design der KI-Plattform. Sie ist das Referenzdesign aus den Terraform-Modulen: Dein Deployment kann sich bei Namen, SKUs und den vorhandenen optionalen Teilen unterscheiden.
Layers¶
Die Lösung hat drei layers. Jeder layer wird auf dem vorherigen deployt.
flowchart TB
subgraph shared["1. Shared platform (platform team)"]
acct["Foundry account<br/>(AIServices)"]
cae["Container Apps<br/>environment"]
acr["Container Registry"]
cosmos["Cosmos DB<br/>(agent threads)"]
search["AI Search<br/>(vector store)"]
kv["Key Vault"]
law["Log Analytics"]
end
subgraph proj["2. Foundry project per workload"]
p["Foundry project<br/>+ Agents capability host"]
pid["Project identity"]
st["Storage account"]
ai["Application Insights"]
end
subgraph wl["3. Workload (workload team)"]
app["Application / agent client"]
wid["Workload identity"]
end
acct --> p
p --> pid
p --- st
p --- ai
p -. connection .-> cosmos
p -. connection .-> search
ai --> law
app --> p
app --> wid
app --> cae
cae --> acr
| Layer | Enthält | Erstellt von |
|---|---|---|
| Shared platform | Foundry account, Container Apps environment, Registry, Cosmos DB, AI Search, Plattform-Storage, Key Vault, Log Analytics, Netzwerk | Plattform-Team |
| Foundry project | Project, Project Identity, Storage Account, Application Insights, Connections, Capability Host, Rollenzuweisungen | Plattform-Team, auf Anfrage |
| Workload | Anwendung, Workload Identity, Rollenzuweisungen für diese Identity | Workload-Team (mit dem Plattform-Team, wo Rollen auf gemeinsamen Ressourcen nötig sind) |
Foundry account¶
Ein Account pro Plattform. Aus dem Terraform:
| Einstellung | Wert |
|---|---|
| Ressourcentyp | Microsoft.CognitiveServices/accounts, kind AIServices, SKU S0 |
| Project Management | Aktiviert (allowProjectManagement) |
| Lokale (Key-)Authentifizierung | Deaktiviert (disableLocalAuth), der Zugriff läuft also über Entra ID |
| Custom Subdomain | Gleich dem Account-Namen |
| Identity | Eine User-assigned Managed Identity, die mit dem Account erstellt wird |
| Network Injection | Szenario agent in ein von dir bereitgestelltes Integration Subnet (useMicrosoftManagedNetwork ist false, es wird also dein eigenes Subnet verwendet) |
| Private Endpoint | Wird nur erstellt, wenn ein Endpoint-Subnet angegeben ist, Sub-Ressource account |
| Öffentlicher Netzwerkzugriff | Im Modul Enabled, siehe Bekannte Probleme |
Das Modul wird mit dem Provider azapi deployt, weil die Ressource von azurerm nicht vollständig unterstützt wird. Das Modul
liefert als Outputs die Account-ID, den Namen, den Endpoint, einen OpenAI-Endpoint der Form https://<account>.openai.azure.com sowie die
Client- und Principal-ID der Identity.
Foundry project¶
Jeder Workload bekommt ein eigenes Project im gemeinsamen Account. Das Project-Modul erstellt:
| Ressource | Details |
|---|---|
| Resource group | Eine pro Project, benannt mit dem Naming-Modul und dem Suffix -project |
| Project | Microsoft.CognitiveServices/accounts/projects, mit einer User-assigned Managed Identity |
| Storage Account | Standard, LRS, mindestens TLS 1.2, öffentlicher Netzwerkzugriff deaktiviert, mit einem Private Endpoint für blob |
| Application Insights | Workspace-basiert, mit dem von dir angegebenen Log-Analytics-Workspace verknüpft |
| Connections | Storage, Cosmos DB und AI Search mit Entra-ID-Authentifizierung; Application Insights mit seinem Connection String |
| Capability Host | Kind Agents, mit den Connections für Vector Store, Storage und Thread Storage |
| Rollenzuweisungen | Für die Project Identity und für die Gruppen Owner, Contributor und Reader (Zugriff und RBAC) |
Alle Connections haben isSharedToAll auf false: Sie gehören zum Project.
Das Modul kann auch den Foundry account selbst erstellen („Standalone-Modus“, wenn keine account_id übergeben wird). Mit dem gemeinsamen
Account der Plattform nutzt du den „Decoupled-Modus“, in dem nur das Project erstellt wird. Siehe
Plattform-Module.
Wo die Agent-Daten liegen¶
Der Capability Host verweist den Agent-Service auf die verbundenen Stores:
| Daten | Store |
|---|---|
| Threads, Nachrichten, Agent-Definitionen, Run-Status | Cosmos DB, Datenbank enterprise_memory, Collections mit der internen ID des Projects als Präfix (Thread Message Store, System Thread Message Store, Agent Entity Store, Agent Definitions, Run State) |
| Dateien | Das Storage Account des Projects (blob) |
| Vektoren | Der mit dem Project verbundene Azure-AI-Search-Service |
Cosmos DB und AI Search sind gemeinsam genutzt, die Isolation zwischen Projects erfolgt daher über die Collections pro Project und über Rollenzuweisungen, nicht über getrennte Services.
Netzwerk¶
- Der Foundry account, und im Project-Modul auch das Storage Account des Projects, sind über Private Endpoints im Endpoint-Subnet des spokes erreichbar.
- Agents laufen mit Network Injection im Integration Subnet des spokes.
- Die private DNS zones, die das Project-Modul für volle Funktionalität auflistet, sind:
privatelink.vaultcore.azure.net,privatelink.openai.azure.com,privatelink.cognitiveservices.azure.com,privatelink.aiservices.azure.com,privatelink.blob.core.windows.net,privatelink.documents.azure.comundprivatelink.search.windows.net. - Die Module ignorieren Änderungen an der DNS Zone Group ihrer Private Endpoints, die DNS-Einträge werden also voraussichtlich außerhalb des Moduls registriert. Wie das auf der Plattform geschieht, steht im DNS-Design.
Namensgebung¶
Das Project-Modul verwendet das Community-Naming-Modul mit dem Project-Namen als Suffix. Der Name des Foundry accounts wird aus dem
Cognitive-Account-Namen des Naming-Moduls abgeleitet, wobei cog durch aif ersetzt wird. Die Project Identity heißt
id-<project>-foundry-project, und das Lookup-Modul verlässt sich auf diesen Namen. Das Muster für das Ressourcensuffix in der Quelle ist
<workload>-<environment>-<region> mit Kürzeln (prd, acc, tst, dev, np; weu, sec). Die Namensgebung deiner Plattform kann
abweichen: Namen und Tags.
Observability¶
- Application Insights des Projects schreibt in den Log-Analytics-Workspace des spokes.
- Im Standalone-Modus setzt das Modul außerdem Diagnoseeinstellungen auf dem Account für die Log-Kategorien
Audit,RequestResponseundAzureOpenAIRequestUsage. Im Decoupled-Modus wird diese Einstellung nicht erstellt. Diagnoseeinstellungen für den gemeinsamen Account sind nicht Teil des Account-Moduls (siehe Bekannte Probleme).