Последняя проверка: май 2026 г.
Разверните сервисы AWS для экзамена AI-102 с помощью чистого Terraform: пошаговое руководство с привязкой каждого блока к разделам экзамена. Код также совместим с OpenTofu.
К концу этой лабораторной работы вы создадите, используя чистый Terraform, основу приложения Azure AI в стиле RAG (retrieval-augmented generation) — учетную запись Azure OpenAI с развертыванием чат-модели класса Claude / GPT, службу Azure AI Search для индекса извлечения, учетную запись хранения для исходных документов и Key Vault, хранящий ключи API. Пять блоков; эталонная архитектура AI-102.
Вставьте фрагменты кода в один файл main.tf, запустите terraform init, затем terraform apply шаг за шагом.
>= 1.5 или OpenTofu >= 1.6.az login).azurerm_cognitive_account требует этого один раз).Azure AI Search Basic является основной статьей расходов в размере $75/месяц. Переключитесь на уровень Free (sku = "free"), если вы чувствительны к стоимости; лабораторная работа по-прежнему демонстрирует архитектуру.
Стандартное начало для Azure. AI-102 ожидает, что вы будете использовать eastus или westus для доступности новейших моделей Azure OpenAI — в старых регионах семейство 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 является производственным GenAI-движком для AI-102. Мы создаем учетную запись (kind = "OpenAI") и развертываем gpt-4o-mini в качестве чат-модели — самой дешевой модели класса GPT-4 на момент написания и рекомендуемой по умолчанию для лабораторной работы AI-102. Развертывание — это именованное связывание конкретной версии модели с выделением квоты; вы вызываете ее по имени из кода приложения.
model.version = "2024-07-18" — это дата выпуска gpt-4o-mini — AI-102 рассматривает стабильность версии модели как повторяющуюся проблему (привязка к конкретной версии против автоматического обновления). Экзамен отдает предпочтение явному закреплению для надежности в производстве.
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 (переименованный Cognitive Search) — это движок извлечения для шаблонов RAG в AI-102. Мы разворачиваем службу уровня Basic — она поддерживает системно-назначаемое управляемое удостоверение, которое требуется для безопасного вызова Azure OpenAI со стороны AI Search для функции интегрированной векторизации (где AI Search вызывает модели встраивания от вашего имени во время индексации).
Настройка local_authentication_enabled = false — это ответ, соответствующий лучшим практикам производства AI-102: принудительная аутентификация через Entra ID, без административных ключей в свободном доступе. Системно-назначаемому управляемому удостоверению предоставляется доступ к Azure OpenAI на следующем шаге.
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
}Исходные документы для RAG хранятся в Azure Storage. Индексаторы AI Search извлекают данные из контейнера больших двоичных объектов, пропускают их через модель встраивания OpenAI для векторизации и заполняют поисковый индекс. Предоставление управляемому удостоверению AI Search роли Storage Blob Data Reader для учетной записи хранения является шаблоном извлечения без пароля в AI-102.
С Storage + AI Search + OpenAI, соединенными через управляемое удостоверение, основа RAG готова. Уровень приложения (оркестратор чата, который принимает запросы пользователей, вызывает AI Search, а затем вызывает OpenAI с извлеченным контекстом) — это код, который вы пишете; Terraform здесь не помогает, он обеспечивает правильную инфраструктуру.
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
}AI-102 ожидает, что производственные приложения будут считывать конечные точки и ключи из Key Vault, а не из переменных среды или файлов конфигурации. Мы разворачиваем Key Vault и храним конечную точку OpenAI, имя развертывания и конечную точку AI Search как секреты. В производстве управляемое удостоверение приложения будет иметь роль Key Vault Secrets User на этом хранилище для их чтения при запуске.
Это завершает цикл Реализация и Интеграция AI-102: каждая конечная точка, каждый ключ, каждый URL-адрес службы проходит через Key Vault — единая точка ротации секретов, единая точка аудита. Каждый дополнительный шаблон AI-102 (Document Intelligence, Translator, Custom Vision, Speech) подключается таким же образом.
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 удаляет все. Примечания:
purge_soft_delete_on_destroy = true в функциях провайдера заставляет команду destroy выполнять фактическую очистку.AI-102 охватывает больше сервисов, которые не могут быть включены в эту лабораторную работу — Azure AI Document Intelligence (распознавание форм, пользовательские модели извлечения), Azure AI Vision (пользовательская классификация изображений + обнаружение объектов), Azure AI Language (CLU + пользовательские QnA), Azure AI Speech (пользовательская речь, нейронные голоса, перевод речи), Azure AI Bot Service, Azure AI Content Safety и вся поверхность проектирования потока подсказок Azure AI Studio.
Мы придерживаемся основы RAG Azure OpenAI + AI Search + Storage + Key Vault, потому что это наиболее протестированная архитектура AI-102, на основе которой строятся все остальные шаблоны AI-102. Document Intelligence подает данные в RAG. Vision извлекает содержимое из изображений, которые затем встраиваются в RAG. Bot Service — это внешний интерфейс поверх этого стека.
Для вышеупомянутых поверхностей см. разделы Просмотр и Editorial на этой странице сертификации.