Épique Terraform AWS Provider pour votre infrastructure Amazon

Si vous prévoyez de gérer et travailler avec Amazon Web Services (AWS), l’utilisation du fournisseur AWS de Terraform est un must. Il vous permet d’interagir avec les nombreuses ressources prises en charge par AWS, telles que Amazon S3, Elastic Beanstalk, Lambda, et bien d’autres encore.

Dans ce guide ultime, vous allez apprendre, étape par étape, tout ce que vous devez savoir sur le fournisseur AWS et comment utiliser ce fournisseur avec Terraform pour gérer votre infrastructure Amazon.

Allons-y!

Prérequis

Si vous souhaitez suivre ce tutoriel, assurez-vous d’avoir les éléments suivants en place :

  • 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.

Qu’est-ce que le fournisseur AWS Terraform ?

Terraform dépend de plugins pour interagir avec des fournisseurs de services cloud tels que AWS, Google Cloud Platform (GCP) et Oracle. L’un des fournisseurs les plus largement utilisés est le fournisseur AWS. Ce fournisseur interagit avec de nombreuses ressources prises en charge par AWS, telles que \texttt{Amazon S3}, \texttt{Elastic Beanstalk}, \texttt{Lambda}, et bien d’autres. \texttt{

}Terraform utilise le fournisseur AWS avec les informations d’identification appropriées pour se connecter à Amazon et gérer ou déployer/mettre à jour des dizaines de services AWS. \texttt{

}Le fournisseur AWS est déclaré dans le fichier de configuration Terraform et comprend divers paramètres tels que la version, les URL des points d’extrémité ou les régions cloud, etc. \texttt{

}\texttt{Déclaration du fournisseur AWS}

Quand vous avez besoin de faire référence au nom d’un fournisseur, vous devez définir un nom local. Le nom local est le nom du fournisseur qui est attribué à l’intérieur du bloc required_providers. Les noms locaux sont attribués lors de la requête d’un fournisseur et doivent être uniques par module.

Lors de la déclaration des required_providers, vous devez également déclarer le paramètre source dans Terraform 0.13 et les versions ultérieures. Le paramètre source définit l’adresse source à partir de laquelle Terraform peut télécharger des plugins.

Les adresses source se composent de trois parties, comme suit :

  • Nom d’hôte – Le nom d’hôte du registre Terraform qui distribue le fournisseur. Le nom d’hôte par défaut est registry.terraform.io.
  • Espace de noms – Un espace de noms organisationnel dans le registre spécifié.
  • Type – Un type est un nom court que vous fournissez pour la plateforme ou le système que le fournisseur gère, et il doit être unique.

Vous pouvez voir ci-dessous la syntaxe de déclaration du paramètre source, où les trois parties d’une adresse source sont délimitées par des barres obliques (/).

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

# EXEMPLE D'UTILISATION DE LA SYNTAXE DES PARAMÈTRES DE SOURCE

# Déclaration de l'emplacement/adresse source où Terraform peut télécharger des plugins
# Le fournisseur AWS officiel appartient à l'espace de noms hashicorp sur le 
# registre registry.terraform.io. Ainsi, l'adresse source de hashicorp est hashicorp/aws
source  = "hashicorp/aws"

Le fichier de configuration Terraform ci-dessous déclare le nom du fournisseur requis (aws), ainsi que l’adresse source, la version du fournisseur AWS, et configure la région du fournisseur (us-east-2).

# Déclaration des Exigences du Fournisseur lorsque Terraform 0.13 et ultérieur est installé
terraform {
  # Une exigence de fournisseur se compose d'un nom local (aws), 
  # d'un emplacement source et d'une contrainte de version. 
  required_providers {
    aws = {     
      # Déclaration de l'emplacement/adresse source où Terraform peut télécharger des plugins
      source  = "hashicorp/aws"
      # Déclaration de la version du fournisseur aws comme étant supérieure à 3.0
      version = "~> 3.0"  
    }
  }
}

# Configuration du Fournisseur AWS dans la région us-east-2
provider "aws" {
  region = "us-east-2"
}

Authentification d’un Compte AWS avec des Identifiants Intégrés

Maintenant que vous avez une compréhension de base de la façon de déclarer le fournisseur AWS, passons à l’authentification d’un compte AWS.

Vous pouvez authentifier le fournisseur AWS via différentes méthodes, telles que la déclaration de variables d’environnement et le stockage des informations d’identification dans un profil nommé. Mais le moyen le plus rapide d’authentifier un compte AWS est de coder en dur les informations d’identification dans votre fournisseur AWS.

