Почему я не могу использовать источник данных aws_lambda_function внутри aws_lambda_alias routing_config? - PullRequest
0 голосов
/ 28 апреля 2019

Я экспериментирую с сине-зеленой настройкой развертывания для лямбд, используя terraform и лямбда-псевдонимы.

Я пытаюсь автоматически извлечь ранее развернутую версию лямбды, используя источник данных aws_lambda_function и используя значение в routing_config => Additional_version_weights. Это позволило бы мне настроить разделение трафика между ранее развернутой версией и версией, которая только что была развернута.

Однако я столкнулся с двумя ошибками, которые я не совсем понимаю.

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

Если я жестко закодирую значение, terraform попытается запустить обновление, однако произойдет сбой, поскольку при попытке установить версию в конфигурации маршрутизации на пустое значение, что приведет к ошибке проверки. Если я вместо этого выведу значение, я вижу, что получена правильная версия.

Пример кода и инструкции по воспроизведению можно найти по ссылке ниже.

https://github.com/jaknor/terraform-lambda-data-source-issue

Кто-нибудь может объяснить, почему это не работает?

Пожалуйста, обратите внимание, хотя я ценю, что есть другие способы достижения моей цели, на данный момент меня интересует только понимание этих конкретных ошибок.

1 Ответ

1 голос
/ 29 апреля 2019

В Terraform v0.11 и более ранних версиях последовательности интерполяции не поддерживаются слева от символа =, вводящего аргумент или ключ объекта.

Чтобы создать карту с динамическими ключами, вместо этого необходимоиспользуйте функцию map:

  additional_version_weights = "${map(data.aws_lambda_function.existing_lambda_func.version, var.lambda_previous_version_percentage)}"

В Terraform v0.12 (которая находится в стадии бета-версии, когда я пишу это) анализатор теперь может различать аргументы (которые должны быть константами вконфигурацию) и ключи карты (которые могут быть произвольными выражениями), поэтому предпочтителен следующий синтаксис, хотя приведенный выше будет работать для обратной совместимости.

  additional_version_weights = {
    (data.aws_lambda_function.existing_lambda_func.version) = var.lambda_previous_version_percentage
  }

Дополнительные круглые скобки вокруг ключевого выражения важны дляTerraform, что это следует понимать как нормальное выражение, а не как буквальное имя.

...