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