Опциональная привязка функции CloudFront Lambda в Terraform - PullRequest
0 голосов
/ 11 декабря 2018

Мы размещаем наше веб-приложение на CloudFront и S3.Эта инфраструктура настроена в модуле Terraform.Мы используем тот же модуль (управляемый Terragrunt) для развертывания нашего веб-приложения в наших промежуточных и производственных средах.

Очевидно, что мы не хотим публичного доступа к нашей промежуточной среде.Таким образом, мы создали функцию Lambda для включения Basic HTTP Auth и используем lambda_function_association в ресурсе aws_cloudfront_distribution, чтобы включить ее.

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

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

например,

# Basic Auth Guard
resource "aws_cloudfront_distribution" "default" {
  count = "${var.behind_auth_guard}"
  ...
}

# No Basic Auth Guard
resource "aws_cloudfront_distribution" "default" {
  count = "${var.behind_auth_guard ? 0 : 1}"
}

Однако, когда я пытаюсь развернуть код, я получаю aws_cloudfront_distribution.default: resource repeated multiple times.

Есть ли способ достичь того, чего я хочу?

Другой вариант, который я рассмотрел, - это установка лямбды на обеих версиях, но при этом она ничего не делает в prod.Однако это кажется неэффективным и дорогостоящим, поскольку Lamdba будет вызываться при каждом запросе, и он хотел бы избежать этого, если это возможно.

1 Ответ

0 голосов
/ 19 декабря 2018

В Terraform v0.12.0 это будет действительно легко решить, поскольку он поддерживает Динамические Вложенные Блоки .К сожалению, эта версия не будет выпущена до 1 квартала 2019 года.

Тем временем вы можете согласиться с предложенным вами предложением, с небольшими изменениями.Вам нужно только небольшое изменение, потому что дублирующиеся имена не поддерживаются.

# Basic Auth Guard
resource "aws_cloudfront_distribution" "cf_with_guard" {
  count = "${var.behind_auth_guard}"
  ...
}

# No Basic Auth Guard
resource "aws_cloudfront_distribution" "cf_no_guard" {
  count = "${var.behind_auth_guard ? 0 : 1}"
}

Если вы сейчас хотите использовать какие-либо выходные данные из этого ресурса, вы должны использовать небольшой хак .Например, если вы хотите вывести id дистрибутива:

output "cf_id" {
  value = "${var.behind_auth_guard ? join("", aws_cloudfront_distribution.cf_with_guard.*.id) : join("", aws_cloudfront_distribution.cf_no_guard.*.id)}"
}

join() необходим, потому что вы не можете сделать ссылку на ресурс, который не существует.Даже в выражении if.join() работает вокруг этого, обращаясь к списку всех ресурсов, который пуст, если count для ресурса равен 0.

Примечание для дальнейшего использования: , если v0.12.0 выпущен, вышеуказанные обходные пути больше не нужны.Просто обратитесь к динамическим вложенным блокам.

...