Fornitore AWS Terraform EPICO per la tua infrastruttura Amazon

Se prevedi di gestire e lavorare con Amazon Web Services (AWS), l’uso del Terraform provider AWS è essenziale. Ti permette di interagire con le molte risorse supportate da AWS, come Amazon S3, Elastic Beanstalk, Lambda e molti altri.

In questa guida definitiva, imparerai passo dopo passo tutto ciò che devi sapere sul provider AWS e su come utilizzare questo provider con Terraform per gestire la tua infrastruttura Amazon.

Facciamolo!

Prerequisiti

Se desideri seguire questo tutorial, assicurati di avere quanto segue:

  • A code editor – Even though you can use any text editor to work with Terraform configuration files, you should have one that understands the HCL Terraform language. Try out Visual Studio (VS) Code.

Cosa è il provider Terraform AWS?

Terraform dipende dai plugin per interagire con i fornitori di servizi cloud come AWS, Google Cloud Platform (GCP) e Oracle. Uno dei fornitori più utilizzati è il provider AWS. Questo provider interagisce con molte risorse supportate da AWS, come Amazon S3, Elastic Beanstalk, Lambda e molte altre.

Terraform utilizza il provider AWS con le credenziali adeguate per connettersi ad Amazon e gestire o distribuire/aggiornare decine di servizi AWS.

Il provider AWS viene dichiarato all’interno del file di configurazione di Terraform e include vari parametri come la versione, gli URL degli endpoint o le regioni cloud, ecc.

Dichiarazione del provider AWS

Quando hai bisogno di fare riferimento al nome di un fornitore, devi definire un nome locale. Il nome locale è il nome del fornitore assegnato all’interno del blocco required_providers. I nomi locali vengono assegnati quando si richiede un fornitore e devono essere univoci per modulo.

Quando dichiari i required_providers, devi anche dichiarare il parametro source in Terraform 0.13 e versioni successive. Il parametro source imposta l’indirizzo di origine da cui Terraform può scaricare plugins.

Gli indirizzi di origine sono composti da tre parti, come segue:

  • Hostname – Il nome host del registro Terraform che distribuisce il fornitore. Il nome host predefinito è registry.terraform.io.
  • Namespace – Uno spazio dei nomi organizzativo nel registro specificato.
  • Tipo – Un tipo è un nome breve che fornisci per la piattaforma o il sistema gestito dal fornitore e deve essere univoco.

Qui sotto puoi vedere la sintassi di dichiarazione del parametro source, in cui le tre parti di un indirizzo di origine sono delimitate da barre (/).

## <HOSTNAME>/]<NAMESPACE>/<TYPE>

# ESEMPIO DI UTILIZZO DELLA SINTASSI DEI PARAMETRI DI ORIGINE

# Dichiarazione della posizione/indirizzo di origine da cui Terraform può scaricare i plugin
# Il provider ufficiale AWS appartiene allo spazio dei nomi hashicorp nel registro.terraform.io. Quindi, l'indirizzo di origine di hashicorp è hashicorp/aws
# Di seguito è riportata la configurazione di Terraform che dichiara il nome del provider richiesto (aws), insieme all'indirizzo di origine, alla versione del provider AWS e configura la regione del provider (us-east-2).
source  = "hashicorp/aws"
# Dichiarazione dei requisiti del provider quando è installato Terraform 0.13 e versioni successive
terraform {
  # Un requisito del provider è composto da un nome locale (aws),
  # una posizione di origine e un vincolo di versione.
  required_providers {
    aws = {     
      # Dichiarazione della posizione/indirizzo di origine da cui Terraform può scaricare i plugin
      source  = "hashicorp/aws"
      # Dichiarazione della versione del provider aws come maggiore di 3.0
      version = "~> 3.0"  
    }
  }
}

# Configurazione del provider AWS nella regione us-east-2
provider "aws" {
  region = "us-east-2"
}

Autenticazione di un account AWS con credenziali codificate nel codice

Ora che hai una comprensione di base di come dichiarare il provider AWS, vediamo come autenticare un account AWS.

Puoi autenticare il provider AWS tramite diversi metodi, come dichiarare le variabili di ambiente e memorizzare le credenziali in un profilo nominato. Tuttavia, il modo più rapido per autenticarsi a un account AWS è inserire direttamente le credenziali nel tuo provider AWS.

Sebbene le credenziali codificate duramente non siano consigliate poiché sono suscettibili di divulgazione, puoi comunque dichiarare credenziali codificate duramente nella configurazione di Terraform per testare rapidamente risorse AWS. Ma continua a leggere e scoprirai successivamente un modo migliore per autenticare un account AWS dichiarando le variabili di ambiente.

