In questo tutorial imparerai come archiviare lo stato di Terraform in un bucket Cloud Storage.
Per impostazione predefinita, Terraform archivia lo stato
localmente in un file denominato terraform.tfstate
. Questa configurazione predefinita può
complicare l'utilizzo di Terraform per i team quando più utenti eseguono Terraform contemporaneamente e ogni macchina ha una propria comprensione dell'attuale
infrastruttura.
Per aiutarti a evitare questi problemi, questa pagina mostra come configurare un stato remoto che rimandi a un bucket Cloud Storage. Lo stato remoto è una funzionalità dei backend Terraform.
Obiettivi
Questo tutorial illustra come:
- Utilizza Terraform per eseguire il provisioning di un bucket Cloud Storage per archiviare lo stato di Terraform.
- Aggiungi il modello nel file di configurazione Terraform per eseguire la migrazione dello stato dal backend locale al bucket Cloud Storage.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Cloud Storage comporta costi per l'archiviazione, le operazioni di lettura e scrittura, il traffico in uscita dalla rete e la replica.
Nel bucket Cloud Storage di questo tutorial è abilitato il controllo delle versioni degli oggetti per conservare la cronologia dei deployment. L'attivazione del controllo delle versioni degli oggetti aumenta i costi di archiviazione, che puoi attenuare configurando Gestione del ciclo di vita degli oggetti per eliminare le versioni degli stati precedenti.
Prima di iniziare
-
In the Google Cloud console, activate Cloud Shell.
Cloud Shell è preinstallato con Terraform.
Se utilizzi una shell locale, segui questi passaggi:
- Installa Terraform.
-
Create local authentication credentials for your user account:
gcloud auth application-default login
If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Storage API:
gcloud services enable storage.googleapis.com
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/storage.admin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For examples, see Represent workforce pool users in IAM policies. - Replace
ROLE
with each individual role.
In alternativa, puoi creare un ruolo IAM personalizzato che contenga le seguenti autorizzazioni:
storage.buckets.create
storage.buckets.list
storage.objects.get
storage.objects.create
storage.objects.delete
storage.objects.update
Come best practice, consigliamo di controllare l'accesso al bucket e ai file di stato memorizzati al suo interno. Solo un piccolo gruppo di utenti (ad esempio, l'amministratore cloud principale e la persona che agisce come amministratore alternativo o di backup) deve disporre delle autorizzazioni di amministratore per il bucket. Gli altri sviluppatori devono disporre delle autorizzazioni per scrivere e leggere solo gli oggetti nel bucket.
- Replace
Prepara l'ambiente
Clona il repository GitHub contenente gli esempi di Terraform:
git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
Passa alla directory di lavoro:
cd terraform-docs-samples/storage/remote_terraform_backend_template
Esamina i file Terraform
Esamina il file
main.tf
:cat main.tf
L'output è simile al seguente
Questo file descrive le seguenti risorse:
random_id
: viene aggiunto al nome del bucket Cloud Storage per garantire un nome univoco per il bucket Cloud Storage.google_storage_bucket
: il bucket Cloud Storage in cui memorizzare il file di stato. Questo bucket è configurato per avere le seguenti proprietà:force_destroy
è impostato sufalse
per assicurarsi che il bucket non venga eliminato se contiene oggetti. In questo modo, le informazioni sullo stato nel bucket non vengono eliminate accidentalmente.public_access_prevention
sia impostato suenforced
per assicurarti che i contenuti del bucket non vengano esposti accidentalmente al pubblico.uniform_bucket_level_access
è impostato sutrue
per consentire di controllare l'accesso al bucket e ai relativi contenuti utilizzando autorizzazioni IAM anziché elenchi di controllo dell'accesso dell'accesso.versioning
è attivato per garantire che le versioni precedenti dello stato siano conservate nel bucket.
local_file
: un file locale. I contenuti di questo file indicano a Terraform di utilizzare il bucket Cloud Storage come backend remoto una volta creato il bucket.
Provisiona il bucket Cloud Storage
Inizializza Terraform:
terraform init
Quando esegui
terraform init
per la prima volta, il bucket Cloud Storage specificato nel filemain.tf
non esiste ancora, quindi Terraform inizializza un backend locale per archiviare lo stato nel file system locale.Applica la configurazione per eseguire il provisioning delle risorse descritte nel file
main.tf
:terraform apply
Quando richiesto, inserisci
yes
.Quando esegui
terraform apply
per la prima volta, Terraform esegue il provisioning del bucket Cloud Storage per l'archiviazione dello stato. Crea anche un file locale; il contenuto di questo file indica a Terraform di utilizzare il bucket Cloud Storage come backend remoto per archiviare lo stato.
Esegui la migrazione dello stato al bucket Cloud Storage
Esegui la migrazione dello stato di Terraform al backend Cloud Storage remoto:
terraform init -migrate-state
Terraform rileva che hai già un file di stato locale e ti chiede di eseguire la migrazione dello stato al nuovo bucket Cloud Storage. Quando richiesto, inserisci
yes
.
Dopo aver eseguito questo comando, lo stato di Terraform viene archiviato nel bucket Cloud Storage. Terraform estrae lo stato più recente da questo bucket prima di eseguire un comando e lo inserisce nel bucket dopo l'esecuzione di un comando.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questa pagina, segui questi passaggi.
Apri il file
main.tf
.Nella risorsa
google_storage_bucket.default
, aggiorna il valore diforce_destroy
intrue
.Applica la configurazione aggiornata:
terraform apply
Quando richiesto, inserisci
yes
.Elimina il file di stato:
rm backend.tf
Riconfigura il backend in modo che sia locale:
terraform init -migrate-state
Quando richiesto, inserisci
yes
.Esegui questo comando per eliminare le risorse Terraform:
terraform destroy
Quando richiesto, inserisci
yes
.