GNU/Linux >> Linux Esercitazione >  >> Linux

Come gestire lo stato di terraform in un bucket AWS S3

In questo articolo vedremo cos'è uno stato Terraform e come gestirlo su un bucket S3. Vedremo anche cos'è il "blocco" in Terraform e come implementarlo. Per implementarlo, dobbiamo creare un bucket S3 e una tabella DynamoDB su AWS.

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

  • Stato Terraforma (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 terraform, 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 archiviare il file di stato della terraform in remoto in modo che le persone del team possano accedervi. Per archiviare lo stato in remoto abbiamo bisogno di due cose:un bucket s3 per archiviare il file di stato e una risorsa back-end s3 terraform.
  • Blocca
    Se conserviamo il file di stato in remoto in modo che molte persone possano accedervi, rischiamo che più persone tentino di apportare modifiche allo stesso file esattamente nello stesso momento. Quindi dobbiamo avere un meccanismo che "blocchi" lo stato se è attualmente utilizzato da altri utenti. Possiamo raggiungere questo obiettivo creando una tabella dinamoDB da utilizzare per terraform.

Qui vedremo tutti i passaggi dalla creazione manuale di un bucket S3, all'aggiunta della policy richiesta, alla creazione di una tabella DynamoDB utilizzando Terraform e alla configurazione di Terraform per l'utilizzo di S3 come backend e DynamoDB per memorizzare il blocco.

Prerequisiti

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

Cosa faremo

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

Crea un bucket S3 e allega ad esso una policy.

Fai clic qui per imparare a creare un bucket S3 su un account AWS. Dopo aver creato un bucket, allega ad esso 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 comando seguente 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

Una volta configurate le credenziali, puoi semplicemente testarle elencando i bucket utilizzando il comando seguente.

aws s3 ls

Crea una tabella DynamoDB usando Terraform

Crea 'variables.tf' che contiene le variabili richieste per la dichiarazione.

variabili vim.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 variabili.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 usare è 'terraform init'. Questo comando scarica e installa i plug-in per i provider utilizzati nella configurazione. Nel nostro caso è AWS.

  inizializzazione della piattaforma

Il secondo comando da usare è 'terraform plan'. Questo comando viene utilizzato per vedere le modifiche che avverranno sull'infrastruttura.

 piano della piattaforma

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.

Applicazione della piattaforma

Ora puoi accedere alla dashboard di DynamoDB sulla console per verificare se la tabella è stata creata o meno.

Fino a questo punto, 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 main.tf Terraform. Dopo aver modificato il codice e averlo eseguito, il nostro stato locale preesistente verrà copiato in S3 Backend.

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 file dello stato locale verrà copiato in S3 Bucket.

terraforma init

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

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

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

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 modifiche nel backend del provider.

Puoi semplicemente utilizzare il comando "piano terraform" per vedere quali nuove risorse verranno create.

piano terraforma

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

applicare terraform

Nello screenshot sopra, puoi vedere che il blocco è stato abilitato, il file .tfstate è stato 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 comando seguente per eliminare le risorse.

terraform distruggi

Non appena elimini le risorse, puoi vedere che anche la tabella utilizzata per il blocco è stata eliminata. Se non ti serve anche S3 Bucket, puoi eliminarlo dalla console.

Conclusione

In questo articolo abbiamo appreso la necessità di utilizzare uno stato remoto e bloccare Terraform. Abbiamo visto i passaggi per utilizzare S3 Bucket come backend per archiviare lo stato Terraform e la tabella DynamoDb per abilitare il blocco.


Linux
  1. Come gestire le capacità dei file Linux

  2. Come gestire la password dell'account in Linux

  3. Come creare un'istanza RDS su AWS utilizzando Terraform

  4. Come creare un ruolo IAM in AWS utilizzando Terraform

  5. Come utilizzare AWS CLI per gestire Amazon S3

Che cos'è Terraform e come installarlo e utilizzarlo su AWS EC2

Crea un bucket S3 su AWS utilizzando Terraform

Come creare un bucket S3 utilizzando Python Boto3 su AWS

Come creare una tabella DynamoDB in AWS

Come installare Terraform su Ubuntu 18.04/20.04 LTS

Come gestire i database in MariaDB su Ubuntu 18.04