Terraform: scelta delle credenziali per un file di stato remoto


10

Ho un'infrastruttura esistente in Terraform e la uso da un po 'di tempo. Di recente ho scambiato le credenziali AWS del mio laptop locale (le credenziali archiviate ~/.aws/credentials) e ha smesso di funzionare fino a quando non ho ripristinato quelle credenziali.

Il problema è che sto dichiarando i crediti nella fonte Terraform stessa, ma sembra che non li stia affatto usando.

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"
}

Le autorizzazioni dell'ID di accesso sono valide al 100%. Sto usando lo stesso ID account e la stessa chiave segreta sia per le aws configureimpostazioni in ~/.aws/credentialscui mi trovo che nelle dichiarazioni di Terraform sopra riportate.

Tutto funziona bene fintanto che le ~/.aws/credentialscredenziali sono presenti, ma non appena le credenziali a livello di sistema operativo sono andate (ovvero rm ~/.aws/credentials) ottengo quanto segue quando provo a eseguire operazioni Terraform, come 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".

Se ripopolo ~/.aws/credentialseseguendolo aws configurefunzionerà di nuovo bene.

Non capisco: se la mia providerimpostazione dichiara esplicitamente le credenziali da utilizzare all'interno del codice sorgente Terraform, perché la mia configurazione AWS a livello di sistema operativo è importante?

Come posso fare in modo che Terraform usi solo i crediti definiti nella mia configurazione Terraform e ignori ciò che è nel mio profilo utente del sistema operativo?

Modifica, lo è Terraform v0.11.7

Modifica: si noti che sto cercando di risolvere il problema sul motivo per cui i crediti dichiarati staticamente non vengono utilizzati nella dichiarazione del fornitore. Non cercare metodi alternativi o soluzioni alternative. Grazie.


Hrm ... solo un sospetto. Assicurati che le variabili di ambiente AWS_PROFILEo AWS_DEFAULT_PROFILEnon siano impostate in quanto suggeriscono all'SDK AWS che dovrebbe apparire nel file delle credenziali.
Erik Osterman,

Grazie. Risposta in ritardo ma lo sto rivisitando. Purtroppo ho verificato che non sono presenti var. Sarebbe davvero bello se potesse richiedere crediti in fase di esecuzione come altri piani che non utilizzano un back-end remoto. Grazie comunque.
emmdee,

Risposte:


10

La tua prima domanda

se l'impostazione del mio provider dichiara esplicitamente le credenziali da utilizzare all'interno del codice sorgente Terraform, perché la mia configurazione AWS a livello di sistema operativo è importante?

Il messaggio di errore "Impossibile caricare il back-end: errore nella configurazione del back-end" s3 "" si riferisce alla configurazione del back-end S3.

Cerca nel file ./.terraform/terraform.tfstatee vedrai la configurazione del backend S3.

Il backend Terraform S3 è diverso dal provider AWS Terraform. Il messaggio di errore "Nessuna fonte di credenziali valida trovata per il provider AWS." è fuorviante. Implica che viene utilizzata la configurazione del provider AWS, il che è falso. Le credenziali del back-end S3 sono configurate separatamente e memorizzate nel terraform.tfstatefile.

La configurazione di AWS a livello di sistema operativo è importante perché se non vengono specificate le credenziali di backend S3, come documentato qui https://www.terraform.io/docs/backends/types/s3.html , Terraform utilizza automaticamente quanto segue, nell'ordine:

  1. Variabili d'ambiente AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY
  2. File di credenziali condivise di AWS, il valore predefinito è "~ / .aws / credentials".

Non hai specificato alcuna credenziale nella tua configurazione di backend S3, quindi Terraform sta impostando automaticamente il file delle credenziali condivise di AWS.

La configurazione del backend S3 non contiene credenziali.

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

La tua seconda domanda,

Come posso fare in modo che Terraform usi solo i crediti definiti nella mia configurazione Terraform e ignori ciò che è nel mio profilo utente del sistema operativo?

Innanzitutto, i backend non possono contenere interpolazioni, consultare https://www.terraform.io/docs/backends/config.html . Quindi non è possibile utilizzare alcuna variabile nella configurazione Backend. ad es. questa configurazione non è valida

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}
  }
}

Se si desidera specificare le credenziali AWS durante l'esecuzione terraform init, specificare la configurazione del back-end come opzioni.

terraform init --backend-config="access_key=your_access_key" --backend-config="secret_key=your_secret_key"

Questo produce una configurazione S3 Backend simile a questa, memorizzata nel ./.terraform/terraform.tfstatefile:

{
    "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
    },

Ancora una volta, le credenziali del backend S3 sono configurate separatamente dalle credenziali del provider AWS.

Rieseguire terraform inite specificare le credenziali nella riga di comando come --backend-configopzioni per correggere l'errore.


Grazie. Risposta molto dettagliata e ora capisco il problema. Nel mio caso d'uso ho finito per usare l' shared_credentials_fileopzione che tutti i miei backend e provider raccoglieranno e useranno. Sembra funzionare bene e nulla è bloccato nelle credenziali aws della workstation OS.
emmdee,

3

L'errore che stai ricevendo si riferisce in particolare alla configurazione del backend S3, che AFAIK non eredita le impostazioni dalla configurazione del provider AWS; ha troppo access_keye secret_keyopzioni di configurazione, che se non stai utilizzando ~/.aws/credentialssarà necessario esplicitamente configurare.


1

È meglio impostare profili come nei tuoi ~/.aws/credentialsfile

[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

Quindi nel tuo provider puoi dirgli quale profilo usare

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

Manterrà le chiavi lontano dai tuoi file terraform, il che è una buona cosa se vuoi metterle nel controllo del codice sorgente.


Grazie per l'input. Sono molto consapevole dei profili delle credenziali, tuttavia sto cercando una soluzione alla domanda specifica piuttosto che un metodo alternativo o una soluzione alternativa. I crediti devono essere in variabili per lo scopo di questa domanda. Molto apprezzato a prescindere.
emmdee,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.