Yandex Cloud
Поиск
Связаться с экспертомПопробовать бесплатно
  • Кейсы
  • Документация
  • Блог
  • Все сервисы
    • Cloud Interconnect
    • Cloud Backup
    • Cloud Registry
    • Yandex AI Studio
    • Compute Cloud
    • Object Storage
    • Managed Service for Kubernetes®
    • Yandex BareMetal
    • Smart Web Security
    • Security Deck
    • Managed Service for PostgreSQL
    • Managed Service for ClickHouse®
    • Monium
    • Cloud CDN
    • Network Load Balancer
    • Virtual Private Cloud
    • Cloud DNS
    • Application Load Balancer
    • Yandex Cloud Video
    • Stackland
    • Yandex Cloud Router
    • Yandex Managed Service for Trino
    • Managed Service for MySQL®
    • Managed Service for Valkey™
    • Managed Service for Apache Spark™
    • Yandex StoreDoc
    • Managed Service for OpenSearch
    • Managed Service for Apache Kafka®
    • Data Transfer
    • Yandex MPP Analytics Engine for PostgreSQL
    • Yandex Managed Service for Apache Airflow®
    • Data Processing
    • Yandex MetaData Hub
    • Managed Service for YDB
    • Managed Service for Sharded PostgreSQL
    • Managed Service for YTsaurus
    • Yandex WebSQL
    • DataLens
    • Yandex Search API
    • SpeechSense
    • SpeechKit
    • DataSphere
    • Vision OCR
    • Translate
    • VibeCraft
    • Yandex Cloud Detection and Response
    • Yandex Identity Hub
    • Key Management Service
    • Certificate Manager
    • Yandex Lockbox
    • Audit Trails
    • SmartCaptcha
    • Cloud Desktop
    • GOST Gateway
    • Yandex SIEM
    • SourceCraft Code Assistant
    • Container Registry
    • Managed Service for GitLab
    • SourceCraft
    • Managed Service for Prometheus®
    • Cloud Functions
    • API Gateway
    • Yandex Cloud Postbox
    • Message Queue
    • IoT Core
    • Data Streams
    • Serverless Containers
    • Cloud Notification Service
    • Yandex Query
    • Identity and Access Management
    • Yandex Cloud Console
    • Resource Manager
    • Yandex Cloud Billing
    • Yandex Cloud Quota Manager
    • Cloud Apps
  • Статус работы сервисов
  • Marketplace
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Искусственный интеллект
    • Безопасность
    • Инструменты DevOps
    • Бессерверные вычисления
    • Управление ресурсами
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Yandex Cloud Trust
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Калькулятор цен
    • Тарифы
  • Кейсы
  • Документация
  • Блог
Сделано на Gravity UI
Проект Яндекса
© 2026 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Архитектура и защита базового интернет-сервиса
    • Анализ поресурсной детализации расходов с помощью Object Storage
    • Получение сведений для запроса на включение ресурса в белый список Минцифры
      • Начало работы с Terraform
      • Источники данных Terraform
      • Загрузка состояний Terraform в Object Storage
      • Начало работы с Packer
      • Сборка образа ВМ с набором инфраструктурных инструментов с помощью Packer
      • Блокировка состояний Terraform с помощью Managed Service for YDB
      • Использование модулей Yandex Cloud в Terraform
      • Управление ресурсами Kubernetes с помощью провайдера Terraform
      • Создать ВМ и группу ВМ с Container Optimized Image с помощью Terraform
      • Передача логов через HTTP-вход Unified Agent в Cloud Logging
      • Запуск языковой модели DeepSeek-R1 в кластере GPU Compute Cloud
      • SLO-мониторинг веб-сервиса

В этой статье:

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Установите Terraform
  • Из зеркала
  • С сайта HashiCorp
  • Получите данные для аутентификации
  • Создайте файл конфигурации Terraform
  • Настройте провайдер
  • Подготовьте план инфраструктуры
  • Создайте пользователей
  • Проверьте и отформатируйте файлы конфигураций
  • Создайте ресурсы
  • Удалите созданные ресурсы
  1. Базовая инфраструктура
  2. Инструменты
  3. Начало работы с Terraform

