Исправить предупреждение "Выражения только для интерполяции устарели" в Terraform

Я обновился до Terraform v0.12.16 и теперь получаю много сообщений, которые выглядят следующим образом:

Warning: Interpolation-only expressions are deprecated

  on ../modules/test-notifier/test_notifier.tf line 27, in resource "aws_sns_topic_policy" "default":
  27:   arn    = "${aws_sns_topic.default.arn}"

Terraform 0.11 and earlier required all non-constant expressions to be
provided via interpolation syntax, but this pattern is now deprecated. To
silence this warning, remove the "${ sequence from the start and the }"
sequence from the end of this expression, leaving just the inner expression.

Template interpolation syntax is still used to construct strings from
expressions when the template includes multiple interpolation sequences or a
mixture of literal strings and interpolations. This deprecation applies only
to templates that consist entirely of a single interpolation sequence.

Таких сообщений сотни. Есть ли автоматический способ их исправить?

10 ответов

Решение

Этот инструмент автоматически удаляет начальные и конечные кавычки и фигурные скобки, что устраняет предупреждения: https://github.com/apparentlymart/terraform-clean-syntax

go get github.com/apparentlymart/terraform-clean-syntax
terraform-clean-syntax .
  Warning: Interpolation-only expressions are deprecated

  on main.tf line 3, in provider "aws":
   3:   region  = "${var.region}"

Я также получил указанное выше предупреждение, которое связано с измененным синтаксисом объявления переменных в terraform. См. Пример ниже -:

Старый синтаксис- region = "${var.region}" # вы получите предупреждение только о интерполяции

Новый Synatx- region = var.region # без предупреждения

Проверьте синтаксис и исправьте его с помощью любого редактора кода.

Вы сначала обновили код?

Terraform 0.11 несовместима с 0.12, поэтому вам необходимо сначала обновить его.

terraform init
terraform 0.12upgrade

Если ваш код Terraform вызывает другие модули terraform, убедитесь, что вы также обновили эти модули terraform до 0.12.

Обновите интерполяции, как показано ниже:

      subscription_id = "${var.subscription_id}"

к

      subscription_id = var.subscription_id

Terraform v14 fmtвключил это. Теперь вы можете получить rc двоичный и просто запустить terraform fmt.

Можно использовать код terraform-clean-syntax Мартина Аткинса (спасибо Кевину Бёрку за подсказку)

Я беззастенчиво использовал его и упаковал в контейнер докеров, чтобы его можно было легко запустить на машинах без linux_amd64, например MacOS:

https://github.com/NoLedgeTech/terraform-clean-syntax-docker

TL&DR (ВНИМАНИЕ - это обновит ваши tf файлы на месте):

docker pull pniemiec/terraform-clean-syntax-docker
cd <DIRECTORY_WITH_TF_FILES>
terraform init
terraform plan    # This shows a lot of warnings
docker run --rm -v $(pwd):/code -t pniemiec/terraform-clean-syntax-docker
terraform plan    # This does not show a lot of warnings :sweat_smile:

Или вы можете использовать простой sed:

sed -i 's/\"\${/\"/g;s/}\"/\"/g' main.tf

Решение уже есть в выводе журнала: ... remove the "${ sequence from the start and the }" ...

Вы использовали => arn "${aws_sns_topic.default.arn}"

Попробуйте использовать без интерполяции, например: arn = aws_sns_topic.default.arn

Я использовал блокнот ++, чтобы удалить этот синтаксис интерполяции.

регулярное выражение:

^(.*)\${(.*)}

заменить:

\1\2 
Другие вопросы по тегам