Использование Terraform для создания центра Azure AI Foundry
В этой статье вы используете Terraform для создания концентратора Azure AI Foundry, проекта и подключения служб ИИ. Центр — это центральное место для специалистов по обработке и анализу данных и разработчиков для совместной работы над проектами машинного обучения. Она предоставляет общее, совместное пространство для создания, обучения и развертывания моделей машинного обучения. Центр интегрирован с Машинное обучение Azure и другими службами Azure, что делает его комплексным решением для задач машинного обучения. Центр также позволяет управлять развертываниями ИИ и отслеживать их выполнение.
Terraform поддерживает определение, предварительный просмотр и развертывание облачной инфраструктуры. С помощью Terraform можно создавать файлы конфигурации с применением синтаксиса HCL. Синтаксис HCL позволяет указать поставщика облачных служб, например Azure, и элементы, составляющие облачную инфраструктуру. После создания файлов конфигурации создается план выполнения, который позволяет предварительно просматривать изменения инфраструктуры до их развертывания. После проверки изменений примените план выполнения для развертывания инфраструктуры.
- Создание или изменение группы ресурсов
- Настройка учетной записи хранения
- Установка хранилища ключей
- Настройка служб ИИ
- Создание центра ИИ Foundry
- Разработка проекта Ai Foundry
- Установка подключения служб ИИ
Необходимые компоненты
Создайте учетную запись Azure с активной подпиской. Вы можете создать учетную запись бесплатно.
Реализация кода Terraform
Примечание.
Пример кода для этой статьи находится в репозитории Azure Terraform GitHub. Вы можете просмотреть файл журнала, содержащий результаты теста из текущих и предыдущих версий Terraform.
См. другие статьи и примеры кода, в которых показано, как использовать Terraform для управления ресурсами Azure.
Создайте каталог для тестирования и выполнения примера кода Terraform и сделайте его текущим каталогом.
Создайте файл с именем
providers.tf
и вставьте приведенный ниже код.terraform { required_version = ">= 1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } azapi = { source = "azure/azapi" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features { key_vault { recover_soft_deleted_key_vaults = false purge_soft_delete_on_destroy = false purge_soft_deleted_keys_on_destroy = false } resource_group { prevent_deletion_if_contains_resources = false } } } provider "azapi" { }
Создайте файл с именем
main.tf
и вставьте приведенный ниже код.resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } // RESOURCE GROUP resource "azurerm_resource_group" "rg" { location = var.resource_group_location name = random_pet.rg_name.id } data "azurerm_client_config" "current" { } // STORAGE ACCOUNT resource "azurerm_storage_account" "default" { name = "${var.prefix}storage${random_string.suffix.result}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name account_tier = "Standard" account_replication_type = "GRS" allow_nested_items_to_be_public = false } // KEY VAULT resource "azurerm_key_vault" "default" { name = "${var.prefix}keyvault${random_string.suffix.result}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" purge_protection_enabled = false } // AzAPI AIServices resource "azapi_resource" "AIServicesResource"{ type = "Microsoft.CognitiveServices/accounts@2023-10-01-preview" name = "AIServicesResource${random_string.suffix.result}" location = azurerm_resource_group.rg.location parent_id = azurerm_resource_group.rg.id identity { type = "SystemAssigned" } body = jsonencode({ name = "AIServicesResource${random_string.suffix.result}" properties = { //restore = true customSubDomainName = "${random_string.suffix.result}domain" apiProperties = { statisticsEnabled = false } } kind = "AIServices" sku = { name = var.sku } }) response_export_values = ["*"] } // Azure AI Hub resource "azapi_resource" "hub" { type = "Microsoft.MachineLearningServices/workspaces@2024-04-01-preview" name = "${random_pet.rg_name.id}-aih" location = azurerm_resource_group.rg.location parent_id = azurerm_resource_group.rg.id identity { type = "SystemAssigned" } body = jsonencode({ properties = { description = "This is my Azure AI hub" friendlyName = "My Hub" storageAccount = azurerm_storage_account.default.id keyVault = azurerm_key_vault.default.id /* Optional: To enable these field, the corresponding dependent resources need to be uncommented. applicationInsight = azurerm_application_insights.default.id containerRegistry = azurerm_container_registry.default.id */ /*Optional: To enable Customer Managed Keys, the corresponding encryption = { status = var.encryption_status keyVaultProperties = { keyVaultArmId = azurerm_key_vault.default.id keyIdentifier = var.cmk_keyvault_key_uri } } */ } kind = "hub" }) } // Azure AI Project resource "azapi_resource" "project" { type = "Microsoft.MachineLearningServices/workspaces@2024-04-01-preview" name = "my-ai-project${random_string.suffix.result}" location = azurerm_resource_group.rg.location parent_id = azurerm_resource_group.rg.id identity { type = "SystemAssigned" } body = jsonencode({ properties = { description = "This is my Azure AI PROJECT" friendlyName = "My Project" hubResourceId = azapi_resource.hub.id } kind = "project" }) } // AzAPI AI Services Connection resource "azapi_resource" "AIServicesConnection" { type = "Microsoft.MachineLearningServices/workspaces/connections@2024-04-01-preview" name = "Default_AIServices${random_string.suffix.result}" parent_id = azapi_resource.hub.id body = jsonencode({ properties = { category = "AIServices", target = jsondecode(azapi_resource.AIServicesResource.output).properties.endpoint, authType = "AAD", isSharedToAll = true, metadata = { ApiType = "Azure", ResourceId = azapi_resource.AIServicesResource.id } } }) response_export_values = ["*"] } /* The following resources are OPTIONAL. // APPLICATION INSIGHTS resource "azurerm_application_insights" "default" { name = "${var.prefix}appinsights${random_string.suffix.result}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name application_type = "web" } // CONTAINER REGISTRY resource "azurerm_container_registry" "default" { name = "${var.prefix}contreg${random_string.suffix.result}" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location sku = "premium" admin_enabled = true } */
Создайте файл с именем
variables.tf
и вставьте приведенный ниже код.variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string default = "rg" description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." } variable "prefix" { type = string description="This variable is used to name the hub, project, and dependent resources." default = "ai" } variable "sku" { type = string description = "The sku name of the Azure Analysis Services server to create. Choose from: B1, B2, D1, S0, S1, S2, S3, S4, S8, S9. Some skus are region specific. See https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-overview#availability-by-region" default = "S0" } resource "random_string" "suffix" { length = 4 special = false upper = false } /*Optional: For Customer Managed Keys, uncomment this part AND the corresponding section in main.tf variable "cmk_keyvault_key_uri" { description = "Key vault uri to access the encryption key." } variable "encryption_status" { description = "Indicates whether or not the encryption is enabled for the workspace." default = "Enabled" } */
Создайте файл с именем
outputs.tf
и вставьте приведенный ниже код.output "resource_group_name" { value = azurerm_resource_group.rg.id } output "workspace_name" { value = azapi_resource.project.id } output "endpoint" { value = jsondecode(azapi_resource.AIServicesResource.output).properties.endpoint }
Инициализация Terraform
Запустите terraform init, чтобы инициализировать развертывание Terraform. Эта команда скачивает поставщик Azure, необходимый для управления ресурсами Azure.
terraform init -upgrade
Основные моменты:
- Параметр
-upgrade
обновляет необходимые подключаемые модули поставщика до последней версии, которая соответствует ограничениям версии конфигурации.
Создание плана выполнения Terraform
Чтобы создать план выполнения, выполните terraform plan.
terraform plan -out main.tfplan
Основные моменты:
- Команда
terraform plan
создает план выполнения, но не выполняет его. Вместо этого она определяет, какие действия необходимы для создания конфигурации, заданной в файлах конфигурации. Этот шаблон позволяет проверить, соответствует ли план выполнения вашим ожиданиям, прежде чем вы начнете вносить изменения в фактические ресурсы. - Необязательный параметр
-out
позволяет указать выходной файл для плана. Использование параметра-out
гарантирует, что проверяемый план полностью соответствует применяемому.
Применение плана выполнения Terraform
Выполните terraform apply, чтобы применить план выполнения к вашей облачной инфраструктуре.
terraform apply main.tfplan
Основные моменты:
- В примере
terraform apply
команды предполагается, что вы ранее выполнили.terraform plan -out main.tfplan
- Если для параметра
-out
указано другое имя файла, используйте то же имя в вызове кterraform apply
. - Если вы не использовали параметр
-out
, вызовитеterraform apply
без параметров.
Проверка результатов
Получите имя группы ресурсов Azure.
resource_group_name=$(terraform output -raw resource_group_name)
Получите имя рабочей области.
workspace_name=$(terraform output -raw workspace_name)
Запустите az ml workspace show , чтобы отобразить сведения о новой рабочей области.
az ml workspace show --resource-group $resource_group_name \ --name $workspace_name
Очистка ресурсов
Если вам больше не нужны ресурсы, созданные через Terraform, выполните следующие действия:
Выполните команду terraform plan и укажите флаг
destroy
.terraform plan -destroy -out main.destroy.tfplan
Основные моменты:
- Команда
terraform plan
создает план выполнения, но не выполняет его. Вместо этого она определяет, какие действия необходимы для создания конфигурации, заданной в файлах конфигурации. Этот шаблон позволяет проверить, соответствует ли план выполнения вашим ожиданиям, прежде чем вы начнете вносить изменения в фактические ресурсы. - Необязательный параметр
-out
позволяет указать выходной файл для плана. Использование параметра-out
гарантирует, что проверяемый план полностью соответствует применяемому.
- Команда
Выполните команду terraform apply, чтобы применить план выполнения.
terraform apply main.destroy.tfplan
Устранение неполадок с Terraform в Azure
Устранение распространенных проблем при использовании Terraform в Azure.