Provider configuration
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
Есть два варианта описания и определения загрузочного диска для ВМ:
- Описание диска отдельно в
compute_disk
и указание соответствующегоdisk_id
вcompute_instance
- Описание и определение диска прямо в
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
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?
Платформа (тип ВМ) определяет:
- тип процессора
- наличие GPU
- набор допустимых конфигураций vCPU и RAM
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: