Amazon web services 跨微服务环境模块化地构建IaC
我正试图重构我的IaC地形设置,以减少代码重复,更快地进行更改。我正在开发一个无服务器的微服务应用程序,因此,例如,我正在运行几个aws ecs autoscaling和aws ecs实例。我有开发和生产环境,在每个环境中都有一个模块文件夹,其中定义了每个微服务模块。请参阅模拟文件夹结构的图片 如您所见,有许多重复的文件夹。在dev和prod环境的main.tf中,调用每个模块并分配变量 例如: ecs-autoscaling-microservice-A main.tfAmazon 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 &
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用于开发和产品环境。