Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 跨微服务环境模块化地构建IaC_Amazon Web Services_Terraform_Microservices_Terraform Provider Aws_Infrastructure As Code - Fatal编程技术网

Amazon web services 跨微服务环境模块化地构建IaC

Amazon web services 跨微服务环境模块化地构建IaC,amazon-web-services,terraform,microservices,terraform-provider-aws,infrastructure-as-code,Amazon Web Services,Terraform,Microservices,Terraform Provider Aws,Infrastructure As Code,我正试图重构我的IaC地形设置,以减少代码重复,更快地进行更改。我正在开发一个无服务器的微服务应用程序,因此,例如,我正在运行几个aws ecs autoscaling和aws ecs实例。我有开发和生产环境,在每个环境中都有一个模块文件夹,其中定义了每个微服务模块。请参阅模拟文件夹结构的图片 如您所见,有许多重复的文件夹。在dev和prod环境的main.tf中,调用每个模块并分配变量 例如: ecs-autoscaling-microservice-A main.tf resource &

我正试图重构我的IaC地形设置,以减少代码重复,更快地进行更改。我正在开发一个无服务器的微服务应用程序,因此,例如,我正在运行几个aws ecs autoscaling和aws ecs实例。我有开发和生产环境,在每个环境中都有一个模块文件夹,其中定义了每个微服务模块。请参阅模拟文件夹结构的图片

如您所见,有许多重复的文件夹。在dev和prod环境的main.tf中,调用每个模块并分配变量

例如:

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
  }
}
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
}
开发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
  }
}
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
}
我的问题是移除所有模块的最佳方式是什么。因此,我不需要为prod和dev环境中的每个微服务都配备一个ecs模块,而只需要为ecs配备一个模块,可以在任何环境中的任何微服务中重复使用。有关所需的文件夹结构,请参见图。这是可能的还是我在浪费时间?我在考虑使用某种for_-each,其中每个微服务都是用自己的映射变量预先定义的。但是我想要一些指导。提前谢谢


我建议您阅读Yevgeniy Brikman关于Terraform的一系列优秀博文,这些博文澄清了我对Terraform的理解:


这篇文章似乎触及了这个确切的问题:

您必须对模块进行参数化。您还可以将tf用于开发和产品环境。