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



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

地形.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"
}
}

变量.tf

variable "instances" {}

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

最新更新