1

Bicep vs Terraform

Quelle solution IaC pour Azure ?

No notes for this slide

2

Agenda

Introduction rapide

Première grosse différence

Seconde grosse différence

Conclusion

No notes for this slide

3
Allô
Xavier Mignot
Consultant Cloud & DevOps
Edgenda
Québec

No notes for this slide

4

Introduction

No notes for this slide

5

Introduction

De quoi parle-t-on au juste ?

Deux outils d’Infrastructure-as-Code:

  • Bicep , un DSL open-source par Microsoft
  • Terraform , un outil qui a 2 versions
    • La version originale d’HashiCorp en BSL
    • Le fork OpenTofu open-source propulsé par la Fondation Linux

Avec plusieurs points communs

  • Mode déclaratif (vs impératif)
  • Un workflow similaire: validate, plan/what-if, apply
  • Deux syntaxes qui se ressemblent
9
0
1
2
3
4
5
6
7
8
9

No notes for this slide

6

Un exemple de code tout simple

Avec Bicep

var myProject = 'my-project'
resource rg 'Microsoft.Resources/resourceGroups@2023-07-01' = {
  name: 'rg-${myProject}'
  location: 'canadaeast'
}
output rgName string = rg.name

Avec Terraform

locals {  my_project = "my-project" }
resource "azurerm_resource_group" "rg" {
  name     = "rg-${local.my_project}"
  location = "canadaeast"
}
output "rg_name" { value = azurerm_resource_group.rg.name }
5
0
1
2
3
4
5

No notes for this slide

7

Ce n’est pas juste une question de multi-cloud

No notes for this slide

8

Première différence

Le mode d’exécution

(Qu’est-ce qui se passe lorsque chaque outil tourne ?)

1
0
1

No notes for this slide

9

On commence par une démo !

  1. Organisation du repo
  2. Lancement en Bicep (avec un déploiement et un scope)
az deployment sub create -n deploy-tf-vs-bicep -l canadaeast -f main.bicep -p location=canadaeast
  1. Petit parcours du code Bicep, et montrer le déploiement dans le portail (avec le template ARM)
  2. Lancement avec Terraform (pas de fichier ni de scope à préciser, ni de déploiement)
  3. Petit parcours du code
  4. Explication de la différence de comportement
  • Côté Bicep, un seul appel d'API et tout se passe dans Azure
  • Côté Terraform, de multiples appels
10

No notes for this slide

11

No notes for this slide

12

Qu’est-ce que ça change ?

Interaction avec d’autres outils, APIs, ou clouds

Bicep est "limité" à l’API Azure Resource Manager

L’organisation du code n’est pas la même

Tout doit être "calculé" au début du déploiement

Limitation sur les fichiers

Et sur les boucles

6
0
1
2
3
4
5
6

Limitation à l'API Resource Manager

  • Impossible de créer des blobs
  • Impossible de créer des objets dans Azure Ad (App Registrations, groupes, etc.)
  • Montrer le deployment script

Organisation du code

  • En Bicep, 1 fichier = 1 déploiement

S'il y a du temps, montrer le module isEven (Bicep en priorité)

  • Dé-commenter le code dans resources.bicep
  • Transformer la variable en output Expliquer la différence sur les fichiers (non variablilisés en Bicep)
13

Seconde différence

State ou pas de state ?

1
0
1

No notes for this slide

14

Qu’est-ce que le state ?

Un aspect spécifique à

Un fichier JSON avec toute notre infra

En local par défaut

… mais il faut le mutualiser

… et le sécuriser

A quoi sert le state ?

A éviter les collisions

Lier la configuration à l’infrastructure

Stocker des meta-data comme les dépendances…

…et d’autres trucs qui ne sont pas des ressources

10
0
1
2
3
4
5
6
7
8
9
10

No notes for this slide

15

On retourne dans le portail !

Tests à faire

  • Dé-commenter le "some-container" et re-déployer
    • Re-commenter le "some-container" et déployer à nouveau
  • Changer le nom logique d'une ressource (le rg)
    • What-if en Bicep: pas de changement
    • Apply en tf: suppression du rg (il faut utiliser le bloc moved)
  • Créer un container "test" à la main et faire un apply en tf
    • Importer le container avec tf import 'module.static_website.azurerm_storage_container.test' et l'id dans l'erreur
  • Tout renommer
    • Terraform: tf apply -var project=nouveau-nom (il supprime et re-créé tout)
    • Bicep: changer la variable project dans le main.bicep (il duplique à côté)
  • Tout déployer dans Canada Central
    • Terraform: tf apply -var location=canadacentral (propose de tout recréer)
    • Bicep az deployment sub create -n deploy-tf-vs-bicep -l canadaeast -f main.bicep -p location=canadacentral (renvoie une erreur)
16

No notes for this slide

17

Et là, qu’est-ce que ça change ?

Possibilité de supprimer des ressources

Attention aux changements hors IaC

qui ne viennent par forcément du portail

Moins facile de faire du refactoring

On peut y stocker autre chose que des ressources Azure

5
0
1
2
3
4
5

Changements hors IaC

  • Exemple des App Services avec le certificat dans le KV
18

D’autres différences ?

No notes for this slide

19

Quelques petits "détails"

Qui ne doivent pas guider votre choix

Fonctionnalités de chaque langage (boucles, fonctions, etc.)

Intégration dans Visual Studio Code

Eco-système: linters, etc.

3
0
1
2
3

No notes for this slide

20

Quelques vérités pas toujours vraies

Tout est possible dans Azure avec Bicep dès le premier jour

Seul Bicep est supporté par Microsoft

2
0
1
2

Montrer le static website avec un deployment script en Bicep Toute nouvelle feature doit être dans le provider AzureRm pour passer en GA

21

Conclusion

Il va falloir faire un choix maintenant

No notes for this slide

22

S’il fallait en choisir un

Je choisirais Terraform/OpenTofu en premier…

…s’il y a une vraie volonté de faire de l’IaC

Pas de changement dans le portail

Adopté par plusieurs personnes

4
0
1
2
3
4

No notes for this slide

23

Faites du Bicep si…

Vous faites encore des templates ARM

Pour remplacer certains scripts PowerShell/Azure CLI

Pour les problèmes de type

Bicep va continuer d’évoluer

Deployment stacks

Extensibilité

6
0
1
2
3
4
5
6

No notes for this slide

24

Derniers conseils avant la fin

Quelque soit la solution utilisée

Découpez/modulez votre code

Exécutez le (souvent)

La sandbox est votre amie

Le GitOps votre chemin

Votre objectif: avoir confiance

Cf ce talk (en anglais) sur le test de code IaC

7
0
1
2
3
4
5
6
7

No notes for this slide

25

No notes for this slide

25 slides · 83 clicks · 0 words