Bien que l’utilisation de crédits codés en dur ne soit pas recommandée car elle est sujette aux fuites, vous pouvez néanmoins déclarer des informations d’identification codées en dur dans la configuration Terraform pour tester rapidement n’importe quelle ressource AWS. Mais continuez à lire et vous découvrirez plus tard une meilleure façon d’authentifier un compte AWS en déclarant des variables d’environnement.

La configuration ci-dessous déclare un nom local (aws) ainsi que la région du fournisseur (us-east-2), comme indiqué ci-dessous. Vous pouvez voir que le bloc du fournisseur AWS déclare également une clé d’accès et une clé secrète pour authentifier un compte AWS.

# Déclaration d'un fournisseur AWS nommé aws
provider "aws" {
  # Déclaration de la région du fournisseur
  region = "us-east-2"
  # Déclaration de la clé d'accès et de la clé secrète
  access_key = "access-key"
  secret_key = "secret-key"
}

Sécurisation des informations d’identification en déclarant des variables d’environnement

Vous venez d’apprendre qu’il est possible de coder en dur des informations d’identification statiques pour authentifier le service cloud AWS avec Terraform. Cependant, le codage en dur n’est pas sûr et est recommandé uniquement lors du déploiement dans un environnement de test pour tester rapidement le code.

Y a-t-il une autre manière de sécuriser les informations d’identification? Oui, en les déclarant comme des variables d’environnement, il n’y a pas de limite au nombre que vous pouvez déclarer. Les variables d’environnement sont des variables dont les valeurs sont définies en dehors du fichier de configuration Terraform et sont composées d’une paire nom/valeur.

Exécutez la série de commandes export ci-dessous pour exporter chaque variable d’environnement. L’exportation des variables d’environnement les rend disponibles tout au long du programme ou jusqu’à ce que Terraform s’exécute.

# Exportation de la variable AWS_ACCESS_KEY_ID
export AWS_ACCESS_KEY_ID="access-key"
# Exportation de la variable AWS_SECRET_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY="secret-key"
# Exportation de la variable AWS_DEFAULT_REGION
export AWS_DEFAULT_REGION="us-east-2"

Stockage de plusieurs informations d’identification dans un profil nommé

À la fois le codage en dur et la déclaration des informations d’identification en tant que variables d’environnement vous permettent d’authentifier un compte AWS à la fois. Mais que faire si vous devez stocker plusieurs informations d’identification et les utiliser au besoin? Stocker les informations d’identification dans un profil nommé est l’option idéale.

Le code ci-dessous crée un profil nommé (Myprofile) qui contient une clé d’accès et une clé secrète.

L’emplacement par défaut des profils nommés est à $HOME/.aws/credentials/Myprofile sur Linux et macOS, ou %USERPROFILE%\.aws\credentials\Myprofile sur Windows. Remplacez Myprofile par le nom réel du profil nommé.

# Création du profil nommé 'Monprofil'
[Myprofile]
aws_access_key_id = AKIAVWOJMI5836154yRW31
aws_secret_accesss_key = vIaGmx2bJCAK90hQbpNhPV2k5wlW7JsVrP1bm9Ft

Une fois que vous avez créé un profil nommé dans ~/.aws/credentials, vous pouvez ensuite référencer ce profil dans votre configuration Terraform en utilisant l’attribut profile. Ci-dessous, vous référencez le profil nommé Monprofil.

# Configuration du fournisseur AWS nommé 'aws' dans la région us-east-2
provider "aws" {
  region = "us-east-2"
  # Déclaration du profil nommé (Monprofil)
  profile = "Myprofile"
}

Déclaration de l’Assume Role dans le fournisseur AWS

Vous venez d’apprendre à configurer un fournisseur AWS en déclarant des informations d’identification codées en dur avant d’exécuter Terraform. Mais peut-être que vous voulez déclarer des informations d’identification au moment de l’exécution. Si tel est le cas, l’API AssumeRole est ce dont vous avez besoin. AssumeRole fournit des informations d’identification temporaires contenant un ID de clé d’accès, une clé d’accès secrète et un jeton de sécurité. Ces informations d’identification vous permettent de vous connecter à AWS.

Le code ci-dessous déclare le fournisseur nommé aws et un assume_role qui contient un nom de rôle et un nom de session. Pour configurer l’accès AssumeRole, vous devez définir un rôle IAM qui spécifie les privilèges qu’il accorde et quelles entités peuvent l’assumer.

