Вы должны быть в состоянии выполнить 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]
}
Таким образом, вам не нужно хранить имена дважды.