我有以下代码,并且我希望有一个条件,该条件仅在实例是公共子网的一部分(或根据需要基于布尔值)的情况下才创建弹性IP。这是我目前可以使用的代码,但是我希望它不要为专用子网上的资源创建弹性IP:
locals {
instances_beta = {
my-ec2 = {
name = "myec2",
ami = "ami-029e27fb2fc8ce9d8",
instancetype = "t3.xlarge"
environment = "Beta",
securitygroups = [var.mysg],
subnetid = var.public-a,
elasticip = true
}
}
}
resource "aws_instance" "beta-instance" {
for_each = local.instances_beta
ami = each.value.ami
instance_type = each.value.instancetype
subnet_id = each.value.subnetid
key_name = "mykey"
vpc_security_group_ids = each.value.securitygroups
tags = {
Name = each.value.name
Environment = each.value.environment
}
}
resource "aws_eip" "beta-eip" {
for_each = local.instances_beta
instance = aws_instance.beta-instance[each.key].id
vpc = true
}
听起来,count是执行类似操作的最佳方法,但是我不能这样做,因为我已经在使用for_each来实现资源创建。我试图使用嵌套的for循环来执行此操作,但是我无法完全弄清楚如何正确地使用语法,或者这是否是执行此操作的最佳方法。作为参考,我在其中找到的最佳资源是关于for_each条件句:https://blog.gruntwork.io/terraform-tips-tricks-loops-if-statements-and-gotchas-f739bbae55f9
答案 0 :(得分:2)
您可以使用for
循环来创建过滤后的地图,例如:
for_each = {
for key, value in local.instances_beta: key => value if value.subnetid == var.public-a
}
它将过滤local.instances_beta
并保留subnetid
等于var.public-a
的项目。您可以根据需要调整条件。