Начало работы с Terraform

Статья создана
Yandex Cloud
Улучшена
Обновлена 15 октября 2026 г.
Открыть в Markdown
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
  • Установите Terraform
    • Из зеркала
    • С сайта HashiCorp
  • Получите данные для аутентификации
  • Создайте файл конфигурации Terraform
  • Настройте провайдер
  • Подготовьте план инфраструктуры
    • Создайте пользователей
  • Проверьте и отформатируйте файлы конфигураций
  • Создайте ресурсы
  • Удалите созданные ресурсы

Terraform позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.

Terraform распространяется под лицензией Business Source License, а провайдер Yandex Cloud для Terraform — под лицензией MPL-2.0.

Подробная информация о ресурсах провайдера в документации на сайте Terraform или в зеркале.

Чтобы создать первую инфраструктуру в Yandex Cloud с помощью Terraform:

  1. Подготовьте облако к работе.
  2. Установите Terraform.
  3. Получите данные для аутентификации.
  4. Создайте файл конфигурации Terraform.
  5. Настройте провайдер.
  6. Подготовьте план инфраструктуры.
  7. Проверьте и отформатируйте файлы конфигураций.
  8. Создайте ресурсы.

Если ресурсы больше вам не нужны, удалите их.

Подготовьте облако к работеПодготовьте облако к работе

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.

Подробнее об облаках и каталогах.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки инфраструктуры, которую вы создадите с помощью Terraform, входят:

  • плата за постоянно запущенные виртуальные машины (тарифы Yandex Compute Cloud);
  • плата за использование динамических публичных IP-адресов (тарифы Yandex Virtual Private Cloud).

Установите TerraformУстановите Terraform

Из зеркалаИз зеркала

Внимание

Зеркало может быть недоступно.

Вы можете скачать дистрибутив Terraform для вашей платформы из зеркала. После загрузки добавьте путь к папке, в которой находится исполняемый файл, в переменную PATH:

export PATH=$PATH:/path/to/terraform

С сайта HashiCorpС сайта HashiCorp

Windows
Linux
macOS

Используйте один из способов:

  • Скачайте дистрибутив Terraform и установите его согласно инструкции.

  • Установите Terraform с помощью пакетного менеджера Chocolatey, используя команду:

    choco install terraform
    

Скачайте дистрибутив Terraform и установите его согласно инструкции.

Используйте один из способов:

  • Скачайте дистрибутив Terraform и установите его согласно инструкции.

  • Установите Terraform с помощью пакетного менеджера Homebrew, используя команду:

    brew install terraform
    

Получите данные для аутентификацииПолучите данные для аутентификации

Для аутентификации в Yandex Cloud и управления инфраструктурой используйте Terraform от имени сервисного аккаунта или пользователя: аккаунта на Яндексе, федеративного аккаунта или локального пользователя.

Сервисный аккаунт
Аккаунт на Яндексе, федеративный или локальный пользователь

Использование сервисного аккаунта с помощью имперсонации является рекомендованным и наиболее безопасным способом аутентификации.

При создании IAM-токена используйте имперсонацию для созданного сервисного аккаунта, указав его идентификатор в параметре --impersonate-service-account-id. В результате Terraform будет от имени сервисного аккаунта управлять ресурсами в каталоге и использовать IAM-токен сервисного аккаунта.

Примечание

Для использования имперсонации пользователю должна быть назначена роль iam.serviceAccounts.tokenCreator на соответствующий сервисный аккаунт.

