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?
7 Réponses :
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 .
obtention: panic: didn't find any token of type TokenOBrack
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.
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>
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:
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
.
Ou vous pouvez utiliser un simple sed:
sed -i 's/\"\${/\"/g;s/}\"/\"/g' main.tf
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")
J'ai utilisé notepad ++ pour supprimer cette syntaxe d'interpolation.
regex:
\1\2
remplacer par:
^(.*)\${(.*)}
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.
Terraform v14 fmt
incorporé. Vous pouvez maintenant obtenir le binaire rc
et lancer simplement terraform fmt
.