Chargement de données dans AWS Elasticsearch avec DynamoDB Streams et Lambda

Elasticsearch est une solution open source de recherche et d’analyse distribuée RESTful qui est actuellement largement utilisée par de nombreuses entreprises dans le monde. Il s’agit d’un moteur de recherche basé sur la bibliothèque Apache Lucene. Elasticsearch est largement utilisé dans l’analyse de texte, l’analyse de journaux, la recherche textuelle et de nombreux autres cas d’utilisation.
Amazon Elasticsearch est un service entièrement géré qui nous permet de déployer, de sécuriser et d’exécuter facilement Elasticsearch. Le service prend en charge les API Elasticsearch open source, Kibana intégration avec Logstachet d’autres services AWS. Dans cet article, je vais parler de la façon dont nous pouvons charger des données de streaming dans le service AWS Elasticsearch à l’aide des flux AWD DynamoDB et AWS Lambda. Ainsi, dans notre scénario, lorsqu’une application Web ou un service Web ajoute des données à notre base de données dynamoDB, cela déclenchera une fonction AWS Lambda qui insérera automatiquement ces données dans notre service Elasticsearch que nous pouvons utiliser dans notre cas d’utilisation.
Je suppose que pour ce post, vous avez une idée de base sur ce qu’est Elasticsearch, dynamoDB et Lambda. Par conséquent, dans ce post, je ne vais pas discuter en détail de ce que fait Elasticsearch, dynamoDB et Lambda. Ok, assez d’explications, passons directement à l’implémentation.
Création d’une instance AWS Elasticsearch
Créons d’abord notre instance Elasticsearch sur notre AWS. Recherchez le service Elasticsearch à partir des services et accédez au tableau de bord pour créer le service Elasticsearch. Si c’est la première fois que vous créez un service elasticsearch, vous serez accueilli par l’écran suivant. Cliquez sur Créer un nouveau domaine pour commencer à créer notre nouveau domaine elasticsearch.
Nous allons créer notre domaine uniquement à des fins d’apprentissage, de sorte que les configurations que nous sélectionnerons pour notre domaine ne sont applicables qu’à des fins d’apprentissage. Pour la production, vous devez suivre la configuration correcte. Puisque nous utilisons ce domaine uniquement pour l’apprentissage, sélectionnez Type de déploiement comme développement et test et cliquez sur suivant.
Sur l’écran suivant, nous devons fournir un nom de domaine. Après cela, sélectionnez le type d’instance en tant que t2.small.elasticsearch car il s’agit du seul type d’instance disponible pour le niveau gratuit. Vous pouvez laisser toutes les autres options comme valeurs par défaut sans aucune modification.
Sur l’écran suivant, il nous sera demandé de configurer la sécurité de notre domaine elasticsearch. Il est recommandé d’utiliser l’accès VPC où notre domaine sera dans un réseau privé avec uniquement des instances de notre réseau VPC qui auront accès. Mais dans notre cas, faites-en un accès public.
Ci-dessous sur la même page, vous verrez où nous mettons en place une politique d’accès pour notre domaine. Étant donné que ce n’est que pour l’apprentissage ajouter Autoriser l’accès ouvert au domaine ce qui rendra accessible toute adresse IP. Ici, nous pouvons également spécifier un rôle IAM ou des comptes d’utilisateurs AWS spécifiques.
Maintenant, c’est tout pour créer notre domaine de test elasticsearch. Après quelques minutes, notre domaine elasticsearch sera opérationnel. La création de notre service Elasticsearch se fait donc maintenant.
Création d’une table DynamoDB et de flux DynamoDB
Dans notre article comme mentionné précédemment, nous allons utiliser les flux de données DynamoDB pour notre domaine elasticsearch pour effectuer des analyses. Pour envoyer nos données de table dynamoDB sous forme de flux à elasticsearch, nous allons utiliser la fonction AWS Lambda. Ainsi, lorsqu’un nouvel élément de données arrive dans la table de base de données déclenche une notification d’événement à Lambda, qui exécute ensuite notre code personnalisé pour effectuer l’indexation et l’ajout d’élément dans elasticsearch.
Créons d’abord notre table DynamoDB. Accédez au tableau de bord DynamoDB et créez un nouveau tableau. Assurez-vous de créer la table dynamoDB dans le même région où notre domaine elasticsearch est également créé.
Afin de diffuser nos données dynamoDB vers elasticsearch, nous devons activer le flux sur notre table dynamoDB. Pour ce faire, accédez à l’onglet de présentation de notre tableau et cliquez sur Gérer le flux. Assurez-vous de sélectionner Type de vue comme Nouvelle image et Activer.
Création d’une fonction Lambda
Avant de créer notre fonction Lambda, nous devons créer un rôle IAM qui sera affecté à notre fonction lambda. Pour créer un nouveau rôle IAM, accédez au tableau de bord IAM et cliquez sur Créer un rôle. Après cela, pour le type, sélectionnez Lambda.
Ensuite, il nous sera demandé quel type d’autorisations nous allons attribuer à ce rôle. Cliquez sur créer une politique pour créer une politique personnalisée pour notre rôle qui vous redirigera vers une page de création de politique. Là, sélectionnez JSON et collez les autorisations ci-dessous.
La politique ci-dessus autorisera les demandes Elasticsearch POST et PUT, obtiendra et traitera les flux DynamoDB et créera des flux de journaux sur AWS Cloudwatch.
Après cela, il nous sera demandé de donner un nom à la politique. Ensuite, nous pouvons cliquer sur créer une politique. Revenons maintenant à la page précédente pour le nouveau rôle IAM où la stratégie nous a été demandée. Assurez-vous d’actualiser le tableau des stratégies et sélectionnez la stratégie que nous avons créée.
Enfin, après cela, nous pouvons ajouter des balises, donner un nom à notre rôle et créer notre rôle pour notre fonction lambda.
Nous avons une tâche de plus pour créer un rôle, qui est d’ajouter une relation de confiance pour notre rôle. Pour cela, accédez à l’onglet des relations d’approbation et ajoutez la relation d’approbation JSON suivante si elle n’y est pas déjà.
Maintenant, dans notre code lambda, nous allons faire des requêtes PUT. Pour cela je vais utiliser axios pour faire des requêtes HTTP. Il existe deux façons dans AWS Lambda où nous pouvons obtenir des dépendances externes. La première consiste à créer du code localement avec des dépendances et à compresser le fichier, puis à le télécharger sur AWS Lambda. La deuxième option consiste à créer une couche AWS dans lambda et à utiliser cette couche sur notre fonction. Je préfère les couches car nous pouvons réutiliser la même dépendance dans de nombreuses fonctions lambda.
Création d’une couche lambda
Créez un nouveau dossier dans votre système nommé nodejs. Assurez-vous d’utiliser le nom comme nodejs car c’est une exigence lors de l’ajout de couches. Dans ce dossier nodejs, émettez les commandes suivantes.
Cela initialisera un fichier package.json et installera NOTRE dépendance axios. Maintenant, il devrait y avoir un dossier nommé node_modules dans notre dossier nodejs. Maintenant, compressons notre dossier nodejs et allons dans le tableau de bord AWS Lambda et cliquez sur Couches. Là, cliquez sur ajouter un nouveau calque.
Donnez ici un nom à notre couche et téléchargez le fichier zip que nous avons créé. Après cela, sélectionnez le runtime comme Node.js 12.x. Voilà, maintenant notre couche est disponible pour une utilisation dans nos fonctions lambda.
Créons ensuite notre fonction Lambda. Allez pour créer une nouvelle fonction et sélectionnez Utilisez un plan. Là, sélectionnez dynamodb-process-stream comme notre plan.
Après cela, donnez un nom à votre fonction et sélectionnez notre rôle IAM déjà créé pour cette fonction comme rôle d’exécution.
Ensuite, pour le déclencheur dynamodb, sélectionnez notre table. Définir la position de départ comme horizon de coupe.
Maintenant, notre fonction est générée. La première chose à faire est d’ajouter le calque à notre fonction que nous avons ajoutée plus tôt. Cliquez sur Calques puis sur ajouter un calque.
Ok, maintenant notre environnement runtime node.js aura déjà une dépendance axios ajoutée. Créons ensuite notre fonction.
Dans la fonction ci-dessus, le flux dynamoDB nous donne l’événement de flux où il nous fournira une liste des enregistrements de flux. Nous allons parcourir tous ces enregistrements et vérifier le nom de l’événement. Si le nom de l’événement est RETIRER ce qui signifie que l’élément est supprimé de la table dynamoDB, nous supprimerons également cet élément de notre elasticsearch. Sinon, nous ajouterons cet article à notre recherche sur les élastiques. Notez que nous avons créé notre nom d’index comme films et tapez comme film. Plus sur ce qu’est l’index et quel est le type sera discuté dans le prochain post où je parlerai plus sur les fonctionnalités d’Elasticsearch.
Maintenant, notre fonction lambda est prête à être déployée. Assurez-vous d’enregistrer la fonction et accédez à la table dynamoDB pour tester l’ensemble de notre processus de streaming. Créez un nouvel élément dans le tableau et ajoutez la réponse suivante que j’ai obtenue de l’API OMDB.
Maintenant, lorsque nous ajoutons l’élément à notre table, la fonction lambda doit être déclenchée et doit ajouter cet enregistrement à notre recherche élastique. Nous pouvons confirmer si notre article est ajouté à elasticsearch de plusieurs manières.
La première consiste à accéder à notre tableau de bord elasticsearch et à l’onglet Indices. Là, de nouveaux indices devraient maintenant être créés sous forme de films et de mappages comme propriétés d’élément.
Sinon, nous pouvons interroger notre instance elasticsearch en émettant une demande GET ci-dessous.
Cela devrait donner le document inséré comme réponse. C’est tout pour charger des données dans le service AWS Elasticsearch à l’aide des flux DynamoDB et AWS Lambda. Dans le prochain article, parlons davantage des fonctionnalités d’Elasticsearch et de l’implémentation complète d’un service Web utilisant Node.js qui utilisera notre service Elasticsearch. Je vous remercie.