Ich habe eine vorhandene Infrastruktur in Terraform und benutze sie seit einer Weile. Vor kurzem hatte ich die AWS-Anmeldeinformationen meines lokalen Laptops (die darin gespeicherten Creds ~/.aws/credentials
) ausgetauscht und es funktionierte nicht mehr, bis ich diese Anmeldeinformationen zurückgesetzt hatte.
Das Problem ist, dass ich die Creds in der Terraform-Quelle selbst deklariere, aber es scheint, dass sie überhaupt nicht verwendet werden.
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"
}
Die Zugriffs-ID-Berechtigungen sind 100% gut. Ich verwende dieselbe Konto-ID und denselben geheimen Schlüssel für die aws configure
Einstellungen, die in ~/.aws/credentials
den obigen Terraform-Variablendeklarationen vorgenommen werden.
Alles funktioniert einwandfrei, solange sich die Creds befinden, ~/.aws/credentials
aber sobald die Anmeldeinformationen auf Betriebssystemebene verschwunden sind (dh rm ~/.aws/credentials
), wird beim Versuch, Terraform-Vorgänge auszuführen, Folgendes angezeigt 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".
Wenn ich das ~/.aws/credentials
durch Ausführen neu aws configure
auffülle, funktioniert es wieder einwandfrei.
Ich verstehe nicht - wenn meine provider
Einstellung explizit die Anmeldeinformationen deklariert, die im Terraform-Quellcode verwendet werden sollen, warum ist meine AWS-Konfiguration auf Betriebssystemebene überhaupt wichtig?
Wie kann ich Terraform dazu bringen, nur die in meiner Terraform-Konfiguration definierten Creds zu verwenden und zu ignorieren, was in meinem Betriebssystem-Benutzerprofil enthalten ist?
Bearbeiten, es ist Terraform v0.11.7
Bearbeiten: Bitte beachten Sie, dass ich versuche, das Problem zu lösen, warum die statisch deklarierten Creds in der Anbieterdeklaration nicht verwendet werden. Keine Suche nach alternativen Methoden oder Problemumgehungen. Vielen Dank.
AWS_PROFILE
oderAWS_DEFAULT_PROFILE
Umgebungsvariablen nicht festgelegt , wie sie ein Hinweis auf die AWS SDK sind , dass es in der Credentials - Datei aussehen sollte.Antworten:
Deine erste Frage
Die Fehlermeldung "Backend konnte nicht geladen werden: Fehler beim Konfigurieren des Backends" s3 "" bezieht sich auf Ihre Backend S3-Konfiguration.
Schauen Sie in die Datei
./.terraform/terraform.tfstate
und Sie werden die S3 Backend Konfiguration sehen.Das Terraform S3-Backend unterscheidet sich vom Terraform AWS-Anbieter. Die Fehlermeldung "Keine gültigen Anmeldeinformationsquellen für AWS Provider gefunden." ist irreführend. Dies bedeutet, dass die AWS Provider-Konfiguration verwendet wird, was falsch ist. S3-Backend-Anmeldeinformationen werden separat konfiguriert und in der
terraform.tfstate
Datei gespeichert .Ihre AWS-Konfiguration auf Betriebssystemebene ist wichtig , da Terraform standardmäßig Folgendes verwendet, wenn keine S3-Backend-Anmeldeinformationen angegeben sind, wie hier unter https://www.terraform.io/docs/backends/types/s3.html dokumentiert.
Sie haben in Ihrer S3-Backend-Konfiguration keine Anmeldeinformationen angegeben, daher verwendet terraform standardmäßig die AWS Shared Credentials-Datei.
Ihre S3-Backend-Konfiguration enthält keine Anmeldeinformationen.
Deine zweite Frage,
Erstens können Backends keine Interpolation enthalten, siehe https://www.terraform.io/docs/backends/config.html . Sie können also keine Variablen in der Backend-Konfiguration verwenden. zB ist diese Konfiguration ungültig
Wenn Sie beim Ausführen AWS-Anmeldeinformationen angeben möchten, geben
terraform init
Sie die Backend-Konfiguration als Optionen an.terraform init --backend-config="access_key=your_access_key" --backend-config="secret_key=your_secret_key"
Dies erzeugt eine S3-Backend-Konfiguration, die so aussieht und in der
./.terraform/terraform.tfstate
Datei gespeichert ist :Auch hier werden die S3-Backend-Anmeldeinformationen separat von Ihren AWS Provider-Anmeldeinformationen konfiguriert.
Führen Sie
terraform init
die Anmeldeinformationen erneut aus und geben Sie sie in der Befehlszeile als--backend-config
Optionen an, um Ihren Fehler zu beheben.quelle
shared_credentials_file
Option verwendet, die alle meine Backends und Provider nutzen und nutzen werden. Scheint gut zu funktionieren und nichts ist in den aws-Anmeldeinformationen der OS-Workstation gesperrt.Der Fehler, den Sie erhalten, bezieht sich speziell auf die Konfiguration des S3-Backends, bei dem AFAIK die Einstellungen nicht von der AWS-Anbieterkonfiguration erbt. Es hat auch
access_key
&secret_key
Konfigurationsoptionen, die Sie~/.aws/credentials
explizit konfigurieren müssen, wenn Sie sie nicht verwenden .quelle
Sie sind besser dran, Profile in Ihren
~/.aws/credentials
Dateien wie einzurichtenDann können Sie in Ihrem Provider angeben, welches Profil verwendet werden soll
Dadurch werden die Schlüssel aus Ihren Terraform-Dateien ferngehalten. Dies ist eine gute Sache, wenn Sie sie jemals in die Quellcodeverwaltung übernehmen möchten.
quelle