18
votes

Correction de l'avertissement "Les expressions d'interpolation uniquement sont obsolètes" dans Terraform

J'ai mis à niveau vers Terraform v0.12.16 et maintenant je reçois beaucoup de messages qui ressemblent à ceci:

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.

Il existe des centaines de ces messages. Existe-t-il un moyen automatisé de les résoudre?


0 commentaires

7 Réponses :


4
votes

Cet outil supprimera automatiquement les guillemets et les accolades de début et de fin pour vous, ce qui corrige les avertissements: https://github.com/apparentlymart/terraform-clean-syntax

go get github.com/apparentlymart/terraform-clean-syntax
terraform-clean-syntax .


1 commentaires

obtention: panic: didn't find any token of type TokenOBrack



23
votes

Avez-vous d'abord mis à jour le code?

Terraform 0.11 n'est pas compatible avec 0.12, vous devez donc d'abord le mettre à jour.

terraform init
terraform 0.12upgrade

Si votre code Terraform appelle d'autres modules terraform, veuillez vous assurer que vous avez également mis à niveau ces modules terraform vers 0.12.


2 commentaires

Oui, j'ai mis à jour le code. J'obtenais toujours les erreurs ci-dessus.


Pour clarifier, mettre à jour les modules signifie exécuter ces 2 mêmes commandes dans la racine des modules comme .terraform / modules / <module_name>



6
votes

Le code terraform-clean-syntax de Martin Atkins peut être utilisé (merci à Kevin Burke pour son indice)

Je l'ai utilisé sans vergogne et emballé dans un conteneur docker afin qu'il puisse être facilement exécuté sur des machines non linux_amd64, par exemple MacOS:

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

TL&DR (ATTENTION - cela mettra à jour vos fichiers tf en place):

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:


2 commentaires

Cet outil a été utile, mais notez qu'il ne désinterpole pas les valeurs dans les tableaux (par exemple subnet_ids). Pour cela, j'ai dû retomber en appliquant soigneusement une substitution regex: "\$\{([^}"]+)\}" Elle ne peut pas être appliquée aveuglément à cause de l'interpolation dans ici-documents.


Pour la coquille de poisson, docker run --rm -v $(pwd):/code -t pniemiec/terraform-clean-syntax-docker .



1
votes

Ou vous pouvez utiliser un simple sed:

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


2 commentaires

A très bien fonctionné. J'ai utilisé * .tf au lieu de main.tf, et il a mis à jour tous les fichiers


En fait, vous remplacez les chaînes par " . Au lieu de cela, vous voulez qu'il soit remplacé par rien: sed -i 's/\"\${//g;s/}\"//g' *tf . Votre résultat devient private_key = "${file("ssh_key")}" into private_key = "file("ssh_key")" , qui n'est pas valide. Vous voulez que le résultat soit private_key = file("ssh_key")



0
votes

J'ai utilisé notepad ++ pour supprimer cette syntaxe d'interpolation.

regex:

\1\2 

remplacer par:

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


0 commentaires

3
votes
  Warning: Interpolation-only expressions are deprecated

  on main.tf line 3, in provider "aws":
   3:   region  = "${var.region}"
I also got the above warning, which is due to the changed syntax for declaring variables in terraform.
See the example below -:Old syntax-  region  = "${var.region}"   # you will get Interpolation-only warningNew Synatx-  region  = var.region        # no warningCheck the syntax and correct it using any code editor.

0 commentaires

0
votes

Terraform v14 fmt incorporé. Vous pouvez maintenant obtenir le binaire rc et lancer simplement terraform fmt .


0 commentaires