Dernière révision : mai 2026
Configurez les services AWS figurant à l'examen AI-102 avec Terraform simple — un bloc à la fois, chacun étant lié à un domaine de l'examen. Le même code fonctionne sur OpenTofu.
À la fin de ce laboratoire, vous aurez provisionné, avec du Terraform simple, le substrat d'une application Azure AI de style RAG — un compte Azure OpenAI avec un déploiement de modèle de chat de classe Claude / GPT, un service Azure AI Search pour l'index de récupération, un compte de stockage pour les documents source et un Key Vault contenant les clés API. Cinq blocs ; l'architecture de référence AI-102.
Déposez les extraits dans un seul fichier main.tf, exécutez terraform init, puis terraform apply étape par étape.
>= 1.5 ou OpenTofu >= 1.6.az login).azurerm_cognitive_account l'exige une fois).Azure AI Search Basique est la dépense principale à 75 $/mois. Passez au niveau Gratuit (sku = "free") si vous êtes sensible aux coûts ; le laboratoire démontre toujours l'architecture.
Ouverture Azure standard. L'AI-102 s'attend à ce que vous utilisiez eastus ou westus pour la disponibilité des modèles Azure OpenAI les plus récents — les régions plus anciennes n'obtiennent pas rapidement la famille GPT-4.
terraform {
required_version = ">= 1.5"
required_providers {
azurerm = { source = "hashicorp/azurerm", version = "~> 4.0" }
random = { source = "hashicorp/random", version = "~> 3.6" }
}
}
provider "azurerm" {
features {
key_vault {
purge_soft_delete_on_destroy = true
}
}
}
resource "random_id" "suffix" {
byte_length = 3
}
data "azurerm_client_config" "current" {}
locals {
tags = {
Project = "certlabpro-ai-102"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-ai-102-rg"
location = "eastus"
tags = local.tags
}Azure OpenAI est le moteur GenAI de production pour l'AI-102. Nous créons le compte (kind = "OpenAI") et déployons gpt-4o-mini comme modèle de chat — le modèle de classe GPT-4 le moins cher au moment de la rédaction et le défaut recommandé pour le laboratoire AI-102. Le déploiement est la liaison nommée d'une version de modèle spécifique à une allocation de quota ; vous l'appelez par son nom depuis le code de l'application.
La model.version = "2024-07-18" est la date de sortie de gpt-4o-mini — l'AI-102 teste la stabilité de la version du modèle comme une préoccupation récurrente (verrouillage à une version spécifique vs. mise à jour automatique). L'examen favorise l'épinglage explicite pour la fiabilité en production.
resource "azurerm_cognitive_account" "openai" {
name = "openai-ai102-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
kind = "OpenAI"
sku_name = "S0"
custom_subdomain_name = "openai-ai102-${random_id.suffix.hex}"
identity {
type = "SystemAssigned"
}
tags = local.tags
}
resource "azurerm_cognitive_deployment" "chat" {
name = "gpt-4o-mini"
cognitive_account_id = azurerm_cognitive_account.openai.id
model {
format = "OpenAI"
name = "gpt-4o-mini"
version = "2024-07-18"
}
sku {
name = "Standard"
capacity = 10 # TPM in thousands; 10 = 10K tokens-per-minute quota
}
}Azure AI Search (le Cognitive Search renommé) est le moteur de récupération AI-102 pour les modèles RAG. Nous provisionnons un service de niveau Basique — il prend en charge l'identité managée affectée par le système, ce qui est nécessaire pour qu'AI Search puisse appeler en toute sécurité Azure OpenAI pour la fonctionnalité de vectorisation intégrée (où AI Search appelle des modèles d'embeddings en votre nom pendant l'indexation).
Le paramètre local_authentication_enabled = false est la réponse de bonne pratique de production de l'AI-102 — forcer l'authentification Entra ID, sans clés d'administrateur circulant. L'identité managée affectée par le système se voit accorder l'accès à Azure OpenAI à l'étape suivante.
resource "azurerm_search_service" "main" {
name = "search-ai102-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
sku = "basic"
replica_count = 1
partition_count = 1
local_authentication_enabled = false # Entra auth only
public_network_access_enabled = true
identity {
type = "SystemAssigned"
}
tags = local.tags
}
# Grant AI Search's managed identity Cognitive Services OpenAI User on the
// account — required for integrated vectorization (AI Search → OpenAI embeddings).
resource "azurerm_role_assignment" "search_to_openai" {
scope = azurerm_cognitive_account.openai.id
role_definition_name = "Cognitive Services OpenAI User"
principal_id = azurerm_search_service.main.identity[0].principal_id
}Les documents source pour RAG résident dans Azure Storage. Les indexeurs d'AI Search extraient les données du conteneur de blobs, les passent par le modèle d'embeddings OpenAI pour la vectorisation et alimentent l'index de recherche. Accorder à l'identité managée d'AI Search le rôle Storage Blob Data Reader sur le compte de stockage est le modèle de récupération sans mot de passe de l'AI-102.
Avec Stockage + AI Search + OpenAI tous connectés via l'identité managée, le substrat RAG est en place. La couche application (l'orchestrateur de chat qui prend les requêtes utilisateur, appelle AI Search, puis appelle OpenAI avec le contexte récupéré) est le code que vous écrivez — Terraform n'aide pas ici ; il configure correctement l'infrastructure.
resource "azurerm_storage_account" "docs" {
name = "ai102docs${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
account_tier = "Standard"
account_replication_type = "LRS"
account_kind = "StorageV2"
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
allow_nested_items_to_be_public = false
tags = local.tags
}
resource "azurerm_storage_container" "source" {
name = "source"
storage_account_id = azurerm_storage_account.docs.id
container_access_type = "private"
}
resource "azurerm_role_assignment" "search_to_storage" {
scope = azurerm_storage_account.docs.id
role_definition_name = "Storage Blob Data Reader"
principal_id = azurerm_search_service.main.identity[0].principal_id
}L'AI-102 s'attend à ce que les applications de production lisent les points de terminaison et les clés depuis Key Vault, et non depuis des variables d'environnement ou des fichiers de configuration. Nous provisionnons un Key Vault et y stockons le point de terminaison OpenAI, le nom du déploiement et le point de terminaison AI Search en tant que secrets. En production, l'identité managée de l'application aurait le rôle Utilisateur de secrets Key Vault sur ce coffre pour les lire au démarrage.
Cela clôture la boucle Implémenter et Intégrer de l'AI-102 : chaque point de terminaison, chaque clé, chaque URL de service passe par Key Vault — un point unique de rotation des secrets, un point unique d'audit. Chaque modèle AI-102 supplémentaire (Document Intelligence, Translator, Custom Vision, Speech) se connecte de la même manière.
resource "azurerm_key_vault" "main" {
name = "kv-ai102-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
tenant_id = data.azurerm_client_config.current.tenant_id
sku_name = "standard"
enable_rbac_authorization = true
soft_delete_retention_days = 7
tags = local.tags
}
resource "azurerm_role_assignment" "kv_admin_self" {
scope = azurerm_key_vault.main.id
role_definition_name = "Key Vault Administrator"
principal_id = data.azurerm_client_config.current.object_id
}
resource "azurerm_key_vault_secret" "openai_endpoint" {
name = "openai-endpoint"
value = azurerm_cognitive_account.openai.endpoint
key_vault_id = azurerm_key_vault.main.id
depends_on = [azurerm_role_assignment.kv_admin_self]
}
resource "azurerm_key_vault_secret" "openai_deployment" {
name = "openai-deployment"
value = azurerm_cognitive_deployment.chat.name
key_vault_id = azurerm_key_vault.main.id
depends_on = [azurerm_role_assignment.kv_admin_self]
}
resource "azurerm_key_vault_secret" "search_endpoint" {
name = "search-endpoint"
value = "https://${azurerm_search_service.main.name}.search.windows.net"
key_vault_id = azurerm_key_vault.main.id
depends_on = [azurerm_role_assignment.kv_admin_self]
}terraform destroy supprime tout. Remarques :
purge_soft_delete_on_destroy = true dans les fonctionnalités du fournisseur permet à destroy de purger réellement.L'AI-102 couvre plus de services que ce laboratoire ne peut contenir — Azure AI Document Intelligence (reconnaissance de formulaires, modèles d'extraction personnalisés), Azure AI Vision (classification d'images personnalisée + détection d'objets), Azure AI Language (CLU + QnA personnalisées), Azure AI Speech (synthèse vocale personnalisée, voix neuronales, traduction vocale), Azure AI Bot Service, Azure AI Content Safety, et toute la surface de conception de flux de prompts d'Azure AI Studio.
Nous nous en tenons au substrat RAG Azure OpenAI + AI Search + Stockage + Key Vault car c'est l'architecture AI-102 la plus testée et celle sur laquelle tous les autres modèles AI-102 se composent. Document Intelligence alimente le RAG. Vision extrait le contenu des images qui sont intégrées dans le RAG. Bot Service est une interface utilisateur au-dessus de cette pile.
Pour les surfaces ci-dessus, consultez les sections Parcourir et Editorial de cette page de certification.