Использование для каждого с обновлением версии terraform с 0.12 до 0.13

Я работаю над обновлением версии terraform с 0.12 до 0.13. Пока что я могу создавать необходимые части, меняя провайдеров, а также свои модули.

Текущий статус service.tf

module "services" {
  source   = "../../modules/aws-ecs-servicev2"
  for_each = var.applications

  container_name               = each.value.container_name
  container_cpu                = each.value.container_cpu
  container_image              = each.value.container_image
  container_memory_total       = each.value.container_memory_total
  container_memory_reservation = each.value.container_memory_reservation
  deployment_max_percent       = each.value.deployment_max_percent
  deployment_min_healthy       = each.value.deployment_min_healthy
  container_host_port          = each.value.container_host_port
  container_port               = each.value.container_port
  command                      = each.value.command
  replica_count                = each.value.replica_count
  stage                        = each.value.stage
  alb_enabled                  = each.value.alb_enabled
  alb_subnets                  = module.vpc.public_subnets
  alb_https_enabled            = each.value.alb_https_enabled
  alb_ssl_arn                  = each.value.alb_ssl_arn
  health_check_path            = each.value.health_check_path
  internal_lb                  = each.value.health_check_path
  vault_key                    = each.value.vault_key
  vault_backend                = each.value.vault_backend
  cpu_based_autoscaling        = each.value.cpu_based_autoscaling
  target_cpu_value             = each.value.target_cpu_value
  max_capacity                 = each.value.max_capacity
  min_capacity                 = each.value.min_capacity
  scale_out_adjustment         = each.value.scale_out_adjustment
  scale_out_cooldown           = each.value.scale_out_cooldown
  scale_in_adjustment          = each.value.scale_in_adjustment
  scale_in_cooldown            = each.value.scale_in_cooldown
  disable_scale_in             = each.value.disable_scale_in
  ecs_arn                      = module.ecs.arn
  namespace                    = var.namespace
  sd_namespace_id              = aws_service_discovery_private_dns_namespace.default.id
  vpc_id                       = module.vpc.vpc_id
  health_check_response        = "200"
  alb_sgs                      = [aws_security_group.ecs_sg.id]
}

и application.tf

variable "applications" {
  description = "Map for the services to be deployed"
  type        = any
  default = {
    service-a = {
      container_cpu                = 512
      container_image              = service-a-image:latest
      container_memory_total       = 2048
      container_memory_reservation = 1024
      container_name               = "service-a"
      command                      = null
      deployment_max_percent       = 200
      deployment_min_healthy       = 50
      container_host_port          = [0]
      container_port               = [80]
      replica_count                = 1
      stage                        = "dev"
      health_check_path            = null
      internal_lb                  = false
      vault_key                    = null
      vault_backend                = null
      alb_enabled                  = false
      alb_ssl_arn                  = null
      alb_https_enabled            = false
      cpu_based_autoscaling        = false
      target_cpu_value             = null
      max_capacity                 = null
      min_capacity                 = null
      scale_out_adjustment         = null
      scale_out_cooldown           = null
      scale_in_adjustment          = null
      scale_in_cooldown            = null
      disable_scale_in             = false
    }
  }
}

Чего я хочу добиться?

Можно ли каким-то образом передать значения по умолчанию нескольким переменным, таким как health_check_path= null, чтобы мне не пришлось беспокоиться о том, что это не будет включено в службы, которым не требуются эти значения. Есть также некоторые службы, которые требуют таких значений, которые я затем предоставлю из тех же переменных. Пример

    service-b = {
      container_name               = "service-b-container"
      container_cpu                = 1024
      container_image              = "service-b-image:latest"
      container_memory_total       = 1024
      container_memory_reservation = 1024
      deployment_max_percent       = 200
      deployment_min_healthy       = 50
      container_host_port          = [0]
      container_port               = [80]
      command                      = null
      replica_count                = 1
      stage                        = "dev"
      alb_enabled                  = true
      alb_https_enabled            = true
      alb_ssl_arn                  = "ssl-arn"
      health_check_response        = 200
      health_check_path            = "/status"
      internal_lb                  = false
      vault_key                    = "servia-b"
      vault_backend                = "service"
      cpu_based_autoscaling        = true
      target_cpu_value             = 40
      max_capacity                 = 8
      min_capacity                 = 1
      scale_out_adjustment         = 2
      scale_out_cooldown           = 60
      scale_in_adjustment          = 1
      scale_in_cooldown            = 300
      disable_scale_in             = false
    },

Я пытался использовать локальные или любые другие подобные переменные внутри раздела переменных, например, следующие


