Terraform: отдельные модули против одного большого проекта - PullRequest
0 голосов
/ 06 июня 2019

Я работаю над проектом Datalake, состоящим из множества сервисов: 1VPC (+ подсети, группы безопасности, интернет-шлюз, ...), сегменты S3, кластер EMR, Redshift, ElasticSearch, некоторые функции Lambdas, API-шлюз и RDS.

Мы можем сказать, что некоторые ресурсы являются «статичными», так как они будут созданы только один раз и не изменятся в будущем, например: VPC + подсети и сегменты S3

Другие ресурсы будутизменения в течение жизненного цикла проекта разработки и производства.

Мой вопрос, каков наилучший способ управления структурой проекта?

Я впервые начал так:

-modules
  .rds
    .main.tf
    .variables.tf
    .output.tf
  -emr
  -redshift
  -s3
  -vpc
  -elasticsearch
  -lambda
  -apigateway
.main.tf
.variables.tf

Таким образом, мне нужно только сделать terraform apply, и он развернет все службы.

Второй вариант (я видел, что некоторые разработчики используют его) заключается в том, что каждый сервис будет находиться в отдельной папке, и тогда мы только перейдем в папку сервиса, который мы хотим запустить, а затем выполним terraform apply

Мы будем от 2 до 4 разработчиков этого проекта, и некоторые из нас будут работать только на отдельных ресурсах.

Какую стратегию вы посоветуете мне придерживаться?Или, может быть, у вас есть другая идея и лучшая практика?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 07 июня 2019

То, как мы это делаем, - это отдельные модули для каждой службы с «базовым» модулем, который настраивает VPC, подсети, политики безопасности, CloudTrail и т. Д.

Модули для каждой службы являются самостоятельнымисодержится по возможности.Например, модуль для нашего кластера RDS создает кластер, группу безопасности, все необходимые политики IAM, запись диспетчера секретов, сигналы тревоги CloudWatch для мониторинга и т. Д.

Затем у нас есть «модуль» развертывания вверхуэто включает основополагающий модуль плюс любые другие необходимые ему модули.Одно развертывание для каждой учетной записи AWS, поэтому у нас есть развертывание для нашей учетной записи dev, для нашей учетной записи prod и т. Д.

Модуль развертывания - это место, где мы настраиваем любую межмодульную связь.Например, если веб-серверам необходимо общаться с кластером RDS, мы создадим правило группы безопасности, чтобы подключить SG от модуля веб-сервера к SG от модуля RDS (оба модуля передают обратно свой идентификатор группы безопасности в качестве выхода).

Думайте о развертывании как список покупок модулей и сшивание между ними.

Если вы работаете с модулем, и изменение является автономным, вы можете применить терраформу -target = module.modulename, чтобы изменить свою вещь, не мешая другим.Когда в вашей учетной записи много ресурсов, это также удобно, поэтому планы и заявки могут выполняться быстрее.

PS Я также НАСТОЯТЕЛЬНО рекомендую вам установить удаленное состояние для Terraform, хранящегося в S3, с DynamoDB для блокировки.Если у вас несколько разработчиков, вы НЕ хотите пытаться управлять файлом состояния самостоятельно, так как вы БУДЕТЕ забивать работу друг друга.У меня обычно есть файл state.tf в модуле развертывания, который устанавливает удаленное состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...