Search code examples
amazon-web-servicesamazon-ec2terraformamazon-elb

Incorrect attribute value type error in terraform when passing ec2 instance ids


I am using below code to create 3 ec2 instances and register them with a load balancer,

variables

instance_type = "t3.large"
root_block_volume_type = "standard"
root_block_volume_size = "50"
instance_count = "3"

ec2 creation

resource "aws_instance" "ec2" {
  count = "${var.instance_count}"
  ami = "${var.ami_id}"
  instance_type = "${var.instance_type}"
  key_name = "${var.key_pair_name}"
  subnet_id = "${var.private_subnet_id}"
  iam_instance_profile = "${aws_iam_instance_profile.iam_instance_profile.name}"

  /*
   * CAUTION: changing value of below fields will cause the EC2 instance to be terminated and
   * re-created. Think before running the "apply" command.
   */
  associate_public_ip_address = false

  tags = {
    Environment = "${var.env}"
    Project = "${var.project}"
    Provisioner="different-box"
    Name = "${local.name}-1"
  }

  root_block_device {
    volume_type = "${var.root_block_volume_type}"
    volume_size = "${var.root_block_volume_size}"
  }
}



resource "aws_network_interface_sg_attachment" "sg_attachment" {
  count = "${var.instance_count}"
  security_group_id    = "${aws_security_group.ec2_sg.id}"
  network_interface_id = "${aws_instance.ec2[count.index].primary_network_interface_id}"
}

Registering with load balancer

resource "aws_alb_target_group_attachment" "alb_target_group_attachment" {
  count = length("${var.ec2_instance_ids}")
  target_group_arn = "${aws_alb_target_group.alb_target_group.arn}"
  target_id = "${var.ec2_instance_ids[count.index]}"
  port = "${var.alb_target_group_port}"
}

But however when I pass ec2 instance ids as below,

module "alb_engine-ui" {
  source = "./modules/load-balancer"
  env = "${lower(var.env)}"
  project = "engine-ui"
  vpc_id = "${data.aws_vpc.main.id}"
  public_subnet1_id = "${var.public_subnet1_id}"
  public_subnet2_id = "${var.public_subnet2_id}"
  health_check_target_group_path = "/"
  certificate_arn = "${var.certificate_arn}"
  alb_target_group_port = "2016"
  ec2_instance_ids = ["${aws_instance.ec2[*].id}"]
}
variable "ec2_instance_ids" {
  description = "the ec2 instance ids to be used for alb target group"
  type = "list"
}

I'm getting the below error,

Error: Incorrect attribute value type

  on provisioners/different-box/modules/load-balancer/resources.tf line 109, in resource "aws_alb_target_group_attachment" "alb_target_group_attachment":
 109:   target_id = "${var.ec2_instance_ids[count.index]}"

Inappropriate value for attribute "target_id": string required.

Is there a way to avoid this error and pass ec2 ids to the list?


Solution

  • "${aws_instance.ec2[*].id}" is already a list of IDs so if you wrap it in square brackets it makes it a list of lists.

    Removing the square brackets instead leaves it as a list of strings so when you index it you get a single string which is what the target_id parameter wants.