在 Terraform 中为 aws_instance 资源声明嵌套变量

Declaring nested variables in Terraform for aws_instance resource

我在声明嵌套变量时遇到问题。我的变量有一个 .tfvars,然后我在 varaibles.tf 中声明它,最后,我的 aws 实例资源循环遍历我的变量。我的问题是我的 .tfvars 中的嵌套卷块没有被声明并出现错误。

terraform.tfvar

instances = {
    instance-01a = {
        ami                   = "ami-abcdefghijk1234",
        type                  = "t3.medium"
        key_name              = "caws-dc-01"
        private_ip            = "10.0.0.5"
        subnet_id             = "subnet-abcdefghijk1234" #Temp
        vpc_security_group_ids = ["sg-abcdefghijk1234"]     #Temp
        root_block_device = {
        device_name = "/dev/sda1"
        volume_size = 100
        volume_type = "gp2"
        tags = {
            Name = "instance-01a /dev/sda1"
        }
        }
        ebs_block_device = {
        device_name = "/dev/sdf"
        volume_size = 50
        volume_type = "gp2"
        tags = {
            Name = "instance-01a /dev/sdf"
        }
        }
        disable_api_termination = true
        tags = {
        Name = "instance-01a"
        }
    }

variable.tf

variable "instances" {}

instance.tf

resource "aws_instance" "specific_instances" {
  for_each = var.instances

  ami                     = each.value["ami"]
  instance_type           = each.value["type"]
  key_name                = each.value["key_name"]
  private_ip              = each.value["private_ip"]
  subnet_id               = each.value["subnet_id"]              
  vpc_security_group_ids  = each.value["vpc_security_group_ids"] 
  root_block_device        = each.value["root_block_device"]
  ebs_block_device        = each.value["ebs_block_device"]
  disable_api_termination = each.value["disable_api_termination"]
  tags                    = each.value["tags"]
}

错误信息

╷
│ Error: Unsupported argument
│
│   on instance.tf line 13, in resource "aws_instance" "specific_instances":
│   13:   root_block_device        = each.value["root_block_device"]
│
│ An argument named "root_block_device" is not expected here. Did you mean to define a block of type
│ "root_block_device"?
╵
╷
│ Error: Unsupported argument
│
│   on instance.tf line 14, in resource "aws_instance" "specific_instances":
│   14:   ebs_block_device        = each.value["ebs_block_device"]
│
│ An argument named "ebs_block_device" is not expected here. Did you mean to define a block of type
│ "ebs_block_device"?
╵

ebs_block_device 是一个 block 而不是一个论点。所以这意味着您必须执行以下操作:

resource "aws_instance" "specific_instances" {
  for_each = var.instances

  # rest 
  # ....
  
  ebs_block_device {
    device_name =  each.value["ebs_block_device"]["device_name"]
    volume_size =  each.value["ebs_block_device"]["volume_size"]
    volume_type =  each.value["ebs_block_device"]["volume_type"]
    tags        =  each.value["ebs_block_device"]["tags"]
  }
}