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