Déployer ses ressources Airbyte avec Terraform

Le 20 juin 2023, Airbyte a annoncé qu’un provider Terraform pour Airbyte était disponible.

Si vous ne connaissez pas Airbyte, pas de panique. Il s’agit d’un outil open source qui facilite grandement l’ingestion de données depuis une/plusieurs source(s) vers une/plusieurs destination(s). La force d’Airbyte ? Après avoir sélectionné vos ressources parmi un catalogue de +350 éléments, il vous suffit juste de les configurer en remplissant un formulaire. Ensuite, Airbyte s’occupe pour vous des tâches complexes liées à l’ingestion des données. Je vous conseille cet article d’Amin BAZAZ si vous voulez en savoir plus sur Airbyte : Ingestion de données dans ma plateforme : Airbyte répond présent !

Le problème principal d’Airbyte est son manque d’industrialisation. En effet, il est difficile de pouvoir apporter des modifications sur plusieurs ressources sans devoir le faire manuellement. Pour régler cela, Airbyte avait implémenté Octavia CLI qui permettait de définir des ressources Airbyte-as-Code, mais le projet était difficile à utiliser et avait ses limites. Le tout nouveau provider Terraform est là pour remplacer Octavia et mettre fin à ce souci d’industrialisation !

Pour tester ce tout nouvel outil, nous allons l’utiliser pour récupérer les messages disponibles sur un workspace Slack et les pousser dans un Bucket S3 sur AWS.

Figure 1 : Architecture mise en place

Figure 1 : Architecture mise en place

Dans cet article, nous allons voir comment créer une source (Slack), une destination (Bucket S3) ainsi qu’une connexion à l’aide du provider Airbyte de Terraform.

Pré-requis

Si vous souhaitez reproduire ce qui est fait dans l’article, vous aurez besoin d’un compte AWS, de Docker/Rancher, d’Airbyte et de Terraform. J’utilise actuellement Terraform 1.5.7 et Rancher Desktop 1.10.0 pour mettre en place cette infrastructure.

Installer Terraform et Docker/Rancher

Il vous suffit de vous rendre sur les sites officiels et de télécharger les logiciels d’installation :

Installer Airbyte

Pour installer Airbyte en local, il vous suffit de cloner le repo Github d’Airbyte et de lancer le script run-ab-platform.sh (uniquement lors de l’installation) :

# In your workstation terminal
git clone https://github.com/airbytehq/airbyte.git
cd airbyte
./run-ab-platform.sh

Par la suite, il vous suffira de lancer les images d’Airbyte à l’aide d’un simple docker-compose up (docker-compose stop pour les stopper).

Rendez-vous sur localhost:8000/ pour accéder à Airbyte. Par défaut, l’username est airbyte et le mot de passe est password. Ces paramètres peuvent être changés depuis le repo cloné.

Configuration de la source - Slack

Lors de la configuration de la source, nous allons devoir renseigner deux choses :

  • le workspace ID du client Airbyte
  • l’API Token de Slack pour récupérer les messages

N’oubliez pas de créer un fichier Terraform contenant le provider Airbyte (comme indiqué dans la documentation officielle).

Pour trouver le workspace_id, il vous suffit de regarder l’URL de votre client une fois que vous y êtes connecté :

Figure 2 : URL du client Airbyte

Figure 2 : URL du client Airbyte

Le workspace_id est la valeur qui se trouve entre les champs workspaces et connections. Dans mon cas, la valeur du workspace_id est “6b05253c-9a9f-4888-af40-efd23c66f8b0”.

Quant à l’API Token de Slack, je vous renvoie vers la documentation d’Airbyte sur la source Slack. Vous allez devoir vous rendre sur la page d’applications Slack puis créer une application. Veillez à bien fournir les autorisations indiquées dans la documentation.

Ressource Terraform et comparaison avec Airbyte

Slack est notre source de données qui contient l’ensemble des messages que nous voulons récupérer. Pour illustrer la différence entre le provider Terraform et la GUI classique d’Airbyte, vous trouverez des captures d’écran des deux éléments pour chaque étape (source, destination, connexion).

Figure 3 : Source (Slack) sur la GUI d’Airbyte