Для аутентификации от имени сервисного аккаунта:

  1. Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите.

  2. В Yandex Cloud CLI создайте новый профиль или активируйте созданный ранее.

  3. Аутентифицируйтесь от имени аккаунта на Яндексе, федеративного или локального пользователя.

  4. Если у вас еще нет сервисного аккаунта, создайте его.

  5. Назначьте сервисному аккаунту роли, необходимые для управления ресурсами Yandex Cloud.

  6. Запишите аутентификационные данные в переменные окружения, используя имперсонацию:

    Bash
    PowerShell
    export YC_TOKEN=$(yc iam create-token --impersonate-service-account-id <идентификатор_сервисного_аккаунта>)
    export YC_CLOUD_ID=$(yc config get cloud-id)
    export YC_FOLDER_ID=$(yc config get folder-id)
    
    $Env:YC_TOKEN=$(yc iam create-token --impersonate-service-account-id <идентификатор_сервисного_аккаунта>)
    $Env:YC_CLOUD_ID=$(yc config get cloud-id)
    $Env:YC_FOLDER_ID=$(yc config get folder-id)
    

    Где <идентификатор_сервисного_аккаунта> — идентификатор сервисного аккаунта.

В результате в переменных окружения сохранятся IAM-токен сервисного аккаунта, а также идентификатор облака и идентификатор каталога.

Примечание

При каждой операции аутентификация будет происходить с помощью этого IAM-токена, пока не истечет время его жизни (не более 12 часов). После этого снова потребуется пройти аутентификацию. Для автоматического перевыпуска IAM-токена можно использовать скрипт или другие способы автоматизации.

Чтобы продлить срок, в течение которого не нужно аутентифицироваться в браузере, используйте refresh-токены, позволяющие перевыпускать IAM-токены без перехода в браузер. Для этого разрешите использовать refresh-токены на уровне организации и инициализируйте DPoP-защиту в CLI.

Настройки провайдера в конфигурационном файле Terraform без указания чувствительных параметров указываются следующим образом:

provider "yandex" {
  # Параметры cloud_id, folder_id и token не указываются, так как
  # провайдер автоматически подхватит их из переменных окружения

  zone = "<зона_доступности>"
}

Где zone — зона доступности, в которой по умолчанию будут создаваться все облачные ресурсы.

С такой конфигурацией используйте Terraform без дополнительных флагов, так как провайдер автоматически подхватит их из переменных окружения.

Важно

Управление ресурсами от имени пользовательского аккаунта является менее безопасным, чем использование сервисного аккаунта.

Для аутентификации от имени пользовательского аккаунта:

  1. Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите.

  2. В Yandex Cloud CLI создайте новый профиль или активируйте созданный ранее.

  3. Аутентифицируйтесь в зависимости от типа используемого аккаунта: аккаунта на Яндексе, федеративного или локального пользователя.

  4. Запишите чувствительные данные профиля: IAM-токен, идентификатор облака и каталога в переменные окружения:

    Bash
    PowerShell
    export YC_TOKEN=$(yc iam create-token)
    export YC_CLOUD_ID=$(yc config get cloud-id)
    export YC_FOLDER_ID=$(yc config get folder-id)
    
    $Env:YC_TOKEN=$(yc iam create-token)
    $Env:YC_CLOUD_ID=$(yc config get cloud-id)
    $Env:YC_FOLDER_ID=$(yc config get folder-id)
    

    Где:

    yc iam create-token — получение IAM-токена для текущей сессии.
    yc config get cloud-id — получение идентификатора облака из текущего профиля CLI.
    yc config get folder-id — получение идентификатора каталога из текущего профиля CLI.

    В результате в переменных окружения сохранятся IAM-токен, а также идентификатор облака и идентификатор каталога.

Примечание

При каждой операции аутентификация будет происходить с помощью этого IAM-токена, пока не истечет время его жизни (не более 12 часов). После этого снова потребуется пройти аутентификацию. Для автоматического перевыпуска IAM-токена можно использовать скрипт или другие способы автоматизации.

Чтобы продлить срок, в течение которого не нужно аутентифицироваться в браузере, используйте refresh-токены, позволяющие перевыпускать IAM-токены без перехода в браузер. Для этого разрешите использовать refresh-токены на уровне организации и инициализируйте DPoP-защиту в CLI.

Настройки провайдера в конфигурационном файле Terraform без указания чувствительных параметров указываются следующим образом:

provider "yandex" {
  # Параметры cloud_id, folder_id и token не указываются, так как
  # провайдер автоматически подхватит их из переменных окружения

  zone = "<зона_доступности>"
}

Где zone — зона доступности, в которой по умолчанию будут создаваться все облачные ресурсы.

С такой конфигурацией используйте Terraform без дополнительных флагов, так как провайдер автоматически подхватит их из переменных окружения.

Создайте файл конфигурации TerraformСоздайте файл конфигурации Terraform

  1. Создайте новую директорию с произвольным названием, например cloud-terraform. В ней будут храниться конфигурационные файлы и сохраненные состояния Terraform и инфраструктуры.

    Важно

    Каждая конфигурация должна находиться в отдельной директории.

  2. Создайте в новой директории конфигурационный файл с расширением .tf, например main.tf.

Настройте провайдерНастройте провайдер

Примечание

Настройки применимы для Terraform 0.13 и более поздних версий. Рекомендуется использовать последнюю стабильную версию Terraform.

  1. Если раньше у вас был настроен провайдер из реестра HashiCorp, сохраните его настройки:

    Linux/macOS
    Windows
    mv ~/.terraformrc ~/.terraformrc.old
    
    Move-Item $env:APPDATA\terraform.rc $env:APPDATA\terraform.rc.old
    
  2. Укажите источник, из которого будет устанавливаться провайдер.

    Linux/macOS
    Windows

    Откройте файл конфигурации Terraform CLI:

    nano ~/.terraformrc
    

    Примечание

    Файл .terraformrc должен располагаться в корне домашней папки пользователя, например, /home/user/ или /User/user/.

    Откройте файл конфигурации Terraform CLI terraform.rc в папке %APPDATA% вашего пользователя.

    Чтобы узнать абсолютный путь к папке %APPDATA%, выполните команду echo %APPDATA% для cmd или $env:APPDATA для PowerShell.

    Добавьте в него следующий блок:

    provider_installation {
      network_mirror {
        url = "https://terraform-mirror.yandexcloud.net/"
        include = ["registry.terraform.io/*/*"]
      }
      direct {
        exclude = ["registry.terraform.io/*/*"]
      }
    }
    

    Подробнее о настройках зеркал в документации.

  3. В начале конфигурационного файла .tf добавьте следующие блоки:

    terraform {
      required_providers {
        yandex = {
          source = "yandex-cloud/yandex"
        }
      }
      required_version = ">= 0.13"
    }
    
    provider "yandex" {
      zone = "<зона_доступности_по_умолчанию>"
    }
    

    Где:

    • source — глобальный адрес источника провайдера.
    • required_version — минимальная версия Terraform, с которой совместим провайдер.
    • provider — название провайдера.
    • zone — зона доступности, в которой по умолчанию будут создаваться все облачные ресурсы.
  4. Выполните команду terraform init в папке с конфигурационным файлом .tf. Эта команда инициализирует провайдеров, указанных в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера.

Если провайдер не установился, создайте обращение в поддержку с именем и версией провайдера.

Если вы использовали файл .terraform.lock.hcl, перед инициализацией выполните команду terraform providers lock, указав адрес зеркала, откуда будет загружаться провайдер, и платформы, на которых будет использоваться конфигурация:

terraform providers lock -net-mirror=https://terraform-mirror.yandexcloud.net -platform=<название_платформы_1> -platform=<название_платформы_2> yandex-cloud/yandex

Где:

  • -net-mirror — адрес зеркала, откуда будет загружаться провайдер.

  • -platform — платформы, на которых будет использоваться конфигурация. Возможные значения:

    • windows_amd64 — 64-bit Windows.
    • linux_amd64 — 64-bit Linux.
    • darwin_arm64 — 64-bit macOS.

Если вы использовали модули Terraform, сначала выполните terraform init, затем удалите lock-файл, а затем выполните команду terraform providers lock.

Подробнее о команде terraform providers lock в документации Terraform.

Подготовьте план инфраструктурыПодготовьте план инфраструктуры

