【问题标题】:How to pass different subnet ids to terraform aws_instance resource when subnet ids are created with count.index?使用 count.index 创建子网 ID 时,如何将不同的子网 ID 传递给 terraform aws_instance 资源?
【发布时间】:2020-09-04 00:56:51
【问题描述】:

我是 terraform 的新手,我正在尝试分别使用单个代码块为子网和实例创建多个资源。 我可以使用以下代码创建子网

    # Subnets : LoadBalancer
resource "aws_subnet" "lb" {
  count = length(var.lb_subnets_cidr)
  vpc_id = aws_vpc.terra_vpc.id
  cidr_block = element(var.lb_subnets_cidr,count.index)
  availability_zone = element(var.azs,count.index)
  map_public_ip_on_launch = true
  tags = {
    Name = "test-lb-subnet-${count.index+1}"
  }
}

# Subnets : App
resource "aws_subnet" "app" {
  count = length(var.app_subnets_cidr)
  vpc_id = aws_vpc.terra_vpc.id
  cidr_block = element(var.app_subnets_cidr,count.index)
  availability_zone = element(var.azs,count.index)
  map_public_ip_on_launch = true
  tags = {
    Name = "test-app-subnet-${count.index+1}"
  }
}


# Subnets : Databases
resource "aws_subnet" "db" {
  count = length(var.db_subnets_cidr)
  vpc_id = aws_vpc.terra_vpc.id
  cidr_block = element(var.db_subnets_cidr,count.index)
  availability_zone = element(var.azs,count.index)
  map_public_ip_on_launch = false
  tags = {
    Name = "test-db-subnet-${count.index+1}"
  }
}

而我无法使用以下代码创建实例

#key pair

resource "aws_key_pair" "test_key" {
  key_name   = var.key_name
  public_key = file(var.public_key_path)
}


#AWS instances
resource "aws_instance" "servers" {
  count = length(var.instance_type)
  instance_type = element(var.instance_type,count.index)
  ami           = var.ami

  tags =  {
    Name = element(var.instance_name,count.index)
  }

  key_name               = aws_key_pair.test_key.id
  vpc_security_group_ids = [aws_security_group.jump_sg.id]
  subnet_id              = element(local.subs,count.index)
  private_ip             = element(var.private_ip,count.index)

}

下面还有我的 variable.tf 文件。

variable "instance_type" {
        type = list
        default = ["t2.micro","c5.xlarge","m5.xlarge","m5.xlarge","m5.xlarge","r5.large","r5.large"]
}

variable "instance_name" {
        type = list
        default = ["jump-server-test","test-app-01","test-mongodb-01","test-mongodb-02","test-mongodb-03","test-redis-01","test-redis-02"]
}

variable "private_ip" {
        type = list
        default = ["172.17.7.10","172.17.10.10","172.17.4.10","172.17.5.10","172.17.6.10","172.17.4.20","172.17.5.20"]
}

locals {
        subs = concat([aws_subnet.jump.id],[aws_subnet.app.id],[aws_subnet.db.id])
}

variable "ami" {
        default = "ami-b73b63a0"
}

使用上面的代码,我得到以下错误。

Error: Missing resource instance key

  on variables.tf line 49, in locals:
  49:   subs = concat([aws_subnet.jump.id],[aws_subnet.app.id],[aws_subnet.db.id])

Because aws_subnet.app has "count" set, its attributes must be accessed on
specific instances.

For example, to correlate with indices of a referring resource, use:
    aws_subnet.app[count.index]


Error: Missing resource instance key

  on variables.tf line 49, in locals:
  49:   subs = concat([aws_subnet.jump.id],[aws_subnet.app.id],[aws_subnet.db.id])

Because aws_subnet.db has "count" set, its attributes must be accessed on
specific instances.

For example, to correlate with indices of a referring resource, use:
    aws_subnet.db[count.index]

尝试了不同的解决方案。但似乎我无法抓住。 提前致谢。

【问题讨论】:

    标签: terraform-provider-aws terraform0.12+


    【解决方案1】:

    将 variables.tf 第 49 行替换为:

        subs = concat([for sn in aws_subnet.jump: sn.id],[for sn in aws_subnet.app: sn.id],[for sn in aws_subnet.db: sn.id])
    

    【讨论】:

      猜你喜欢
      • 2018-07-09
      • 1970-01-01
      • 2020-09-11
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2018-09-09
      • 2021-08-09
      相关资源
      最近更新 更多