Provider configuration

profider.tf
 

Resources

Для создания ВМ (минимально) нужны загрузочный диск и подсеть, а для подсети — сеть.

yandex_vpc_network

resource "yandex_vpc_network" "mpw-net" {
  name        = "mpw-net"
  description = "Network for monitoring-practical-work"
}

yandex_vpc_subnet

resource "yandex_vpc_subnet" "mpw-subnet" {
  name           = "mpw-subnet"
  description    = "Subnet for monitoring-practical-work"
  network_id     = yandex_vpc_network.mpw-net.id
  v4_cidr_blocks = ["10.10.0.0/16"]
}

yandex_vpc_security_group

resource "yandex_vpc_security_group" "mpw-sec-group" {
  name        = "mpw-sec-group"
  description = "Secutity group for monitoring-practical-work"
  network_id  = yandex_vpc_network.mpw-net.id
 
  dynamic "ingress" {
    for_each = ["80", "443"]
    content {
      protocol       = "TCP"
      description    = "Allow incoming traffic for web server"
      v4_cidr_blocks = ["0.0.0.0/0"]
      port           = ingress.value
    }
  }
 
  egress {
    protocol       = "ANY"
    v4_cidr_blocks = ["0.0.0.0/0"]
    from_port      = 0
    to_port        = 65535
  }
}

yandex_vpc_address

Можно [зарезервировать статический публичный IP-адрес] и использовать его как IP-адрес ВМ. Так IP-адрес ВМ будет останется идентичным даже после пересоздания ресурсов.

resource "yandex_vpc_address" "mpw-vm-1-ip" {
  name                = "mpw-vm-1-ip"
  deletion_protection = true
  external_ipv4_address { zone_id = local.zone }
}

И указать его в nat_ip_address в блоке network_interface для ВМ:

network_interface {
  nat            = true
  nat_ip_address = yandex_vpc_address.mpw-vm-1-ip.external_ipv4_address[0].address
}

IP-адрес не будет удаляться?

Ну, подразумевается, что во время работы с terraform, ты не будешь удалять ресурс yandex_vpc_address.mpw-vm-1-ip, тогда зарезервированный IP-адрес не удалится и ВМ продолжит использовать именно его.
deletion_protection как раз не даст удалить IP-адрес. Убирать защиту от удаления потом придется в консоли Yandex.Cloud (Virtual Private Cloud Другое IP-адреса)… idk, я не смог убрать защиту с помощью yc-cli (не понятно, как работает ключ --deletion-protection для yc vpc address update).

yandex_compute_disk

Есть два варианта описания и определения загрузочного диска для ВМ:

  1. Описание диска отдельно в compute_disk и указание соответствующего disk_id в compute_instance
  2. Описание и определение диска прямо в compute_instance в блоке boot_disk { initialize_params {} }

Вариант №1

resource "yandex_compute_disk" "mpw-vm-1-boot-disk" {
  name     = "mpw-vm-1-boot-disk"
  image_id = "fd81u2jojucn3njlptqo" # debian-12-v20250303
  type     = "network-hdd"
  size     = 10
}
 
resource "yandex_compute_instance" "mpw-vm-1" {
  boot_disk { disk_id = yandex_compute_disk.mpw-vm-1-boot-disk.id }
}

Как узнать image_id?

С помощью yc-cli:

yc compute image list --folder-id=standard-images | rg debian-12

Sauce: Получить список публичных образов | CLI

type?

Вариант №2

Во избежание повторений второй вариант применяется сразу в главе с созданием ВМ, поэтому см. там.

yandex_compute_instance

Код для создания ВМ с самой дешевой конфигурацией (для тестов):

resource "yandex_compute_instance" "mpw-vm-1" {
  name        = "mpw-vm-1"
  description = "VM for monitoring-practical-work"
  platform_id = "standard-v2"
 
  resources {
    cores         = 2
    core_fraction = 5
    memory        = 0.5
  }
 
  boot_disk {
    initialize_params {
      name     = "mpw-vm-1-boot-disk"
      image_id = "fd81u2jojucn3njlptqo" # debian-12-v20250303
      type     = "network-hdd"
      size     = 10
    }
  }
 
  network_interface {
    subnet_id      = yandex_vpc_subnet.mpw-subnet.id
    nat            = true
    nat_ip_address = yandex_vpc_address.mpw-vm-1-ip.external_ipv4_address[0].address
  }
 
  metadata = { ssh-keys = "debian:${file("~/.ssh/id_ed25519.pub")}" }
}

Что за platform_id?

Платформа (тип ВМ) определяет:

Sauce: Платформы

metadata?

cloud-init

Инструкции для cloud-init можно передать в user-data в блоке metadata:

metadata = { user-data = "${file("cloud-init.yml")}" }

Настройка SSH-ключей для подключения к ВМ в cloud-init.yml отменяет необходимость ssh-keys в блоке metadata.

Терпение vro

terraform создает ВМ и сообщает о его готовности, что не означает завершение работы cloud-init. Наблюдать за его работой можно в serial port output.

См. Cloud config examples tho

About terraform.tfstate

В работе над одной инфраструктурой с кем-то еще нужно будет делиться состоянием инфраструктуры. Для этого нужно хранить файлы состояния .tfstate в бакете в том же Yandex.Cloud.
Подробнее см. видео на YT


Sauces: