Получить ресурсы на основе значения, созданного с использованием счетчика - PullRequest
0 голосов
/ 30 января 2020

Я использую Terraform v12.19 с провайдером aws v2.34.0. Представьте, у меня есть ресурс, сгенерированный со значением счетчика:

resource "aws_iam_role" "role" {
  count = length(var.somevariable)
  name = var.somevariable[count.index]
}

Позже я хочу сослаться на один конкретный c экземпляр ресурса таким образом, например:

resource "aws_iam_role_policy_attachment" "polatt" {
  role       = aws_iam_role.role["TheRoleNameIWant"].id
  policy_arn = "arn:aws:iam::aws:policy/..."
}

Я не знаю индекс, я могу просто положиться на имя, предоставленное переменной. Это потому, что значения переменной предоставляются внешним источником, и порядок может измениться ...

Есть идеи, как это сделать?

1 Ответ

1 голос
/ 13 февраля 2020

Вы должны быть в состоянии выполнить sh это с помощью функции терраформ index.

Вот минимальный пример использования null_resources для проверки

locals {
  role_names = [
    "role-a",
    "role-b",
    "role-c",
    "role-d",
  ]

  target_role_name = "role-c"
}

resource "null_resource" "hi" {
  count = length(local.role_names)
}

output "target_resource" {
  value = null_resource.hi[index(local.role_names, local.target_role_name)].id
}

output "all_resources" {
  value = [for r in null_resource.hi : r.id]
}

Это выводит Например,

all_resources = [
  "4350570701002192774",
  "9173388682753384584",
  "1634695740603384613",
  "2098863759573339880",
]
target_resource = 1634695740603384613

Итак, я полагаю, ваш пример будет выглядеть так:

resource "aws_iam_role_policy_attachment" "polatt" {
  role       = aws_iam_role.role[index(var.somevariable, "TheRoleNameIWant")].id
  policy_arn = "arn:aws:iam::aws:policy/..."
}

Обновление

В приведенном ниже комментарии упоминается, что у вас действительно более сложные данные структура, чем просто список имен. Я просто хотел упомянуть, что вы можете получать имена из вашей JSON структуры.

Предполагая, что у вас есть что-то вроде следующего

variable "role_values" {
  value = [
    {
      name = "foo",
      other = "details",
      fields = 3
    },
    {
      name = "bar",
      other = "yet more details",
      fields = 3
    }
  ]
}

, вы можете получить только имена, используя локальные и более новые for циклы TF 0,12 предлагает

locals {
  role_names = [for role in var.role_values: role.name]
}

Таким образом, вам не нужно хранить имена дважды.

...