Terraform: инфраструктура на уровне кода | страница 70



# backend.hcl

bucket         = "terraform-up-and-running-state"

region         = "us-east-2"

dynamodb_table = "terraform-up-and-running-locks"

encrypt        = true

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

# Частичная конфигурация. Другие параметры (такие как bucket, region) будут

# переданы команде 'terraform init' в виде файла с использованием

# аргументов -backend-config

terraform {

  backend "s3" {

    key = "example/terraform.tfstate"

  }

}

Чтобы собрать воедино все фрагменты вашей конфигурации, выполните команду terraforminit с аргументом -backend-config:

$ terraform init -backend-config=backend.hcl

Terraform объединит частичную конфигурацию из файла backend.hcl и вашего кода Terraform, чтобы получить полный набор параметров для вашего модуля.

Еще один вариант заключается в применении Terragrunt, инструмента с открытым исходным кодом, который пытается компенсировать то, чего не хватает в Terraform. Terragrunt может помочь избежать дублирования базовых параметров хранилища (имя и регион бакета, имя таблицы DynamoDB) за счет определения их в едином файле и автоматического применения относительного файлового пути модуля в качестве значения key. Пример с Terragrunt будет показан в главе 8.


Изоляция файлов состояния

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

Например, при попытке развертывания новой версии своего приложения в среде финального тестирования вы можете нарушить его работу в промышленных ­условиях. Или еще хуже, вы можете повредить весь файл состояния (скажем, из-за отсутствия блокирования либо из-за редкой программной ошибки в Terraform), в результате чего ваша инфраструктура выйдет из строя во всех средах38.

Весь смысл поддержки нескольких сред состоит в том, что они изолированы друг от друга, поэтому, если вы управляете всеми ими из одного набора конфигурационных файлов Terraform, вы нарушаете эту изоляцию. По аналогии с переборками, которые не дают затопить все секции судна из-за протечки в одной из них, вы должны предусмотреть «переборки» для своей архитектуры Terraform (рис. 3.3).