Требуется неподходящее значение для строки атрибута cidr_block

#terraform-provider-aws #terraform0.12

#terraform-provider-aws #terraform0.12

Вопрос:

Привет, мой код terraform здесь

main.tf

 terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}
# Configure the AWS Provider
provider "aws" {
  region = var.region
}

# DATA

data "aws_availability_zones" "available" {}

data "template_file" "public_cidrsubnet" {
  count    = var.subnet_count
  template = "$${cidrsubnet(vpc_cidr,8,current_count)}"
  vars = {
    vpc_cidr      = var.network_address_space
    current_count = count.index
  }
}

resource "aws_vpc" "tf-aws-vn" {
  cidr_block = var.network_address_space
  tags       = local.common_tags
  #name       = var.name
}
resource "aws_subnet" "tf-aws-sn" {
  count             = length(data.aws_availability_zones.available.names)
  vpc_id            = aws_vpc.tf-aws-vn.id
  cidr_block        = [data.template_file.public_cidrsubnet[*].rendered]
  availability_zone = slice(data.aws_availability_zones.available.names, 0, var.subnet_count)
  tags              = local.common_tags
}
  

variables.tf

 variable "region" {
  default = "us-east-1"
}
variable network_address_space {}

variable name {
  type = string
}
variable "subnet_count" {
  type = number
}
  

И, наконец!
terraform.tfvars

 network_address_space = "10.0.0.0/16"
subnet_count          = 2
  

Я получаю сообщение об ошибке, как показано ниже:

 Error: Incorrect attribute value type

  on main.tf line 36, in resource "aws_subnet" "tf-aws-sn":
  36:   cidr_block        = [data.template_file.public_cidrsubnet[*].rendered]

Inappropriate value for attribute "cidr_block": string required.
  

В чем проблема?

Я хочу создать n подсетей для любого диапазона адресов, который я предоставляю

Моя версия terraform — 0.13.5

Ответ №1:

Вы передаете массив в cidr_block, что приводит к указанной ошибке. Вам нужно передать строку в блок cidr.

 cidr_block = data.template_file.public_cidrsubnet[count.index].rendered
  

Вам также необходимо изменить * на фактическое количество. В противном случае вы получите сообщение об ошибке с жалобой на то, что это кортеж из 2 элементов.
В вашем коде результат data.template_file.public_cidrsubnet[*].rendered является

 cidr_output = [
  "10.0.0.0/24",
  "10.0.1.0/24",
]
  

Тогда следующая проблема, с которой вы столкнетесь, связана с самим счетчиком. В качестве count используется общее количество зон доступности, но вы хотите, чтобы count был subnet_count . У вас есть только 2 подсети, созданные в шаблоне public_cidrsubnet, поэтому вы не можете создать подсеть в каждой зоне доступности.
Затем вам также необходимо передать count.index в срез для аргумента availability_zone.

Правильный ресурс aws_subnet, который должен работать

 resource "aws_subnet" "tf-aws-sn" {
  count             = var.subnet_count
  vpc_id            = aws_vpc.tf-aws-vn.id
  cidr_block        = data.template_file.public_cidrsubnet[count.index].rendered
  availability_zone = slice(data.aws_availability_zones.available.names, 0, var.subnet_count)[count.index]
  

}