在 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"]
}
}
我在声明嵌套变量时遇到问题。我的变量有一个 .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"]
}
}