Fermer

décembre 15, 2018

Maintenir votre calendrier de vacances en téléchargeant des données en bloc


Nous avons déjà examiné, à les étapes nécessaires à la création d’un calendrier de vacances dans DynamoDB. L'un des avantages de garder toutes vos heures de fermeture suivies dans une base de données est que vous pouvez facilement mettre à jour le moment où le centre d'appels devrait être disponible, modifier les raisons de la fermeture ou ajouter de nouvelles vacances avec un minimum d'effort et aucune modification du code. Toutefois, en raison de la structure de DynamoDB, le chargement simultané de nombreux éléments peut s'avérer fastidieux. Voici, par exemple, les étapes nécessaires pour effectuer un téléchargement par lot à l'aide de l'AWS CLI.

Pour résoudre ce problème et faciliter l'automatisation de la maintenance de votre calendrier de vacances, nous vous expliquerons quelques fonctions lambda qui peut télécharger en bloc des données de S3. Il s’agit d’un article en deux parties, consacré au téléchargement d’un fichier JSON spécifique au calendrier des vacances, tandis que la deuxième partie traite de l’envoi d’un fichier CSV plus générique.

1.Prerequisites

code lui-même, il y a quelques éléments à configurer. Vous aurez besoin d'une table DynamoDB pour écrire les dates, d'un compartiment S3 pour stocker l'entrée de données et d'un rôle Lambda pouvant interagir avec les deux.

Commencez par créer une table DynamoDB et un compartiment S3. Assurez-vous qu'ils se trouveront dans la même région que la fonction Lambda et nommez-les comme il convient pour votre environnement. Assurez-vous également que la clé primaire de la table DynamoDB est un nombre. Pour faciliter les choses plus tard, nommez la clé primaire dateStart ou veillez à mettre à jour le code ci-dessous de manière appropriée.

Une fois vos ressources créées, accédez à IAM et configurez un rôle pour Lambda. Afin de pouvoir mettre à jour une fonction dans votre table DynamoDB, Lambda doit disposer des autorisations «dynamodb: PutItem» pour DynamoDB et «s3: Get *», des autorisations d'action «s3: List *» pour le compartiment S3 que nous utiliserons pour télécharger nos fichiers. Je recommande de créer deux stratégies distinctes et de n'accorder que l'accès à la ressource pertinente.

Par exemple, dans mon environnement pour le rôle utilisé par Lambda, j'ai une stratégie «DynamoDBPutAccess» qui ressemble à ceci:

 {
    "Version": "2012-10-17",
    "Déclaration": [
        {
            "Action": [
                "dynamodb:PutItem"
            ],
            "Ressource": [
                "arn:aws:dynamodb:us-east-1:553456133668:table/DYANMODBTABLENAME"
            ],
            "Effet": "Autoriser"
        }
    ]
} 

En plus d'une stratégie “S3ReadAccess” qui ressemble à ceci:

 {
    "Version": "2012-10-17",
    "Déclaration": [
        {
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Ressource": "arn: aws: s3 ::: UPLOADBUCKET / *",
            "Effet": "Autoriser"
        }
    ]
} 

Comme toujours lorsque vous travaillez avec Lambda, il est également logique d'accorder à votre rôle une stratégie lui permettant d'interagir avec CloudWatch et d'écrire des journaux.

Une fois que vous avez votre rôle Lambda, il est temps de décider du type de données à utiliser.

2.Télécharger un fichier JSON de S3

Le moyen le plus simple de télécharger des données dans notre calendrier de vacances est d’utiliser un fichier JSON comme point de départ, cela nécessitera un minimum de conversion et nous pourrons utiliser les fonctions JSON intégrées.

Commencez par déclarer les ressources que nous allons utiliser et chargez dans deux variables d'environnement “bucketName” et “fileName”. Celles-ci seront la source de notre fichier de vacances (n'oubliez pas de créer également ces deux variables dans votre environnement. Vous pouvez également décider de rendre le chemin plus difficile. N'oubliez pas que la manière dont les variables sont utilisées dans le code ci-dessous est parfois inutilement verbeuse. dans l’espoir de le rendre plus facile à suivre).

 const AWS = require ('aws-sdk');
   const s3 = new AWS.S3 ();
   const docClient = new AWS.DynamoDB.DocumentClient ({région: 'us-east-1'});

    exports.handler = (événement, contexte, rappel) => {
            const bucketName = process.env.bucketName;
            const keyName = process.env.fileName;
        
            readFile (bucketName, keyName, readFileContent);
    }; 

