1
resposta

[Dúvida] Como eu consigo pegar o ip publico das instâncias que foram criadas no loop?

Ao tentar pegar os ip's das primeiras instâncias, criadas com o count, o terraform retorna erro:

 Error: Reference to undeclared resource
│
│   on 6-outputs.tf line 3, in output "ip_dev-1":
│    3:   value = "${aws_instance.dev-1.public_ip}"
│
│ A managed resource "aws_instance" "dev-1" has not been declared in the root module.
╵
╷
│ Error: Reference to undeclared resource
│
│   on 6-outputs.tf line 6, in output "ip_dev-2":
│    6:   value = "${aws_instance.dev-2.public_ip}"
│
│ A managed resource "aws_instance" "dev-2" has not been declared in the root module.
╵
╷
│ Error: Reference to undeclared resource
│
│   on 6-outputs.tf line 9, in output "ip_dev-3":
│    9:   value = "${aws_instance.dev-3.public_ip}"
│
│ A managed resource "aws_instance" "dev-3" has not been declared in the root module.

Para as demais instâncias, ele retorna normal.

1 resposta

Oi, Wendell. Tudo bem?

Assim não funciona quando usamos count, pois cada um dos recursos não estão definidos no arquivo do terraform. Você pode usar o nome do recurso que definiu com count, e referenciando o índice dele. Então se você colocou count = 3, e o nome do recurso foi dev, pode referenciar usando aws_instance.dev.0.public_ip para o primeiro, aws_instance.dev.1.public_ip para o segundo e assim sucessivamente.

Assim foi o jeito que eu fiz:

No main.tf eu defini a criação das ec2 com count

resource "aws_instance" "ec2-teste" {
  count = 3
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"
  key_name = "ec2-teste" # Insira o nome da chave criada antes.
  associate_public_ip_address = true

  tags = {
    Name = "ec2-teste-${count.index}"
  }
}

E no outputs.tf, coloquei assim:

output "ip-1" {
  value = "${aws_instance.ec2-teste.1.public_ip}"
}

Como o nome do recurso no terraform no meu caso é ec2-teste, quando usando count, cada recurso pode ser referenciado pelo índice dele do loop.

Caso queira retornar todos de vez, pode fazer assim:

output "ip-1" {
  value = "${aws_instance.ec2-teste.*.public_ip}"
}

Espero ter ajudado. Bons estudos!