Terraform — ELB пытается создать заново вместо обновления

#amazon-web-services #terraform #amazon-elb

#amazon-web-services #terraform #amazon-elb

Вопрос:

Обновление: terraform destroy ELB не удаляется, но команда apply пытается создать заново. Простое выполнение команды terraform apply пытается воссоздать ELB, даже если в модуль ELB не было внесено никаких изменений.

В чем причина этого?

Вот ошибка, которую я получаю:

Error: Error creating ELB: DuplicateLoadBalancerName: Load Balancer named myELB already exists and it is configured with different parameters. status code: 400, request id: 123456789-67b1-4fbd-95e3-17f693cdcf75

Вот код ELB:

 # Create ELB
resource "aws_elb" "myELB" {
   depends_on = [
      aws_instance.webservers,
    ]
  for_each = toset(var.public_subnets_names)

  name = "myELB"
  subnets = [data.aws_subnet.public_subnet_ids[each.value].id]

  listener {
    instance_port = 80
    instance_protocol = "http"
    lb_port = 80
    lb_protocol = "http"
  }

  health_check {
    healthy_threshold = 2
    unhealthy_threshold = 2
    timeout = 3
    target = "HTTP:8080/"
    interval = 30
  }

  instances = data.aws_instances.webservers.ids
  cross_zone_load_balancing = true
  idle_timeout = 400
  connection_draining = true
  connection_draining_timeout = 400

  tags = {
    Name = "myELB"
  }

}
  

Вот источник данных выглядит так:

 # Get Public Subnets ID's
data "aws_subnet" "public_subnet_ids" {
  depends_on = [
    aws_subnet.subnets,
  ]

  for_each = toset(var.public_subnets_names)

  filter {
    name = "tag:Name"
    values = [each.value]
  }
}
  

Комментарии:

1. Обновлен вопрос.. ELB не удаляется при выполнении команды terraform destroy . Даже в других случаях, просто запуск команды terraform apply пытается воссоздать

2. Итак, вы создаете несколько ALB, по одному в каждой подсети? Это специально?

Ответ №1:

Это происходит потому, что вы создаете несколько ALB, по одному в каждой подсети с тем же именем myALB . Это связано со следующей строкой:

 for_each = toset(var.public_subnets_names)
  

Не уверен, что это ваше намерение или ошибка, поэтому неясно, чего вы хотите достичь.

Обновить:

Обычно вы просто используете подсети:

 subnets = data.aws_subnet_ids.subnets.ids
  

где вы должны использовать aws_subnet_ids для получения идентификаторов ваших подсетей.

Комментарии:

1. Итак, for_each запускает ресурс дважды? Я думал, что только count запускает ресурсы дважды. Здесь я хотел перебрать var.public_subnets_names , получить идентификаторы и вставить в подсети. Какой подход был бы лучшим? Я обновил вопрос с источником данных. var.public_subnets_names это список имен подсетей

2. Я не использовал count, поскольку count будет запускать ресурс указанное количество раз. Похоже, что for_each делает то же самое?

3. Может быть, использовать цикл for?