Terraform - pętle

Nov 13 2020

Czy można utworzyć pętlę, która tworzy te zasoby? Istnieje wiele powtórzeń tych samych zasobów. Próbowałem użyć map do utworzenia pętli, ale mapa nie akceptuje żadnego innego domyślnego bloku.

A może ręczne tworzenie wszystkich 4 zasobów jest normalne? Wystarczy kilka sugestii jako odpowiedzi, sam próbuję się tego nauczyć.

resource "aws_subnet" "public-test-a" {
  vpc_id = aws_vpc.vpc-test-02.id
  cidr_block = "10.0.0.16/28"
  map_public_ip_on_launch = true
  availability_zone = var.AZ[1]

  tags = {
    Name = var.subnets_names[index]
  }
}

resource "aws_subnet" "public-test-b" {
  vpc_id = aws_vpc.vpc-test-02.id
  cidr_block = "10.0.0.16/28"
  map_public_ip_on_launch = true
  availability_zone = var.AZ[1]

  tags = {
    Name = "public-test-b"
  }
}

resource "aws_subnet" "private-test-a" {
  vpc_id = aws_vpc.vpc-test-02.id
  cidr_block = "10.0.0.32/28"
  availability_zone = var.AZ[0]

  tags = {
    Name = "private-test-a"
  }
}


resource "aws_subnet" "private-test-b" {
  vpc_id = aws_vpc.vpc-test-02.id
  cidr_block = "10.0.0.48/28"
  availability_zone = var.AZ[1]

  tags = {
    Name = "private-test-b"
  }
}

Próbowałem czegoś takiego, ale nie wydaje się to ważne.

Nie możemy również używać aws_vpc.vpc-test-02.idwewnątrz zmiennej, ponieważ jest ona częścią innego tf.

variable "subnets" {
  type = map

  default = {
    vpc_id = aws_vpc.vpc-test-02.id
  }

  public-test-a = {
    map_public_ip_on_launch = true
    availability_zone = var.AZ[0]
  }

  public-test-b = {
    map_public_ip_on_launch = true
    availability_zone = var.AZ[1]
  }

  private-test-a = {
    availability_zone = var.AZ[0]
  }

  private-test-b = {
    availability_zone = var.AZ[1]
  }
}

variable "AZ" {
  type = list
  default = ["ap-south-1a", "ap-south-1b", "ap-south-1c"]
}

variable "subnets_cird" {
  type = list
  default = ["10.0.0.0/28", "10.0.0.16/26", "10.0.0.32/28", "10.0.0.48/28"]
}


variable "subnets_names" {
  type = list
  default = ["public-test-a", "public-test-b", "private-test-a", "private-test-b"]
}

Odpowiedzi

2 FedorPetrov Nov 13 2020 at 11:14

Dla tego wyszukiwania liczy się i for_each w dokumentacji terraform. Oto przykład, jak można zamienić public-test-a i public-test-b na jeden test publiczny:

variable "number_of_subnets" {
default = 2
}

resource "aws_subnet" "public-test" {
  count = var.number_of_subnets
  vpc_id = aws_vpc.vpc-test-02.id
  cidr_block = "10.0.0.16/28"
  map_public_ip_on_launch = true
  availability_zone = var.AZ[1]

  tags = {
    # here you pick the right name according to the subnet index, where e.g subnets_names = ["public-test-a","public-test-b"]
    Name = var.subnets_names[count.index]
  }
}

To samo można zrobić dla private_test.

Jeśli chodzi o rzeczy, których próbowałeś. Zmiennym nie można przypisać innych zmiennych. Aby osiągnąć tę funkcjonalność, użyj lokalnych:

locals {
   x = aws_vpc.vpc-test-02.id
}

a następnie uzyskaj dostęp do wartości, takiej jak

local.x