Terraform 如果输入是非空列表或空列表,我需要模块返回项目列表

Terraform 如果输入是非空列表或空列表,我需要模块返回项目列表,terraform,string-interpolation,pagerduty,Terraform,String Interpolation,Pagerduty,我的模块将一个可能为空的列表作为输入,如果该列表为非空,则创建一些资源并返回我在模块外部需要的特定属性,如下所示: variable contexts { type = "list" } resource "pagerduty_service" "p1" { count = "${length(var.contexts)}" name = "p1-${element(var.contexts, count.index)}"

我的模块将一个可能为空的列表作为输入,如果该列表为非空,则创建一些资源并返回我在模块外部需要的特定属性,如下所示:

variable contexts {
    type = "list"
}

resource "pagerduty_service" "p1" {
    count = "${length(var.contexts)}"
    name                    = "p1-${element(var.contexts, count.index)}"
    description             = "p1-${element(var.contexts, count.index)}"
    auto_resolve_timeout    = 14400
    acknowledgement_timeout = 1800
    escalation_policy       = "${pagerduty_escalation_policy.p1.id}"
    alert_creation          = "create_alerts_and_incidents"
    incident_urgency_rule {
        type    = "constant"
        urgency = "high"
    }
}

data "pagerduty_vendor" "cloudwatch" {
    name = "Cloudwatch"
}

resource "pagerduty_service_integration" "p1_cloudwatch" {
    count   = "${length(var.contexts)}"
    name    = "Amazon Cloudwatch"
    vendor  = "${data.pagerduty_vendor.cloudwatch.id}"
    service = "${element(pagerduty_service.p1.*.id, count.index)}"
}

output "integration_keys" {
    value = "${pagerduty_service_integration.*.integration_keys}"
}
我遇到的问题是,当这个模块首先在非空列表中运行,从而创建资源时,它工作得很好。如果我再次运行它,它将失败,出现以下异常:

* module.pagerduty.output.integration_keys: Resource 'pagerduty_service_integration.possibly_empty_resource_list' does not have attribute 'integration_key' for variable 'pagerduty_service_integration.possibly_empty_resource_list.*.integration_key'
如果可能的\u empty\u resource\u列表为空,我想不出一个好办法让这个输出返回一个空列表

有什么想法吗

编辑:

我尝试对输出执行三元检查,但由于某些原因,不支持使用列表,因此这将不起作用,但我希望它能说明我正在尝试执行的操作:

"${length(var.contexts) > 0 ? pagerduty_service_integration.*.integration_keys : list()}"
解决方案:

output "instance_id" { 
  value = "${element(concat(aws_instance.example.*.id, list("")), 0)}"
}

在terraform升级到0.11指南的最底部有一个部分:它显示了我对计算资源的使用

例: 输出实例_id{value=${elementconcataws_instance.example.*.id,list,0}


从评论移到列表上

列表的名称是什么?是的,这就是创建它所需要的,但它是一个可变长度的列表。。我在脚本的最顶端添加了它,之前它在另一个文件中。如果传入一个空列表,则pagerduty_service_集成的计数将为0,并且不会创建资源。然后,您会得到所得到的错误,因为集成键找不到不存在的pagerduty服务集成变量empty列表{type=list}输出集成键{value=${coalesclistjoin,pagerduty服务集成。*。集成键,var.empty列表}试试这个。更多信息在这里的最底部:是我用来计算模块中的资源及其输出的例子:output instance_id{value=${elementconcataws_instance.example.*.id,list,0}谢谢,我也想接受你之前的评论,但只能投票支持它: