Terraform:如何在“内部使用多个局部变量”;对于“每个人”;
我有一个terraform模板,可以创建多个EC2实例。 然后,我在AWS控制台中创建了一些弹性网络接口,并将它们作为本地接口添加到terraform模板中。 现在,我想将适当的ENI映射到实例,因此我添加了局部变量和变量,如下所示Terraform:如何在“内部使用多个局部变量”;对于“每个人”;,terraform,terraform-provider-aws,terraform-template-file,Terraform,Terraform Provider Aws,Terraform Template File,我有一个terraform模板,可以创建多个EC2实例。 然后,我在AWS控制台中创建了一些弹性网络接口,并将它们作为本地接口添加到terraform模板中。 现在,我想将适当的ENI映射到实例,因此我添加了局部变量和变量,如下所示 locals { instance_ami = { A = "ami-11111" B = "ami-22222" C = "ami-33333" D = "ami-4444" } } variable "insta
locals {
instance_ami = {
A = "ami-11111"
B = "ami-22222"
C = "ami-33333"
D = "ami-4444"
}
}
variable "instance_eni" {
description = "Pre created Network Interfaces"
default = [
{
name = "A"
id = "eni-0a15890a6f567f487"
},
{
name = "B"
id = "eni-089a68a526af5775b"
},
{
name = "C"
id = "eni-09ec8ad891c8e9d91"
},
{
name = "D"
id = "eni-0fd5ca23d3af654a9"
}
]
}
resource "aws_instance" "instance" {
for_each = local.instance_ami
ami = each.value
instance_type = var.instance_type
key_name = var.keypair
root_block_device {
delete_on_termination = true
volume_size = 80
volume_type = "gp2"
}
dynamic "network_interface" {
for_each = [for eni in var.instance_eni : {
eni_id = eni.id
}]
content {
device_index = 0
network_interface_id = network_interface.value.eni_id
delete_on_termination = false
}
}
}
我得到以下错误:
错误:启动源实例时出错:InvalidParameterValue:每个网络接口都需要一个
唯一设备索引。
状态代码:400,请求id:4a482753-bddc-4fc3-90f4-2f1c5e2472c7
我认为terraform正在将所有4个ENI仅连接到一个实例。
如何将ENI连接到单个实例?您在问题中共享的配置要求Terraform管理四个实例,每个实例都有四个与之关联的网络接口。这有两个不同的问题:
- 每个实例上的所有for网络接口都配置了相同的
,这是无效的,并且是此处错误消息报告的内容设备索引
- 即使要解决这个问题,它也会尝试将相同的四个网络接口连接到四个不同的EC2实例,这是无效的:每个网络接口一次只能连接到一个实例
network\u interface
块,每个实例的内容都不同:
locals {
instance_ami = {
A = "ami-11111"
B = "ami-22222"
C = "ami-33333"
D = "ami-4444"
}
}
variable "instance_eni" {
description = "Pre created Network Interfaces"
default = [
{
name = "A"
id = "eni-0a15890a6f567f487"
},
{
name = "B"
id = "eni-089a68a526af5775b"
},
{
name = "C"
id = "eni-09ec8ad891c8e9d91"
},
{
name = "D"
id = "eni-0fd5ca23d3af654a9"
}
]
}
locals {
# This expression is transforming the instance_eni
# value into a more convenient shape: a map from
# instance key to network interface id. You could
# also choose to just change directly the
# definition of variable "instance_eni" to already
# be such a map, but I did it this way to preserve
# your module interface as given.
instance_network_interfaces = {
for ni in var.instance_eni : ni.name => ni.id
}
}
resource "aws_instance" "instance" {
for_each = local.instance_ami
ami = each.value
instance_type = var.instance_type
key_name = var.keypair
root_block_device {
delete_on_termination = true
volume_size = 80
volume_type = "gp2"
}
network_interface {
device_index = 0
network_interface_id = local.instance_network_interfaces[each.key]
delete_on_termination = false
}
}
现在,每个实例只有一个网络接口,每个接口都连接到输入变量中给定的相应ENI ID。参考
each.key
和each.value
是我们如何在为每个使用资源时在声明的每个实例之间创建差异的;我们内部不需要任何其他重复构造,除非我们想要创建嵌套的重复,比如每个实例都有动态数量的网络接口。Hi Martin,下面是上述配置的错误。“错误:无效的索引网络\u接口\u id=local.instance\u网络\u接口[each.key]|--------------------------------------------each.key是一个”| local.instance\u网络\u接口是一个具有4个属性的对象,给定的键不标识此集合值中的元素。”但是,我能够通过:network\u interface\u id=lookup(var.instance\u eni,each.key)实现上述目标。对于上述内容,我已经更新了instance\u eni变量,如下所示。变量“instance_eni”{default={A=“eni-0a15890a6f567f487”B=“eni-089a68a526af5775b”C=“eni-09ec8ad891c8e9d91”D=“eni-0fd5ca23d3af654a9”}