数据为空时如何使地形错误

how to make terraform error when data is empty

我对 Terraform 有疑问,尤其是 google 负载均衡器 backend_service

这是我的示例 tf 配置

var backends {
  default = [
     {
      'name':'red'
      'service': 'abcd'
     },
     {
      'name':'blue'
      'service': 'efgh'
     }
]
}

local {
backend = {for i in var.backends: "${i.name}-${i.service}" => i}
}

data "external" "mydata" {
    for_each = local.backend
    program = ["/bin/sh", "script.sh", each.value.name]
}
//that script will get some data like this //

{"id": "sometext"}

//

resource "google_compute_backend_service" "default" {
  project  = local.project_id
  for_each = local.backend
  name     = each.key

  dynamic "backend" {
    for_each = {for zone in var.zone: zone => "projects/${local.project_id}/zones/${zone}/networkEndpointGroups/${data.external.mydata[each.key].result.id}"}

  }
}

问题是,如果 data.external.mydata[each.key].result.id 为空,则 terraform plan 为 success/without 错误。 我希望 terraform plan 成为 error/failed,尤其是 google_compute_backend_service

here's sample external.data if empty

{"id":""}

我希望这是 error/failed 特别是 google_compute_backend_service

是否可以重现错误? 我知道它可以使用 count 来检查 external.data 值,但是因为我使用 for_each,所以我不能使用 count

您使用 external 数据源执行的程序的部分预期协议是,它们可以通过将错误消息打印到 stderr 然后以非零退出状态退出来指示错误。

在 shell 脚本中,您可以通过如下命令执行此操作:

echo >&2 "No matching object is available."
exit 1

如果您的命令像这样未成功退出,那么 external 提供程序将检测到并 return 失败,这将反过来阻止 Terraform 处理依赖于该结果的任何资源。