С помощью Terraform в Yandex Cloud можно создавать облачные ресурсы разных типов, например ВМ, диски и образы. Полный список ресурсов приведен в документации провайдера.

Для каждого ресурса укажите обязательные и необязательные параметры, которые определяют его свойства. Описания ресурсов составляют план инфраструктуры.

План включает две ВМ (terraform1 и terraform2), облачную сеть network1 и подсеть subnet1.

Имена ресурсов должны соответствовать следующим требованиям:

  • длина — от 3 до 63 символов;
  • может содержать строчные буквы латинского алфавита, цифры и дефисы;
  • первый символ — буква, последний — не дефис.

ВМ будут различаться количеством ядер и объемом памяти: у terraform1 будет два ядра и 2 ГБ оперативной памяти, а у terraform2 — четыре ядра и 4 ГБ оперативной памяти. Обе ВМ автоматически получат публичные и внутренние IP-адреса из диапазона 192.168.10.0/24. Подсеть subnet1 находится в зоне доступности ru-central1-d и принадлежит сети network1. Для ВМ используйте образ Ubuntu.

В конфигурации ВМ укажите идентификатор образа загрузочного диска. Получите список доступных публичных образов с помощью команды CLI:

yc compute image list --folder-id standard-images

Для доступа к ВМ по SSH сгенерируйте пару SSH-ключей и укажите путь к публичной части ключа в параметре ssh-keys блока metadata.

Ниже приведены фрагменты конфигурации провайдера и одной ВМ для разных регионов. Полные конфигурации ресурсов приведены во вкладках Linux и Windows ниже.

terraform {
  required_providers {
    yandex = {
      source = "yandex-cloud/yandex"
    }
  }
}

provider "yandex" {
  zone = "<зона_доступности_по_умолчанию>"
}

resource "yandex_compute_instance" "vm-1" {
  name = "terraform1"
}
Создание ВМ Linux
Создание ВМ Windows

По плану будут созданы следующие ресурсы:

  • Облачная сеть network1 с подсетью subnet1 в зоне доступности ru-central1-d.
  • Две виртуальные машины Linux: terraform1 (2 ядра и 2 ГБ оперативной памяти) и terraform2 (4 ядра и 4 ГБ оперативной памяти). Они автоматически получат публичные и внутренние IP-адреса из диапазона 192.168.10.0/24 в подсети subnet-1.
  1. Выберите образ загрузочного диска в Yandex Cloud Marketplace, например Ubuntu 22.04 LTS. Получите список доступных публичных образов с помощью команды CLI:

    yc compute image list --folder-id standard-images
    
  2. Сгенерируйте пару SSH-ключей для доступа к ВМ по SSH.

  3. Опишите параметры ресурсов в файле main.tf:

    • В параметре ssh-keys блока metadata укажите путь к публичной части SSH-ключа.
    • В image_id задайте идентификатор образа загрузочного диска.
    Файл main.tf
    <настройки провайдера>
    
    resource "yandex_compute_disk" "boot-disk-1" {
      name     = "boot-disk-1"
      type     = "network-hdd"
      zone     = "ru-central1-d"
      size     = "20"
      image_id = "fd806c8slu9j********"
    }
    
    resource "yandex_compute_disk" "boot-disk-2" {
      name     = "boot-disk-2"
      type     = "network-hdd"
      zone     = "ru-central1-d"
      size     = "20"
      image_id = "fd806c8slu9j********"
    }
    
    resource "yandex_compute_instance" "vm-1" {
      name        = "terraform1"
      platform_id = "standard-v3"
    
      resources {
        cores  = 2
        memory = 2
      }
    
      boot_disk {
        disk_id = yandex_compute_disk.boot-disk-1.id
      }
    
      network_interface {
        subnet_id = yandex_vpc_subnet.subnet-1.id
        nat       = true
      }
    
      metadata = {
        ssh-keys = "ubuntu:${file("<путь_к_публичной_части_SSH-ключа>")}"
      }
    }
    
    resource "yandex_compute_instance" "vm-2" {
      name        = "terraform2"
      platform_id = "standard-v3"
    
      resources {
        cores  = 4
        memory = 4
      }
    
      boot_disk {
        disk_id = yandex_compute_disk.boot-disk-2.id
      }
    
      network_interface {
        subnet_id = yandex_vpc_subnet.subnet-1.id
        nat       = true
      }
    
      metadata = {
        ssh-keys = "ubuntu:${file("~/.ssh/id_ed25519.pub")}"
      }
    }
    
    resource "yandex_vpc_network" "network-1" {
      name = "network1"
    }
    
    resource "yandex_vpc_subnet" "subnet-1" {
      name           = "subnet1"
      zone           = "ru-central1-d"
      network_id     = yandex_vpc_network.network-1.id
      v4_cidr_blocks = ["192.168.10.0/24"]
    }
    
    output "internal_ip_address_vm_1" {
      value = yandex_compute_instance.vm-1.network_interface.0.ip_address
    }
    
    output "internal_ip_address_vm_2" {
      value = yandex_compute_instance.vm-2.network_interface.0.ip_address
    }
    
    output "external_ip_address_vm_1" {
      value = yandex_compute_instance.vm-1.network_interface.0.nat_ip_address
    }
    
    output "external_ip_address_vm_2" {
      value = yandex_compute_instance.vm-2.network_interface.0.nat_ip_address
    }
    

