Я пытаюсь реорганизовать свой 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, где каждый микросервис определяется заранее с его собственными отображенными переменными. Но, пожалуйста, мне нужны некоторые рекомендации. Заранее спасибо!