Terraform · 6 min read · Dec 10, 2025
Wie man den Terraform-Zustand in einem AWS S3-Bucket verwaltet

In diesem Artikel werden wir sehen, was ein Terraform-Zustand ist und wie man ihn in einem S3-Bucket verwaltet. Wir werden auch sehen, was “Lock” in Terraform ist und wie man es implementiert. Um dies zu implementieren, müssen wir einen S3-Bucket und eine DynamoDB-Tabelle in AWS erstellen.
Bevor wir fortfahren, lassen Sie uns die Grundlagen des Terraform-Zustands und des Locks verstehen.
- Terraform-Zustand (terraform.tstate-Datei):
Die Zustandsdatei enthält Informationen darüber, welche Ressourcen in den Terraform-Konfigurationsdateien definiert sind. Wenn Sie beispielsweise eine EC2-Instanz mit der Terraform-Konfiguration erstellt haben, enthält die Zustandsdatei Informationen über die tatsächliche Ressource, die in AWS erstellt wurde. - S3 als Backend zur Speicherung der Zustandsdatei:
Wenn wir im Team arbeiten, ist es gut, die Terraform-Zustandsdatei remote zu speichern, damit die Teammitglieder darauf zugreifen können. Um den Zustand remote zu speichern, benötigen wir zwei Dinge: einen S3-Bucket zur Speicherung der Zustandsdatei und eine Terraform-S3-Backend-Ressource. - Lock:
Wenn wir die Zustandsdatei remote speichern, sodass viele Personen darauf zugreifen können, besteht das Risiko, dass mehrere Personen gleichzeitig versuchen, Änderungen an derselben Datei vorzunehmen. Daher benötigen wir einen Mechanismus, der den Zustand “sperrt”, wenn er derzeit von anderen Benutzern verwendet wird. Dies können wir erreichen, indem wir eine DynamoDB-Tabelle erstellen, die Terraform verwenden kann.
Hier werden wir alle Schritte sehen, beginnend mit der manuellen Erstellung eines S3-Buckets, dem Hinzufügen der erforderlichen Richtlinie, der Erstellung einer DynamoDB-Tabelle mit Terraform und der Konfiguration von Terraform zur Verwendung von S3 als Backend und DynamoDB zur Speicherung des Locks.
Voraussetzungen
- Grundkenntnisse in Terraform.
- Grundkenntnisse über S3-Buckets.
- Terraform auf Ihrem System installiert.
- AWS-Konto (erstellen Sie eines, wenn Sie noch keines haben).
- ‘access_key’ & ‘secret_key’ eines AWS IAM-Benutzers. (Klicken Sie hier, um zu lernen, wie man einen IAM-Benutzer mit ‘access_key’ & ‘secret_key’ in AWS erstellt.)
Was wir tun werden
- Erstellen Sie einen S3-Bucket und fügen Sie eine Richtlinie hinzu.
- Erstellen Sie eine DynamoDB-Tabelle mit Terraform.
- Erstellen Sie eine EC2-Instanz mit den Terraform-Konfigurationsdateien.
- Löschen Sie die erstellte EC2-Instanz mit Terraform.
Erstellen Sie einen S3-Bucket und fügen Sie eine Richtlinie hinzu.
Klicken Sie hier, um zu lernen, wie man einen S3-Bucket in einem AWS-Konto erstellt. Sobald Sie einen Bucket erstellt haben, fügen Sie die folgende Richtlinie hinzu.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1560164441598",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:PutObject*",
"s3:List*",
"s3:Get*",
"s3:Delete*"
],
"Resource": [
"arn:aws:s3:::state-lock-rahul",
"arn:aws:s3:::state-lock-rahul/*"
]
}
]
}
Konfigurieren Sie “AWS_ACCESS_KEY_ID” und “AWS_SECRET_ACCESS_KEY”, damit Sie von der CLI auf Ihr Konto zugreifen können.
Verwenden Sie den folgenden Befehl, um die Werte von “AWS_ACCESS_KEY_ID” und “AWS_SECRET_ACCESS_KEY” zu exportieren.
export AWS_ACCESS_KEY_ID=AKIAQ6GAIA5XC2XMMM7W
export AWS_SECRET_ACCESS_KEY=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
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEYSobald Sie Ihre Anmeldeinformationen konfiguriert haben, können Sie diese einfach testen, indem Sie die Buckets mit dem folgenden Befehl auflisten.
aws s3 ls

Erstellen Sie eine DynamoDB-Tabelle mit Terraform
Erstellen Sie ‘variables.tf’, die die Deklaration der erforderlichen Variablen enthält.
vim variables.tf
variable "region" {
description = "Region des AWS VPC"
}
Erstellen Sie ‘main.tf’, die für die Erstellung einer DynamoDB-Tabelle verantwortlich ist. Diese main.tf wird die Werte der Variablen aus variables.tf lesen. Diese Tabelle wird verwendet, um den Lock zu speichern.
provider "aws" {
region = "${var.region}"
}
resource "aws_dynamodb_table" "terraform_locks" {
name = "rahul-test-dynamodb-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
Der erste Befehl, der verwendet werden soll, ist ‘terraform init’. Dieser Befehl lädt und installiert Plugins für die in der Konfiguration verwendeten Anbieter. In unserem Fall ist es AWS.
*terraform init

Der zweite Befehl, der verwendet werden soll, ist ‘terraform plan’. Dieser Befehl wird verwendet, um die Änderungen zu sehen, die an der Infrastruktur vorgenommen werden.
terraform plan

Der Befehl ‘terraform apply’ erstellt die Ressourcen in AWS, die in der main.tf-Datei erwähnt sind. Sie werden aufgefordert, Ihre Eingabe zur Erstellung der Ressourcen bereitzustellen.
terraform apply

Jetzt können Sie zum DynamoDB-Dashboard in der Konsole gehen, um zu überprüfen, ob die Tabelle erstellt wurde oder nicht.

Bis zu diesem Zeitpunkt haben wir einen S3-Bucket manuell aus der S3-Konsole erstellt und eine DynamoDB-Tabelle mit Terraform erstellt. Wir haben den S3-Bucket nicht als Backend konfiguriert, um den Zustand zu speichern, und die DynamoDB-Tabelle, um den Lock zu speichern.
Um unser Ziel zu erreichen, müssen wir unsere Terraform main.tf-Datei ändern. Nach der Änderung des Codes und der Ausführung wird unser vorhandener lokaler Zustand in das S3-Backend kopiert.
Aktualisieren Sie unsere vorhandene main.tf mit dem folgenden Code.
vim main.tf
provider "aws" {
region = "${var.region}"
}
terraform {
backend "s3" {
bucket = "state-lock-rahul"
key = "test/terraform.tfstate"
region = "eu-west-3"
dynamodb_table = "rahul-test-dynamodb-table"
}
}
resource "aws_dynamodb_table" "terraform_locks" {
name = "rahul-test-dynamodb-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
Jetzt, wenn Sie den Befehl “terraform plan” versuchen, um zu sehen, welche neue Ressource erstellt wird, schlägt der Befehl mit dem folgenden Fehler fehl.
Sie werden aufgefordert, das Backend neu zu initialisieren.

Um das Backend neu zu initialisieren, verwenden Sie den Befehl “terraform init”. An diesem Punkt wird Ihre lokale Zustandsdatei in den S3-Bucket kopiert.
terraform init
Sie können die Ausgabe wie im untenstehenden Screenshot beobachten, nachdem Sie den Befehl “terraform init” ausgeführt haben. Terraform wurde aktiviert, um die DynamoDB-Tabelle zu verwenden, um den Lock zu erwerben. Sobald das Locking aktiviert ist, können keine zwei gleichen Operationen an derselben Ressource parallel ausgeführt werden.

Sie können zum S3-Dashboard von der AWS-Konsole gehen, um zu sehen, ob die terraform.tfstate kopiert wurde oder nicht.

Jetzt können Sie erneut eine neue Ressource erstellen und sehen, dass der Zustand im S3-Bucket gespeichert wird. Um eine neue DynamoDB-Testtabelle zu erstellen, aktualisieren Sie die main.tf-Datei mit dem folgenden Code.
vim main.tf
variable "region" {
description = "Region des AWS VPC"
}
Rahuls-MacBook-Pro:terraform rahul$ cat main.tf
provider "aws" {
region = "${var.region}"
}
tf {
backend "s3" {
bucket = "state-lock-rahul"
key = "test/terraform.tfstate"
region = "eu-west-3"
dynamodb_table = "rahul-test-dynamodb-table"
}
}
resource "aws_dynamodb_table" "terraform_locks" {
name = "rahul-test-dynamodb-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
resource "aws_dynamodb_table" "test-table" {
name = "rahul-test-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
Diesmal ist es nicht notwendig, “terraform init” auszuführen, da es keine Änderungen im Backend zum Anbieter gibt.
Sie können einfach den Befehl “terraform plan” verwenden, um zu sehen, welche neuen Ressourcen erstellt werden.
terraform plan


Jetzt führen Sie den folgenden Befehl aus, um eine neue DynamoDb-Testtabelle zu erstellen.
terraform apply


Im obigen Screenshot sehen Sie, dass das Locking aktiviert wurde, die .tfstate-Datei wird in S3 kopiert.
Jetzt können Sie in der Konsole sehen, dass die neue Tabelle erstellt wurde.

Wenn Sie die Ressource, die Sie mit Terraform erstellt haben, nicht mehr benötigen, verwenden Sie den folgenden Befehl, um die Ressourcen zu löschen.
terraform destroy

Sobald Sie die Ressourcen löschen, sehen Sie, dass die Tabelle, die für das Locking verwendet wurde, ebenfalls gelöscht wurde. Wenn Sie den S3-Bucket ebenfalls nicht benötigen, können Sie ihn aus der Konsole löschen.
Fazit
In diesem Artikel haben wir die Notwendigkeit der Verwendung eines remote Zustands und des Lockings in Terraform kennengelernt. Wir haben die Schritte gesehen, um den S3-Bucket als Backend zur Speicherung des Terraform-Zustands und die DynamoDB-Tabelle zur Aktivierung des Lockings zu verwenden.
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.