По плану будут созданы следующие ресурсы:

  • Облачная сеть ya-network с подсетью ya-network в зоне доступности, указанной по умолчанию.
  • Две виртуальные машины Windows: terraform1 (2 ядра и 4 ГБ оперативной памяти) и terraform2 (4 ядра и 4 ГБ оперативной памяти). Они автоматически получат публичные и внутренние IP-адреса из диапазона 192.168.10.0/16 в подсети ya-network.

Создайте следующие файлы:

  1. main.tf — основной файл с описанием инфраструктуры.

    Содержимое файла main.tf
    terraform {
      required_providers {
        yandex = {
          source = "yandex-cloud/yandex"
        }
      }
    }
    
    provider "yandex" {
      zone = var.zone
    }
    
    resource "yandex_vpc_network" "default" {
      name = var.network
    }
    
    resource "yandex_vpc_subnet" "default" {
      network_id     = yandex_vpc_network.default.id
      name           = var.subnet
      v4_cidr_blocks = var.subnet_v4_cidr_blocks
      zone           = var.zone
    }
    
    data "yandex_compute_image" "default" {
      family = var.image_family
    }
    
    data "template_file" "default" {
      template = file("${path.module}/init.ps1")
      vars = {
        user_name  = var.user_name
        user_pass  = var.user_pass
        admin_pass = var.admin_pass
      }
    }
    
    resource "yandex_compute_instance" "vm-1" {
      name        = "terraform1"
      hostname    = "terraform1"
      zone        = var.zone
      platform_id = "standard-v3"
    
      resources {
        cores = 2
        memory = 4
      }
    
      boot_disk {
        initialize_params {
          image_id = data.yandex_compute_image.default.id
          size     = var.disk_size
          type     = var.disk_type
        }
      }
    
      network_interface {
        subnet_id = yandex_vpc_subnet.default.id
        nat       = var.nat
      }
    
      metadata = {
        user-data = data.template_file.default.rendered
      }
    
      timeouts {
        create = var.timeout_create
        delete = var.timeout_delete
      }
    }
    
    resource "yandex_compute_instance" "vm-2" {
      name        = "terraform2"
      hostname    = "terraform2"
      zone        = var.zone
      platform_id = "standard-v3"
    
      resources {
        cores = 4
        memory = 4
      }
    
      boot_disk {
        initialize_params {
          image_id = data.yandex_compute_image.default.id
          size = var.disk_size
          type     = var.disk_type
        }
      }
    
      network_interface {
        subnet_id = yandex_vpc_subnet.default.id
        nat       = var.nat
      }
    
      metadata = {
        user-data = data.template_file.default.rendered
      }
    
      timeouts {
        create = var.timeout_create
        delete = var.timeout_delete
      }
    }
    
    output "internal_ip_address_vm_1" {
      value = yandex_compute_instance.vm-1.network_interface.0.ip_address
    }
    
    output "internal_ip_address_vm_2" {
      value = yandex_compute_instance.vm-2.network_interface.0.ip_address
    }
    
    output "external_ip_address_vm_1" {
      value = yandex_compute_instance.vm-1.network_interface.0.nat_ip_address
    }
    
    output "external_ip_address_vm_2" {
      value = yandex_compute_instance.vm-2.network_interface.0.nat_ip_address
    }
    
  2. variables.tf — файл с описанием переменных для создаваемых ресурсов.

    Файл variables.tf
    variable "zone" {
      type    = string
      default = "ru-central1-d"
    }
    
    variable "network" {
      type    = string
      default = "ya-network"
    }
    
    variable "subnet" {
      type    = string
      default = "ya-network"
    }
    
    variable "subnet_v4_cidr_blocks" {
      type    = list(string)
      default = ["192.168.10.0/16"]
    }
    
    variable "nat" {
      type    = bool
      default = true
    }
    
    variable "image_family" {
      type    = string
      default = "windows-2019-dc-gvlk"
    }
    
    variable "disk_size" {
      type    = number
      default = 50
    }
    
    variable "disk_type" {
      type    = string
      default = "network-nvme"
    }
    
    variable "user_name" {
      type    = string
      default = ""
    }
    
    variable "user_pass" {
      type    = string
      default = ""
    }
    
    variable "admin_pass" {
      type    = string
      default = ""
    }
    
    variable "timeout_create" {
      default = "10m"
    }
    
    variable "timeout_delete" {
      default = "10m"
    }
    
  3. terraform.tfvars — файл, где хранятся значения переменных для создаваемых внутри ВМ учетных записей.

    Файл terraform.tfvars
    user_name  = "<my_user>"
    user_pass  = "<my_password>"
    admin_pass = "<my_password>"
    

