Terraform-provider-aws: aws_alb_target_group_attachment no admite la lista para target_id

Creado en 13 jun. 2017  ·  3Comentarios  ·  Fuente: hashicorp/terraform-provider-aws

_Esta edición fue abierta originalmente por @plotniku como hashicorp/terraform#15247. Se migró aquí como parte de la división del proveedor . El cuerpo original del problema se encuentra a continuación._


Hola,

Agregué dos máquinas virtuales con aws_instance y usé el atributo "recuento". También me gustaría agregar en el futuro dos nuevas máquinas virtuales al grupo objetivo, por lo que necesito especificar una lista de máquinas virtuales para "target_id", sin embargo, los recursos realizados con el conteo no existen en la ejecución del plan. Mostrar error de terraformación

Versión Terraform

[ root@ip-100-79-13-128 2_vpc]# versión de terraformación
Terraform v0.9.8

Recursos afectados

  • aws_alb_target_group_attachment

Archivos de configuración de Terraform

resource "aws_instance" "web" {
  count         = "2"
  ami           = "${var.ec2["ami"]}"
  instance_type = "${var.ec2["instance_type"]}"
  key_name      = "${var.ec2["key"]}"
  subnet_id     = "${element(aws_subnet.private-subnets.*.id, count.index)}"
  vpc_security_group_ids = ["${aws_security_group.private.id}"]
  user_data     = "${file("script.sh")}"
  tags  {
        Name          = "${var.general["owner"]}-web"
        configurator  = "${var.vpc["tag"]}"
  }
  depends_on    = ["aws_nat_gateway.main"]
}

resource "aws_alb" "app" {
  name            = "${var.general["owner"]}-elb-app"
  internal        = false
  security_groups = ["${aws_security_group.elb.id}"]
  subnets         = ["${aws_subnet.public-subnets.*.id}"]

  enable_deletion_protection = false

  tags {
    Name           = "${var.general["owner"]}-elb-app"
    configurator   = "terraform"
  }
}

resource "aws_alb_target_group" "app_tg_0" {
  name     = "${var.general["owner"]}-app-tg-0"
  port     = 80
  protocol = "HTTP"
  vpc_id   = "${aws_vpc.main.id}"

  health_check {
    healthy_threshold   = 2
    unhealthy_threshold = 3
    timeout             = 5
    path                = "${var.app["elb_hc_uri"]}"
    interval            = 10
    port                = "${var.app["listen_port_http"]}"
  }

  tags {
    Name           = "${var.general["owner"]}-app-tg-0"
    configurator   = "terraform"
  }
}

resource "aws_alb_target_group" "app_tg_1" {
  name     = "${var.general["owner"]}-app-tg-1"
  port     = 80
  protocol = "HTTP"
  vpc_id   = "${aws_vpc.main.id}"

  health_check {
    healthy_threshold   = 2
    unhealthy_threshold = 3
    timeout             = 5
    path                = "${var.app["elb_hc_uri"]}"
    interval            = 10
    port                = "${var.app["listen_port_http"]}"
  }

  tags {
    Name           = "${var.general["owner"]}-app-tg-1"
    configurator   = "terraform"
  }

}

resource "aws_alb_listener" "app_listener_0" {
  load_balancer_arn = "${aws_alb.app.arn}"
  port              = "80"
  protocol          = "HTTP"

  default_action {
    target_group_arn = "${aws_alb_target_group.app_tg_0.arn}"
    type             = "forward"
  }
}

resource "aws_alb_target_group_attachment" "app_tg_att_0" {
  target_group_arn = "${aws_alb_target_group.app_tg_0.arn}"
  target_id        = "${aws_instance.web.0.id}"
  port             = 80
}

resource "aws_alb_target_group_attachment" "app_tg_att_1" {
  target_group_arn = "${aws_alb_target_group.app_tg_1.arn}"
  target_id        = "${aws_instance.web.1.id}"
  port             = 80
}

resource "aws_alb_listener_rule" "static" {
  listener_arn = "${aws_alb_listener.app_listener_0.arn}"
  priority     = 100

  action {
    type             = "forward"
    target_group_arn = "${aws_alb_target_group.app_tg_1.arn}"
  }

  condition {
    field  = "path-pattern"
    values = ["/static/*"]
  }

}

Salida de depuración

[ root@ip-100-79-13-128 2_vpc]# plan de terraformación
Actualizando el estado de Terraform en la memoria antes del plan...
El estado actualizado se usará para calcular este plan, pero no se
persistido en el almacenamiento de estado local o remoto.

Error al ejecutar el plan: se produjeron 1 error(es):

  • aws_alb_target_group_attachment.app_tg_att_1: se produjeron 1 error(es):

  • aws_alb_target_group_attachment.app_tg_att_1: no se encontró el recurso 'aws_instance.web' para la variable 'aws_instance.web.1.id'

Comportamiento esperado

aws_alb_target_group_attachment debe aceptar

Comportamiento real

Terraform no quiere aplicar

Pasos para reproducir

use la configuración anterior (no he agregado la configuración de la VPC ya que esa parte funciona bien)

Factoides importantes

No, cuenta de AWS.

enhancement servicelbv2 terraform-0.12

Comentario más útil

Experimentando este mismo problema. ¿Algún avance en esto?

Todos 3 comentarios

Hola,

Yo también me encontré con este problema y me preguntaba si había algún movimiento planeado sobre este tema.

Podría estar equivocado, pero ¿no es una solución simple cambiar el tipo de entrada aceptado para "target_id" de cadena a una lista?

He revisado muchos otros problemas y discusiones en esta área, pero no veo otra solución para esto que no sea usar el código WET y desafiar la política DRY:

resource "aws_lb_target_group_attachment" "attach_http_tg_target1" {
  count = "${var.lb_http_listener ? "${length(split(",", var.target_ids)) >= 1 ? "${length(var.http_target_group_names) == "${length(var.http_target_group_ports)}" ? "${length(var.http_target_group_names)}" : 0}" :0}" :0}"
  target_group_arn = "${element(aws_lb_target_group.tg_http.*.arn, count.index)}"
  target_id        = "${element(split(",", var.target_ids), 0)}"
  port             = "${element(var.http_target_group_ports, count.index)}"
}
resource "aws_lb_target_group_attachment" "attach_http_tg_target2" {
  count = "${var.lb_http_listener ? "${length(split(",", var.target_ids)) >= 2 ? "${length(var.http_target_group_names) == "${length(var.http_target_group_ports)}" ? "${length(var.http_target_group_names)}" : 0}" :0}" :0}"
  target_group_arn = "${element(aws_lb_target_group.tg_http.*.arn, count.index)}"
  target_id        = "${element(split(",", var.target_ids), 1)}"
  port             = "${element(var.http_target_group_ports, count.index)}"
}
resource "aws_lb_target_group_attachment" "attach_http_tg_target3" {
  count = "${var.lb_http_listener ? "${length(split(",", var.target_ids)) >= 3 ? "${length(var.http_target_group_names) == "${length(var.http_target_group_ports)}" ? "${length(var.http_target_group_names)}" : 0}" :0}" :0}"
  target_group_arn = "${element(aws_lb_target_group.tg_http.*.arn, count.index)}"
  target_id        = "${element(split(",", var.target_ids), 2)}"
  port             = "${element(var.http_target_group_ports, count.index)}"
}

no es una solución tan elegante 😀

Experimentando este mismo problema. ¿Algún avance en esto?

¿Fue útil esta página
0 / 5 - 0 calificaciones