Après avoir déclaré toutes nos variables, nous appelons une fonction readFile qui inclut notre compartiment, notre nom de fichier et une fonction à appeler si nous trouvons des données.

 function readFile (bucketName, fileName, onFileContent) {
            const params = {Bucket: bucketName, clé: nom_fichier};
            s3.getObject (params, function (err, data) {
                si (! err)
                    onFileContent (filename, data.Body.toString ());
                autre
                    console.error ("Impossible de trouver un objet de données. Erreur JSON:", JSON.stringify (err, null, 2));
            });
        }

Nous pouvons simplement utiliser la méthode s3 getObject pour extraire des données, consigner toute erreur rencontrée ou envoyer les données que nous avons collectées à partir de fileName à notre fonction readFileContent.

 function readFileContent (nomfichier, contenu ) {
           let jsonContent = JSON.parse (contenu);
           pour (laissez-moi dans jsonContent) {
               let holidayStart = jsonContent [i]['holidayStart'];
               let holidayEnd = jsonContent [i]['holidayEnd'];
               let dateStart = new Date (holidayStart) .getTime ();
               let dateEnd = new Date (holidayEnd) .getTime ();
               let reason = jsonContent [i]['reason']
               
                let params = {
                    TableName: process.env.tableName,
                    Article:{
                       "dateStart": dateStart,
                       "dateEnd": dateEnd,
                       "raison": raison,
                       "holidayStart": holidayStart,
                       "vacancesFin": vacancesFin
                    }
                };
              addData (params);
           }
        }

C'est ici que les données de notre fichier JSON sont réellement analysées et associées aux bons attributs dans DynamoDB. Nous supposons que la table DynamoDB que vous avez créée a dateStart comme clé primaire et que le fichier JSON que vous utiliserez a le format suivant:

 "holiday1": {
               "holidayStart": "10 août 2018 00:00 GMT + 09: 00",
               "holidayEnd": "10 août 2018 23:59:00 GMT + 09: 00",
               "raison": "vacances test"
  },
"holiday2": {...},
"holiday3": {...} 

Comme vous pouvez le constater, notre fonction transforme la date de holidayStart en un horodatage d'époque et l'écrit dans le dateStart, mais télécharge également la chaîne de date afin que vous puissiez facilement identifier les dates déjà entrées. . Enfin, nous indiquerons également une raison qu'Amazon Connect peut utiliser pour informer de manière dynamique le demandeur de la fermeture du centre d'appels.

Un autre élément à noter dans la variable params que nous construisons est que nous indiquons à notre fonction la table à mettre à jour. Assurez-vous que vous ajoutez une variable d'environnement nommée nomTable et entrez le nom de votre table DynamoDB.

Maintenant que les données ont été collectées et analysées dans le bon format et que nous savons où elles ont besoin pour vivre, nous devons simplement les ajouter. la table DynamoDB. Pour ce faire, nous invoquerons la fonction addData après avoir lu chaque élément du fichier JSON. Cette fonction utilisera le client DynamoDB pour insérer un élément dans notre base de données ou consigner plus de détails en cas d'erreur.

 fonction addData (params) {
            docClient.put (paramètres, fonction (err, données) {
            si (err) {
                console.error ("Impossible d'ajouter un élément. Erreur JSON:", JSON.stringify (err, null, 2));
            } autre {
                console.log ("Article ajouté:", JSON.stringify (params.Item, null, 2));
                }
            });
        } 

Cela devrait être tout le code nécessaire. Assurez-vous de créer les 3 variables ci-dessous et de les orienter vers les bonnes ressources et vous devriez être prêt à télécharger votre fichier JSON dans S3. chaque fois qu'un objet est créé et invoque cette fonction, vous pouvez également l'exécuter manuellement avec un événement JSON vide et votre table doit être remplie.

L'utilisation d'un JSON n'est peut-être pas le moyen le plus pratique de saisir des données de vacances. Dans le prochain article de blog, nous examinerons le téléchargement de données à partir d'un fichier CSV. Nous allons utiliser les concepts de base détaillés ici, mais nous devrons analyser CSV dans un format compatible avec NodeJS.

Demandez une démonstration Amazon Connect






Source link