Модуляризация Terraform IaC в микросервисных средах

Я пытаюсь реорганизовать свой IaC Terraform, чтобы повторять меньше кода и быстрее вносить изменения. Я работаю над бессерверным микросервисным приложением, поэтому, например, я запускаю несколько экземпляров aws-ecs-autoscaling и aws-ecs. У меня есть среды разработки и производства, и в каждой из них есть папка модулей, в которой определен каждый модуль микросервиса. См. Изображение для макета структуры папок.

введите описание изображения здесь

Как видите, существует много повторяющихся папок. В main.tf сред dev и prod каждый модуль вызывается и назначается переменная.

EG:

ecs-autoscaling-microservice-A main.tf

resource "aws_appautoscaling_target" "dev_ecs_autoscaling_microservice_A_target" {
  max_capacity = 2
  min_capacity = 1
  resource_id = "service/${var.ecs_cluster.name}/${var.ecs_service.name}"
  scalable_dimension = "ecs:service:DesiredCount"
  service_namespace = "ecs"
}

resource "aws_appautoscaling_policy" "dev_ecs_autoscaling_microservice_A_memory" {
  name               = "dev_ecs_autoscaling_microservice_A_memory"
  policy_type        = "TargetTrackingScaling"
  resource_id        = aws_appautoscaling_target.dev_ecs_autoscaling_microservice_A_target.resource_id
  scalable_dimension = aws_appautoscaling_target.dev_ecs_autoscaling_microservice_A_target.scalable_dimension
  service_namespace  = aws_appautoscaling_target.dev_ecs_autoscaling_microservice_A_target.service_namespace

  target_tracking_scaling_policy_configuration {
    predefined_metric_specification {
      predefined_metric_type = "ECSServiceAverageMemoryUtilization"
    }
    target_value       = 80
  }
}

resource "aws_appautoscaling_policy" "dev_ecs_autoscaling_microservice_A_cpu" {
  name = "dev_ecs_autoscaling_microservice_A_cpu"
  policy_type = "TargetTrackingScaling"
  resource_id = aws_appautoscaling_target.dev_ecs_autoscaling_microservice_A_target.resource_id
  scalable_dimension = aws_appautoscaling_target.dev_ecs_autoscaling_microservice_A_target.scalable_dimension
  service_namespace = aws_appautoscaling_target.dev_ecs_autoscaling_microservice_A_target.service_namespace

  target_tracking_scaling_policy_configuration {
    predefined_metric_specification {
      predefined_metric_type = "ECSServiceAverageCPUUtilization"
    }
    target_value = 60
  }
}

РАЗРАБОТАТЬ main.tf

module "ecs_autoscaling_microservice_A" {
  source      = "./modules/ecs-autoscaling-microservice-A"
  ecs_cluster = module.ecs_autoscaling_microservice_A.ecs_cluster_A
  ecs_service = module.ecs_autoscaling_microservice_A.ecs_service_A
}

Мой вопрос в том, как лучше всего удалить все модули. Итак, вместо того, чтобы иметь модуль ecs для каждого микросервиса как для среды prod, так и для среды разработки, я могу просто иметь 1 модуль для ecs, который можно повторно использовать для любого микросервиса в любой среде. См. Изображение для требуемой структуры папок. Возможно ли это, или я зря трачу время? Я думал об использовании какого-то for_each, где каждый микросервис определяется заранее с его собственными отображенными переменными. Но, пожалуйста, мне нужны некоторые рекомендации. Заранее спасибо!

введите описание изображения здесь


comment
Вам придется параметризовать свои модули. Вы также можете использовать tf рабочие области для сред разработки и производства.   -  person Marcin    schedule 07.04.2021


Ответы (1)


Я предлагаю вам прочитать отличную серию сообщений в блоге Евгения Брикмана о Terraform, которые прояснили мое понимание Terraform:

https://blog.gruntwork.io/a-comprehensive-guide-to-terraform-b3d32832baca

Этот точный вопрос, кажется, затронут в этом: https://blog.gruntwork.io/how-to-create-reusable-infrastructure-with-terraform-modules-25526d65f73d

person dennyrolling    schedule 08.04.2021