Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform 使用带有标记的count.index构建地形_Terraform_Terraform Provider Aws - Fatal编程技术网

Terraform 使用带有标记的count.index构建地形

Terraform 使用带有标记的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_标记是字符串列表,只有在应用后才知

使用terraform,我试图使用count.index将计数包含在我的资源的标记中,但出现以下错误:

错误:属性值类型不正确 │ │ 在..\modules\sn\resources.tf第16行的资源“aws\U子网”“产品编号”中: │ 16:tags=var.sn_tags[count.index] │ ├──────────────── │ │ count.index是一个数字,只有在应用后才知道 │ │ var.sn_标记是字符串列表,只有在应用后才知道 │ │ 属性“标记”的值不正确:需要字符串映射

vars.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"]
  
}
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"]
}