【问题标题】:Terraform using count.index with tagsTerraform 使用带有标签的 count.index
【发布时间】:2021-08-06 12:05:28
【问题描述】:

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

错误:属性值类型不正确 │ │ 在 ..\modules\sn\ressources.tf 第 16 行,资源“aws_subnet”“prod_sn”中: │ 16: tags = var.sn_tags[count.index] │ ├──────────────── │ │ count.index 是一个数字,只有 apply 后才知道 │ │ var.sn_tags 是一个字符串列表,只有在apply之后才知道 │ │ 属性“tags”的值不合适:需要字符串映射。

vars.tf

variable "sn_tags" {
  type        = list (string)
  default     = ["aa", "bb"]
}

ressources.tf

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

ma​​in.tf

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

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    您的问题是每个循环迭代都试图将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"
    }
    

    如果我们查看the documentation for the aws_subnet resource,我们可以看到tags parameter 需要map,而不是错误所暗示的string

    您可以通过将您的 list(string) 变量更改为 list(map) 来解决此问题,这样您就可以改为:

    variable "sn_tags" {
      type = list(map)
    }
    

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

    或者,如果您只想将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]
      }
    }
    

    然后这样称呼它:

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

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 2019-01-23
      • 2020-01-16
      • 2022-11-03
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 2022-01-07
      • 2018-10-15
      相关资源
      最近更新 更多