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