La configurazione di seguito dichiara un nome locale (aws) insieme alla regione del provider (us-east-2), come mostrato di seguito. Puoi vedere che il blocco provider AWS dichiara anche una chiave di accesso e una chiave segreta per autenticare un account AWS.

# Dichiarazione di un provider AWS chiamato aws
provider "aws" {
  # Dichiarazione della regione del provider
  region = "us-east-2"
  # Dichiarazione della access_key e secret_key
  access_key = "access-key"
  secret_key = "secret-key"
}

Sicurezza delle credenziali tramite dichiarazione di variabili di ambiente

Hai appena appreso che è possibile codificare staticamente le credenziali per autenticare il servizio cloud AWS con Terraform. Tuttavia, la codifica rigida è insicura e consigliata solo durante la distribuzione in un ambiente di test per testare rapidamente il codice.

C’è un altro modo per proteggere le credenziali? Sì, dichiarandole come variabili d’ambiente, non c’è limite al numero che puoi dichiarare. Le variabili d’ambiente sono variabili il cui valore è impostato al di fuori del file di configurazione di Terraform e sono composte da una coppia nome/valore.

Esegui la serie di comandi export di seguito per esportare ciascuna variabile d’ambiente. L’esportazione delle variabili d’ambiente le rende disponibili in tutto il programma o fino a quando Terraform viene eseguito.

# Esporta la variabile AWS_ACCESS_KEY_ID
export AWS_ACCESS_KEY_ID="access-key"
# Esporta AWS_SECRET_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY="secret-key"
# Esporta AWS_DEFAULT_REGION
export AWS_DEFAULT_REGION="us-east-2"

Archiviazione di più credenziali in un profilo nominato

Sia l’inserimento manuale che la dichiarazione delle credenziali come variabili d’ambiente ti consentono di autenticare un account AWS una volta alla volta. Ma cosa succede se devi archiviare più credenziali e usarle quando necessario? Archiviare le credenziali in un profilo nominato è l’opzione ideale.

Il codice qui sotto crea un profilo nominato (Myprofile) che contiene una chiave di accesso e una chiave segreta.

La posizione predefinita dei profili nominati è in $HOME/.aws/credentials/Myprofile su Linux e macOS, o %USERPROFILE%\.aws\credentials\Myprofile su Windows. Sostituisci Myprofile con il nome effettivo del profilo nominato.

# Creazione del profilo nominato 'Ilmioprofilo'
[Myprofile]
aws_access_key_id = AKIAVWOJMI5836154yRW31
aws_secret_accesss_key = vIaGmx2bJCAK90hQbpNhPV2k5wlW7JsVrP1bm9Ft

Una volta creato un profilo nominato in ~/.aws/credentials, è possibile fare riferimento a quel profilo nella configurazione di Terraform utilizzando l’attributo profilo. Di seguito, si fa riferimento al profilo nominato Ilmioprofilo.

# Configurazione del Provider AWS denominato 'aws' nella regione us-east-2
provider "aws" {
  region = "us-east-2"
  # Dichiarazione del profilo nominato (Ilmioprofilo)
  profile = "Myprofile"
}

Dichiarare l’Assume Role nel Provider AWS

Hai appena imparato a configurare un Provider AWS dichiarando le credenziali codificate rigidamente prima di eseguire Terraform. Ma forse vuoi dichiarare le credenziali al momento dell’esecuzione. In tal caso, l’API AssumeRole è ciò di cui hai bisogno. AssumeRole fornisce credenziali temporanee contenenti un ID chiave di accesso, una chiave di accesso segreta e un token di sicurezza. Queste credenziali ti consentono di connetterti ad AWS.

Il codice seguente dichiara il provider denominato aws e un assume_role che contiene un nome ruolo e un nome sessione. Per configurare l’accesso AssumeRole, è necessario definire un ruolo IAM che specifichi i privilegi che concede e quali entità possono assumerlo.

# Dichiarazione del provider AWS chiamato 'aws'
provider "aws" {
  # Dichiarazione di AssumeRole
  assume_role {
		# Dichiarazione di un nome di risorsa.
    # Il role_arn è l'Amazon Resource Name (ARN) del ruolo IAM da assumere.
    # ARN è un numero univoco allineato a tutte le risorse nell'account AWS.
    role_arn     = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"
    # Dichiarazione di un nome di sessione
    session_name = "SESSION_NAME"
  }
}

Dichiarazione di Più Provider AWS

