Compartilhar via


Usar o Terraform para criar um hub de IA do Azure Foundry

Neste artigo, você usa o Terraform para criar um hub do IA do Azure Foundry, um projeto e uma conexão de serviços de IA. Um hub é um local central para cientistas de dados e desenvolvedores colaborarem em projetos de machine learning. Ele fornece um espaço compartilhado e colaborativo para criar, treinar e implantar modelos de machine learning. O hub é integrado ao Azure Machine Learning e a outros serviços do Azure, tornando-o uma solução abrangente para tarefas de machine learning. O hub também permite que você gerencie e monitore suas implantações de IA, garantindo que elas estejam funcionando conforme o esperado.

O Terraform permite a definição, a visualização e a implantação da infraestrutura de nuvem. Usando o Terraform, você cria arquivos de configuração usando sintaxe de HCL. A sintaxe da HCL permite que você especifique o provedor de nuvem, como o Azure, e os elementos que compõem sua infraestrutura de nuvem. Depois de criar os arquivos de configuração, você cria um plano de execução que permite visualizar as alterações de infraestrutura antes de serem implantadas. Depois de verificar as alterações, aplique o plano de execução para implantar a infraestrutura.

  • Criar um grupo de recursos
  • Configurar uma conta de armazenamento
  • Estabeleça um cofre de chaves
  • Configure serviços de IA
  • Crie um hub do Azure AI Foundry
  • Desenvolva um projeto do Azure AI Foundry
  • Estabeleça uma conexão de serviços de IA

Pré-requisitos

Implementar o código do Terraform

  1. Crie um diretório no qual testar e executar o código de exemplo do Terraform e faça dele o diretório atual.

  2. Crie um arquivo chamado providers.tf, depois insira o código a seguir.

    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" {
    }
    
  3. Crie um arquivo chamado main.tf, depois insira o código a seguir.

    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
    }
    */
    
  4. Crie um arquivo chamado variables.tf, depois insira o código a seguir.

    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"
    }
    */
    
  5. Crie um arquivo chamado outputs.tf, depois insira o código a seguir.

    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
    }
    

Inicializar Terraform

Execute terraform init para inicializar a implantação do Terraform. Esse comando baixa o provedor do Azure necessário para gerenciar seus recursos do Azure.

terraform init -upgrade

Pontos principais:

  • O parâmetro -upgrade atualiza os plug-ins do provedor necessários para a versão mais recente que esteja em conformidade com as restrições de versão da configuração.

Criar um plano de execução Terraform

Execute o comando terraform plan para criar um plano de execução.

terraform plan -out main.tfplan

Pontos principais:

  • O comando terraform plan cria um plano de execução, mas não o executa. Em vez disso, ele determina quais ações são necessárias para criar a configuração especificada em seus arquivos de configuração. Esse padrão permite que você verifique se o plano de execução corresponde às suas expectativas antes de fazer qualquer alteração nos recursos reais.
  • O parâmetro opcional -out permite que você especifique um arquivo de saída para o plano. Usar o parâmetro -out garante que o plano que você examinou seja exatamente o que é aplicado.

Aplicar um plano de execução do Terraform

Execute terraform apply para aplicar o plano de execução à sua infraestrutura de nuvem.

terraform apply main.tfplan

Pontos principais:

  • O exemplo de comando do terraform apply pressupõe que você executou o terraform plan -out main.tfplan anteriormente.
  • Se você especificou um nome de arquivo diferente para o parâmetro -out, use esse mesmo nome de arquivo na chamada para terraform apply.
  • Se você não usou o parâmetro -out, chame terraform apply sem nenhum parâmetro.

Verifique os resultados

  1. Obtenha o nome do grupo de recursos do Azure.

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. Obtenha o nome do workspace.

    workspace_name=$(terraform output -raw workspace_name)
    
  3. Execute az ml workspace show para exibir informações sobre o novo workspace.

    az ml workspace show --resource-group $resource_group_name \
                         --name $workspace_name
    

Limpar os recursos

Quando você não precisar mais dos recursos criados por meio o Terraform, execute as seguintes etapas:

  1. Execute terraform plan e especifique o sinalizador destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Pontos principais:

    • O comando terraform plan cria um plano de execução, mas não o executa. Em vez disso, ele determina quais ações são necessárias para criar a configuração especificada em seus arquivos de configuração. Esse padrão permite que você verifique se o plano de execução corresponde às suas expectativas antes de fazer qualquer alteração nos recursos reais.
    • O parâmetro opcional -out permite que você especifique um arquivo de saída para o plano. Usar o parâmetro -out garante que o plano que você examinou seja exatamente o que é aplicado.
  2. Execute a aplicação do Terraform para aplicar o plano de execução.

    terraform apply main.destroy.tfplan
    

Solucionar problemas do Terraform no Azure

Solucionar problemas comuns ao usar o Terraform no Azure.

Próximas etapas