Terraform 使用带有标签的 count.index

bha*_*chi 5 terraform terraform-provider-aws

使用 terraform,我尝试使用 count.index 将计数包含在我的资源标签中,但出现此错误:

\n
\n

错误:资源“aws_subnet”“prod_sn”中 ..\\modules\\sn\\ressources.tf 第 16 行上的属性值类型\n\xe2\x94\x82\n\xe2\x94\x82 不正确:\n \xe2\x94\x82 16: 标签 = var.sn_tags[count.index]\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2 \x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n\xe2\x94\x82 \xe2\x94\x82 count.index 是一个数字,已知仅在 apply\n\xe2\x94\x82 \xe2\x94\x82 var.sn_tags 是字符串列表,仅在 apply\n\xe2\x94\x82\n\xe2\x94\x82 后才知道 属性值不合适“tags”:所需字符串的映射。

\n
\n

变量.tf

\n
variable "sn_tags" {\n  type        = list (string)\n  default     = ["aa", "bb"]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

资源.tf

\n
resource "aws_subnet" "prod_sn" {\n  count                   = length(var.sn_cidr)\n  vpc_id                  = var.vpc_id\n  cidr_block              = var.sn_cidr[count.index]\n  availability_zone       = data.aws_availability_zones.azs.names[count.index]\n  tags                    = var.sn_tags[count.index] \n}\n
Run Code Online (Sandbox Code Playgroud)\n

主.tf

\n
# Create Public Subnet on availability_zone "3a"\nmodule "publicSn-a" {\n  source            = "../modules/sn"\n  vpc_id            = module.vpc.vpcId \n  sn_cidr           = ["10.0.1.0/24", "10.0.2.0/24"]\n  sn_tags           = ["prodPublicA","prodPublicB"]\n  \n}\n
Run Code Online (Sandbox Code Playgroud)\n

yda*_*coR 4

您的问题是每次循环迭代都尝试将string类型传递给tags参数。如果您将其分解为没有计数的单个资源(现在使用第一个元素),那么您当前的代码基本上是这样的:

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"
}
Run Code Online (Sandbox Code Playgroud)

如果我们查看资源的文档,aws_subnet我们可以看到该tags参数需要 a ,而不是错误所暗示的mapa 。string

您可以通过将list(string)变量更改为 a来解决此问题list(map),因此您可以使用类似以下内容:

variable "sn_tags" {
  type = list(map)
}
Run Code Online (Sandbox Code Playgroud)

# 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           = [
    {
      name = "prodPublicA"
    },
    {
      name = "prodPublicB"
    },
  ] 
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想Name向所有子网添加标签,并且不希望标签具有更大的灵活性,您可以像这样重新设计:

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]
  }
}
Run Code Online (Sandbox Code Playgroud)

并这样称呼它:

# 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"]
}
Run Code Online (Sandbox Code Playgroud)