Fino ad ora, hai imparato come dichiarare e configurare il Provider AWS in Terraform che funziona con una singola regione. Ma cosa succede se devi gestire la tua infrastruttura o i servizi AWS in più regioni cloud? In tal caso, dovrai dichiarare la parola chiave alias.

L’alias consente di definire più configurazioni per lo stesso provider e selezionare quale utilizzare su base risorsa o modulo o supportare più regioni.

Il codice sottostante dichiara il Provider AWS predefinito chiamato aws con la region impostata su us-east-2. E poi dichiara un Provider AWS aggiuntivo con lo stesso nome, ma con un alias dichiarato chiamato west e una region impostata su us-west-2.

Dichiarare un alias consente di creare risorse in us-east-2 per impostazione predefinita o nella regione us-west-2 se si sceglie il provider aws.west a seconda delle esigenze.

# Le risorse di configurazione del provider predefinito che iniziano con aws.
provider "aws" {
  # Dichiarazione della regione us-east-2 per il provider AWS chiamato 'aws'
  region = "us-east-2" 
}

# Configurazione del provider aggiuntiva per la regione ovest.
# Le risorse possono fare riferimento a questo come aws.west.
provider "aws" {
  alias  = "west"
  # Dichiarazione della regione us-west-2 per il provider AWS denominato 'west'
  region = "us-west-2"
}

# Dichiarazione della risorsa utilizzando un provider aggiuntivo nella regione ovest
resource "aws_instance" "west-region" {
  # Dichiarazione del provider come aws.west
  # aws.west è referenziato dal provider AWS chiamato 'aws' e con l'alias 'west'
  provider = aws.west
}

# Dichiarazione della risorsa utilizzando il provider predefinito
resource "aws_instance" "east-region" 
}

Personalizzazione della configurazione del punto di accesso del provider AWS

La personalizzazione della configurazione del punto di accesso è utile quando ci si connette a punti di accesso dei servizi AWS non predefiniti, come AWS Snowball o durante i test locali.

Configura il provider AWS di Terraform per utilizzare gli endpoint personalizzati. Fallo dichiarando il blocco di configurazione endpoints all’interno del blocco del provider, come mostrato di seguito.

La configurazione sottostante ti consente di accedere al servizio AWS S3 sulla porta locale 4572 come se stessi effettivamente accedendo al servizio AWS S3 su un account AWS. Allo stesso modo, la configurazione ti consente di accedere a dynamodb localmente sulla porta 4569. DynamoDB è un servizio di database NoSQL che offre prestazioni veloci con scalabilità senza soluzione di continuità.

Controlla l’elenco degli endpoint personalizzati consentiti dal provider Terraform AWS.

# Dichiarazione del provider AWS chiamato 'aws'
provider "aws" {
  # Dichiarazione degli endpoint
  endpoints { 
    # Dichiarazione del dynamodb in locale con porta 4569 
    dynamodb = "<http://localhost:4569>"  
    # Dichiarazione del S3 in locale con porta 4572
    s3 = "<http://localhost:4572>"  
  }
}

Aggiunta di tag

In precedenza, hai appreso come viene dichiarato un provider AWS con configurazioni come regione, posizione di origine, ecc. Ma per gestire meglio le tue risorse, è necessario aggiungere tag a livello di provider.

I tag sono etichette composte da chiavi e valori definiti dall’utente. I tag sono utili quando è necessario controllare la fatturazione, la proprietà, l’automazione, il controllo degli accessi e molti altri casi d’uso nell’account AWS.

Invece di aggiungere tag a tutte le risorse singolarmente, impariamo come aggiungere tag a tutte le risorse a livello di provider che aiuterà a risparmiare molto codice e tempo.

Il codice qui sotto configura un provider AWS con tag definiti all’interno del default_tags. Il vantaggio di aggiungere tag all’interno del provider è che i tag specificati verranno automaticamente aggiunti quando si crea una qualsiasi risorsa con questo provider.

# Configurazione del Provider AWS denominato 'aws'
provider "aws" {
  # Aggiunta dei tag predefiniti Ambiente e Proprietario a livello di Provider
  default_tags {
    # Dichiarazione dei valori dei tag
    tags = {
      Environment = "Production"
      Owner       = "shanky"
    }
  }
}
# Creazione della risorsa 'aws_vpc' contrassegnata con Nome=MiaVPC
resource "aws_vpc" "myinstance" {
  tags = {
    Name = "MyVPC"
  }
}

Ignorando i Tag

