То, как мы это делаем, - это отдельные модули для каждой службы с «базовым» модулем, который настраивает VPC, подсети, политики безопасности, CloudTrail и т. Д.
Модули для каждой службы являются самостоятельнымисодержится по возможности.Например, модуль для нашего кластера RDS создает кластер, группу безопасности, все необходимые политики IAM, запись диспетчера секретов, сигналы тревоги CloudWatch для мониторинга и т. Д.
Затем у нас есть «модуль» развертывания вверхуэто включает основополагающий модуль плюс любые другие необходимые ему модули.Одно развертывание для каждой учетной записи AWS, поэтому у нас есть развертывание для нашей учетной записи dev, для нашей учетной записи prod и т. Д.
Модуль развертывания - это место, где мы настраиваем любую межмодульную связь.Например, если веб-серверам необходимо общаться с кластером RDS, мы создадим правило группы безопасности, чтобы подключить SG от модуля веб-сервера к SG от модуля RDS (оба модуля передают обратно свой идентификатор группы безопасности в качестве выхода).
Думайте о развертывании как список покупок модулей и сшивание между ними.
Если вы работаете с модулем, и изменение является автономным, вы можете применить терраформу -target = module.modulename, чтобы изменить свою вещь, не мешая другим.Когда в вашей учетной записи много ресурсов, это также удобно, поэтому планы и заявки могут выполняться быстрее.
PS Я также НАСТОЯТЕЛЬНО рекомендую вам установить удаленное состояние для Terraform, хранящегося в S3, с DynamoDB для блокировки.Если у вас несколько разработчиков, вы НЕ хотите пытаться управлять файлом состояния самостоятельно, так как вы БУДЕТЕ забивать работу друг друга.У меня обычно есть файл state.tf в модуле развертывания, который устанавливает удаленное состояние.