要求属性cidr_block字符串的值不合适

问题描述

嗨,我的terraform代码在这里

main.tf

play

variables.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,var.subnet_count)
  tags              = local.common_tags
}

最后! terraform.tfvars

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

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

我遇到如下错误

network_address_space = "10.0.0.0/16"
subnet_count          = 2

出了什么问题?

我想为我提供的任何地址范围创建n个子网

我的terraform版本是0.13.5

解决方法

您正在将数组传递给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",]

然后,您将面临的下一个问题是计数本身。您将可用区域总数用作计数,但您希望该计数为subnet_count。您只能在public_cidrsubnet模板中创建2个子网,因此不能在每个可用性区域中创建一个子网。 然后,您还需要将count.index传递给slice,以获取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,var.subnet_count)[count.index]

}