Terraform 如何使用if、else、elsif语句创建地形?

Terraform 如何使用if、else、elsif语句创建地形?,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我正在设置一个地形模块来创建极光集群。 我需要有一个跨区域复制选项,因此我需要决定复制副本相对于源区域的区域。 有什么方法可以在terraform中执行多选项条件吗?在terraform

我正在设置一个地形模块来创建极光集群。
我需要有一个跨区域复制选项,因此我需要决定复制副本相对于源区域的区域。

有什么方法可以在terraform中执行多选项条件吗?

在terraform<0.12中没有if/elseif/else这样的东西


但是,您可以在

中使用经典布尔逻辑这是使用coalesce()函数的一种方法:

locals{
  prod = "${var.environment == "PROD" ? "east" : ""}"
  prod2 = "${var.environment == "PROD2" ? "west2" : ""}"
  nonprod = "${var.environment != "PROD" && var.environment != "PROD2" ? "west" : ""}"
  region = "${coalesce(local.prod,local.prod2, local.nonprod)}"
}

您可以尝试只使用
映射
查找
。例如:

/* In your variables.tf */
variable "region_mapping" {
  description = "mapping for cross-region replication"
  default = {
    "us-east-1" = "us-east-2",
    "us-west-1" = "us-west-2"
  }
}

/* Then create use lookup to get the replication region from the deployment region */
resource "example" "example" {
  region = "${lookup(var.region_mapping, var.region)}"
}
如果
var.region
是您部署当前集群的位置,并且其值例如为
us-east-1
,则查找将返回
us-east-2
,作为您应该部署复制副本的区域


根据您的需要调整此开关。

从terraform 0.12开始,您可以使用地图来模拟开关,例如:

locals {
  environments = {
    prod = "east",
    prod2 = "west2"
  }
  
  region = lookup(environment_region, lower(var.environment), "west")
}
这样做的好处是,如果结果更复杂,您可以从映射返回对象/列表,而不是简单的字符串

例如,我有一个集中式命名模块,它根据资源类型等不同的规则组合名称

locals {
  parts_map = {
    # NB Location should always be last to ensure geo-separation of names
    prefix = [ local.type.code, var.name, var.role, var.environment, module.location.code ]
    suffix = [ var.name, var.role, var.environment, local.type.code, module.location.code ]
    mode3  = [ var.name, local.type.code, var.role, var.environment, module.location.code ]
}

parts = compact(local.parts_map[local.type.order])
对于更字面的“if-elif-else”方法,您可以将if速记与其他方法嵌入,以产生类似的效果。如果您的用例也在for循环中,那么您也可以这样做:

locals {
  test = {
    for i in list : 
      key => "${ condition ? value : (elif-condition ? elif-value : else-value)}"
  }
}

在任何情况下都可以使用“${}”语法

这很有帮助,我最终使用的是list而不是map,我需要count.index来查找值,谢谢@Esteban Garcia
locals {
  test = {
    for i in list : 
      key => "${ condition ? value : (elif-condition ? elif-value : else-value)}"
  }
}