TGViewer
Сочный DevOps Сочный DevOps @andtree_sec · 420 subscribers
Post #211 238
Terraform провайдер для управления объектами ELK

Мы используем официальный - https://registry.terraform.io/providers/elastic/elasticstack/latest

Это небольшая заметка по особенностям API kibana, как следствие поведение провайдера.
Предположим есть некий json dataview:
{
"data_view": {
"name": "dataview_name",
"title": "dataview_title",
"allowNoIndex": true,
"allowHidden": true,
"namespaces": ["default"]
}
}


Мы его обрабатываем в коде и накладываем на схеме провайдера в данном случае вот так:
locals {
dataview_root = "${var.json_base_path}/dataviews"
dataview_files = fileset(local.dataview_root, "**/*.json")

dataview_map = {
for f in local.dataview_files :
replace(basename(f), ".json", "") => jsondecode(file("${local.dataview_root}/${f}"))
}
}

resource "elasticstack_kibana_data_view" "kibana_dataview" {
for_each = local.dataview_map

data_view = {
title = try(each.value.data_view.title, each.value.title)
name = try(each.value.data_view.name, each.value.name, each.key)
time_field_name = try(each.value.data_view.timeFieldName, each.value.timeFieldName, null)
namespaces = try(each.value.data_view.namespaces, each.value.namespaces, null)
allow_no_index = try(each.value.data_view.allowNoIndex, each.value.allowNoIndex, null)
type = try(each.value.data_view.type, each.value.type, null)

field_attrs = {
for field_name, attrs in try(each.value.data_view.fieldAttrs, each.value.fieldAttrs, {}) :
field_name => {
count = try(attrs.count, null)
custom_label = try(attrs.customLabel, null)
}
}

field_formats = {
for field_name, format in try(each.value.data_view.fieldFormats, each.value.fieldFormats, {}) :
field_name => jsonencode(format)
}

runtime_field_map = try(jsonencode(each.value.data_view.runtimeFieldMap), jsonencode(each.value.runtimeFieldMap), null)

source_filters = [
for filter in try(each.value.data_view.sourceFilters, each.value.sourceFilters, []) : {
value = filter.value
}
]
}
space_id = try(each.value.space_id, "default")
}


Применяем в кластер, все ок, при смене name, title тоже все ок, dataview обновиться, а вот при смене значения например у namespace или поля allowNoIndex объект будет пересоздан. Дело в том, что так работает API kibana, как следствие провайдер, который кстати использует их официальную go либу.
Все бы ничего пересоздали и ладно, вот только при пересоздании меняется dataview id, а на dataview id могут быть завязаны rules в kibana. Следовательно они все перестанут работать.

#terraform
More from @andtree_sec
  1. Sep 7, 2026Давненько не было сообщений. Скорее всего в будущем они уйдут в telegraf, который я еще не…
  2. Jul 6, 2026Последнее время на работе часто приходится работать с apache flink и даже что-то писать на…
  3. Jun 4, 2026Немножко про молекула тесты... У нас принято использовать в переменных lookup плагин для д…
  4. May 20, 2026Очередной небольшой проект. Веб-приложение, которое агрегирует через стандартный механиз g…
  5. May 15, 2026Включаем профилирование в ansible Профилирование, это вывод даты, времени запуска и итогов…
  6. Apr 17, 2026Так выглядит общий dashbord работы с инцидентами.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →