Terraform ne permet pas l'utilisation de variables dans le block backend
; ce qui nous interdit d'utiliser des trucs pratiques comme le fournisseur external, fournisseur permettant d'appeler un programme externe pour alimenter des variables terraform ; programme pouvant être un gestionnaire de secrets, par exemple.
Par exemple, on peut lire des secrets depuis passwordstore) via un wrapper maison, qui implémente le protocole attendu par external
:
#!/usr/bin/env bash
set -e
jq -M -n --arg pass_secret "$(pass show $1)" '{secret: $pass_secret}'
Et ensuite, on peut l'utiliser ainsi :
data "external" "mon_secret" {
program = ["./pass-wrapper.sh", "mon/chemin/dans/pass/mon-secret"]
}
Manque de bol, c'est pas possible de faire ça avec un block backend
dans terraform (opentofu débloque ça).
Avec terraform on doit soit passer par des variables d'environnement soit via des arguments à la ligne de commande.
En ligne de commande ça donne ça (on dira que ce fichier s'appelle monscript.sh
):
#!/usr/bin/env bash
declare -a backend_vars=(
"endpoint=https://monstockage-s3.example.com"
"bucket=monbucket"
"key=monfichier.tfstate"
"access_key=$(pass show monbuckets3/access_key)"
"secret_key=$(pass show monbuckets3/secret_key)"
)
backend_configs=""
for var in "${backend_vars[@]}"; do
backend_configs+=" -backend-config='${var}'"
done
export TF_CLI_ARGS_init="$backend_configs"
source monscript.sh
On peut ensuite appeler terraform init
.