Abilitare i tag a livello di provider aiuta ad applicare i tag in tutto l’ambiente. Ma a volte è necessario ignorare i tag, ad esempio se non si desidera aggiungere un tag predefinito a un’istanza EC2 e piuttosto applicarlo al resto delle risorse nell’account AWS. Diamo un’occhiata!

Il codice qui sotto configura un provider AWS con ignore_tags definiti all’interno del provider. Il vantaggio dell’uso del tag di ignoranza è quando non si desidera aggiungere tag predefiniti a determinate risorse e si applicano al resto delle risorse.

Nel codice sottostante, quando si crea una risorsa utilizzando il provider aws, tutte le risorse ignoreranno i tag LastScanned e kubernetes.io.

# Configurazione del provider AWS chiamato aws
provider "aws" {
	# Ignora i prefissi e le chiavi dei tag in tutte le risorse sotto il provider AWS (aws) 
  ignore_tags {
    key_prefixes = ["kubernetes.io"]
  }
  ignore_tags {
    keys = ["LastScanned"]
  }
}

Creazione di un Bucket AWS S3

A questo punto, hai imparato tutto su come dichiarare e configurare i provider AWS in modo approfondito. Ma dichiarare il provider AWS non fa nulla fino a quando non gestisci risorse AWS come la creazione di un bucket AWS S3 o la cancellazione di un’istanza Ec2, ecc. Quindi, impariamo come creare un bucket AWS S3!

1. Crea una cartella chiamata ~/terraform-s3-demo, quindi cambia (cd) la directory di lavoro in quella cartella. La cartella ~/terraform-s3-demo conterrà il file di configurazione e tutti i file associati che Terraform creerà.

mkdir ~/terraform-s3-demo
cd ~/terraform-s3-demo

2. Copia e incolla la configurazione sottostante nel tuo editor di codice preferito e salvala come main.tf nella directory ~/terraform-s3-demo.

Il file main.tf crea alcune risorse necessarie:

  • Requisito del provider: Un requisito del provider consiste in un nome locale, una posizione di origine e un vincolo di versione.
  • Chiave di crittografia: La chiave di crittografia Amazon S3 aiuta il bucket S3 in modo che tutti gli oggetti nuovi siano crittografati quando vengono archiviati nel bucket. Le chiavi di crittografia vengono create utilizzando aws_kms_key in Terraform.
  • Configurazione del Provider AWS: Dichiarare il nome del provider (aws) insieme alla regione us-east-2.
  • Bucket: Questo modulo Terraform crea un bucket chiamato terraformdemobucket. Terraform non può distruggere questo bucket in quanto contiene un flag force_destroy.

Versioning: Il versioning in Amazon S3 significa mantenere più versioni di un oggetto nello stesso bucket

# Configurazione del Provider AWS chiamato aws
provider "aws" {
# Ignora i prefissi chiave e le chiavi su tutte le risorse sotto un provider aws.
  ignore_tags {
    key_prefixes = ["kubernetes.io/"]
  }
  ignore_tags {
    keys = ["LastScanned"]
  }
}

# Dichiarazione dei requisiti del Provider
terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

# Configurazione del Provider AWS (aws) con regione impostata su 'us-east-2'
provider "aws" {
  region = "us-east-2"
}

# Concessione dell'accesso al bucket
resource "aws_s3_bucket_public_access_block" "publicaccess" {
  bucket = aws_s3_bucket.demobucket.id
  block_public_acls = false
  block_public_policy = false
}

# Creazione della chiave di crittografia che crittograferà gli oggetti del bucket
resource "aws_kms_key" "mykey" {
  deletion_window_in_days = "20"
}

# Creazione del bucket chiamato terraformdemobucket
resource "aws_s3_bucket" "demobucket" {
  bucket = terraformdemobucket
  force_destroy = false
  server_side_encryption_configuration {
    rule {
        apply_server_side_encryption_by_default {
        kms_master_key_id = aws_kms_key.mykey.arn
        sse_algorithm = "aws:kms"
      }
    }
  }
  # Mantenimento di più versioni di un oggetto nello stesso bucket
  versioning {
    enabled = true
  }
}

3. Ora, esegui i comandi seguenti per navigare nella directory ~\\terraform-s3-demo e inizializzare Terraform. Terraform inizializza i plugin e i provider necessari per lavorare con le risorse.

Terraform di solito utilizza un approccio a tre comandi in ordine sequenziale terraform init, terraform plan, e terraform apply.

cd ~\terraform-s3-demo       # Cambia nella directory ~\terraform-s3-demo
terraform init               # Inizializza Terraform
terraform plan               # Assicurati che la sintassi della tua configurazione sia corretta
terraform apply -auto-approve # Prova il bucket AWS S3

