0
votes

AWS- Les données ne sont pas enregistrées dans DynamoDB à partir de Lambda

Ma tâche consiste à ajouter de nouveaux utilisateurs Cognito à DynamoDB à l'aide de Lambda. J'ai reçu un pool d'utilisateurs AWS Cognito existant. Jusqu'à présent, j'ai écrit une fonction lambda et l'ai testée avec des données de démonstration afin qu'elle puisse enregistrer les données dans DynamoDB. Mais lors du test, il n'enregistre pas mes données dans la base de données. À titre indicatif, j'ai suivi cet article . Dans l'article, il est dit que lors du test, ma table DynamoDB doit être remplie.

Ma fonction lambda ressemble à ceci:

{
  "userName": "Proteeti Prova",
  "request": {
    "userAttributes": {
      "user_name": "Proteeti13",
      "first_name": "Proteeti",
      "last_name": "Prova",
      "email_address": "proteeti13@gmail.com",
      "mobile_phone": "7777777",
      "password": "ironman",
      "referred_by": "tony stark"
    }
  },
  "response": {}
}

Exemple d'entrée que je teste avec:

const aws = require('aws-sdk');
const ddb = new aws.DynamoDB.DocumentClient({region: 'us-east-2'});


exports.handler = async (event, context) => {
    console.log(event);

    let date = new Date();

    const tableName = 'User';
    const region = 'us-west-2';
  
    
    console.log("table=" + tableName + " -- region=" + region);

    aws.config.update({region});


       
        let ddbParams = {
            Item: {
                'user_name': {S: event.request.userAttributes.user_name},
                'first_name': {S: event.request.userAttributes.first_name},
                'last_name': {S: event.request.userAttributes.last_name},
                'email_address': {S: event.request.userAttributes.email_address},
                'mobile_phone': {S: event.request.userAttributes.mobile_phone},
                'password': {S: event.request.userAttributes.password},
                'referred_by': {S: event.request.userAttributes.referred_by},
                'createdAt': {S: date.toISOString()}
            },
            TableName: tableName
        };

       
        try {
            await ddb.putItem(ddbParams).promise()
            console.log("Success");
        } catch (err) {
            console.log("Error", err);
        }

        console.log("Success: Everything executed correctly");
        context.done(null, event);


};

Sortie de journal

START RequestId: XXXXXXXXXXXXXXXXXXXXXXXX Version: $ LATEST 2020-10-23T07: 59: 49.334Z XXXXXXXXXXXXXXXXXXXXX INFO Erreur {ResourceNotFoundException: Ressource demandée non trouvée à Request.extractError (/ var / runtime / node_modules / aws-sdk /. js: 51: 27) à Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20) à Request.emit (/ var / runtime / node_modules / aws-sdk / lib / sequential_executor.js: 78: 10) à Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:688:14) à Request.transition (/ var / runtime / node_modules / aws-sdk / lib / request.js: 22: 10) à AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12) à / var / runtime / node_modules / aws-sdk / lib / state_machine.js: 26: 10 sur demande. (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9) sur demande. (/var/runtime/node_modules/aws-sdk/lib/request.js:690:12) sur Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18) message: 'Ressource demandée introuvable', code: 'ResourceNotFoundException', heure: 2020-10-23T07: 59: 49.233Z,
requestId: 'XXXXXXXXXXXXXXXXXXXXXXXXX',
statusCode: 400, réessayable: false, RetryDelay: 37,83355253768394} 2020-10-23T07: 59: 49.335Z XXXXXXXXXXXXXXXXXXX INFO succès: Tout exécuté correctement FIN RequestId: XXXXXXXXXXXXXXXXXXXXXXXXXXXX RAPPORT RequestId: XXXXXXXXXXXXXXXXXXXXXXXXXXXX Durée: 1203.41 ms Facturé Durée: 1300 ms Taille de la mémoire: 128 Mo de mémoire maximale utilisée: 89 Mo Durée d'initialisation: 391,58 ms


3 commentaires

Pouvez-vous vous assurer que vous avez réellement une table appelée User dans la région us-west-2?


Pouvez-vous vérifier que votre table existe réellement dans us-west-2 ?


Oui, la table existe dans us-west-2


3 Réponses :


0
votes

Ainsi, ResourceNotFoundException signifie ceci, selon le document AWS:

entrez la description de l'image ici

Vous devez vérifier si votre table existe et si vous utilisez la bonne clé d'accès. En outre, pourquoi créez-vous votre objet DynamoDB avec us-east-2 comme région juste pour le changer dans votre lambda en us-west-2. Essayez de lancer immédiatement l'instance avec la bonne région.


2 commentaires

Pouvez-vous me dire comment vérifier la clé d'accès? Le pool d'utilisateurs avec lequel je vais travailler est dans us-west-2, tout comme mon lambda. C'est pourquoi j'ai créé la table DynamoDB dans us-west-2.


Je n'exécute pas le lambda localement btw.



0
votes

Pourriez-vous essayer avec ce code?

const aws = require('aws-sdk');
aws.config.update({region: 'us-east-2'});
const ddb = new aws.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});

exports.handler = async (event, context) => {
    console.log(event);

    let date = new Date();

    const tableName = 'User';
    const region = 'us-west-2';


    console.log("table=" + tableName + " -- region=" + region);

    aws.config.update({region});



        let ddbParams = {
            Item: {
                user_name:  event.request.userAttributes.user_name,
                first_name:  event.request.userAttributes.first_name,
                last_name:  event.request.userAttributes.last_name,
                email_address:  event.request.userAttributes.email_address,
                mobile_phone:  event.request.userAttributes.mobile_phone,
                password:  event.request.userAttributes.password,
                referred_by:  event.request.userAttributes.referred_by,
                createdAt:  date.toISOString()
            },
            TableName: tableName
        };


        try {
            await ddb.put(ddbParams).promise()
            console.log("Success");
        } catch (err) {
            console.log("Error", err);
        }

        console.log("Success: Everything executed correctly");
        context.done(null, event);


};

Le problème semble venir pour le putItem et je vous conseille également d'utiliser le documentClient avec la dernière version pour plus de simplicité


2 commentaires

Donne l'erreur suivante: snippi.com/s/s826qfz


Pourriez-vous réessayer en utilisant aws.config.update({region: 'us-west-2'}) ? Je n'ai pas vu que les régions sont différentes au début. Même si votre fonction lambda est dans us-east-2 vous devez configurer votre client avec us-west-2 pour accéder aux ressources régionales



0
votes

Votre problème est tout d'abord, changez le nom de votre table et regardez votre nom de base de données dans la section table. Ensuite, entrez les fonctions de la console aws, trouvez votre fonction lambda, paramètres de base> Affichez votre nom_fonction_lambda, il y a des autorisations et attachez une stratégie, créez une nouvelle stratégie pour les autorisations, donnez un accès complet à dynamodb.


0 commentaires