Ricerca nel sito web

Come gestire lo stato Terraform in un bucket AWS S3


In questo articolo vedremo cos'è uno stato Terraform e come gestirlo su un Bucket S3. Vedremo anche cos'è \lock\ in Terraform e come implementarlo. Per implementare ciò, dobbiamo creare un bucket S3 e una tabella DynamoDB su AWS.

Prima di procedere, comprendiamo le basi dello stato e del blocco di Terraform.

  • Stato Terraform (file terraform.tstate): 
    Il file di stato contiene informazioni su quali risorse esistono definite nei file di configurazione terraform. Ad esempio, se hai creato un'istanza EC2 utilizzando terraform config, il file di stato contiene informazioni sulla risorsa effettiva che è stata creata su AWS.
  • S3 come back-end per archiviare il file di stato:
    Se stiamo lavorando in un team, è utile archiviare il file di stato terraform in remoto in modo che le persone del team possono accedervi. Per archiviare lo stato in remoto abbiamo bisogno di due cose: un bucket s3 per archiviare il file di stato e una risorsa di backend terraform s3.
  • Blocca
    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 identico momento. Quindi dobbiamo disporre di un meccanismo che \blocchi lo stato se è attualmente utilizzato da altri utenti. Possiamo ottenere ciò creando una tabella dinamoDB che terraform possa utilizzare.

Qui vedremo tutti i passaggi dalla creazione manuale di un bucket S3, all'aggiunta della policy richiesta, alla creazione della tabella DynamoDB utilizzando Terraform e alla configurazione di Terraform per utilizzare S3 come back-end e DynamoDB per archiviare il blocco.

Prerequisiti

  1. Comprensione di base di Terraform.
  2. Comprensione di base del bucket S3.
  3. Terraform installato sul tuo sistema.
  4. Account AWS (crealo se non ne hai uno).
  5. access_key e secret_key di un utente AWS IAM. (Fai clic qui per imparare a creare un utente IAM con access_key e secret_key su AWS, )

Cosa faremo

  1. Crea un bucket S3 e allegagli una policy.
  2. Crea una tabella DynamoDB utilizzando Terraform
  3. Crea un EC2 utilizzando i file di configurazione Terraform.
  4. Elimina l'istanza EC2 creata utilizzando Terraform.

Crea un bucket S3 e allegagli una policy.

Fai clic qui per imparare a creare un bucket S3 su un account AWS. Una volta creato un bucket, allegagli la seguente policy.

{
    "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.

Utilizza 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_KEY

Dopo aver configurato le tue credenziali, puoi semplicemente testarle elencando i bucket utilizzando il seguente comando.

aws s3 ls

Crea una tabella DynamoDB utilizzando Terraform

Crea variable.tf che contiene la dichiarazione delle variabili richieste.

vim variables.tf

variable "region" {
     description = "Region of AWS VPC"
}

Crea main.tf che è responsabile della creazione di una tabella DynamoDB. Questo main.tf leggerà i valori delle variabili da variable.tf. Questa tabella verrà utilizzata per memorizzare il blocco.

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 plug-in per i provider utilizzati all'interno della configurazione. Nel nostro caso è AWS.

 terraform init

Il secondo comando da utilizzare è terraform plan. Questo comando viene utilizzato per vedere i cambiamenti che avverranno 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 contributo per creare le risorse.

terraform apply

Ora puoi andare su DynamoDB Dashboard sulla console per verificare se la tabella è stata creata o meno.

Fino a questo momento, abbiamo creato manualmente un bucket S3 dalla console S3 e dalla tabella DynamoDB utilizzando Terraform. Non abbiamo configurato il bucket S3 come backend per archiviare lo stato e la tabella DynamoDB per archiviare il blocco.

Per raggiungere il nostro obiettivo, dobbiamo modificare il nostro file Terraform main.tf. Dopo aver modificato il codice ed eseguito, il nostro stato locale preesistente verrà 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 verrà creata, il comando fallirà con il seguente errore.

Ti verrà chiesto di reinizializzare il backend.

Per reinizializzare il backend, usa il comando \terraform init\. A questo punto, il tuo file di stato locale verrà copiato in S3 Bucket.

terraform init

Puoi osservare l'output come mostrato nello screenshot sottostante dopo aver eseguito il comando \terraform init\, Terraform è stato abilitato per utilizzare DynamoDb Table per acquisire il  blocco. Una volta abilitato il blocco, non è possibile eseguire parallelamente due stesse operazioni sulla stessa risorsa.

Puoi andare alla dashboard S3 dalla console AWS per vedere se terraform.tfstate è stato copiato o meno.

Ora, ancora una volta puoi creare una nuova risorsa e vedere lo stato verrà archiviato su S3 Bucket. Per creare una nuova tabella DynamoDB Test, aggiorna il file main.tf con il seguente codice.

vim main.tf

variable "region" {
     description = "Region of AWS VPC"
}

Rahuls-MacBook-Pro:terraform rahul$ cat 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"
  }
}


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 cambiamenti nel back-end del provider.

Puoi semplicemente utilizzare il comando \terraform plan\ per vedere quali nuove risorse verranno create.

terraform plan

Ora esegui il comando seguente per creare una nuova tabella di test DynamoDb.

terraform apply

Nello screenshot sopra, puoi vedere che il blocco è stato abilitato, il file .tfstate viene copiato su 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 anche la tabella utilizzata per il blocco è stata eliminata. Se non ti serve anche il bucket S3, puoi eliminarlo dalla console.

Conclusione

In questo articolo, abbiamo appreso della necessità di usare uno stato remoto e bloccare in Terraform. Abbiamo visto i passaggi per utilizzare il bucket S3 come back-end per archiviare lo stato di Terraform e la tabella DynamoDb per abilitare il blocco.