Лучшей практикой для создания кода Terraform является
... в большинстве случаев мы настоятельно рекомендуем сохранять дерево модулей плоским, используя только один уровень дочерних модулей, и использовать технику, аналогичнуювышеприведенное использование выражений для описания отношений между модулями
From: Руководство по составлению модулей TF
В основном это означает:
- Держите модули в другом git или в той же папке уровня, что и ваши немодульные tf-файлы (
provisioners
), делайте модули небольшими и придерживайтесь SRP (Single Responsibility). - Составьте сложный поток с помощью компоновки модулей, имея в виду DIP - Инверсия зависимостей
- Модули являются абстракциями с одной ответственностью, в то время как
provisioners
являются фактическими настройками, которые составляют вызовы модулей- на плоском уровне, в то время как более поздние вызовы модулей могут использовать выходы предшествующих им вызовов модулей в потоке
Это означает:
- /modules
- /vpc
- vpc.tf
- /subnets_private
- subnets.tf
- routing_tables.tf
- /ecs_cluster
- iam_ecs.tf
- asg_ecs.tf
- /network
- /provisioners
- /staging
- /workload_cluster_core_domain
- main.tf
- /control_plane_network
- main.tf
Где main.tf имеют плоскую структуру:
module1--
|
--module2<-
|
->module3
Где каждый module
может использовать выходные данные из:
- предшествующих (в дереве зависимостей)
module
вызовов data
вызовов.
Конечно, вы можете разделить свои потоки на уровне состояния, но вам нужно будет поддерживать его, или использовать OOS framework, как Terragrunt, или написать свою собственную оболочку (довольно распространенный подход, кстати) - но это,очевидно, потребуется обернуть использование TF cli в bash / go / python / node / etc.