Состояние инфраструктуры в больших проектах становится узким местом при масштабировании команд и сервисов. Remote state решает проблемы с блокировками и конкурентным доступом, но требует продуманной структуры. Главный принцип — разделение state-файлов по четким границам ответственности.
В основе грамотного управления состоянием лежит принцип разделения state-файлов по логическим границам. Каждый state-файл описывает независимый компонент инфраструктуры. Такой подход уменьшает риск конфликтов при параллельной работе нескольких команд:
# network/main.tf
terraform {
backend "s3" {
bucket = "terraform-states"
key = "network/terraform.tfstate"
endpoint = "storage.yandexcloud.net"
}
}
# databases/main.tf
terraform {
backend "s3" {
bucket = "terraform-states"
key = "databases/terraform.tfstate"
endpoint = "storage.yandexcloud.net"
}
}
Для обмена данными между состояниями используется data source terraform_remote_state. Сетевые настройки из одного state становятся доступны другим компонентам. Это позволяет избежать жесткой связанности между модулями и упрощает поддержку кода:
data "terraform_remote_state" "network" {
backend = "s3"
config = {
bucket = "terraform-states"
key = "network/terraform.tfstate"
endpoint = "storage.yandexcloud.net"
}
}
resource "yandex_mdb_postgresql_cluster" "postgres" {
name = "prod-postgres"
environment = "PRODUCTION"
network_id = data.terraform_remote_state.network.outputs.network_id
config {
version = "15"
resources {
resource_preset_id = "s3-c2-m8"
disk_size = 100
}
}
}При работе с секретами state-файл шифруется на уровне Object Storage через KMS. Ключ доступа выдается только членам инфраструктурной команды. Дополнительный уровень защиты обеспечивает audit log всех операций с state-файлом:
terraform {
backend "s3" {
bucket = "terraform-states"
key = "secrets/terraform.tfstate"
endpoint = "storage.yandexcloud.net"
kms_key_id = "abjhq8c9gct5pd5klm7p"
access_key = var.storage_access_key
secret_key = var.storage_secret_key
}
}Отдельное внимание стоит уделить резервному копированию state-файлов. Настройка репликации бакетов между регионами защищает от потери данных при отказе основного региона. А регулярные бэкапы позволяют восстановить состояние на любой момент времени.
🏴☠️ @happy_devops