Как пропустить цикл for_each, если ключ не существует в terraform

Моя формулировка проблемы проста, но я не могу найти решение нигде в Интернете.

У меня есть список пользователей как locals:

// users

locals {
  allUsers = {

    dev_user_1 = {
      Name   = "user1"
      Email  = "[email protected]"
      GitHub = "user1" # github username
      Team   = "Dev"
    }

    devops_user_2 = {
      Name   = "user2"
      Email  = "[email protected]"
      GitHub = "user2" # github username
      Team   = "DevOps"
    }

    product_user_3 = {
      Name   = "user3"
      Email  = "[email protected]"
      Team   = "Product"
    }
  }
}

Это теги local, которые используются для создания доступа к внутренним инструментам, таким как Github, инструменты мониторинга и т. д.

Теперь для двух пользователей, принадлежащих к командам Dev и DevOps, им нужен доступ к 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 key для всех, но это value как null. Ошибка:
╷
│ 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, этот хак был бы очень полезен.

for_each = { for k, v in local.allUsers : k => v if v.GitHub != null } Это исправляет проблему 50%, но я все еще должен установить тег GitHub = null. Было бы неплохо не настроить это и заставить это работать.
Alok Kelsey 13.05.2022 20:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас была правильная идея с вашей третьей попытки, но условная логика в выражении for немного неверна. Вместо этого вам нужно использовать функцию can:

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

Если вложенная карта содержит ключ Github, то can(attributes.Github) возвращает true, а конструктор карты будет содержать пару ключ-значение. С помощью этого алгоритма вы можете создать новую карту из старой карты с удаленными записями, которые не содержат ключа Github во вложенном значении карты.

@AlokKelsey Я пропустил, что имя переменной было GitHub вместо Github. Я обновил h на H, и теперь он работает правильно. Возможно, в будущем вы захотите рассмотреть возможность использования стандартного футляра TF для змеи.

Matt Schuchard 13.05.2022 20:58

Извините, это моя ошибка. Я не знаю, что я делал не так, но теперь это сработало как шарм! Спасибо чувак.

Alok Kelsey 13.05.2022 20:58

Да, верно, это была опечатка. Мы прокомментировали одновременно.

Alok Kelsey 13.05.2022 20:59

Превосходно. Еще раз спасибо за то, что сэкономили мне много времени ??

Alok Kelsey 13.05.2022 21:00

Другие вопросы по теме