Gewusst wie: Terraform-Sperrstatus in S3

Terraform bietet ab v0.9 das Sperren der Remote-Statusverwaltung. Um es in AWS zum Laufen zu bringen, erstellen Sie ein Terraform S3-Backend, einen S3-Bucket und eine DynamDB-Tabelle.

Intro

Wenn Sie eine Infrastruktur mit terraform config erstellen, wird eine Statusdatei mit dem Namen terraform.tfstat lokal im Verzeichnis .terraform generiert. Diese Statusdatei enthält Informationen zur Infrastruktur und Konfiguration, die terraform verwaltet. Wenn Sie in einem Team arbeiten, ist es besser, diese Statusdatei remote zu speichern, damit mehr Benutzer darauf zugreifen können, um Änderungen an der Infrastruktur vorzunehmen.

Terragrunt bot zunächst eine großartige Möglichkeit, Remote-Terraform-Statusdateien in AWS mit einem S3-Bucket und einer dyanmoDB-Tabelle zu sperren. In Version 0.9 hat Terraform diese Funktionalität ebenfalls hinzugefügt. In diesem Blog werde ich daher zeigen, wie Sie die Remote-Statusverwaltung mit Sperren unter Verwendung von Terraform und nicht Terragrunt einrichten.

Was ist in der Statusdatei?

Die Statusdatei enthält Informationen darüber, welche realen Ressourcen für jedes in den terraform-Konfigurationsdateien definierte Objekt vorhanden sind. Wenn Sie beispielsweise eine DNS-Zonenressource in Ihrer terraform-Konfiguration erstellt haben, enthält die Statusdatei Informationen zu der tatsächlichen Ressource, die in AWS erstellt wurde.

Hier ist ein Beispiel für die Erstellung einer DNS-Zone mit Terraform zusammen mit der zugehörigen Statusdatei:

# example.tf
# Erstellen Sie eine DNS-Zone mit dem Namen example.com
Ressource "aws_route53_zone" "example_dns_zone" {
  name = "example.com"
}
# terraform.tfstate
# In der Statusdatei wird die DNS-Zonen-ID zusammen mit ihrem Namen gespeichert
"aws_route53_zone.example_dns_zone": {
    "type": "aws_route53_zone",
    "primär": {
       "id": "Z2D3OUXZHH4NUA",
       "Attribute": {
          "name": "example.com"
        }
     }
},

Remote-Speicherung des Status in S3

Wenn Sie in einem Team arbeiten, empfiehlt es sich, die Terraform-Statusdatei remote zu speichern, damit viele Benutzer darauf zugreifen können. Um terraform so einzurichten, dass der Status remote gespeichert wird, benötigen Sie zwei Dinge: einen S3-Bucket zum Speichern der Statusdatei und eine S3-Backend-Ressource für terraform.

Sie können einen S3-Bucket in einer Terraform-Konfiguration wie folgt erstellen:

# example.tf
anbieter "aws" {
  region = "us-west-2"
}
# terraform state file setup
# Erstellen Sie einen S3-Bucket, in dem die Statusdatei gespeichert werden soll
Ressource "aws_s3_bucket" "terraform-state-storage-s3" {
    bucket = "terraform-remote-state-storage-s3"
 
    versionierung {
      enabled = true
    }
 
    Lebenszyklus {
      prevent_destroy = true
    }
 
    Stichworte {
      Name = "S3 Remote Terraform State Store"
    }
}

Dann erstelle die s3-Backend-Ressource wie folgt:

# terraform.tf
Terraform {
 Backend "s3" {
 verschlüsseln = wahr
 bucket = "terraform-remote-state-storage-s3"
 region = us-west-2
 Schlüssel = Pfad / zu / Zustand / Datei
 }
}

Was ist Sperren und warum brauchen wir es?

Wenn die Statusdatei remote gespeichert wird, sodass viele Benutzer darauf zugreifen können, besteht die Gefahr, dass mehrere Benutzer gleichzeitig versuchen, Änderungen an derselben Datei vorzunehmen. Wir müssen also einen Mechanismus bereitstellen, der den Status „sperrt“, wenn er gerade von einem anderen Benutzer verwendet wird. Dies können wir erreichen, indem wir eine dynamoDB-Tabelle erstellen, die terraform verwenden kann.

Erstellen Sie die dynamoDB-Tabelle folgendermaßen:

# example.tf
# Erstellen Sie eine Dynamodb-Tabelle zum Sperren der Statusdatei
Ressource "aws_dynamodb_table" "dynamodb-terraform-state-lock" {
  name = "terraform-state-lock-dynamo"
  hash_key = "LockID"
  read_capacity = 20
  write_capacity = 20
 
  Attribut {
    name = "LockID"
    Typ = "S"
  }
 
  Stichworte {
    Name = "DynamoDB Terraform State Lock Table"
  }
}

Sie müssen die Terraform S3-Backend-Ressource ändern und in die dynamoDB-Tabelle hinzufügen:

# terraform.tf
Terraform {
 Backend "s3" {
 verschlüsseln = wahr
 bucket = "terraform-remote-state-storage-s3"
 dynamodb_table = "Terraform-State-Lock-Dynamo"
 region = us-west-2
 Schlüssel = Pfad / zu / Zustand / Datei
 }
}

Teile zusammenfügen:

Nachdem Sie die S3-Bucket- und -DynamoDB-Tabelle erstellt haben, können Sie Ihre Terraform-Konfigurationen wie gewohnt mit den Befehlen terraform plan und terraform apply ausführen, und die Statusdatei wird im S3-Bucket angezeigt. Wenn Sie nach diesen Befehlen die Datei .terraform / terraform.tfstate überprüfen, wird angezeigt, dass sie jetzt den Speicherort der Statusdatei anstelle der tatsächlichen Statusdatei enthält.

Jessica $ cat .terraform / terraform.tfstate
{
    "version": 3,
    "backend": {
        "Typ": "s3",
        "config": {
            "bucket": "terraform-remote-state-storage-s3",
            "dynamodb_table": "terraform-state-lock-dynamo",
            "verschlüsseln": wahr,
            "key": "example / terraform.tfstate",
            "region": "us-west-2"
        }
    }
}

Hilfreiche Ressourcen:

Terraform-Statusdokumente, Backend-Dokumente, Backends: S3-Dokumente

Terragrunt Blog über Terraform