如果 terraform 中不存在密钥,如何跳过 for_each 循环

How to skip for_each loop if key does not exist in terraform

我的问题陈述很简单,但我无法在互联网上的任何地方找到解决方案。

我的用户列表为 locals:

// users

locals {
  allUsers = {

    dev_user_1 = {
      Name   = "user1"
      Email  = "user1@abc.com"
      GitHub = "user1" # github username
      Team   = "Dev"
    }

    devops_user_2 = {
      Name   = "user2"
      Email  = "user2@abc.com"
      GitHub = "user2" # github username
      Team   = "DevOps"
    }

    product_user_3 = {
      Name   = "user3"
      Email  = "user3@abc.com"
      Team   = "Product"
    }
  }
}

这些 local 标签用于创建对 Github、监控工具等内部工具的访问权限

现在,对于属于 DevDevOps 团队的 2 个用户,他们需要访问 Github ORG,而产品用户只需要访问一些仪表板但不是 Github,因此缺少标签。

我如何遍历 terraform 资源 github_membership 以跳过此产品用户(或任何没有标签 key GitHub 的人?)

我正在尝试以下代码,但没有成功

// Send GitHub invite
resource "github_membership" "xyzTeam" {
  for_each = local.allUsers
  username = each.value.GitHub
  role     = "member"
}

错误:

╷
│ Error: Unsupported attribute
│
│   on users.tf line 12, in resource "github_membership" "xyzTeam":
│   12:   username = each.value.GitHub
│     ├────────────────
│     │ each.value is object with 3 attributes
│
│ This object does not have an attribute named "GitHub".

我做了什么来解决这个问题?

  1. 为每个人设置 GitHub keyvaluenull。 错误:
╷
│ Error: "username": required field is not set
│
│   with github_membership.xyzTeam["user3"],
│   on users.tf line 10, in resource "github_membership" "xyzTeam":
│   10: resource "github_membership" "devops" {
│
╵
  1. 如果我将值留空,错误:
Error: PATCH https://api.github.com/user/memberships/orgs/XYZ: 422 You can only update an organization membership's state to 'active'. []
  1. for k, v in local.allUsers : k => v if v != "" 同样的错误,因为它仍然试图创建具有空值的用户,但最终失败了。

我想不出别的了。如果有人可以帮助从这些现有的 locals 中创建单独的 locals,这会创建 locals 的列表,grep GitHub 值,那么 hack 将非常有帮助。

您第三次尝试的想法是正确的,但 for 表达式中的条件逻辑略有偏差。您需要改用 can 函数:

{ for user, attributes in local.allUsers : user => attributes if can(attributes.GitHub) }

如果嵌套映射包含 Github 键,则 can(attributes.Github) returns true,映射构造函数将包含 key-value 对。使用此算法,您可以从旧地图构建新地图,并删除不包含嵌套地图值中的 Github 键的条目。