Загрузка состояний Terraform в Object Storage
В инструкции описываются шаги загрузки состояния Terraform в Yandex Object Storage.
Состояние Terraform описывает текущую развернутую инфраструктуру и хранится в файлах с расширением .tfstate
. Файл состояния создается после развертывания инфраструктуры и может быть сразу загружен в Object Storage. Загруженный файл состояния будет обновляться после изменений созданной инфраструктуры.
В этом примере сохраненное состояние позволит другим пользователям получить идентификатор одной из созданных подсетей, чтобы подключить к ней новую виртуальную машину.
Чтобы настроить хранение состояний Terraform в Object Storage и использовать его для создания новых ресурсов:
- Подготовьте облако к работе.
- Необходимые платные ресурсы.
- Установите Terraform.
- Создайте файл конфигурации Terraform.
- Настройте провайдер.
- Создайте сервисный аккаунт и статический ключ доступа.
- Создайте бакет.
- Настройте бэкенд.
- Разверните конфигурацию.
- Проверьте сохраненное состояние.
- Получите состояние из бэкенда.
Если созданные ресурсы вам больше не нужны, удалите их.
Terraform и его провайдеры распространяются под лицензией Mozilla Public License.
Подготовьте облако к работе
Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
Внимание
Все созданные с помощью Terraform ресурсы тарифицируются, внимательно проверьте конфигурации, которые будут использоваться далее.
В этом сценарии будут созданы три виртуальных машины с публичными IP-адресами, виртуальная сеть и две подсети.
В стоимость поддержки этой инфраструктуры входят:
- плата за хранение данных (см. тарифы Yandex Object Storage);
- плата за диски и постоянно запущенные виртуальные машины (см. тарифы Yandex Compute Cloud);
- плата за использование динамических публичных IP-адресов (см. тарифы Yandex Virtual Private Cloud).
Установите Terraform
Из зеркала
Вы можете скачать дистрибутив Terraform для вашей платформы из зеркала. После загрузки добавьте путь к папке, в которой находится исполняемый файл, в переменную PATH
:
export PATH=$PATH:/path/to/terraform
С сайта Hashicorp
Используйте один из способов:
-
Скачайте дистрибутив Terraform и установите его согласно инструкции.
-
Установите Terraform с помощью пакетного менеджера Chocolatey, используя команду:
choco install terraform
Скачайте дистрибутив Terraform и установите его согласно инструкции.
Используйте один из способов:
-
Скачайте дистрибутив Terraform и установите его согласно инструкции.
-
Установите Terraform с помощью пакетного менеджера Homebrew, используя команду:
brew install terraform
Создайте файл конфигурации Terraform
- Создайте директорию с произвольным названием, например
cloud-terraform
. В ней будут храниться конфигурационные файлы Terraform. - Создайте в этой директории конфигурационный файл с расширением
.tf
, например,example.tf
.
Настройте провайдер
Примечание
Настройки применимы для Terraform 0.13
и более поздних версий. Рекомендуется использовать последнюю стабильную версию Terraform.
-
Если раньше у вас был настроен провайдер из реестра Hashicorp, сохраните его настройки:
Linux и macOSWindowsmv ~/.terraformrc ~/.terraformrc.old
mv $env:APPDATA/terraform.rc $env:APPDATA/terraform.rc.old
-
Укажите источник, из которого будет устанавливаться провайдер.
Linux и macOSWindowsОткройте файл конфигурации Terraform CLI:
nano ~/.terraformrc
Откройте файл конфигурации Terraform CLI
terraform.rc
в папке%APPDATA%
вашего пользователя.Добавьте в него следующий блок:
provider_installation { network_mirror { url = "https://terraform-mirror.yandexcloud.net/" include = ["registry.terraform.io/*/*"] } direct { exclude = ["registry.terraform.io/*/*"] } }
Подробнее о настройках зеркал см. в документации.
-
В начале конфигурационного файла
.tf
добавьте следующие блоки:terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } required_version = ">= 0.13" } provider "yandex" { zone = "<зона доступности по умолчанию>" }
Где:
source
— глобальный адрес источника провайдера.required_version
— минимальная версия Terraform, с которой совместим провайдер.provider
— название провайдера.zone
— зона доступности, в которой по умолчанию будут создаваться все облачные ресурсы.
-
Выполните команду
terraform init
в папке с конфигурационным файлом.tf
. Эта команда инициализирует провайдеров, указанных в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера.
Если провайдер не установился, создайте обращение в поддержку с именем и версией провайдера.
Если вы использовали файл .terraform.lock.hcl
, то перед инициализацией выполните команду terraform providers lock
, указав адрес зеркала, откуда будет загружаться провайдер, и платформы, на которых будет использоваться конфигурация:
terraform providers lock -net-mirror=https://terraform-mirror.yandexcloud.net -platform=linux_amd64 -platform=darwin_arm64 yandex-cloud/yandex
Если вы использовали модули, то сначала выполните terraform init
, затем удалите lock-файл, а затем выполните команду terraform providers lock
.
Создайте сервисный аккаунт и статический ключ доступа
- Создайте сервисный аккаунт с ролью
editor
на каталог, указанный в настройках провайдера. - Получите статический ключ доступа. Сохраните идентификатор ключа и секретный ключ — они понадобятся в следующих разделах инструкции.
Создайте бакет
Создайте бакет с любым именем, например terraform-object-storage-tutorial
. В нем будет храниться файл состояния Terraform.
Настройте бэкенд
Чтобы сохранить состояние Terraform в Object Storage, укажите настройки провайдера и бэкенда:
terraform {
required_providers {
yandex = {
source = "yandex-cloud/yandex"
}
}
backend "s3" {
endpoint = "storage.yandexcloud.net"
bucket = "<имя бакета>"
region = "ru-central1"
key = "<путь к файлу состояния в бакете>/<имя файла состояния>.tfstate"
access_key = "<идентификатор статического ключа>"
secret_key = "<секретный ключ>"
skip_region_validation = true
skip_credentials_validation = true
}
}
provider "yandex" {
token = "<OAuth или статический ключ сервисного аккаунта>"
cloud_id = "<идентификатор облака>"
folder_id = "<идентификатор каталога>"
zone = "<зона доступности по умолчанию>"
}
Подробнее о бэкенде для хранения состояний читайте на сайте 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.
-
Сохраните следующую конфигурацию в файл
example.tf
:terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } backend "s3" { endpoint = "storage.yandexcloud.net" bucket = "<имя бакета>" region = "ru-central1" key = "<путь к файлу состояния в бакете>/<имя файла состояния>.tfstate" access_key = "<идентификатор статического ключа>" secret_key = "<секретный ключ>" skip_region_validation = true skip_credentials_validation = true } } provider "yandex" { token = "<OAuth или статический ключ сервисного аккаунта>" cloud_id = "<идентификатор облака>" folder_id = "<идентификатор каталога>" zone = "ru-central1-a" } resource "yandex_compute_image" "ubuntu_2004" { source_family = "ubuntu-2004-lts" } resource "yandex_compute_instance" "vm-1" { name = "terraform1" resources { cores = 2 memory = 2 } boot_disk { initialize_params { image_id = yandex_compute_image.ubuntu_2004.id } } network_interface { subnet_id = yandex_vpc_subnet.subnet-1.id nat = true } metadata = { ssh-keys = "ubuntu:${file("~/.ssh/id_ed25519.pub")}" } } resource "yandex_compute_instance" "vm-2" { name = "terraform2" resources { cores = 2 memory = 4 } boot_disk { initialize_params { image_id = yandex_compute_image.ubuntu_2004.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-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 }
-
Проверьте конфигурацию с помощью команды
terraform plan
. -
Разверните конфигурацию с помощью команды
terraform apply
.
Проверьте сохраненное состояние
Убедитесь, что файл состояния загружен в Object Storage:
- Откройте консоль управления и выберите каталог, в котором находится созданный бакет.
- Выберите сервис Object Storage.
- В списке бакетов выберите тот, куда должно было сохраниться состояние Terraform.
- Убедитесь, что в бакете появился файл состояния.
Получите состояние из бэкенда
Сохраненное в Object Storage состояние Terraform можно запросить из другой конфигурации и дополнить уже созданную инфраструктуру.
Создайте еще одну конфигурацию и используйте сохраненное состояние, чтобы создать еще одну виртуальную машину в одной из заранее созданных подсетей:
-
Создайте директорию
remote-state
. -
Перейдите в созданную директорию и создайте конфигурацию
remote-state.tf
:terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } } 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 = "ru-central1" key = "<путь к файлу состояния в бакете>/<имя файла состояния>.tfstate" access_key = "<идентификатор статического ключа>" secret_key = "<секретный ключ>" skip_region_validation = true skip_credentials_validation = true } } resource "yandex_compute_instance" "vm-3" { name = "terraform3" resources { cores = 2 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_ed25519.pub")}" } }
-
Выполните команду
terraform init
. -
Выполните команду
terraform plan
. В терминале должен отобразиться план создания одной виртуальной машины. -
Выполните команду
terraform apply
. -
Перейдите в консоль управления и убедитесь, что в разделе Compute Cloud появилась виртуальная машина
vm-3
.
Удалите созданные ресурсы
Чтобы удалить созданные ресурсы, выполните команду terraform destroy
сначала во второй конфигурации, а затем в первой.