Terraform: Choix des informations d'identification pour un fichier d'état distant

10

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 configureparamètres qui entrent ~/.aws/credentialscomme je le suis dans les déclarations de variables Terraform ci-dessus.

Tout fonctionne bien tant que les identifiants sont en place, ~/.aws/credentialsmais 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/credentialsen l'exécutant, aws configurecela fonctionnera à nouveau correctement.

Je ne comprends pas - si mon providerparamè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.

emmdee
la source
Hrm ... juste un pressentiment. Assurez-vous que les variables d'environnement AWS_PROFILEou AWS_DEFAULT_PROFILEne sont pas définies, car elles indiquent au kit SDK AWS qu'il doit rechercher dans le fichier d'informations d'identification.
Erik Osterman
Merci. Réponse tardive mais je revisite cela. Malheureusement, j'ai vérifié que les vars env ne sont pas présents. Ce serait vraiment bien s'il pouvait demander des crédits lors de l'exécution comme d'autres plans qui n'utilisent pas de backend distant. Merci quand même.
emmdee

Réponses:

10

Votre première question

si mon paramètre de fournisseur 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?

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.tfstateet 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.tfstatefichier.

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:

  1. Variables d'environnement AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY
  2. Fichier d'informations d'identification partagées AWS, la valeur par défaut est "~ / .aws / credentials".

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.

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
  }
}

Votre deuxième question,

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?

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

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
    access_key = ${var.access_key}
    secret_key = ${var.secret_key}
  }
}

Si vous souhaitez spécifier les informations d'identification AWS lors de l'exécution, terraform initvous 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.tfstatefichier:

{
    "version": 3,
    "serial": 1,
    "lineage": "bd737d2d-1181-ed64-db57-467d14d2155a",
    "backend": {
        "type": "s3",
        "config": {
            "access_key": "your_access_key",
            "secret_key": "your_secret_key"
        },
        "hash": 9345827190033900985
    },

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 initet spécifiez les informations d'identification sur la ligne de commande comme --backend-configoptions pour corriger votre erreur.

Mike Marseglia
la source
Merci. Réponse très détaillée et je comprends maintenant le problème. Dans mon cas d'utilisation, j'ai fini par utiliser l' shared_credentials_fileoption 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.
emmdee
3

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_keyet secret_keyque si vous n'utilisez pas, ~/.aws/credentialsvous devrez configurer explicitement.

Bodgit
la source
1

Vous feriez mieux de configurer des profils dans vos ~/.aws/credentialsfichiers comme

[profile1]
aws_access_key_id = xxxx
aws_secret_access_key = xxxxx
region = us-east-1

[profile2]
aws_access_key_id = xxxx
aws_secret_access_key = xxxx
region = us-west-2

Ensuite, dans votre fournisseur, vous pouvez lui dire quel profil utiliser

provider "aws" {
  profile = "profile2"
  region = "${var.region}"
}

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.

Mike
la source
Merci pour la contribution. Je suis très conscient des profils de diplômes, mais je cherche une solution à la question spécifique plutôt qu'une méthode alternative ou une solution de contournement. Les crédits doivent être en variables pour la portée de cette question. Très apprécié malgré tout.
emmdee