XinCTO/gestion de VM sur aws avec terraform

Ecrit le Sun, 05 November 2017 18:00:33 +0000

gestion de VM sur aws avec terraform

La gestion des VM est une des premières briques de l’orchestration, d’une part assez simple, mais bon tremplin pour aller vers des choses plus complexes. Je vous propose ici de regarder comment provisionner et gérer rapidement des VM dans aws EC2 avec terraform.

Nous pouvons faire ceci de multiples façons, des librairies existent pour chaque langage et plate-forme d’automatisation (ie ansible, salt, puppet…), mais terraform propose une solution assez simple et permettant rapidement de se mettre en selle. Par ailleurs, cet outil permettra de faire d’autre choses ensuite sur des environnements différents et des fournisseurs différents que aws.

Configuration d’un compte sur aws

Si vous n’avez pas déjà un compte dédié à de l’administration à distance de votre EC2, je vous propose de le faire, isoler les usages et les droits est toujours une bonne pratique. Pour cela :

  • connectez vous sur votre console aws
  • si vous n’avez pas déjà mis en place l’authentification par token, profitez-en
  • dans l’IAM (à partir du menu de votre compte), sélectionner la section utilisateurs
  • ajouter un utilisateur (par exemple nommé tf) avec à les droits du groupe AmazonEC2FullAccess (on pourra faire plus fin ensuite), la création d’un groupe pourra être nécessaire
  • dans les informations d’identification de sécurité (onglet), créez une clé d’accès, elle est constituée d’un identifiant et d’un secret à noter, il n’apparaît plus ensuite, ces 2 informations seront indispensables pour autoriser votre terraform à piloter EC2

Trouver votre AMI

Pour construire une VM dans EC2, il faut spécifier un modèle, celui-ci est spécifié par une clé de type ami (Amazon Machine Image), on peut en trouver une facilement dans la première étape de la création d’une instance, dans mon cas sur la zone Irlande, je choisi le linux proposé par Amazon sous la référence ami-acd005d5 (cette valeur peut évoluer, ne la prenez pas sans vérifier son existance).

Pendant que vous êtes à cette étape, sélectionner le type de serveur que vous souhaiterez instancier, pour l’exemple ici nous utiliserons un t2.nano (1 vCPU, 512MB de mémoire), à adapter à votre cas d’usage bien sûr.

Terraform

On considère que vous avez installé sur votre poste préféré une version de l’outil terraform, passons directement au paramétrage de notre VM.

Je vous propose de construire notre fichier d’orchestration sur la base de quelques sections, le serveur, les droits d’accès via ssh, le filtrage réseau. Vous mettrez tout cela dans un fichier (ie aws.tf) dans un répertoire dédié à ce paramétrage.

Accès à EC2

On commence par spécifier que l’on souhaite utiliser le fournisseur aws dans l’écosystème terraform. C’est ici que l’on fournira les clés d’accès et la région de création de votre instance.

1provider "aws" {
2  access_key = "CHANGE-ME"
3  secret_key = "CHANGE-ME-TOO"
4  region     = "eu-west-1"
5}

Serveur

On commence par spécifier la forme de notre serveur en tant qu’instance aws, elle sera sur la base de l’AMI que nous avons trouvé précédement et de la taille spécifié dans le type.

1resource "aws_instance" "vm_test_01" {
2  ami           = "ami-acd005d5"
3  instance_type = "t2.nano"
4}

Clé SSH

Comme il pourrait être intéressant que l’on puisse se connecter à notre VM construite automatiquement, il nous faut ajouter une section spécifique pour aws :

1resource "aws_key_pair" "default" {
2  key_name = "alex"
3  public_key = "ssh-rsa CHANGE-ME"
4}

Groupe de sécurité

Les VM sont protégées chez Amazon par le biais de règles de filtrage décrites dans un groupe de sécurité. Voici la configuration pour un groupe assez simple autorisant ICMP vers notre VM, ainsi que l’accès à SSH et HTTP.

 1resource "aws_security_group" "default" {
 2  name = "terraform-test"
 3
 4  # Allow SSH & HTTP in
 5  ingress {
 6    from_port   = 22
 7    to_port     = 22
 8    protocol    = "tcp"
 9    cidr_blocks = ["0.0.0.0/0"]
10    description = "SSH in"
11  }
12
13  ingress {
14    from_port   = 80
15    to_port     = 80
16    protocol    = "tcp"
17    cidr_blocks = ["0.0.0.0/0"]
18    description = "HTTP in"
19  }
20
21  egress {
22    from_port   = 0
23    to_port     = 65535
24    protocol    = "tcp"
25    cidr_blocks = ["0.0.0.0/0"]
26  }
27
28  # Enable ICMP
29  ingress {
30    from_port = -1
31    to_port = -1
32    protocol = "icmp"
33    cidr_blocks = ["0.0.0.0/0"]
34  }
35}

Finalisation du serveur

Il nous suffit d’appliquer l’ensemble de ces sections au sein du serveur, via key_name et vpc_security_group_ids :

1resource "aws_instance" "example" {
2  ami           = "ami-acd005d5"
3  instance_type = "t2.nano"
4  key_name = "${aws_key_pair.default.id}"
5  vpc_security_group_ids = ["${aws_security_group.default.id}"]
6}

En route

Maintenant que notre configuration est prête, testons tout cela.

1terraform init

initialisation du répertoire sur la base de notre fichier .tf. Si besoin, les plugins définis vont être téléchargé en addition à votre installation terraform, ils seront installés dans le répertoire .terraform crée à ce effet.

1terraform plan

Planification de l’ensemble des changements à notre infrastructure, ici, tout est neuf, vous devriez avoir la prévision suivante :

1Plan: 3 to add, 0 to change, 0 to destroy.

Maintenant que l’on sait ce qui va se passer, passons à la vraie vie

1terraform apply

Effectue la mise en oeuvre, avec les appels de webservice vers aws, cette phase peut prendre un peu de temps, un message toutes les 10 secondes est affiché pour décrire la phase actuelle. L’ensemble des actions planifiées devraient désormais avoir été executées, la VM en marche sur aws.

Contrôle

1terraform show

Là nous allons pouvoir connaitre le statut de notre instance, son identité, son adresse IP (public_ip), une section complète pour le sécurity group appliqué.

Vous pouvez désormais utiliser votre VM, l’accès à ssh s’effectue sur le compte ec2-user, vous trouverez les informations sur votre console dans le détail de l’instance crée.

Ce statut est calculé et peut ne pas correspondre à la réalité

1terraform refresh

La commande refresh permet de resynchroniser le référentiel local avec le terrain, utile par exemple si vous avez modifié des paramètres directement dans la console aws.

Arrêt

1terraform destroy

Permet de détruire l’ensemble des composants précédemment créés, on laisse tout propre, les clés, les groupes de sécurité et les instances.

Conclusion

En quelques étapes très simples on peut se lancer dans de l’orchestration sur aws. En creusant un peu sur terraform, vous verrez que ceci est également possible sur Google Cloud, Azure ou encore sur votre cloud privé avec VmWare.

Encore beaucoup de travail pour faire des choses intéressantes, mais c’est une première brique à l’édifice.

Photo Sebastian Pichler