Chez Theodo Data & AI, nous sommes toujours confrontés à des tâches difficiles lorsque nous manipulons des données. L'une des tâches importantes qui m'a été confiée consistait à migrer des données entre des comptes AWS. L'objectif de cette mission était de dupliquer les tables DynamoDB d'un environnement de production vers un environnement de test afin d'observer le comportement de l'application avec des données réelles.
Solution AWS : Pipeline de données AWS
Une solution proposée par AWS pour migrer les données DynamoDB d'un compte à un autre est d'utiliser AWS Data Pipeline. Un guide complet existe pour réaliser cette migration. La solution consiste à créer un Data Pipeline dans le compte source qui videra les données des tables DynamoDB vers un bucket S3 dans le compte de destination et un autre Data Pipeline dans le compte de destination pour transformer les données des objets S3 en tables DynamoDB.
Qu'est-ce que AWS Data Migration Pipeline et comment fonctionne-t-il ?
AWS Data Pipeline est un service web qui configure un pipeline pour vous aider à transformer et à déplacer des données entre différents services AWS Compute et Storage. Le pipeline peut être exécuté manuellement ou automatiquement à des intervalles spécifiés.
Il se compose des éléments suivants :
- Une définition de pipeline où vous pouvez communiquer la logique métier de votre gestion de données à AWS Data Pipeline. Vous pouvez définir les noms, les formats et les emplacements de votre source de données, les activités pour la transformer, le calendrier de ces activités, les ressources qui les exécutent, les conditions préalables nécessaires pour les exécuter...
- Un pipeline qui planifie et exécute des tâches en créant des instances Amazon EC2 pour exécuter les activités de travail définies. Vous pouvez télécharger votre définition de pipeline dans le pipeline et l'activer ensuite. Pour modifier une source de données, vous devez désactiver le pipeline, effectuer la modification, puis réactiver le pipeline. Mais si vous ne devez que modifier le pipeline, vous n'avez pas besoin de le désactiver.
- Un exécutant de tâches qui prend en charge les tâches mentionnées dans la définition du pipeline et les exécute. Il est installé et s'exécute automatiquement sur les ressources créées par les définitions de pipeline. AWS Data Pipeline fournit une application d'exécution des tâches. Vous pouvez également écrire une application personnalisée.
Pour migrer les données DynamoDB entre différents comptes AWS, nous avons configuré le Data Pipeline pour utiliser un cluster EMR. Lorsqu'un Data Pipeline s'exécute, il crée quelques machines virtuelles AWS EC2 et installe un cluster Hadoop. Enfin, il exécute un script sur le cluster pour transférer les données d'une ressource AWS à une autre. Ce travail est effectué en parallèle par de nombreux collaborateurs. Il envoie finalement une notification à l'utilisateur avec le statut de l'exécution.
Retour d'expérience sur l'utilisation d'AWS Data Pipeline
La solution proposée par AWS semble assez simple et facile à utiliser. Malheureusement, elle cache de nombreuses difficultés qui rendent son adaptation à nos besoins très compliquée. En effet, non seulement il est difficile de retrouver les informations pertinentes dans la documentation, mais en plus les logs ne sont pas toujours disponibles.
Terraformer un pipeline de données ?
La terraformation du Data Pipeline était une étape nécessaire dans notre cas puisque, par principe, nous n'utilisons pas la console web pour les déploiements dans l'environnement de production. Après des heures de recherche sur Google, il était clair pour nous que la terraformation d'une définition de Data Pipeline est toujours impossible. Une ressource aws_datapipeline_pipeline a été implémentée dans le référentiel terraform mais elle ne peut décrire que le nom de la ressource et les tags optionnels qui lui sont attachés. Une étape manuelle est toujours nécessaire pour spécifier la définition du pipeline.
L'alternative consistait à créer le pipeline de données dans l'environnement de test, à vérifier qu'il fonctionnait correctement et enfin à exporter l'architecture du pipeline de données au format JSON et à l'importer dans l'environnement de production. Nous avons donc été obligés de faire des manipulations manuelles dans l'environnement de production, ce que nous ne voulions pas faire.
Système de journalisation AWS Data Pipeline
AWS permet d'enregistrer les fichiers journaux du pipeline dans un emplacement persistant et fournit un guide pour trouver ces journaux. Nous avons donc configuré la définition de notre pipeline pour créer des fichiers journaux dans un seau S3. Cela nous a beaucoup aidés à comprendre les causes de l'échec du pipeline.
Cependant, ce n'était pas toujours le cas. En effet, lorsque nous avons créé un AWS Data Pipeline dans l'environnement de test et que nous l'avons activé, le pipeline a été annulé. Nous avons essayé de comprendre le problème, mais aucun journal n'était disponible. Les fichiers journaux n'ont même pas été créés et aucune information n'a été fournie pour expliquer le problème. C'était vraiment pénible car nous ne pouvions pas comprendre la raison de l'annulation du pipeline et aucune solution proposée sur Internet n'était utile. Après de nombreuses hypothèses et tentatives, nous avons décidé de contacter l'équipe de support d'AWS qui nous a expliqué que le cluster EMR ne pouvait pas être lancé avec succès parce qu'aucun sous-réseau n'était spécifié dans le Data Pipeline.
Le dépannage en cas d'échec du pipeline a également été un point pénible. En fait, cela prend beaucoup de temps car il nous faut environ 15 minutes pour attendre que les runners commencent la sauvegarde.
Extraction de données de plusieurs tables DynamoDB
La solution proposée par AWS ne prend en charge que la migration d'une seule table. Mais créer une ressource AWS Data Pipeline par table était vraiment insensé dans notre cas puisque nous avions 14 tables DynamoDB à migrer.
Une autre alternative a finalement été trouvée qui consistait à modifier l'architecture du Data Pipeline en ajoutant une EmrActivity supplémentaire pour chaque table. Le pipeline crée ainsi un cluster EMR et lui assigne toutes les activités. Il suffit d'activer le pipeline pour que le cluster EMR exécute les 14 activités en parallèle.
Cette solution n'est pas très cool non plus puisque nous devons créer manuellement toutes les activités, leurs étapes et les sources de données qu'elles manipulent. Mais au moins, elle nous évite de créer de nombreux Data Pipelines et de les activer plusieurs fois.
Conclusion
L'utilisation d'AWS Data Pipeline pour migrer des données DynamoDB à travers des comptes AWS n'a pas été une tâche facile car elle cache de nombreuses difficultés :
L'approche est compliquée à mettre en place et n'est pas suffisamment documentée
La tâche est très lente à démarrer
Les journaux ne sont pas toujours disponibles.
Les personnes qui ont eu du mal à utiliser AWS Data Pipeline ont proposé d'autres options telles que le codage de leur propre solution à l'aide d'AWS Lambdas ou l'utilisation d'AWS glue.
Vous cherchez des experts en migration de données ? N'hésitez pas à nous contacter !