Terraform - vòng lặp

Nov 13 2020

Có thể tạo vòng lặp tạo tài nguyên này không? Có rất nhiều sự lặp lại của các tài nguyên giống nhau. Tôi đã thử sử dụng bản đồ để tạo vòng lặp nhưng bản đồ không chấp nhận bất kỳ khối mặc định nào khác.

Hay là bình thường để tạo thủ công cả 4 tài nguyên? Chỉ cần một số gợi ý như câu trả lời là đủ, tôi đang cố gắng tự tìm hiểu nó.

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"
  }
}

Tôi đã thử một cái gì đó như thế này nhưng nó có vẻ không hợp lệ.

Ngoài ra, chúng ta không thể sử dụng aws_vpc.vpc-test-02.idbên trong biến vì một phần của nó là một tf khác.

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"]
}

Trả lời

2 FedorPetrov Nov 13 2020 at 11:14

Đối với số lượng tìm kiếm này và for_each trong tài liệu địa hình. Dưới đây là một ví dụ, cách bạn có thể thay thế public-test-a và public-test-b bằng một public-test:

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]
  }
}

Điều tương tự cũng có thể được thực hiện đối với private_test.

Liên quan đến những điều bạn đã thử. Các biến không thể được gán cho một biến khác. Để đạt được chức năng này, hãy sử dụng địa phương:

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

và sau đó truy cập giá trị như

local.x