# Déclaration du fournisseur AWS nommé 'aws'
provider "aws" {
  # Déclaration de AssumeRole
  assume_role {
		# Déclaration d'un nom de ressource.
    # Le role_arn est le nom de ressource Amazon (ARN) du rôle IAM à assumer.
    # ARN est un numéro unique qui est aligné sur toutes les ressources du compte AWS.
    role_arn     = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"
    # Déclaration d'un nom de session
    session_name = "SESSION_NAME"
  }
}

Déclaration de plusieurs fournisseurs AWS

Jusqu’à présent, vous avez appris comment déclarer et configurer le fournisseur AWS dans Terraform qui fonctionne avec une seule région. Mais que faire si vous devez gérer votre infrastructure ou vos services AWS dans plusieurs régions cloud ? Dans ce cas, vous devrez déclarer le mot-clé alias.

L’alias permet de définir plusieurs configurations pour le même fournisseur et de sélectionner celui à utiliser sur une base par ressource ou par module ou de prendre en charge plusieurs régions.

Le code ci-dessous déclare le fournisseur AWS par défaut nommé aws avec la region définie sur us-east-2. Puis déclare un autre fournisseur AWS avec le même nom, mais avec un alias déclaré nommé west et une region définie sur us-west-2.

Déclarer un alias vous permet de créer des ressources dans la région us-east-2 par défaut ou dans la région us-west-2 si vous choisissez le fournisseur aws.west en fonction des besoins.

# Les ressources de configuration du fournisseur par défaut qui commencent par aws.
provider "aws" {
  # Déclaration de la région us-east-2 pour le fournisseur AWS nommé 'aws'
  region = "us-east-2" 
}

# Configuration supplémentaire du fournisseur pour la région ouest. 
# Les ressources peuvent faire référence à cela comme aws.west.
provider "aws" {
  alias  = "west"
  # Déclaration de la région us-west-2 pour le fournisseur AWS référencé en tant que 'west'
  region = "us-west-2"
}

# Déclaration de la ressource en utilisant un fournisseur supplémentaire dans la région ouest
resource "aws_instance" "west-region" {
  # Déclaration du fournisseur en tant que aws.west
  # aws.west est référencé à partir du fournisseur AWS nommé 'aws' et avec l'alias 'west'
  provider = aws.west
}

# Déclaration de la ressource en utilisant le fournisseur par défaut
resource "aws_instance" "east-region" 
}

Personnaliser la configuration de l’endpoint du fournisseur AWS

Personnaliser la configuration de l’endpoint est pratique lors de la connexion à des endpoints de service AWS non par défaut, tels que AWS Snowball ou lors de tests locaux.

Configurez le fournisseur AWS de Terraform pour utiliser des points d’accès personnalisés. Faites-le en déclarant le bloc de configuration endpoints à l’intérieur du bloc du fournisseur, comme indiqué ci-dessous.

La configuration ci-dessous vous permet d’accéder au service AWS S3 sur le port local 4572 comme si vous accédiez réellement au service AWS S3 sur un compte AWS. De même, la configuration vous permet d’accéder localement à dynamodb sur le port 4569. DynamoDB est un service de base de données NoSQL qui offre des performances rapides avec une évolutivité transparente.

Vérifiez la liste des points d’accès personnalisés autorisés par le fournisseur AWS Terraform.

# Déclaration du fournisseur AWS nommé 'aws'
provider "aws" {
  # Déclaration des points d'accès
  endpoints { 
    # Déclaration du dynamodb sur localhost avec le port 4569 
    dynamodb = "<http://localhost:4569>"  
    # Déclaration du S3 sur localhost avec le port 4572
    s3 = "<http://localhost:4572>"  
  }
}

Ajout de balises

Auparavant, vous avez appris comment déclarer un fournisseur AWS avec des configurations telles que la région, l’emplacement source, etc. Mais pour mieux gérer vos ressources, vous devez ajouter des balises au niveau du fournisseur.

Les balises sont des étiquettes composées de clés et de valeurs définies par l’utilisateur. Les balises sont pratiques lorsque vous devez vérifier la facturation, la propriété, l’automatisation, le contrôle d’accès et de nombreux autres cas d’utilisation dans le compte AWS.

Au lieu d’ajouter des balises à chaque ressource individuellement, apprenons comment ajouter des balises à toutes les ressources au niveau du fournisseur, ce qui permettra de gagner beaucoup de code et de temps.

Le code ci-dessous configure un fournisseur AWS avec des balises définies à l’intérieur de default_tags. L’avantage d’ajouter des balises dans le fournisseur est que les balises spécifiées seront automatiquement ajoutées lorsque vous créez une ressource avec ce fournisseur.

