Terraform: инфраструктура на уровне кода | страница 76
Возьмем код кластера с веб-сервером, который вы написали в главе 2, объединим его с кодом для Amazon S3 и DynamoDB из этой главы и организуем это все в виде структуры каталогов, представленной на рис. 3.8.
Рис. 3.8. Структура файлов для кода кластера с веб-сервером
Бакет S3, созданный вами в этой главе, необходимо переместить в папку global/s3. Поместите выходные переменные (s3_bucket_arn и dynamodb_table_name) в файл outputs.tf. При перемещении файлов в новое место убедитесь, что вы не забыли скопировать (скрытую) папку .terraform, иначе придется заново все инициализировать.
Кластер веб-серверов, который вы создали в главе 2, следует поместить в папку stage/services/webserver-cluster (своего рода тестовая версия этого кластера; промышленную мы добавим в следующей главе). Не забудьте скопировать папку .terraform и поместить входные и выходные переменные в файлы variables.tf и соответственно outputs.tf.
Вам также необходимо обновить кластер веб-серверов, чтобы он использовал S3 в качестве хранилища. Вы можете просто скопировать и вставить раздел backend из файла global/s3/main.tf без особых изменений, но не забудьте присвоить параметру key путь к папке, в которой находится код веб-сервера: stage/services/webserver-cluster/terraform.tfstate. Таким образом, код Terraform в системе управления версиями и структура ваших файлов состояния будут полностью совпадать и вам будет очевидно то, как они между собой связаны. Модуль s3 использует этот же принцип для установки параметра key.
Такая структура файлов и каталогов упрощает просмотр кода и помогает понять, какие именно компоненты развернуты в той или иной среде. Кроме того, она обеспечивает хорошую степень изоляции между окружениями и между компонентами внутри одного окружения. Благодаря этому, если что-то пойдет не так, это коснется лишь небольшой части вашей инфраструктуры.
Конечно, это свойство в каком-то смысле является и недостатком: разделение компонентов на отдельные папки не дает случайной оплошности нарушить работу всей инфраструктуры, но при этом лишает вас возможности развертывать всю инфраструктуру одной командой. Если бы все компоненты для одного окружения были описаны в одном конфигурационном файле Terraform, вы бы могли запустить все это окружение с помощью единого вызова terraformapply. Но если все компоненты находятся в отдельных папках, нужно выполнить terraformapply в каждой из них. Стоит отметить, что в случае применения Terragrunt вы можете автоматизировать этот процесс с помощью команды apply-all39.