Terraform AWS · 6 min read · Dec 10, 2025
Come gestire lo stato di Terraform in un bucket S3 AWS

In questo articolo, vedremo cos’è uno stato di Terraform e come gestirlo in un bucket S3. Vedremo anche cos’è il “lock” in Terraform e come implementarlo. Per implementare questo, dobbiamo creare un bucket S3 e una tabella DynamoDB su AWS.
Prima di procedere, comprendiamo le basi dello stato di Terraform e del Lock.
- Stato di Terraform (file terraform.tstate):
Il file di stato contiene informazioni su quali risorse esistono definite nei file di configurazione di terraform. Ad esempio, se hai creato un’istanza EC2 utilizzando la configurazione di terraform, allora il file di stato contiene informazioni sulla risorsa effettiva che è stata creata su AWS. - S3 come Backend per memorizzare il file di stato:
Se stiamo lavorando in un team, è utile memorizzare il file di stato di terraform in remoto in modo che le persone del team possano accedervi. Per memorizzare lo stato in remoto abbiamo bisogno di due cose: un bucket S3 per memorizzare il file di stato e una risorsa backend S3 di terraform. - Lock:
Se memorizziamo il file di stato in remoto in modo che molte persone possano accedervi, rischiamo che più persone tentino di apportare modifiche allo stesso file nello stesso momento. Quindi abbiamo bisogno di un meccanismo che “blocchi” lo stato se attualmente è utilizzato da altri utenti. Possiamo ottenere questo creando una tabella DynamoDB da utilizzare per terraform.
Qui vedremo tutti i passaggi a partire dalla creazione manuale di un bucket S3, aggiungendo la policy necessaria, creando una tabella DynamoDB utilizzando Terraform e configurando Terraform per utilizzare S3 come Backend e DynamoDB per memorizzare il lock.
Requisiti
- Comprensione di base di Terraform.
- Comprensione di base del bucket S3.
- Terraform installato sul tuo sistema.
- Account AWS (crea se non ne hai uno).
- ‘access_key’ e ‘secret_key’ di un utente IAM AWS. (Clicca qui per imparare a creare un utente IAM con ‘access_key’ e ‘secret_key’ su AWS, )
Cosa faremo
- Creare un bucket S3 e allegare una policy ad esso.
- Creare una tabella DynamoDB utilizzando Terraform.
- Creare un EC2 utilizzando i file di configurazione di Terraform.
- Eliminare l’istanza EC2 creata utilizzando Terraform.
Creare un bucket S3 e allegare una policy ad esso.
Clicca qui per imparare a creare un bucket S3 su un account AWS. Una volta creato un bucket, allega la seguente policy ad esso.
{
"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/*"
]
}
]
}
Configura “AWS_ACCESS_KEY_ID” e “AWS_SECRET_ACCESS_KEY” in modo da poter accedere al tuo account dalla CLI.
Usa il seguente comando per esportare i valori di “AWS_ACCESS_KEY_ID” e “AWS_SECRET_ACCESS_KEY”
export AWS_ACCESS_KEY_ID=AKIAQ6GAIA5XC2XMMM7W
export AWS_SECRET_ACCESS_KEY=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
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEYUna volta configurate le tue credenziali, puoi semplicemente testarle elencando i bucket utilizzando il seguente comando.
aws s3 ls

Creare una tabella DynamoDB utilizzando Terraform
Crea ‘variables.tf’ che contiene la dichiarazione delle variabili richieste.
vim variables.tf
variable "region" {
description = "Regione di AWS VPC"
}
Crea ‘main.tf’ che è responsabile della creazione di una tabella DynamoDB. Questo main.tf leggerà i valori delle variabili da variables.tf. Questa tabella sarà utilizzata per memorizzare il lock.
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"
}
}
Il primo comando da utilizzare è ‘terraform init’. Questo comando scarica e installa i plugin per i provider utilizzati nella configurazione. Nel nostro caso è AWS.
* terraform init*

Il secondo comando da utilizzare è ‘terraform plan’. Questo comando viene utilizzato per vedere le modifiche che avranno luogo sull’infrastruttura.
terraform plan

Il comando ‘terraform apply’ creerà le risorse su AWS menzionate nel file main.tf. Ti verrà chiesto di fornire il tuo input per creare le risorse.
terraform apply

Ora, puoi andare al Dashboard di DynamoDB sulla console per controllare se la tabella è stata creata o meno.

Fino a questo punto, abbiamo creato un bucket S3 manualmente dalla Console S3 e una tabella DynamoDB utilizzando Terraform. Non abbiamo configurato il bucket S3 come Backend per memorizzare lo stato e la tabella DynamoDB per memorizzare il lock.
Per raggiungere il nostro obiettivo, dobbiamo modificare il nostro file main.tf di Terraform. Dopo aver modificato il codice ed eseguito, il nostro stato locale preesistente sarà copiato nel Backend S3.
Aggiorna il nostro main.tf esistente con il seguente codice.
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"
}
}
Ora, se provi il comando “terraform plan” per vedere quale nuova risorsa sarà creata, il comando fallirà con il seguente errore.
Ti verrà chiesto di riinizializzare il backend.

Per riinizializzare il backend, usa il comando “terraform init”. A questo punto, il tuo file di stato locale sarà copiato nel bucket S3.
terraform init
Puoi osservare l’output come mostrato nello screenshot qui sotto dopo aver eseguito il comando “terraform init”, Terraform è stato abilitato per utilizzare la tabella DynamoDB per acquisire il lock. Una volta abilitato il locking, non possono essere eseguite due operazioni identiche sulla stessa risorsa in parallelo.

Puoi andare al Dashboard S3 dalla Console AWS per vedere se il terraform.tfstate è stato copiato o meno.

Ora, puoi creare una nuova risorsa e vedere che lo stato sarà memorizzato nel bucket S3. Per creare una nuova tabella di test DynamoDB, aggiorna il file main.tf con il seguente codice.
vim main.tf
variable "region" {
description = "Regione di 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"
}
}
Questa volta, non è necessario eseguire “terraform init” poiché non ci sono modifiche nel Backend rispetto al Provider.
Puoi semplicemente usare il comando “terraform plan” per vedere quali nuove risorse saranno create.
terraform plan


Ora, esegui il seguente comando per creare una nuova tabella di test DynamoDB.
terraform apply


Nello screenshot sopra, puoi vedere che il locking è stato abilitato, il file .tfstate viene copiato in S3.
Ora, nella console puoi vedere che la nuova tabella è stata creata

Ora, se non hai più bisogno della risorsa che hai creato utilizzando Terraform, usa il seguente comando per eliminare le risorse.
terraform destroy

Non appena elimini le risorse, puoi vedere che la tabella utilizzata per il locking è stata eliminata. Se non hai bisogno nemmeno del bucket S3, puoi eliminarlo dalla console.
Conclusione
In questo articolo, abbiamo appreso la necessità di utilizzare uno stato remoto e il locking in Terraform. Abbiamo visto i passaggi per utilizzare il bucket S3 come Backend per memorizzare lo stato di Terraform e la tabella DynamoDB per abilitare il locking.
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.