Загрузка состояний Terraform в Object Storage

В инструкции описываются шаги загрузки состояния Terraform в Yandex Object Storage.

Состояние Terraform описывает текущую развернутую инфраструктуру и хранится в файлах с расширением .tfstate. Файл состояния создается после развертывания инфраструктуры и может быть сразу загружен в Object Storage. Загруженный файл состояния будет обновляться после изменений созданной инфраструктуры.

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

Чтобы настроить хранение состояний Terraform в Object Storage и использовать его для создания новых ресурсов:

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

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

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

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

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

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

Предупреждение

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

В этом сценарии будут созданы три виртуальных машины с публичными IP-адресами, виртуальная сеть и две подсети.

В стоимость поддержки этой инфраструктуры входят:

Установите Terraform

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

Установите Terraform с помощью пакетного менеджера Homebrew:

$ brew install terraform

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

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

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

  1. В начале конфигурационного файла необходимо задать настройки провайдера.

    provider "yandex" {
      token     = "<OAuth или статический ключ сервисного аккаунта>"
      folder_id = "<идентификатор каталога>"
      zone      = "ru-central1-a"
    }
    
    • provider — название провайдера.
    • tokenOAuth-токен для доступа к Яндекс.Облаку.
    • folder_idидентификатор каталога, в котором Terraform создаст облачные ресурсы.
    • zone — зона доступности, в которой по умолчанию будут создаваться все облачные ресурсы.
  2. Выполните команду terraform init в папке с конфигурационным файлом. Эта команда инициализирует провайдеров, указанных в конфигурационных файлах и позволяет работать с ресурсами и источниками данных провайдера.

Создайте сервисный аккаунт и статический ключ доступа

  1. Создайте сервисный аккаунт с ролью editor на каталог, указанный в настройках провайдера.
  2. Получите статический ключ доступа. Сохраните идентификатор ключа и секретный ключ — они понадобятся в следующих разделах инструкции.

Создайте бакет

Создайте бакет с любым именем, например terraform-object-storage-tutorial. В нем будет храниться файл состояния Terraform.

Настройте бэкенд

Чтобы сохранить состояние Terraform в Object Storage, необходимо указать настройки провайдера и бэкенда:

provider "yandex" {
  token     = "<OAuth или статический ключ сервисного аккаунта>"
  folder_id = "<идентификатор каталога>"
  zone      = "ru-central1-a"
}

terraform {
  backend "s3" {
    endpoint   = "storage.yandexcloud.net"
    bucket     = "<имя бакета>"
    region     = "us-east-1"
    key        = "<путь к файлу состояния в бакете>/<имя файла состояния>.tfstate"
    access_key = "<идентификатор статического ключа>"
    secret_key = "<секретный ключ>"

    skip_region_validation      = true
    skip_credentials_validation = true
  }
}

Подробнее о бэкенде для хранения состояний читайте на сайте Terraform.

Разверните конфигурацию

В этом примере будут созданы две виртуальные машины: terraform1 и terraform2. Они будут подключены к подсети subnet-1 в зоне доступности ru-central1-a. Подсеть будет принадлежать облачной сети network-1.

У машин будут разные количества ядер и объемы памяти: 1 ядро и 2 Гб оперативной памяти у terraform1 и 2 ядра и 4 Гб оперативной памяти у terraform2. Машины автоматически получат публичные IP-адреса и приватные IP-адреса из диапазона 192.168.10.0/24 в подсети subnet-1. На виртуальных машинах будет установлена операционная система Ubuntu и размещена публичная часть ключа для доступа к машинам по SSH.

  1. Сохраните следующую конфигурацию в файл example.tf:

    provider "yandex" {
    token     = "<OAuth или статический ключ сервисного аккаунта>"
    folder_id = "<идентификатор каталога>"
    zone      = "ru-central1-a"
    }
    
    terraform {
      backend "s3" {
        endpoint   = "storage.yandexcloud.net"
        bucket     = "<имя бакета>"
        region     = "us-east-1"
        key        = "<путь к файлу состояния в бакете>/<имя файла состояния>.tfstate"
        access_key = "<идентификатор статического ключа>"
        secret_key = "<секретный ключ>"
    
        skip_region_validation      = true
        skip_credentials_validation = true
      }
    }
    
    resource "yandex_compute_instance" "vm-1" {
      name = "terraform1"
    
      resources {
        cores  = 1
        memory = 2
      }
    
      boot_disk {
        initialize_params {
          image_id = "fd87va5cc00gaq2f5qfb"
        }
      }
    
      network_interface {
        subnet_id = "${yandex_vpc_subnet.subnet-1.id}"
        nat       = true
      }
    
      metadata = {
        ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
      }
    }
    
    resource "yandex_compute_instance" "vm-2" {
      name = "terraform2"
    
      resources {
        cores  = 2
        memory = 4
      }
    
      boot_disk {
        initialize_params {
          image_id = "fd87va5cc00gaq2f5qfb"
        }
      }
    
      network_interface {
        subnet_id = "${yandex_vpc_subnet.subnet-1.id}"
        nat       = true
      }
    
      metadata = {
        ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
      }
    }
    
    resource "yandex_vpc_network" "network-1" {
      name = "network1"
    }
    
    resource "yandex_vpc_subnet" "subnet-1" {
      name           = "subnet1"
      zone           = "ru-central1-a"
      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}"
    }
    
    output "subnet-1" {
      value = "${yandex_vpc_subnet.subnet-1.id}"
    }
    
  2. Проверьте конфигурацию c помощью команды terraform plan.

  3. Разверните конфигурацию с помощью команды terraform apply.

Проверьте сохраненное состояние

Убедитесь, что файл состояния загружен в Object Storage:

  1. Откройте консоль управления и выберите каталог, в котором находится созданный бакет.
  2. Выберите сервис Object Storage.
  3. В списке бакетов выберите тот, куда должно было сохраниться состояние Terraform.
  4. Убедитесь, что в бакете появился файл состояния.

Получите состояние из бэкенда

Сохраненное в Object Storage состояние Terraform можно запросить из другой конфигурации и дополнить уже созданную инфраструктуру.

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

  1. Создайте директорию remote-state.

  2. Перейдите в созданную директорию и создайте конфигурацию remote-state.tf:

    provider "yandex" {
      token     = "<OAuth или статический ключ сервисного аккаунта>"
      cloud_id  = "cloud-id"
      folder_id = "folder-id"
      zone      = "ru-central1-a"
    }
    
    data "terraform_remote_state" "vpc" {
      backend = "s3"
      config = {
        endpoint   = "storage.yandexcloud.net"
        bucket     = "<имя бакета>"
        region     = "us-east-1"
        key        = "<путь к файлу состояния в бакете>/<имя файла состояния>.tfstate"
        access_key = "<идентификатор статического ключа>"
        secret_key = "<секретный ключ>"
    
        skip_region_validation      = true
        skip_credentials_validation = true
      }
    }
    
    resource "yandex_compute_instance" "vm-3" {
      name = "terraform3"
    
      resources {
        cores  = 1
        memory = 2
      }
    
      boot_disk {
        initialize_params {
          image_id = "fd87va5cc00gaq2f5qfb"
        }
      }
    
      network_interface {
        subnet_id = data.terraform_remote_state.vpc.outputs.subnet-1
        nat       = true
      }
    
      metadata = {
        ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
      }
    }
    
    
  3. Выполните команду terraform init.

  4. Выполните команду terraform plan. В терминале должен отобразиться план создания одной виртуальной машины.

  5. Выполните команду terraform apply.

  6. Перейдите в консоль управления и убедитесь, что в разделе Compute Cloud появилась виртуальная машина vm-3.

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

Чтобы удалить созданные ресурсы, выполните команду terraform destroy сначала во второй конфигурации, а затем в первой.