Terraform 使用带有标记的count.index构建地形
使用terraform,我试图使用count.index将计数包含在我的资源的标记中,但出现以下错误: 错误:属性值类型不正确 │ │ 在..\modules\sn\resources.tf第16行的资源“aws\U子网”“产品编号”中: │ 16:tags=var.sn_tags[count.index] │ ├──────────────── │ │ count.index是一个数字,只有在应用后才知道 │ │ var.sn_标记是字符串列表,只有在应用后才知道 │ │ 属性“标记”的值不正确:需要字符串映射 vars.tfTerraform 使用带有标记的count.index构建地形,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,使用terraform,我试图使用count.index将计数包含在我的资源的标记中,但出现以下错误: 错误:属性值类型不正确 │ │ 在..\modules\sn\resources.tf第16行的资源“aws\U子网”“产品编号”中: │ 16:tags=var.sn_tags[count.index] │ ├──────────────── │ │ count.index是一个数字,只有在应用后才知道 │ │ var.sn_标记是字符串列表,只有在应用后才知
variable "sn_tags" {
type = list (string)
default = ["aa", "bb"]
}
resource "aws_subnet" "prod_sn" {
count = length(var.sn_cidr)
vpc_id = var.vpc_id
cidr_block = var.sn_cidr[count.index]
availability_zone = data.aws_availability_zones.azs.names[count.index]
tags = var.sn_tags[count.index]
}
# Create Public Subnet on availability_zone "3a"
module "publicSn-a" {
source = "../modules/sn"
vpc_id = module.vpc.vpcId
sn_cidr = ["10.0.1.0/24", "10.0.2.0/24"]
sn_tags = ["prodPublicA","prodPublicB"]
}
resources.tf
variable "sn_tags" {
type = list (string)
default = ["aa", "bb"]
}
resource "aws_subnet" "prod_sn" {
count = length(var.sn_cidr)
vpc_id = var.vpc_id
cidr_block = var.sn_cidr[count.index]
availability_zone = data.aws_availability_zones.azs.names[count.index]
tags = var.sn_tags[count.index]
}
# Create Public Subnet on availability_zone "3a"
module "publicSn-a" {
source = "../modules/sn"
vpc_id = module.vpc.vpcId
sn_cidr = ["10.0.1.0/24", "10.0.2.0/24"]
sn_tags = ["prodPublicA","prodPublicB"]
}
main.tf
variable "sn_tags" {
type = list (string)
default = ["aa", "bb"]
}
resource "aws_subnet" "prod_sn" {
count = length(var.sn_cidr)
vpc_id = var.vpc_id
cidr_block = var.sn_cidr[count.index]
availability_zone = data.aws_availability_zones.azs.names[count.index]
tags = var.sn_tags[count.index]
}
# Create Public Subnet on availability_zone "3a"
module "publicSn-a" {
source = "../modules/sn"
vpc_id = module.vpc.vpcId
sn_cidr = ["10.0.1.0/24", "10.0.2.0/24"]
sn_tags = ["prodPublicA","prodPublicB"]
}
您的问题是每个循环迭代都试图将
字符串
类型传递给标记
参数。如果将其分解为没有计数的单个资源(现在使用第一个元素),则当前代码基本上如下所示:
resource "aws_subnet" "prod_sn" {
vpc_id = var.vpc_id
cidr_block = "10.0.1.0./24"
availability_zone = "eu-west-1a" # Note may not be this but the data source and the index will at least resolve to a single string AZ
tags = "prodPublicA"
}
如果我们看一下,我们可以看到,它需要的是映射
,而不是错误所暗示的字符串
您可以通过将list(string)
变量更改为list(map)
来解决此问题,因此您可以使用类似以下内容:
variable "sn_tags" {
type = list(map)
}
及
或者,如果您只想在所有子网中添加一个名称标记,而不想让标记具有更大的灵活性,您可以像这样对其进行返工:
variable "sn_names" {
type = list(string)
}
resource "aws_subnet" "prod_sn" {
count = length(var.sn_cidr)
vpc_id = var.vpc_id
cidr_block = var.sn_cidr[count.index]
availability_zone = data.aws_availability_zones.azs.names[count.index]
tags = {
Name = var.sn_names[count.index]
}
}
这样称呼它:
# Create Public Subnet on availability_zone "3a"
module "publicSn-a" {
source = "../modules/sn"
vpc_id = module.vpc.vpcId
sn_cidr = ["10.0.1.0/24", "10.0.2.0/24"]
sn_names = ["prodPublicA","prodPublicB"]
}