跨微服务环境模块化 Terraform IaC

Posted

技术标签:

【中文标题】跨微服务环境模块化 Terraform IaC【英文标题】:Modularising Terraform IaC across microservice environments 【发布时间】:2021-07-03 02:21:57 【问题描述】:

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

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

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

我的问题是删除所有模块的最佳方法是什么。因此,我不必为 prod 和 dev 环境中的每个微服务都有一个 ecs 模块,我可以只为 ecs 提供一个模块,可以在任何环境中重新用于任何微服务。有关所需的文件夹结构,请参阅图像。这是可能的还是我在浪费时间?我正在考虑使用某种 for_each ,其中每个微服务都预先定义了其拥有的映射变量。但希望得到一些指导。提前致谢!

【问题讨论】:

您必须参数化您的模块。您还可以将 tf workspaces 用于开发和生产环境。 您可以创建模块的模块。并重用您的自定义模块。确保遵循 DRY 原则。 【参考方案1】:

我建议您阅读 Yevgeniy Brikman 撰写的关于 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

【讨论】:

以上是关于跨微服务环境模块化 Terraform IaC的主要内容,如果未能解决你的问题,请参考以下文章

跨微服务发送公共 API 版本控制

使用 Django REST 框架跨微服务共享数据库关系

是否应该使用数据库主键来识别跨微服务的实体?

您应该如何处理跨微服务的身份验证和共享用户信息?

如何将跨微服务的端到端测试包含到多个持续交付管道中?

text DigitalOcean Terraform模块服务定义