variable "cpu" {
  type = number
  default = 1024
  description = "cpu to associate"
}

variable "applications" {
  description = "Map for the services to be deployed"
  type        = any
  default = {
  service-b = {
      container_name               = "service-b-container"
      container_cpu                = var.cpu
      container_image              = "service-b-image:latest"
      container_memory_total       = 1024
      container_memory_reservation = 1024
  },
  service-a = {
      container_name               = "service-a-container"
      container_cpu                = var.cpu
      container_image              = "service-b-image:latest"
      container_memory_total       = 1024
  }
 }
}

но оказывается terraform этого не позволяет. Чтобы уточнить это, позвольте мне добавить его журнал здесь

Error: Variables not allowed

  on application.tf line 56, in variable "applications":
  56:       container_cpu        = var.cpu

Variables may not be used here.

Если я попытаюсь не включать переменные, которые присутствуют в моем services.tf, я получу следующую ошибку

Acquiring state lock. This may take a few moments...                                                                                                                                                                                                                                                                                       
Refreshing Terraform state in-memory prior to plan...                                                                                                                                                                                                                                                                                      
The refreshed state will be used to calculate this plan, but will not be                                                                                                                                                                                                                                                                   
persisted to local or remote state storage.                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                           
module.services["service-a"].module.ecs_alb_service_task.data.aws_iam_policy_document.ecs_exec[0]: Refreshing state...                                                                                                                                                                                                            
module.services["service-a"].module.ecs_alb_service_task.data.aws_iam_policy_document.ecs_service_policy[0]: Refreshing state...                                                                                                                                                                                                  
module.services["service-a"].module.ecs_alb_service_task.data.aws_iam_policy_document.ecs_task_exec[0]: Refreshing state...                                                                                                                                                                                                       
module.services["service-a"].module.ecs_alb_service_task.data.aws_iam_policy_document.ecs_task[0]: Refreshing state...                                                                                                                                                                                                            
module.services["service-a"].module.ecs_alb_service_task.data.aws_iam_policy_document.ecs_service[0]: Refreshing state...                                                                                                                                                                                                         
module.vpc.aws_vpc.this[0]: Refreshing state... [id=vpc-0641c1d3435df195a]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
aws_service_discovery_private_dns_namespace.default: Refreshing state... [id=ns-vyggm2ltoxjufhfa]                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                                                                           
Error: Unsupported attribute                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                           
  on Service.tf line 22, in module "services":                                                                                                                                                                                                                                                                                             
  22:   alb_enabled                  = each.value.alb_enabled                                                                                                                                                                                                                                                                              
    |----------------                                                                                                                                                                                                                                                                                                                      
    | each.value is object with 12 attributes                                                                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                                           
This object does not have an attribute named "alb_enabled".                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                                                                                                                           
Error: Unsupported attribute                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                           
  on Service.tf line 25, in module "services":                                                                                                                                                                                                                                                                                             
  25:   alb_https_enabled            = each.value.alb_https_enabled                                                                                                                                                                                                                                                                        
    |----------------                                                                                                                                                                                                                                                                                                                      
    | each.value is object with 12 attributes                                                                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                                           
This object does not have an attribute named "alb_https_enabled".                                                                                                                                                                                                                                                                          
                                                                      

В любом случае, я могу добиться этого, поскольку существует более 10 сервисов, которые необходимо развернуть таким образом, а также некоторым сервисам не хватает переменной, а другим требуется.

«терраформ этого не позволяет». не очень конкретно. Вы получаете сообщение об ошибке? Где именно не получается?

Marcin 10.12.2020 12:29

Позвольте мне обновить мой вопрос @Marcin

dempti 10.12.2020 13:17

@Marcin, пожалуйста, проверьте обновленный вопрос.

dempti 10.12.2020 14:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
480
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вариант 1. Судя по документации, это может помочь - объявить какой-то особый тип объекта и там выставить значения по умолчанию: https://www.terraform.io/docs/configuration/variables.html#declaring-an-input-variable

Вариант 2. Также может помочь (не пробовал) - использование поиска со значением по умолчанию https://www.terraform.io/docs/configuration/functions/lookup.html

Простой пример для варианта 2:

дочерний модуль:

main.tf

resource "local_file" "simple_file" {
  filename = "file/${var.file_name}"
  content     = "foo!"
}

переменные.tf

variable "file_name" {
  description = "file name"
}

корневой модуль: main.tf

module "file" {
  source = "./child_module"
  for_each = var.applications
  file_name = lookup(each.value, "Not_existing_key", "default_value" )
}

default_value используется в этом случае в дочернем модуле

версия для терраформирования 0.14.3

Другие вопросы по теме