Блок Terraform Dynami c - PullRequest
       99

Блок Terraform Dynami c

1 голос
/ 04 мая 2020

У меня проблемы с созданием динамического c блока в Terraform. Я пытаюсь создать службу ECS с помощью модуля. В модуле я хочу указать, что блок network_configuration должен создаваться только при наличии переменной. Вот мой код модуля:

resource "aws_ecs_service" "service" {


name = var.name
  cluster = var.cluster
  task_definition = var.task_definition
  desired_count = var.desired_count
  launch_type = var.launch_type
  load_balancer {
    target_group_arn = var.lb_target_group
    container_name   = var.container_name
    container_port   = var.container_port
  }

  dynamic "network_configuration" {
    for_each = var.network_config
    content {
      subnets = network_configuration.value["subnets"]
      security_groups = network_configuration.value["security_groups"]
      assign_public_ip = network_configuration.value["public_ip"]
    }
  }
}

Далее приведен код для фактической услуги:

module "fargate_service" {
  source = "./modules/ecs/service"
  name = "fargate-service"
  cluster = module.ecs_cluster.id
  task_definition = module.fargate_task_definition.arn
  desired_count = 2
  launch_type = "FARGATE"
  lb_target_group = module.target_group.arn
  container_name = "fargate_definition"
  container_port = 8000
  network_config = local.fargate_network_config
}

Наконец, мой файл localals выглядит так:

locals {
    fargate_network_config = {
      subnets          = module.ec2_vpc.private_subnet_ids
      public_ip        = "false"
      security_groups  = [module.fargate_sg.id]
  }
}

С Приведенная выше конфигурация I sh позволяет создать один блок network_configiration только при наличии переменной network_config. Если я не определю это, я хочу, чтобы модуль не беспокоился о создании блока. Я получаю Invalid index ошибку.

network_configuration.value is tuple with 3 elements
The given key does not identify an element in this collection value: a number
is required.

Что не так с моим кодом? Я впервые использую блоки Dynami c в Terraform, но я хочу понять это. Спасибо

1 Ответ

1 голос
/ 04 мая 2020

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

locals {
  fargate_network_config = [
    {
      subnets          = module.ec2_vpc.private_subnet_ids
      public_ip        = "false"
      security_groups  = [module.fargate_sg.id]
    }
  ]
}

Затем зафиксируйте вашу переменную network_config в виде списка.

Наконец, ваш блок Dynami c:

dynamic "network_configuration" {
  for_each = var.network_config
    content {
      subnets = lookup(network_configuration.value, "subnets", null)
      security_groups = lookup(network_configuration.value, "security_groups", null)
      assign_public_ip = lookup(network_configuration.value, "public_ip", null)
    }
}

надеюсь, что поможет

...