Creazione di istanze AWS EC2 e utenti IAM

Nella sezione precedente, hai imparato come creare un singolo oggetto (bucket AWS S3) usando Terraform con AWS Provider. Ma in realtà, puoi creare più oggetti dello stesso tipo usando Terraform con AWS Provider.

1. Crea una cartella chiamata ~/terraform-ec2-iam-demo, quindi naviga al suo interno

2. Apri il tuo editor di codice preferito, copia/incolla la configurazione seguente e salva il file come main.tf nella directory ~/terraform-ec2-iam-demo.

Il codice di seguito crea due istanze EC2 ec21a e ec21a, con tipi di istanza t2.micro e t2.medium differenti, quindi crea utenti IAM con quattro nomi diversi. L’ami dichiarato nel codice è un Amazon Machine Image (AMI), che fornisce le informazioni necessarie per avviare un’istanza, come il tipo di sistema operativo, quale software installare, ecc.

Puoi trovare AMI Linux utilizzando la console di Amazon EC2.

# Creazione dell'istanza con il tipo di istanza t2.micro e t2.medium
resource "aws_instance" "my-machine" {
# Dichiarazione dell'AMI
  ami = "ami-0a91cd140a1fc148a"
  for_each  = {
      key1 = "t2.micro"
	    key2 = "t2.medium"
   }
  instance_type  = each.value
	key_name       = each.key
    tags =  {
	   Name  = each.value
	}
}
# Creazione degli utenti IAM con quattro nomi diversi
resource "aws_iam_user" "accounts" {
  for_each = toset( ["Account1", "Account2", "Account3", "Account4"] )
  name     = each.key
}

3. Successivamente, crea un altro file, copia/incolla il codice qui sotto e salva il file come vars.tf nella directory ~/terraform-ec2-iam-demo.

Il codice qui sotto dichiara tutte le variabili, alle quali si fa riferimento nel file main.tf. Dopo aver eseguito il codice Terraform, alla variabile tag_ec2 vengono assegnati i valori ec21a e ec21b alle due istanze EC2 definite nel file main.tf.

variable "tag_ec2" {
  type = list(string)
  default = ["ec21a","ec21b"]
}

4. Crea un altro file di configurazione Terraform chiamato output.tf nella directory ~/terraform-ec2-iam-demo, quindi copia/incolla il codice qui sotto nel file output.tf.

Dopo l’esecuzione riuscita del comando terraform apply, dovresti vedere i valori di ${aws_instance.my-machine.*.id} e ${aws_iam_user.accounts.*.name} alla fine dell’output del comando.

Il codice qui sotto indica a Terraform di fare riferimento alle risorse aws_instance e aws_iam_user definite nel file di configurazione main.tf.

output "aws_instance" {
   value = "${aws_instance.my-machine.*.id}"
}
output "aws_iam_user" {
   value = "${aws_iam_user.accounts.*.name}"
}

5. Crea un altro file di configurazione nella directory ~/terraform-ec2-iam-demo chiamato provider.tf, e incolla il codice seguente nel file provider.tf. Il file provider.tf sottostante definisce il provider AWS di Terraform in modo che Terraform sappia come interagire con tutte le risorse AWS che hai definito nei passaggi precedenti.

provider "aws" {
   region = "us-east-2"
 }

6. Ora, verifica che tutti i file richiesti siano contenuti nella cartella ~/terraform-ec2-iam-demo eseguendo il comando tree.

Showing all the Terraform configuration files required

7. Esegui i comandi sottostanti in ordine sequenziale per inizializzare Terraform e creare istanze EC2 AWS e utenti IAM.

terraform init
terraform plan
terraform apply
Terraform apply command executed successfully.

Infine, passa alla Console di Gestione AWS, e poi vai al servizio AWS EC2 e alla console IAM.

Nelle schermate seguenti, puoi verificare che le istanze EC2 e gli utenti IAM esistano.

Verifying the two EC2 instances that got created using Terraform
Verifying the four IAM users that got created using Terraform

Conclusion

Con questa guida definitiva, ora hai le conoscenze necessarie per lavorare con il Provider AWS, dalla dichiarazione all’esecuzione del Provider AWS all’interno di Terraform. Hai anche appreso come il Provider AWS ti consente di dichiarare le credenziali in modi sicuri.

Ora, quale servizio AWS hai in mente di gestire con il Provider AWS e Terraform?

Source:
https://adamtheautomator.com/terraform-aws/