Kewin Daniel Guzman Diaz
Tambien puedes encontrarlo en la documentación oficial de HashiCorp proveedor de azurerm:
azurerm_virtual_machine | Resources | hashicorp/azurerm | Terraform | Terraform Registry
Crear una máquina virtual en Azure con Terraform parece complejo al inicio, pero con la documentación oficial y un inventario claro de recursos, el despliegue se vuelve un proceso ordenado. Aquí descubres cómo armar el script desde cero, qué componentes de red necesitas y cómo conectarte por escritorio remoto al final. Ideal si ya manejas grupos de recursos y quieres dar el siguiente paso en infraestructura como código.
¿Qué necesitas antes de escribir el script de Terraform?
La documentación oficial de Microsoft es tu mejor aliada. Busca en cualquier navegador máquina virtual Windows Terraform y el primer resultado te da la guía completa, disponible en español o inglés según prefieras [00:18].
Dentro de VS Code, crea una carpeta llamada máquinas virtuales en tu repositorio del curso y agrega el archivo main.tf. Para no reescribir desde cero, copia el bloque del provider de un ejercicio anterior y elimina la parte de Azure CAF, que no necesitas en este caso.
¿Qué es un provider en Terraform? Es el bloque que le dice a Terraform con qué nube o servicio vas a trabajar. En este caso, indica que usarás Azure como destino del despliegue.
¿Qué componentes forman una máquina virtual en Azure?
Antes de escribir código, conviene listar el inventario completo. Una sola máquina virtual requiere ocho recursos coordinados entre sí.
Este inventario lo escribes como comentario al inicio de tu main.tf y vas borrando cada línea conforme creas el bloque correspondiente. Es una forma simple de mantener el control [02:30].
¿Cómo defines el grupo de recursos y las variables?
El grupo de recursos hereda dos variables: ubicación y nombre. Eso significa crear un archivo variables.tf con bloques de tipo string para cada una. Si tienes la extensión de Terraform en VS Code, el snippet variable te ahorra tiempo.
Después de declarar las variables, regresas a main.tf y escribes el bloque del grupo de recursos. Con eso ya tienes la base para todo lo demás.
¿Cómo configurar la red virtual y la subred?
Usa los recursos azurerm_virtual_network y azurerm_subnet. La red virtual hereda del grupo de recursos, y la subred hereda a su vez de la red virtual. Mantén un prefijo personal en los nombres, como amin- o el que prefieras, para identificar tus recursos rápido.
¿Cómo configuras la seguridad y la conectividad de red?
Aquí entra la parte que muchos pasan por alto. Sin una IP pública, un grupo de seguridad y una interfaz de red bien conectados, tu máquina virtual existirá pero no podrás acceder a ella.
La IP pública se crea con azurerm_public_ip heredando ubicación y grupo de recursos. El grupo de seguridad de red, definido con azurerm_network_security_group, es donde abres el protocolo RDP en el puerto 3389 para permitir el acceso por escritorio remoto [04:35].
¿Para qué sirve el puerto 3389? Es el puerto estándar del protocolo RDP de Windows. Abrirlo en el grupo de seguridad permite conectarte por escritorio remoto a la máquina virtual desde tu computadora.
La interfaz de red, creada con azurerm_network_interface, funciona como la tarjeta de red de cualquier computadora. Conecta la subred con la IP pública y le da identidad de red a la VM. Finalmente, el recurso azurerm_network_interface_security_group_association une la interfaz con el grupo de seguridad. Sin esa asociación, las reglas de seguridad no aplican a tu máquina.
¿Cómo declaras la máquina virtual Windows?
El bloque azurerm_windows_virtual_machine necesita dos variables nuevas: vm_username y vm_password. Las agregas en variables.tf siguiendo el mismo patrón de tipo string.
La imagen elegida es Windows Server 2022, una de las ediciones más recientes disponibles en Azure. La ubicación, el grupo de recursos y la interfaz de red se heredan de los bloques previos.
¿Cómo aplicas el script y verificas el despliegue?
Crea el archivo terraform.tfvars con los valores reales: eastus2 para la ubicación, un nombre como maquinas-virtuales-group para el grupo, tu nombre de usuario y un password robusto que combine mayúsculas, números y símbolos.
Desde la terminal, sitúate en la carpeta correcta y ejecuta los comandos en orden:
terraform init para inicializar el proyecto.terraform plan -out plan.out para revisar los ocho recursos que se van a crear.terraform apply para desplegar todo en Azure.El despliegue completo ocurre en pocos minutos. Una vez terminado, entras al portal de Azure, buscas el grupo de recursos maquinas-virtuales-group y seleccionas el icono de la máquina virtual [09:25].
¿Cómo te conectas por escritorio remoto a la VM?
Dentro de la máquina virtual, ve a la opción Conectar en la columna izquierda. Antes de descargar el archivo RDP, Azure verifica si tu IP tiene acceso. Cuando aparece la leyenda accesible, descargas el archivo, lo abres con doble clic e ingresas las credenciales de tu terraform.tfvars.
En segundos, el escritorio de Windows Server 2022 aparece en tu pantalla, totalmente desplegado desde código. ¿Te animas a probarlo con otra región o con una imagen Linux? Cuéntame en los comentarios qué configuración usaste tú.
Quiero compartir con ustedes un recursos de una VM que cree No en Azure sino en Google Cloud, tiene un pequeno script para agregarle un webserver Nginx :
terraform { required_providers { google = { source = "hashicorp/google" } } } provider "google" { project = "gcp-d60eb74" region = "us" zone = "us" } # 1. Recurso de la Instancia de Cómputo (VM) resource "google_compute_instance" "terraform" { name = "terraform" machine_type = "e2-micro" tags = ["web", "dev"] boot_disk { initialize_params { image = "debian-cloud/debian-11" } } network_interface { network = "default" access_config { } } allow_stopping_for_update = true ## Configurar web server metadata_startup_script = <<-EOF #!/bin/bash sudo apt-get update sudo apt-get install -y nginx sudo systemctl enable nginx sudo systemctl start nginx EOF } ### Cierre de VM # 2. Recurso de la Regla de Firewall resource "google_compute_firewall" "allow_web" { name = "allow-http-web-tags" network = "default" allow { protocol = "tcp" ports = ["80"] } source_ranges = ["0.0.0.0/0"] target_tags = ["web"] }
Este es mi equivalente en AWS. Tengo poco conocimiento con redes, por lo que me apoyé con IA.
data "aws_ami" "amazon_linux_2023_ami" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["al2023-ami-2023*-x86_64"] # Filtro para la versión estable actual } } # 1. VPC resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" enable_dns_hostnames = true tags = merge(local.common_tags, { Name = "${var.project_name}-${var.environment}-vpc" }) } # 2. Subnet resource "aws_subnet" "main_subnet" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" availability_zone = "${var.region}a" tags = merge(local.common_tags, { Name = "${var.project_name}-${var.environment}-subnet" }) } # 3. Internet Gateway (Necesario en AWS para que haya internet) resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.main.id tags = merge(local.common_tags, { Name = "${var.project_name}-${var.environment}-igw" }) } # 4. Tabla de Rutas (Para que la subred sea pública) resource "aws_route_table" "public_rt" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.igw.id } tags = merge(local.common_tags, { Name = "${var.project_name}-${var.environment}-public-rt" }) } resource "aws_route_table_association" "a" { subnet_id = aws_subnet.main_subnet.id route_table_id = aws_route_table.public_rt.id } # 5. Security Group (Equivalente a Network Security Group) resource "aws_security_group" "app_sg" { name = "${var.project_name}-${var.environment}-web-sg" description = "Security group para acceso HTTP a la instancia EC2" vpc_id = aws_vpc.main.id # Regla HTTP (Puerto 80) ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } # Salida permitida (Azure lo hace por defecto, AWS requiere código) egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = local.common_tags }
resource "aws_instance" "ec2_instance" { ami = data.aws_ami.amazon_linux_2023_ami.id instance_type = "t3.micro" count = 1 # Cantidad de instancias a crear # Asociación de red subnet_id = aws_subnet.main_subnet.id vpc_security_group_ids = [aws_security_group.app_sg.id] associate_public_ip_address = true # Para que la instancia tenga IP pública y sea accesible desde internet # Disco de Sistema (OS Disk) root_block_device { volume_type = "gp3" volume_size = 8 } key_name = var.key_name user_data = <<-EOF #!/bin/bash # Actualizar paquetes e instalar Apache (httpd) dnf update -y dnf install -y httpd systemctl start httpd systemctl enable httpd echo "<h1>Servidor Amazon Linux 2023 desplegado por Terraform</h1>" > /var/www/html/index.html EOF tags = merge(local.common_tags, { Name = "${var.project_name}-${var.environment}-web-${count.index + 1}" }) }
Kewin Daniel Guzman Diaz
Tambien puedes encontrarlo en la documentación oficial de HashiCorp proveedor de azurerm:
azurerm_virtual_machine | Resources | hashicorp/azurerm | Terraform | Terraform Registry