# Configuration du fournisseur AWS nommé 'aws'
provider "aws" {
  # Ajout des balises par défaut Environnement et Propriétaire au niveau du fournisseur
  default_tags {
    # Déclaration de la valeur des balises
    tags = {
      Environment = "Production"
      Owner       = "shanky"
    }
  }
}
# Création de la ressource 'aws_vpc' balisée avec Nom=MyVPC
resource "aws_vpc" "myinstance" {
  tags = {
    Name = "MyVPC"
  }
}

Ignorer les balises

Activer les balises au niveau du fournisseur aide à appliquer des balises dans tout l’environnement. Mais parfois, vous devez ignorer les balises, par exemple si vous ne souhaitez pas ajouter de balise par défaut à une instance EC2 et plutôt l’appliquer au reste des ressources dans le compte AWS. Jetons un coup d’œil !

Le code ci-dessous configure un fournisseur AWS avec ignore_tags défini à l’intérieur du fournisseur. L’avantage d’utiliser la balise d’ignorance est lorsque vous ne souhaitez pas ajouter de balises par défaut à certaines ressources et les appliquer au reste des ressources.

Dans le code ci-dessous, lorsque vous créez une ressource avec le fournisseur aws, toutes les ressources ignoreront les balises LastScanned et kubernetes.io.

# Configuration du fournisseur AWS nommé aws
provider "aws" {
	# Ignorer les préfixes et les clés des balises sur toutes les ressources sous le fournisseur AWS (aws)
  ignore_tags {
    key_prefixes = ["kubernetes.io"]
  }
  ignore_tags {
    keys = ["LastScanned"]
  }
}

Création d’un bucket S3 AWS

À présent, vous avez appris tout ce qu’il faut savoir sur la déclaration et la configuration des fournisseurs AWS en profondeur. Mais déclarer simplement le fournisseur AWS ne fait rien tant que vous ne gérez pas les ressources AWS telles que la provision d’un bucket S3 AWS ou la suppression d’une instance Ec2, etc. Alors, apprenons comment créer un bucket S3 AWS !

1. Créez un dossier nommé ~/terraform-s3-demo, puis changez (cd) le répertoire de travail vers ce dossier. Le dossier ~/terraform-s3-demo contiendra votre fichier de configuration et tous les fichiers associés que Terraform va créer.

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

2. Copiez et collez la configuration ci-dessous dans votre éditeur de code préféré, et enregistrez-la sous le nom de main.tf dans le répertoire ~/terraform-s3-demo.

Le fichier main.tf crée quelques ressources nécessaires :

  • Exigence du fournisseur : Une exigence du fournisseur se compose d’un nom local, d’un emplacement source et d’une contrainte de version.
  • Clé de chiffrement: La clé de chiffrement Amazon S3 aide le bucket S3 afin que tous les nouveaux objets soient chiffrés lorsqu’ils sont stockés dans le bucket. Les clés de chiffrement sont créées à l’aide de aws_kms_key dans Terraform.
  • Configuration du fournisseur AWS: Déclaration du nom du fournisseur (aws) ainsi que de la région us-east-2.
  • Bucket: Ce module Terraform crée un bucket nommé terraformdemobucket. Terraform ne peut pas détruire ce bucket car il contient un indicateur force_destroy.

Versioning: La versioning dans Amazon S3 signifie conserver plusieurs versions d’un objet dans le même bucket

# Configuration du fournisseur AWS nommé aws
provider "aws" {
# Ignorer les préfixes de clé de tag et les clés sur toutes les ressources sous un fournisseur aws.
  ignore_tags {
    key_prefixes = ["kubernetes.io/"]
  }
  ignore_tags {
    keys = ["LastScanned"]
  }
}

# Déclaration des exigences du fournisseur
terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

# Configuration du fournisseur AWS (aws) avec la région définie sur 'us-east-2'
provider "aws" {
  region = "us-east-2"
}

# Accorder l'accès au bucket
resource "aws_s3_bucket_public_access_block" "publicaccess" {
  bucket = aws_s3_bucket.demobucket.id
  block_public_acls = false
  block_public_policy = false
}

# Création de la clé de chiffrement qui chiffrera les objets du bucket
resource "aws_kms_key" "mykey" {
  deletion_window_in_days = "20"
}

# Création du bucket nommé 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"
      }
    }
  }
  # Conservation de plusieurs versions d'un objet dans le même bucket
  versioning {
    enabled = true
  }
}

3. Maintenant, exécutez les commandes ci-dessous pour naviguer vers le répertoire ~\\terraform-s3-demo et initialiser Terraform. Terraform initialise les plugins et les fournisseurs nécessaires pour travailler avec les ressources.

Terraform utilise généralement une approche en trois commandes dans l’ordre séquentiel terraform init, terraform plan et terraform apply.

cd ~\terraform-s3-demo       # Changer vers le répertoire ~\terraform-s3-demo
terraform init               # Initialiser Terraform
terraform plan               # Assurez-vous que la syntaxe de votre configuration est correcte
terraform apply -auto-approve # Approvisionner le bucket AWS S3

Création d’instances EC2 AWS et d’utilisateurs IAM

Dans la section précédente, vous avez appris à créer un seul objet (un bucket AWS S3) en utilisant Terraform avec le fournisseur AWS. Mais en fait, vous pouvez créer plusieurs objets du même type en utilisant Terraform avec le fournisseur AWS.

1. Créez un dossier nommé ~/terraform-ec2-iam-demo, puis naviguez-y

2. Ouvrez votre éditeur de code favori, copiez/collez la configuration ci-dessous et enregistrez le fichier sous le nom main.tf dans le répertoire ~/terraform-ec2-iam-demo.

Le code ci-dessous crée deux instances EC2 ec21a et ec21a, avec les types d’instance t2.micro et t2.medium respectivement, puis crée des utilisateurs IAM avec quatre noms différents. L’ami déclaré dans le code est une Amazon Machine Image (AMI), qui fournit les informations nécessaires pour lancer une instance, telles que le type de système d’exploitation, quels logiciels installer, etc.

Vous pouvez trouver des AMIs Linux en utilisant la console Amazon EC2.

# Création de l'instance avec le type d'instance t2.micro et t2.medium
resource "aws_instance" "my-machine" {
# Déclaration de l'AMI
  ami = "ami-0a91cd140a1fc148a"
  for_each  = {
      key1 = "t2.micro"
	    key2 = "t2.medium"
   }
  instance_type  = each.value
	key_name       = each.key
    tags =  {
	   Name  = each.value
	}
}
# Création des utilisateurs IAM avec quatre noms différents
resource "aws_iam_user" "accounts" {
  for_each = toset( ["Account1", "Account2", "Account3", "Account4"] )
  name     = each.key
}

3. Ensuite, créez un autre fichier, copiez/collez le code ci-dessous, et enregistrez le fichier sous vars.tf dans le répertoire ~/terraform-ec2-iam-demo.

Le code ci-dessous déclare toutes les variables, qui sont référencées dans le fichier main.tf. Après avoir exécuté le code Terraform, la variable tag_ec2 avec les valeurs ec21a et ec21b est assignée aux deux instances EC2 définies dans le fichier main.tf.

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

4. Créez un autre fichier de configuration Terraform appelé output.tf dans le répertoire ~/terraform-ec2-iam-demo, puis copiez/collez le code ci-dessous dans le fichier output.tf.

Après l’exécution réussie de la commande terraform apply, vous devriez voir les valeurs de ${aws_instance.my-machine.*.id} et ${aws_iam_user.accounts.*.name} à la fin de la sortie de la commande.

Le code ci-dessous indique à Terraform de faire référence aux ressources aws_instance et aws_iam_user définies dans le fichier de configuration main.tf.

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

5. Créez un autre fichier de configuration dans le répertoire ~/terraform-ec2-iam-demo appelé provider.tf, et collez le code ci-dessous dans le fichier provider.tf. Le fichier provider.tf ci-dessous définit le fournisseur AWS Terraform afin que Terraform sache comment interagir avec toutes les ressources AWS que vous avez définies dans les étapes précédentes.

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

6. Maintenant, vérifiez que tous les fichiers requis ci-dessous sont contenus dans le dossier ~/terraform-ec2-iam-demo en exécutant la commande tree.

Showing all the Terraform configuration files required

7. Exécutez les commandes ci-dessous dans l’ordre séquentiel pour initialiser Terraform et créer des instances EC2 AWS et des utilisateurs IAM.

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

Enfin, accédez à la Console de gestion AWS, puis passez au service EC2 AWS et à la console IAM.

Sur les captures d’écran suivantes, vous pouvez vérifier que les instances EC2 et les utilisateurs IAM existent.

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

Conclusion

Avec ce guide ultime, vous disposez désormais des connaissances nécessaires pour travailler avec le fournisseur AWS, de la déclaration à l’exécution du fournisseur AWS dans Terraform. Vous avez également appris comment le fournisseur AWS vous permet de déclarer des informations d’identification de différentes manières de manière sécurisée.

Maintenant, quel service AWS avez-vous en tête pour gérer avec le fournisseur AWS et Terraform?

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