Mit Terraform auf mehreren Konten bereitstellen?

Mit Terraform auf mehreren Konten bereitstellen?

Ich habe nach einer Terraform-Methode gesucht, mit der ich in Terraform gleichzeitig auf mehreren AWS-Konten bereitstellen kann, und bin bisher erfolglos geblieben. AWS hat das Konzept, dies mit Stacks zu tun, aber ich bin nicht sicher, ob es eine Möglichkeit gibt, dies in TF zu tun. Wenn ja, welche Lösungen gäbe es?

Mehr zur AWS-Lösung erfahren Sie hier.https://aws.amazon.com/blogs/mt/supercharge-multi-account-management-with-aws-cloudformation/

Antwort1

Um dieselben Terraform-Konfigurationen in mehreren AWS-Konten verwenden zu können, müssen zwei Probleme überwunden werden. Erstens müssen Sie für jedes Konto eine andere Statusdatei verwenden. Zweitens müssen Sie sicherstellen, dass der AWS-Anbieter das richtige Profil/die richtigen Anmeldeinformationen für das gewünschte Konto verwendet.

Verwenden einer anderen Statusdatei für jedes Konto

Auf einer hohen Ebene funktioniert Terraform einfach, indem es einen Abhängigkeitsressourcengraphen aus den angegebenen Terraform-Konfigurationsdateien (*.tf) erstellt und diese mit einer Statusdatei vergleicht. Die Statusdatei kann entweder lokal ( terraform.tfstate) oder in einem Remote-Backend; ein gängiges AWS-Remote-Backend ists3.

Selbst wenn Sie den AWS-Anbieter über Variablen angeben, separate Konten zu verwenden (mehr dazu weiter unten), stürzt Terraform ständig ab, wenn beide Konten dasselbe Backend verwenden. Dies liegt daran, dass beim Wechsel von einem Konto zum anderen die AWS-IDs der Ressourcen nicht übereinstimmen und/oder in der Statusdatei Ressourcen angegeben werden, die in dem Konto, das Terraform gerade betrachtet, nicht vorhanden sind.

Eine einfache Möglichkeit, dies zu umgehen, ist die VerwendungArbeitsbereiche. Mit Arbeitsbereichen können Sie verschiedene Statusdateien verwenden, ohne unterschiedliche Backend-Schlüssel anzugeben. Die Verwendung von Arbeitsbereichen ist sehr unkompliziert. Wenn Sie einen einfachen Terraform-Block haben wie:

terraform {
    backend "s3" {
       bucket = "aws_bucket"
       key    = "terraform.tfstate"
       region = "us-east-1"
    }
}

Sie können neue Arbeitsbereiche erstellen, indem Sie Folgendes verwenden terraform workspace new <workspace-name>. Sie können also einen Arbeitsbereich für beide Ihrer Konten erstellen, indem Sie eine Sequenz wie die folgende verwenden:

terraform workspace new account-1
terraform workspace new account-2

Und Sie können Ihren aktuellen Arbeitsbereich wie folgt wechseln terraform workspace select:

terraform workspace select account-1

Konfigurieren des AWS-Anbieters für die Arbeitsbereichserkennung

Neben der Verwendung separater Statusdateien müssen Sie für jedes benötigte Konto auch unterschiedliche AWS-Anmeldeinformationen (d. h. Zugriffsschlüssel) angeben. AWS-Anmeldeinformationen werden angegeben mitAnbieter. In diesem Fall verwenden wir offensichtlich dieAWS-Anbieter.Sie möchten im Wesentlichen verwendenInterpolationinnerhalb des AWS-Provider-Ressourcenblocks, damit Terraform beim Wechseln der Arbeitsbereiche die richtigen Anmeldeinformationen verwendet. Vorausgesetzt, Sie haben Ihre AWS-Anmeldeinformationsdatei mit einem separaten Profil pro Konto eingerichtet:

[account-1]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[account-2]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

Dann können Sie Ihren AWS-Providerblock einfach wie folgt schreiben:

provider "aws" {
    region  = "us-east-1"
    profile = "${terraform.workspace}"
}

Solange Sie Ihre Arbeitsbereiche mit Ihren AWS-Profilnamen benennen, verwendet Terraform beim Wechseln der Arbeitsbereiche beim Aktualisieren des Status und Erstellen eines Abhängigkeitsdiagramms ein anderes AWS-Anmeldeprofil.

Alternative Methoden

Dies ist bei weitem nicht die einzige Möglichkeit, dies zu erreichen. Sie könntenModule; und dann verschiedene Verzeichnisse haben, die das Modul mit unterschiedlichen AWS-Anbietern und angegebenen Statusdateien aufrufen. Jede Methode hat Vor- und Nachteile.

Mit der Arbeitsbereichsmethode würden Sie es mit einem einzelnen Verzeichnis tun und Sie würden genau dieselben Terraform-Konfigurationsdateien verwenden, wie sie geschrieben sind.

Module erfordern separate Konfigurationsdateien, die zumindest die Module aufrufen und die Anbieter und Backends angeben. Module sind sehr sinnvoll, wenn Sie mehrere Konten, mehrere Regionen und mehrere Umgebungen verwenden möchten. Zum Beispiel, wenn Sie für jedes Konto zwei Regionen und zwei verschiedene Umgebungen (Staging und Produktion) ausführen möchten. Module sind hier sinnvoll, da sie Flexibilität durch die Verwendung von Argumenten wie „Anzahl“ bieten (möglicherweise werden beim Staging weniger Instanzen ausgeführt usw.).

Antwort2

Der Trick besteht im Wesentlichen darin, den Status innerhalb eines gemeinsamen Buckets abzurufen und beim Wechseln der Konten unterschiedliche Anmeldeinformationen für die bereitgestellten anzugeben. Arbeitsbereiche funktionieren bei mir perfekt

provider "aws" {
  version = "~> 2.18"
  profile = "second_account"
}

terraform {
  backend "s3" {
    encrypt = true
    bucket  = "shared_bucket"
    region  = "us-east-1"
    key     = "state"
    profile = "first_shared_account"
  }

  required_version = "~> 0.12.7"
}

Beachten Sie, dass für die Provider- und Backend-Konfiguration unterschiedliche Profile angegeben sind. Sie können eine Reihe verschiedener Profile haben, solange jedes über einen eigenen Arbeitsbereich isoliert ist.

aws configure --profile third_account
terraform workspace new third_account
terraform workspace select third_account

verwandte Informationen