Terraform: инфраструктура на уровне кода | страница 69
1. Написать код Terraform, чтобы создать бакет S3 и таблицу DynamoDB, а затем развернуть этот код с использованием локального хранилища.
2. Вернуться к коду Terraform, добавить в него конфигурацию для удаленного хранилища, чтобы применить свежесозданные бакет S3 и таблицу DynamoDB, и выполнить команду terraforminit, чтобы скопировать ваше локальное состояние в S3.
Если вы когда-нибудь захотите удалить бакет S3 и таблицу DynamoDB, придется выполнить обратные действия.
1. Перейти к коду Terraform, удалить конфигурацию backend и снова выполнить команду terraforminit, чтобы скопировать состояние Terraform обратно на локальный диск.
2. Выполнить terraformdestroy, чтобы удалить бакет S3 и таблицу DynamoDB.
Этот двухступенчатый процесс довольно непростой, зато вы можете использовать во всем своем коде Terraform одни и те же бакет S3 и таблицу DynamoDB, поэтому нужно выполнить его лишь раз (или единожды для каждой учетной записи AWS, если у вас их несколько). Если у вас уже есть бакет S3, вы можете сразу указывать конфигурацию backend в своем коде Terraform без дополнительных действий.
Второе ограничение более болезненное: в разделе backend в Terraform нельзя применять никакие переменные или ссылки. Следующий код не будет работать.
# Это НЕ будет работать. В конфигурации хранилища нельзя использовать переменные.
terraform {
backend "s3" {
bucket = var.bucket
region = var.region
dynamodb_table = var.dynamodb_table
key = "example/terraform.tfstate"
encrypt = true
}
}
Значит, необходимо вручную копировать и вставлять имя и регион бакета S3, а также название таблицы DynamoDB в каждый ваш модуль Terraform. Вы подробно познакомитесь с модулями Terraform в главах 4 и 6. Пока достаточно понимать, что модули — это способ организации и повторного использования кода Terraform и что настоящий код Terraform обычно состоит из множества мелких модулей. Что еще хуже, вам нужно быть очень осторожными, чтобы не скопировать значение key. Чтобы разные модули случайно не перезаписывали состояние друг друга, это значение должно быть уникальным для каждого из них! Частое копирование и ручное редактирование чреваты ошибками, особенно если нужно развертывать и администрировать множество модулей Terraform во многих средах.
По состоянию на май 2019 года единственным решением является использование частичной конфигурации, в которой можно опустить определенные параметры раздела backend и передавать их вместо этого в аргументе командной строки -backend-config при вызове terraforminit. Например, вы можете вынести повторяющиеся параметры хранилища, такие как bucket и region, в отдельный файл под названием backend.hcl: