Terraform 如果映射变量不是空对象,则模块调用中的可选参数

Terraform 如果映射变量不是空对象,则模块调用中的可选参数,terraform,Terraform,我有下面的模块创建一个私有bucket。我只想在模块调用中定义非空的logging参数时使用日志记录: 变量“标记”{ description=“要分配给bucket的标记映射。” type=“映射” 默认值={} } 变量“日志记录”{ description=“分配给存储桶的日志映射。” type=“映射” 默认值={} } 资源“aws\u s3\u bucket”“private\u bucket”{ bucket=“${var.bucket}” acl=“私有” policy=“${d

我有下面的模块创建一个私有bucket。我只想在模块调用中定义非空的
logging
参数时使用日志记录:

变量“标记”{
description=“要分配给bucket的标记映射。”
type=“映射”
默认值={}
}
变量“日志记录”{
description=“分配给存储桶的日志映射。”
type=“映射”
默认值={}
}
资源“aws\u s3\u bucket”“private\u bucket”{
bucket=“${var.bucket}”
acl=“私有”
policy=“${data.aws\u iam\u policy\u document.policy.json}”
tags=“${var.tags}”
#logging=“${var.logging}”
logging=“${length(key(var.logging))>0?var.logging:null}”
# ...
#此块将替换为参数
/*伐木{
target_bucket=“${var.logging_bucket}”
target_prefix=“s3/${local.bucket_id}/”
} */
# ...
}
然而,这是行不通的。我这样调用模块:

模块“专用存储桶”{
source=“模块/专用存储桶”
bucket=“${local.private\u bucket\u name}”
标签{
Name=“无服务器堆栈专用存储桶”
环境=“${local.stage}”
}
}
如果没有在Terraform中实现,为什么要使用顶级?在模块/资源中,是否有其他方法可以使用条件而不仅仅是值来初始化变量

编辑:

这是一个伪代码,我想实现:

resource“aws\u s3\u bucket”“private\u bucket”{
bucket=“${var.bucket}”
acl=“私有”
policy=“${data.aws\u iam\u policy\u document.policy.json}”
tags=“${var.tags}”
#如果var.logging不是空对象,
#然后使用对象初始化日志记录
if(var.logging!={}){
logging=“${var.logging}”
}
# ...
}

您不能在then或else部分使用地图。我认为Terraform0.12可能更灵活

我在Azure上也做了同样的操作,最后在locals{}部分使用了merge函数,var.tags默认为{}:

tags    = "${merge(data.azurerm_resource_group.env.tags, var.tags)}"

然后,我对资源块使用
${local.tags}

您可以使用0.12版(我不确定以前是否可行),实现伪代码想要做的事情的方法可以通过fllowing terraform hcl脚本来实现

locals {
  if_logging = var.logging ? [{}] : []
}
... (assume rest of the bucket resource definition here)
dynamic "logging" {
    for_each = local.if_logging

    content {
       target_bucket = var.bucket
       target_prefix = var.prefix
    }
  }
这是由于dynamic的工作方式


处检查terraform的动态文档如果您需要在循环中检查此项,并且您正在使用terraform 0.12+,您可以按如下操作。换句话说,检查
长度(键(…)
现在可以工作了(从Terraform 0.12开始)

“这不起作用”。发生了什么事?错误消息?
locals {
  possible_subnets = [
    var.k8s_cluster_1_subnet,
    var.database_subnet,
    var.vpc_solr_subnet
  ]
}

...
module "my-module" {
  ...
  subnet_names = [for subnet in local.possible_subnets :
    subnet.name if length(keys(subnet)) > 0
  ]
}