Ausgabe
Ich habe es versucht
private_ip_ws0 = ["10.0.10.3"]
private_ip_ws1 = ["10.0.20.3"]
private_ip_db0 = ["10.0.11.3"]
private_ip_db1 = ["10.0.21.3"]
resource "aws_network_interface" "ws_interface" {
count = 2
subnet_id = aws_subnet.ws_net_public[count.index].id
private_ips = "${var.private_ip_ws}[count.index]"[0]
tags = {
Name = "${var.environment}${count.index}-Interface"
}
}
Aber ich bekomme Fehler:
Error: Reference to undeclared input variable
│
│ on vpc.tf line 55, in resource "aws_network_interface" "ws_interface":
│ 55: private_ips = "${var.private_ip_ws}[count.index]"[0]
│
│ An input variable with the name "private_ip_ws" has not been declared. Did you mean "private_ip_ws1"?
Wie schreibt man Code richtig?
Und warum erlaubt Ihnen Terraform an einer Stelle, so zu schreiben
cidr_block = "${var.public_cidr}${count.index+1}0.0/24"
aber in einem anderen ähnlichen Ausdruck erlaubt es nicht zu schreiben:
private_ips = "${var.private_ip_ws}[count.index]"[0]
Wieso den?
Lösung
Sie können einen Variablennamen nicht über eine solche Variable referenzieren. Das ist einfach keine Funktion, die von Terraform überhaupt unterstützt wird. Der richtige Weg, dies zu tun, wäre, Ihre Variablen in Arrays umzuwandeln, aber wenn Sie die Variablen gleich halten möchten, müssen Sie sie in ein lokales Array einschließen, bevor Sie sie verwenden:
private_ip_ws0 = ["10.0.10.3"]
private_ip_ws1 = ["10.0.20.3"]
private_ip_db0 = ["10.0.11.3"]
private_ip_db1 = ["10.0.21.3"]
locals {
private_ip_ws = [private_ip_ws0, private_ip_ws1]
}
resource "aws_network_interface" "ws_interface" {
count = 2
subnet_id = aws_subnet.ws_net_public[count.index].id
private_ips = local.private_ip_ws[count.index]
tags = {
Name = "${var.environment}${count.index}-Interface"
}
}
Und warum erlaubt Ihnen Terraform an einer Stelle, so zu schreiben
cidr_block = "${var.public_cidr}${count.index+1}0.0/24"
aber in einem anderen ähnlichen Ausdruck erlaubt es nicht zu schreiben:
private_ips = "${var.private_ip_ws}[count.index]"[0]
Weil Sie im ersten Beispiel nur eine einfache Zeichenfolgeninterpolation durchführen, was eine vollkommen gültige Terraform-Syntax ist.
Im zweiten Beispiel erstellen Sie einen dynamischen Variablennamen und versuchen dann, auf den Wert in dieser Variablen zu verweisen, was eine völlig ungültige Terraform-Syntax ist.
Beantwortet von – Mark B
Antwort geprüft von – Katrina (FixError Volunteer)