Создайте пользователейСоздайте пользователей

Linux
Windows

Для добавления пользователей, как и для изменения многих других параметров ОС создаваемой виртуальной машины, в Yandex Cloud используется механизм cloud-init. Для этого необходимо передать текст конфигурации cloud-init в параметре user-data в блоке metadata. В нашем случае это будут системные пользователи:

  1. Создайте текстовый файл с метаданными в кодировке UTF-8, например:

    #cloud-config
    users:
      - name: <имя_пользователя>
        groups: sudo
        shell: /bin/bash
        sudo: 'ALL=(ALL) NOPASSWD:ALL'
        ssh_authorized_keys:
          - <публичный_SSH-ключ_1>
          - <публичный_SSH-ключ_2>
          - ...
    

    Где:

    • name — имя пользователя ВМ.

    • ssh_authorized_keys — список публичных SSH-ключей для доступа к ВМ.

      Пример ключа: ssh-ed25519 AAAAB3Nza...Pu00jRN.

  2. В файле main.tf вместо ssh-keys задайте параметр user-data и укажите путь к файлу с метаданными:

    metadata = {
      user-data = "${file("<путь_к_файлу>/meta.txt")}"
    }
    

Подробнее о работе с метаданными читайте в разделе Метаданные виртуальной машины.

Чтобы создать пользователя и установить пароль учетной записи Administrator на виртуальную машину в Yandex Cloud можно использовать агент cloudbase-init. Для этого создайте скрипт init.ps1, который будет выполняться агентом при первой загрузке системы. В качестве учетных сведений будут использоваться переменные из файла variables.tf.

Файл init.ps1
#ps1
# ^^^ 'ps1' is only for cloudbase-init, some sort of sha-bang in linux

# logging
Start-Transcript -Path "$ENV:SystemDrive\provision.txt" -IncludeInvocationHeader -Force
"Bootstrap script started" | Write-Host

