#amazon-web-services #elasticsearch #terraform
#amazon-веб-сервисы #elasticsearch #terraform
Вопрос:
у нас есть модуль, который создает прокси-сервер безопасности, на котором размещен сайт elasticsearch с использованием terraform. В его коде есть это;
elastic_search_endpoint = "${element(concat(module.es_cluster.elasticsearch_endpoint, list("")),0)}"
который, как я понимаю, затем идет и находит модуль es_cluster и получает конечную точку elasticsearch, которая была выведена из него. Затем это позволяет прокси-серверу иметь доступ к этой конечной точке, чтобы он мог запускать elasticsearch.
Но я на самом деле не понимаю, что делает этот фрагмент кода и почему существуют функции «element» и «concat». Почему это не может быть просто так?
elastic_search_endpoint = "${module.es_cluster.elasticsearch_endpoint}"
Комментарии:
1. Вероятно, это архаичный шаблон преобразования типов из Terraform <= 0.11.
Ответ №1:
Давайте разберем это и посмотрим, что делает каждая часть.
В примере это не показано, но я собираюсь предположить, что module.es_cluster.elasticsearch_endpoint
это выходное значение, представляющее собой список либо нулевых, либо одной конечной точки ElasticSearch, предположительно потому, что этот модуль позволяет отключить генерацию конечной точки ElasticSearch.
Если это так, это означает, что module.es_cluster.elasticsearch_endpoint
это будет либо []
(пустой список), либо ["es.example.com"]
.
Давайте сначала рассмотрим случай, когда это одноэлементный список: concat(module.es_cluster.elasticsearch_endpoint, list(""))
в этом случае будет создан список ["es.example.com", ""]
. Затем element(..., 0)
будет взят первый элемент, дающий "es.example.com"
в качестве конечного результата.
В случае с пустым списком concat(module.es_cluster.elasticsearch_endpoint, list(""))
создается список [""]
. Затем element(..., 0)
будет взят первый элемент, дающий ""
в качестве конечного результата.
Учитывая все это, кажется, что цель этого выражения состоит в том, чтобы либо вернуть одну конечную точку ElasticSearch, если она доступна, либо вернуть пустую строку в качестве заполнителя, если нет.
Я ожидаю, что это написано именно так, потому что оно было нацелено на более раннюю версию языка Terraform, в которой было меньше функций. Другой способ записать это выражение в текущей Terraform (версия 0.14 является текущей на момент написания этой статьи) был бы:
elastic_search_endpoint = (
length(module.es_cluster.elasticsearch_endpoint) > 0 ? module.es_cluster.elasticsearch_endpoint : ""
)
Неудобно, что это включает в себя полную ссылку на вывод дважды. Это может быть оправданием для использования этого concat
подхода даже в современной Terraform, хотя, возможно, будущему читателю это будет не так понятно:
elastic_search_endpoint = (
concat(module.es_cluster.elasticsearch_endpoint, "")[0]
)
Современная Terraform также включает в себя возможность null
значений, поэтому, если бы я писал модуль, подобный вашему сегодня, я бы, вероятно, предпочел возвращать null, а не пустую строку, чтобы было понятнее, что она представляет отсутствие значения:
elastic_search_endpoint = (
length(module.es_cluster.elasticsearch_endpoint) > 0 ? module.es_cluster.elasticsearch_endpoint : null
)
elastic_search_endpoint = (
concat(module.es_cluster.elasticsearch_endpoint, null)[0]
)
Ответ №2:
Перво-наперво: кто написал этот код? Почему это не задокументировано? Спросите парня!
Только из этого кода… Делать особо нечего. Я бы сказал, что, поскольку concat
ожидается два списка, module.es_cluster.elasticsearch_endpoint
это a list(string)
. Кроме того, в зависимости от некоторых variable
параметров, он может быть пустым. Объединение пустой строки гарантирует, что в 0
позиции что-то есть
Таким образом, все ${element(concat(module.es_cluster.elasticsearch_endpoint, list("")),0)}
это можно было бы перевести на length(module.es_cluster.elasticsearch_endpoint) > 0 ? module.es_cluster.elasticsearch_endpoint[0] : ""
(что, имхо, очень удобно для чтения).
Почему это не может быть просто так?
elastic_search_endpoint = «${module.es_cluster.elasticsearch_endpoint}»
Вероятно, потому elastic_search_endpoint
, что является an string
и, как упоминалось ранее, module.es_cluster.elasticsearch_endpoint
является a list(string)
. Вы должны указать значение по умолчанию на случай, если список пуст
Комментарии:
1. «Почему это не задокументировано?» — вероятно, потому, что это не достойно документа. Как вы говорите, одно предложение позже «Делать особо нечего» .
2. С этой единственной строкой кода мало что можно сделать. Мы не знаем типы каждого значения!