03 62 26 44 59 contact@ekit3.com

      Scaleway et Terraform

      par | Juil 22, 2024 | Tech

      Vous avez dû remarquer que le sujet de l’infrastructure as code est devenu omniprésent dans le déploiement d’infrastructures, que ce soit des ressources physiques ou déployées chez un fournisseur Cloud. Dans cet article, nous allons découvrir comment utiliser Terraform, notre outil d’infrastructure as code, pour déployer des ressources chez un fournisseur Cloud, ici Scaleway.Pour mieux appréhender cet article, il est préférable d’être déjà initié à Terraform et de manière plus générale, d’avoir une connaissance de l’infrastructure as code. Ne vous inquiétez pas, même si vous n’êtes pas familier avec ces concepts, nous allons tout de même commencer par des petits rappels, qui vous permettront de suivre le guide pas à pas.À la fin de cet article nous aurons déployé, chez Scaleway, une base de données managée et une application conteneurisée connectée à celle-là.

       

      Petits rappels

       

      Terraform

      Terraform est un outil qui va permettre de créer, mettre à jour et versionner vos infrastructures de manière sécurisée et efficiente. Une infrastructure composée de ressources Cloud, comme des bases de données, des machines virtuelles ou n’importe quel service de votre fournisseur Cloud préféré.

      Il peut aussi déployer des ressources « maison », via du développement custom, qui seront propres à vos besoins.

      Scaleway

      Contrairement aux fournisseurs Cloud les plus connus, comme GCP, AWS, ou encore Azure, Scaleway est un fournisseur de services Cloud estampillé Cloud français.

      Il va fournir des services que vous pouvez retrouver chez d’autres fournisseurs, comme la création de machines virtuelles, du Kubernetes, du serverless, des bases de données managées, etc.

       

      Guide pas à pas

       

      L’ensemble des actions sera réalisé sur Ubuntu22.04.2LTS.

      Setup Terraform

       

      Nous allons tout d’abord installer Terraform :

      sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
      
      wget -O- https://apt.releases.hashicorp.com/gpg | \
      gpg --dearmor | \
      sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
      
      gpg --no-default-keyring \
      --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \
      --fingerprint
      
      echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
      https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
      sudo tee /etc/apt/sources.list.d/hashicorp.list
      
      sudo apt update && apt-get install terraform

      Vous pouvez retrouver toutes les instructions dans le lien en bas de l’article.

       

      Provider Scaleway

      Terraform utilise des composants appelés des « providers », qu’on pourrait apparenter à des librairies dans le monde du développement.

      Ces providers vont vous permettre d’interagir facilement avec les ressources que vous voulez maintenir. Il existe énormément de providers officiels pour des solutions connues, par exemple pour GCP, Github, Datadog et j’en passe.

      Pour en revenir à l’utilisation de Terraform pour des ressources custom, nous ne sommes pas limités à l’utilisation des providers officiels. N’importe qui peut développer son provider custom pour répondre à ses propres besoins.

      Ici nous allons nous intéresser exclusivement au provider officiel Scaleway. Vous pouvez aller sur la Terraform Registry pour avoir un détail complet de son utilisation.

       

      La pratique

      La première étape est de configurer le provider Scaleway. Les providers Terraform ont des paramètres obligatoires, et d’autres qui ne le sont pas. Dans le cas de ce provider, les paramètres obligatoires correspondent à vos informations d’identification Scaleway. Vous allez avoir besoin de ces informations :

      Votre organisation id, que vous pouvez retrouver dans l’interface Scaleway.

      Le project id dans lequel vous voulez créer vos ressources.
      Et enfin, une clé d’API Scaleway composée d’une access key et d’une secret key. 
      Maintenant que vous avez ces informations, nous pouvons commencer à écrire nos fichiers Terraform.
      Il y a trois façons de déclarer ces paramètres:
      • soit en dur dans le fichier
      • soit définis par des variables Terraform que vous passerez au moment de l’exécution
      • la plus sécurisée via des variables d’environnement. 

      Avec les variables terraform:

      // Préférez utiliser la var. d’env. SCW_ACCESS_KEY
      variable "access_key" {
        type = string
        description = "Notre identifiant de clé d'API"
      }
      
      // Preferez utiliser la var d'env SCW_SECRET_KEY
      variable "secret_key" {
        type = string
        description = "Notre clé d'API"
      }
      
      // Préférez utiliser la var. d’env. SCW_DEFAULT_PROJECT_ID
      // Pour trouver votre project_id rendez vous sur le dashboard de votre projet
      variable "project_id" {
        type = string
        description = "Notre id de projet"
      }
      
      // Préférez utiliser la var. d’env. SCW_DEFAULT_PROJECT_ID.
      // Pour trouver votre organization_id rendez-vous sur le dashboard de votre organisation
      variable "organization_id" {
        type = string
        description = "Notre id d'organisation"
      }
      
      terraform {
        required_providers {
          scaleway = {
            source = "scaleway/scaleway"
          }
        }
      required_version = ">= 0.13"
      }
      // Preferez utiliser les variables d'environnement pour plus de sécurité
      // remplacer le provider par provisioner "scaleway" {}
      
      provider "scaleway" {
        access_key = var.access_key
        secret_key = var.secret_key
        project_id = var.project_id
        organization_id = var.organization_id
        region = var.region
        zone = var.zone
      }

       

      Avec les variables d’environnement:
      export SCW_ACCESS_KEY="xxx"
      export SCW_SECRET_KEY="xxx"
      export SCW_DEFAULT_PROJECT_ID="xxx"
      export SCW_DEFAULT_ORGANIZATION_ID="xxx"
      terraform {
        required_providers {
          scaleway = {
            source = "scaleway/scaleway"
          }
        }
        required_version = ">= 0.13"
      }
      provider "scaleway" {}

      Le provider permet également de configurer des paramètres qui vont être réutilisés pour les autres ressources, par exemple la région et la zone dans lesquelles nous allons les déployer. 

      Ici j’ai choisi de passer par des variables avec des valeurs par défaut, qui vont me permettre de surcharger ces paramètres à ma convenance. Nous pouvons imaginer lancer deux déploiements en parallèle : l’un sur fr-par et l’autre vers nl-ams. variable « region » {

      Maintenant que nous avons configuré notre provider, nous allons nous amuser à déployer un petit conteneur WordPress, et pour cela nous allons commencer par créer notre base de données  !

      variable "region" { 
        type = string 
        description = "La région dans laquelle nous allons créer nos ressources"  
        default = "fr-par" 
      } 
      
      variable "zone" { 
        type = string description = "La zone de la région dans laquelle nous allons créer nos ressources" default = "fr-par-1" 
      } 
      
      terraform { 
        required_providers { 
          scaleway = { 
            source = "scaleway/scaleway" 
          } 
        } 
        required_version = ">= 0.13" 
      } 
      
      provider "scaleway" { 
        region = var.region 
        zone = var.zone 
      }

       

      Managed Datadase

      Nous allons commencer par créer un fichier dédié à cette ressource, disons mysql.tf.

      D’abord nous allons créer quelques variables qui vont nous être utiles, comme le nom de la base de données et notre nom d’utilisateur pour celle-là.

      Nous allons utiliser une ressource bien utile de Terraform pour générer un mot de passe complexe pour notre utilisateur de base de données. Nous nous assurons au passage de respecter les conditions imposées par Scaleway quant à la politique de mot de passe.

      Ensuite nous allons créer notre instance de serveur de base de données. Les paramètres utilisés ici correspondent, bien sûr, à des exemples pour un environnement de développement.

      variable "wp_username" {
        type        = string
        default     = "wp-admin"
      }
      
      
      variable "wp_db_name" {
        type        = string
        default     = "wordpress"
      }
      
      resource "random_password" "wp_sql_pwd_db" {
        length  = 16
        special = true
        min_lower = 1
        min_numeric = 1
        min_special = 1
        min_upper = 1
      }
      
      resource "scaleway_rdb_instance" "wp_sql" {
        name           = "wp-mysql"
        node_type      = "DB-DEV-S"
        engine         = "MySQL-8"
        is_ha_cluster  = true
        disable_backup = true
        user_name      = var.wp_username
        password       = random_password.wp_sql_pwd_db.result
      }

      Comme vous le voyez, il ne faut pas énormément de lignes pour créer une nouvelle instance. Cette instance sera automatiquement déployée sur fr-par-1 grâce à la configuration appliquée sur le provider dans le main.tf. 

      Il ne nous reste plus qu’à créer notre base de données ! Ajoutons quelques lignes. 

      variable "wp_username" {
        type        = string
        default     = "wp-admin"
      }
      
      variable "wp_db_name" {
        type        = string
        default     = "wordpress"
      }
      
      resource "random_password" "wp_sql_pwd_db" {
        length  = 16
        special = true
        min_lower = 1
        min_numeric = 1
        min_special = 1
        min_upper = 1
      }
      
      resource "scaleway_rdb_instance" "wp_sql" {
        name           = "wp-mysql"
        node_type      = "DB-DEV-S"
        engine         = "MySQL-8"
        is_ha_cluster  = true
        disable_backup = true
        user_name      = var.wp_username
        password       = random_password.wp_sql_pwd_db.result
      }
      
      resource "scaleway_rdb_database" "wp_sql_db" {
        instance_id    = scaleway_rdb_instance.wp_sql.id
        name           = var.wp_db_name
      }

      Nous n’avons qu’à récupérer l’id de notre instance fraîchement créée et lui donner le nom que nous souhaitons.
      Et voilà ! Nous avons écrit le code représentant notre serveur de base de données.
      Passons maintenant à notre WordPress.

       

      Serverless Container

      Scaleway propose différentes solutions pour déployer nos applications, du Kubernetes, des serverless functions et containers ou encore des machines virtuelles. Ici nous allons utiliser les serverless containers. Nous allons avoir besoin uniquement de deux ressources : un namespace dans lequel nous allons déployer notre 2e ressource, notre conteneur. Ajoutons un nouveau fichier, wordpress.tf :

      variable "container_name" {
        type        = string
        default     = "wordpress-example"
      }
      
      resource "scaleway_container_namespace" "wp_namespace" {
        name        = "wp-namespace"
        description = "namespace dédié au conteneur wordpress-example"
      }
      
      resource "scaleway_container" "wp_container" {
          name = var.container_name
          description = "wordpress container"
          namespace_id = scaleway_container_namespace.wp_namespace.id
          registry_image = "bitnami/wordpress:latest"
          port = 3000
          cpu_limit = 1120
          memory_limit = 2048
          min_scale = 1
          max_scale = 2
          timeout = 600
          max_concurrency = 10
          protocol = "h2c"
          deploy = true
      
          environment_variables = {
              "WORDPRESS_DEBUG" = "1" 
          }
          secret_environment_variables = {
            "WORDPRESS_DATABASE_HOST" = scaleway_rdb_instance.wp_sql.endpoint_ip
            "WORDPRESS_DATABASE_PORT_NUMBER" = scaleway_rdb_instance.wp_sql.endpoint_port
            "WORDPRESS_DATABASE_NAME" = var.wp_db_name
            "WORDPRESS_DATABASE_USER" = var.wp_username
            "WORDPRESS_DATABASE_PASSWORD" = random_password.wp_sql_pwd_db.result
          }
          depends_on = [
            scaleway_rdb_instance.wp_sql,
            random_password.wp_sql_pwd_db
          ]
      }

      Le provider Scaleway facilite la configuration de ce conteneur. Vous retrouvez ici tous les paramètres existants. Nous pouvons retrouver des classiques comme, bien sûr, l’image de notre conteneur, les ressources allouées, le scaling, etc. 

      Mais un paramètre a attiré mon attention, le « secret_environment_variables ». Celui-ci nous permet de passer facilement des secrets qui seront chargés en variables, ce qui est très utile niveau sécurité ! 

       

      A l’action !

       

      Nous y voilà, nous avons terminé de décrire notre infrastructure, il ne nous reste plus qu’à la créer !
      Je vais créer un fichier de variables, uncommited.tfvars.

      wp_username = "test"
      wp_db_name = "dbtest"
      access_key = "xxx"
      secret_key = "xxx"
      project_id = "xxx"
      organization_id = "xxx"

      Il ne nous reste plus qu’à appliquer nos fichiers Terraform
      Après avoir accepté le plan de Terraform, il ne vous reste plus qu’à patienter et regarder vos ressources se créer. 

      Le mot de la fin

      Nous y voilà, en quelques minutes nous avons pu déployer notre infrastructure et notre application.
      Le provider Terraform Scaleway est de mon point de vue efficace, très bien documenté et donc facile à prendre en main.
      Je n’ai pas trouvé plus difficile d’utiliser ce provider comparé à ses concurrents, même si l’interface des logs pour les serverless containers n’est pas des plus efficaces.

      Auteur

      En savoir plus sur EKITE

      Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

      Poursuivre la lecture