# inserting value's from terraform
$MyUserName = "${ user_name }"
$MyPlainTextPassword = "${ user_pass }"
if (-not [string]::IsNullOrEmpty($MyUserName) -and -not [string]::IsNullOrEmpty($MyPlainTextPassword)) {
    "Create user" | Write-Host
    $MyPassword = $MyPlainTextPassword | ConvertTo-SecureString -AsPlainText -Force
    $MyUser = New-LocalUser -Name $MyUserName -Password $MyPassword -PasswordNeverExpires -AccountNeverExpires
    $MyUser | Add-LocalGroupMember -Group 'Administrators'
    $MyUser | Add-LocalGroupMember -Group 'Remote Management Users'
}

# inserting value's from terraform
$MyAdministratorPlainTextPassword = "${ admin_pass }"
if (-not [string]::IsNullOrEmpty($MyAdministratorPlainTextPassword)) {
    "Set local administrator password" | Write-Host
    $MyAdministratorPassword = $MyAdministratorPlainTextPassword | ConvertTo-SecureString -AsPlainText -Force
    # S-1-5-21domain-500 is a well-known SID for Administrator
    # https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/security-identifiers-in-windows
    $MyAdministrator = Get-LocalUser | Where-Object -Property "SID" -like "S-1-5-21-*-500"
    $MyAdministrator | Set-LocalUser -Password $MyAdministratorPassword
}

"Bootstrap script ended" | Write-Host

Проверьте и отформатируйте файлы конфигурацийПроверьте и отформатируйте файлы конфигураций

  1. Проверьте конфигурацию командой:

    terraform validate
    

    Если конфигурация является допустимой, появится сообщение:

    Success! The configuration is valid.
    
  2. Отформатируйте файлы конфигураций в текущем каталоге и подкаталогах:

    terraform fmt
    

    Команда выводит список отформатированных файлов, например:

    main.tf
    

Создайте ресурсыСоздайте ресурсы

  1. После проверки конфигурации выполните команду:

    terraform plan
    

    Терминал выведет список ресурсов и их параметров. На этом этапе ресурсы не создаются. Если конфигурация содержит ошибки, Terraform укажет на них.

    Внимание

    Все созданные с помощью Terraform ресурсы тарифицируются. Внимательно проверьте план.

  2. Чтобы создать ресурсы, выполните команду:

    terraform apply
    
  3. Подтвердите создание ресурсов: введите в терминал слово yes и нажмите Enter.

    Terraform создаст ресурсы и выведет в терминале IP-адреса созданных виртуальных машин. Проверьте наличие ресурсов и их настройки в консоли управления.

Удалите созданные ресурсыУдалите созданные ресурсы

Чтобы удалить ресурсы, созданные с помощью Terraform:

  1. Удалите из конфигурации блоки resource и module, относящиеся к этой инфраструктуре, а также источники данных и выходные значения output, которые на них ссылаются. Сохраните блоки terraform и provider.

  2. Проверьте план удаления:

    terraform plan
    

    Внимание

    Terraform удалит ресурсы, для которых вы убрали описания из конфигурации: кластеры, сети, подсети, виртуальные машины и другие ресурсы.

    Проверьте список ресурсов, которые Terraform собирается удалить.

  3. Примените изменения:

    terraform apply
    
  4. Подтвердите удаление: введите yes и нажмите Enter.

Проверить удаление ресурсов можно в консоли управления.

Полезные ссылкиПолезные ссылки

  • Загрузка состояний Terraform в Object Storage.
  • Блокировка состояний Terraform с помощью Managed Service for YDB.
  • Использование модулей Yandex Cloud в Terraform.
  • Источники данных Terraform.
  • IaC: Terraform — обучающий курс по управлению инфраструктурой в облаке с помощью Terraform.

Была ли статья полезна?

Предыдущая
Создание триггеров, которые вызывают функции для остановки ВМ и отправки уведомлений в Telegram
Следующая
Источники данных Terraform
Сделано на Gravity UI
Проект Яндекса
© 2026 ООО «Яндекс.Облако»