Figure 3 : Source (Slack) sur la GUI d’Airbyte

Comme sur la GUI d’Airbyte, vous devez renseigner :

  • le nom de la source
  • l’API Token (que nous avons généré plus haut)
  • la date de début de réplication

resource "airbyte_source_slack" "src_demo" {
  configuration = {
    channel_filter = [
      "support_technique",
      "dbt",
      "général",
      "events",
      "aléatoire"
    ]
    credentials = {
      source_slack_authentication_mechanism_api_token = {
        api_token    = "<token-api-à-renseigner>"
        option_title = "API Token Credentials"
      }
    }
    join_channels   = true
    lookback_window = 0
    source_type     = "slack"
    start_date      = "2023-01-01T00:00:00Z"
  }
  name         = "[Démo Article] Source de données - Slack"
  workspace_id = "<workspace-id-à-renseigner>"
}

Il est possible de choisir les canaux cibles contenant les messages à récupérer via le paramètre channel_filter (Channel name filter sur l’interface).

Attention, avec la version gratuite de Slack, vous ne pourrez récupérer que les messages qui datent de moins de 90 jours. Ainsi, la valeur attribuée à la variable start_date n’est pas prise en compte au-delà de 90 jours.

Déploiement de la source avec Terraform

Pour déployer la source avec Terraform :

terraform init
terraform plan --out plan.cache
terraform apply "plan.cache"

Figure 4: Source créée sur la GUI d’Airbyte

Figure 4: Source créée sur la GUI d’Airbyte

Et voilà ! Nous venons de créer notre première ressource avec le provider Airbyte de Terraform ! C’était facile, non ?

Passons maintenant à la ressource suivante : la destination.

Configuration de la destination - Bucket S3

Lors de la configuration de la destination, nous allons devoir renseigner trois choses :

  • le workspace ID du client Airbyte
  • une Access Key
  • une Secret Key

Nous avons déjà vu comment retrouver son workspace_id lors de la configuration de la source. En ce qui concerne les deux Keys, je vous renvoie une nouvelle fois vers la documentation d’Airbyte, sur la destination S3 cette fois-ci. Il vous faudra créer un Bucket S3 pour accueillir les messages en provenance de Slack, un utilisateur IAM ayant les droits nécessaires pour accéder au Bucket et enfin une Access Key afin qu’Airbyte puisse profiter des privilèges accordés à cet utilisateur.

Airbyte synchronise les données dans le Bucket au sein d’un sous-dossier spécifique. Veillez à bien créer ce dossier (par la suite, on nommera ce dossier csv).

Ressource Terraform et comparaison avec Airbyte

Comme pour la source, les paramètres affichées sur la GUI d’Airbyte sont les mêmes sur Terraform :

Figure 5 : Destination (Bucket S3) sur la GUI d’Airbyte

Figure 5 : Destination (Bucket S3) sur la GUI d’Airbyte

Comme sur le GUI d’Airbyte, vous devez renseigner :

  • le nom de la destination
  • le nom du Bucket S3
  • le path du Bucket S3 (“csv” si les données vont dans un dossier “csv” dans le Bucket S3)
  • la région du Bucket S3
  • le format de sortie

resource "airbyte_destination_s3" "dst_demo" {
  configuration = {
    access_key_id     = "<access-key-à-renseigner>"
    destination_type  = "s3"
    format = {
      destination_s3_output_format_csv_comma_separated_values = {
        flattening = "No flattening"
        format_type = "CSV"
      }
    }
    s3_bucket_name    = "demo-airbyte-dst"
    s3_bucket_path    = "csv"
    s3_bucket_region  = "eu-west-1"
    secret_access_key = "<secret-key-à-renseigner>"
  }
  name         = "[Démo Article] Destination - Bucket S3"
  workspace_id = "<workspace-id-à-renseigner>"
}

On renseigne également l’Access Key et la Secret Key générées précédemment afin d’accéder au Bucket S3 (qui n’est pas public par mesure de sécurité).

Déploiement de la destination avec Terraform

Pour déployer la destination avec Terraform :

terraform plan --out plan.cache
terraform apply "plan.cache"

Figure 6: Destination créée sur la GUI d’Airbyte

