J'ai une infrastructure existante dans Terraform et je l'utilise depuis un certain temps. Récemment, j'avais échangé les informations d'identification AWS de mon ordinateur portable local (les crédits stockés dans ~/.aws/credentials
) et il a cessé de fonctionner jusqu'à ce que je réinitialise ces informations d'identification.
Le problème est que je déclare les crédits dans la source Terraform elle-même, mais il ne semble pas du tout les utiliser.
terraform {
backend "s3" {
bucket = "example_tf_states"
key = "global/vpc/us_east_1/example_state.tfstate"
encrypt = true
region = "us-east-1"
}
}
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}
variable "access_key" {
default = "<hidden_for_stack_exchange_post>"
}
variable "secret_key" {
default = "<hidden_for_stack_exchange_post>"
}
variable "region" {
default = "us-east-1"
}
Les autorisations d'accès ID sont 100% bonnes. J'utilise le même ID de compte et la même clé secrète pour les aws configure
paramètres qui entrent ~/.aws/credentials
comme je le suis dans les déclarations de variables Terraform ci-dessus.
Tout fonctionne bien tant que les identifiants sont en place, ~/.aws/credentials
mais dès que les informations d'identification au niveau du système d'exploitation ont disparu (c'est-à-dire rm ~/.aws/credentials
), j'obtiens ce qui suit lorsque j'essaie d'exécuter des opérations Terraform, telles que terraform plan
:
Failed to load backend:
Error configuring the backend "s3": No valid credential sources found for AWS Provider.
Please see https://terraform.io/docs/providers/aws/index.html for more information on
providing credentials for the AWS Provider
Please update the configuration in your Terraform files to fix this error.
If you'd like to update the configuration interactively without storing
the values in your configuration, run "terraform init".
Si je re-remplis le ~/.aws/credentials
en l'exécutant, aws configure
cela fonctionnera à nouveau correctement.
Je ne comprends pas - si mon provider
paramètre déclare explicitement les informations d'identification à utiliser dans le code source Terraform, pourquoi ma configuration AWS au niveau du système d'exploitation est-elle importante?
Comment puis-je faire en sorte que Terraform utilise uniquement les crédits définis dans ma configuration Terraform et ignore ce qui se trouve dans mon profil utilisateur de système d'exploitation?
Modifier, c'est Terraform v0.11.7
Edit: Veuillez noter que j'essaie de résoudre le problème sur la raison pour laquelle les crédits déclarés statiquement ne sont pas utilisés dans la déclaration du fournisseur. Ne pas rechercher d'autres méthodes ou solutions de contournement. Merci.
AWS_PROFILE
ouAWS_DEFAULT_PROFILE
ne sont pas définies, car elles indiquent au kit SDK AWS qu'il doit rechercher dans le fichier d'informations d'identification.Réponses:
Votre première question
Le message d'erreur "Impossible de charger le backend: erreur de configuration du backend" s3 "" fait référence à votre configuration Backend S3.
Regardez dans le fichier
./.terraform/terraform.tfstate
et vous verrez la configuration du backend S3.Le serveur principal Terraform S3 est différent du fournisseur Terraform AWS. Le message d'erreur "Aucune source d'informations d'identification valide n'a été trouvée pour le fournisseur AWS." est trompeur. Cela implique que la configuration du fournisseur AWS est utilisée, ce qui est faux. Les informations d'identification du backend S3 sont configurées séparément et stockées dans le
terraform.tfstate
fichier.Votre configuration AWS au niveau du système d'exploitation est importante car si aucune information d'identification de backend S3 n'est spécifiée, comme indiqué ici https://www.terraform.io/docs/backends/types/s3.html , alors Terraform utilise par défaut les éléments suivants, dans l'ordre:
Vous n'avez spécifié aucune information d'identification dans votre configuration S3 Backend, donc terraform utilise par défaut le fichier AWS Shared Credentials.
Votre configuration de backend S3 ne contient aucune information d'identification.
Votre deuxième question,
Tout d'abord, les backends ne peuvent pas contenir d'interpolation, voir https://www.terraform.io/docs/backends/config.html . Vous ne pouvez donc pas utiliser de variables dans la configuration du backend. par exemple, cette configuration n'est pas valide
Si vous souhaitez spécifier les informations d'identification AWS lors de l'exécution,
terraform init
vous spécifiez la configuration du backend comme options.terraform init --backend-config="access_key=your_access_key" --backend-config="secret_key=your_secret_key"
Cela produit une configuration S3 Backend qui ressemble à ceci, stockée dans le
./.terraform/terraform.tfstate
fichier:Encore une fois, les informations d'identification du backend S3 sont configurées séparément de vos informations d'identification du fournisseur AWS.
Réexécutez
terraform init
et spécifiez les informations d'identification sur la ligne de commande comme--backend-config
options pour corriger votre erreur.la source
shared_credentials_file
option que tous mes backends et fournisseurs récolteront et utiliseront. Semble fonctionner correctement et rien n'est verrouillé dans les informations d'identification aws de la station de travail OS.L'erreur que vous obtenez se réfère spécifiquement à la configuration du backend S3, qui AFAIK n'hérite pas des paramètres de la configuration du fournisseur AWS; il dispose également d' options de configuration
access_key
etsecret_key
que si vous n'utilisez pas,~/.aws/credentials
vous devrez configurer explicitement.la source
Vous feriez mieux de configurer des profils dans vos
~/.aws/credentials
fichiers commeEnsuite, dans votre fournisseur, vous pouvez lui dire quel profil utiliser
Il gardera les clés hors de vos fichiers terraform, ce qui est une bonne chose si vous souhaitez les mettre en contrôle de source.
la source