Uso de Terraform para crear un centro de Azure AI Foundry
En este artículo, usará Terraform para crear un centro de Azure AI Foundry, un proyecto y una conexión de servicios de IA. Un centro es un lugar central para que los científicos de datos y desarrolladores colaboren en proyectos de aprendizaje automático. Proporciona un espacio compartido y colaborativo para compilar, entrenar e implementar modelos de aprendizaje automático. El centro se integra con Azure Machine Learning y otros servicios de Azure, lo que lo convierte en una solución completa para las tareas de aprendizaje automático. El centro también le permite administrar y supervisar las implementaciones de inteligencia artificial, lo que garantiza que funcionan según lo previsto.
Terraform habilita la definición, vista previa e implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.
- Crear un grupo de recursos
- Configuración de una cuenta de almacenamiento
- Establecimiento de un almacén de claves
- Configuración de servicios de IA
- Compilar un centro de Azure AI Foundry
- Desarrollo de un proyecto de Azure AI Foundry
- Establecimiento de una conexión de servicios de IA
Requisitos previos
Cree una cuenta de Azure con una suscripción activa. También puede crear una cuenta de forma gratuita.
Implementación del código de Terraform
Nota
El código de ejemplo de este artículo se encuentra en el repositorio de GitHub de Azure Terraform. Puedes ver el archivo de registro que contiene los resultados de las pruebas de las versiones actuales y anteriores de Terraform.
Consulte más artículos y código de ejemplo sobre el uso Terraform para administrar recursos de Azure.
Cree un directorio en el que probar y ejecutar el código de ejemplo de Terraform y conviértalo en el directorio actual.
Cree un archivo llamado
providers.tf
e inserte el siguiente código.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" { }
Cree un archivo llamado
main.tf
e inserte el siguiente código.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 } */
Cree un archivo llamado
variables.tf
e inserte el siguiente código.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" } */
Cree un archivo llamado
outputs.tf
e inserte el siguiente código.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 }
Inicialización de Terraform
Para inicializar la implementación de Terraform, ejecute terraform init. Este comando descarga el proveedor de Azure necesario para administrar los recursos de Azure.
terraform init -upgrade
Puntos clave:
- El parámetro
-upgrade
actualiza los complementos de proveedor necesarios a la versión más reciente que cumpla con las restricciones de versión de la configuración.
Creación de un plan de ejecución de Terraform
Ejecute terraform plan para crear un plan de ejecución.
terraform plan -out main.tfplan
Puntos clave:
- El comando
terraform plan
crea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales. - El parámetro
-out
opcional permite especificar un archivo de salida para el plan. El uso del parámetro-out
garantiza que el plan que ha revisado es exactamente lo que se aplica.
Aplicación de un plan de ejecución de Terraform
Ejecute terraform apply para aplicar el plan de ejecución a su infraestructura en la nube.
terraform apply main.tfplan
Puntos clave:
- El comando
terraform apply
de ejemplo asume que ejecutóterraform plan -out main.tfplan
previamente. - Si especificó un nombre de archivo diferente para el parámetro
-out
, use ese mismo nombre de archivo en la llamada aterraform apply
. - Si no ha utilizado el parámetro
-out
, llame aterraform apply
sin ningún parámetro.
Verificación de los resultados
Obtenga el nombre del grupo de recursos de Azure.
resource_group_name=$(terraform output -raw resource_group_name)
Obtenga el nombre del área de trabajo.
workspace_name=$(terraform output -raw workspace_name)
Ejecute az ml workspace show para mostrar información sobre la nueva área de trabajo.
az ml workspace show --resource-group $resource_group_name \ --name $workspace_name
Limpieza de recursos
Cuando ya no necesite los recursos creados a través de Terraform, realice los pasos siguientes:
Ejecute el comando terraform plan y especifique la marca
destroy
.terraform plan -destroy -out main.destroy.tfplan
Puntos clave:
- El comando
terraform plan
crea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales. - El parámetro
-out
opcional permite especificar un archivo de salida para el plan. El uso del parámetro-out
garantiza que el plan que ha revisado es exactamente lo que se aplica.
- El comando
Ejecute terraform apply para aplicar el plan de ejecución.
terraform apply main.destroy.tfplan
Solución de problemas de Terraform en Azure
Solución de problemas comunes al usar Terraform en Azure.