Figure 6: Destination créée sur la GUI d’Airbyte

Notre destination est créée ! Dernière étape : la connexion.

Configuration de la connexion

Ressource Terraform et comparaison avec Airbyte

Pour faire fonctionner la réplication des données de Slack vers S3, il est nécessaire de créer une connexion entre les deux. Contrairement à la source et à la destination, pas besoin de configuration supplémentaire !

Figure 7 : Connexion sur la GUI d’Airbyte

Figure 7 : Connexion sur la GUI d’Airbyte

Comme sur le GUI d’Airbyte, vous devez renseigner :

  • le nom de la connexion
  • le nom d’au moins un stream à synchroniser (channels_messages ici car on veut récupérer les messages contenus dans les canaux de Slack) et la méthode de synchronisation (Full refresh Overwrite ou Full refresh Append)

resource "airbyte_connection" "connection_demo_article" {
  destination_id       = airbyte_destination_s3.dst_demo.destination_id
  source_id            = airbyte_source_slack.src_demo.source_id
  name                 = "[Démo Article] Slack vers Bucket S3"
  namespace_definition = "source"
  configurations       = {
    streams = [
      {
        name = "channel_messages"
        sync_mode = "full_refresh_overwrite"
      }
    ]
  }


  schedule = {
    schedule_type = "manual"
  }
}

Il est possible de paramétrer à quelle fréquence Airbyte va récupérer les données : manuellement, CRON, toutes les X heures.

Déploiement de la connexion avec Terraform

Pour déployer la connexion avec Terraform :

terraform plan --out plan.cache
terraform apply "plan.cache"

Figure 8 : Connexion créée sur la GUI d’Airbyte

Figure 8 : Connexion créée sur la GUI d’Airbyte

Tout est prêt ! Il ne suffit plus qu’à cliquer sur le bouton “Sync Now” pour lancer la réplication des données.

Figure 9 : Messages sur le Bucket S3 suite à la synchronisation

Figure 9 : Messages sur le Bucket S3 suite à la synchronisation

Tada ! Les messages se retrouvent sur le Bucket S3 !

Comparaison avec Octavia CLI

Octavia CLI est un sous-projet open source du projet Airbyte permettant d’écrire la configuration de source, destination et connexion as code via des fichiers YAML. Pour plus de détails, je vous renvoie vers l’article de Baptiste MANSIRE à ce sujet : Décrire vos ressources Airbyte as code avec Octavia CLI

Cela permet donc de faire des choses similaires au provider Terraform. Vous pouvez donc vous demander : “En quoi cet outil est différent ?”

Similarités :

  • Manager les ressources Airbyte autrement qu’avec la GUI d’Airbyte
  • Possibilité de revenir en arrière si une configuration est mauvaise
  • Collaboration facile car configuration managée par du code
  • CI/CD applicable sur les ressources Airbyte
  • Réplication des ressources dans un autre environnement possible
  • Création d’une multitude de ressources plus simple qu’avec l’interface

Différences :

  • Possibilité de supprimer les ressources sur Terraform, pas sur Octavia
  • Possibilité d’importer des ressources déjà déployées sur l’instance Airbyte avec Octavia, pas sur Terraform
  • Configuration-as-Code sur Octavia, Infrastructure-as-Code avec Terraform

D’après Airbyte, Octavia est encore utilisable mais Terraform prendra la main d’ici la fin de l’année. Airbyte travaille actuellement sur l’import de l’ensemble des ressources de l’API et leur bon fonctionnement et espère terminer avant 2024.

Conclusion

Désormais, vous savez comment déployer vos ressources Airbyte sur Terraform !

Nous avons vu ensemble comment créer une source (Slack), une destination (Bucket S3) et un connecteur grâce au tout nouveau provider. Il vous suffit simplement de suivre la documentation pour déployer une source ou une destination différente. Les paramètres demandés pour créer une ressource sur Terraform sont les mêmes que sur la GUI d’Airbyte.

Si vous souhaitez déployer vos ressources avec du code à l’avenir, préférez cet outil plutôt qu’Octavia CLI : c’est Airbyte qui vous le dit !

Pour aller plus loin :