web-dev-qa-db-fra.com

fonction aws lambda déclenchant plusieurs fois pour un seul événement

J'utilise la fonction aws lambda pour convertir un fichier wav téléchargé dans un compartiment au format mp3 et déplacer ensuite le fichier vers un autre compartiment. Cela fonctionne correctement. Mais il y a un problème de déclenchement. Lorsque je télécharge de petits fichiers wav, la fonction lambda est appelée une fois. Mais lorsque je télécharge un fichier wav de grande taille, cette fonction est déclenchée plusieurs fois.

J'ai recherché ce problème sur Google et constaté qu'il est sans état, il sera donc appelé plusieurs fois (je ne suis pas sûr que ce déclencheur soit pour plusieurs téléchargements ou un même téléchargement).

https://aws.Amazon.com/lambda/faqs/

Existe-t-il une méthode pour appeler cette fonction une fois pour un seul téléchargement?

27
Ijas Ahamed N

Version courte: Essayez d'augmenter le paramètre de délai d'attente dans la configuration de votre fonction lambda.

version longue:

Je suppose que vous rencontrez la fonction lambda en cours de temporisation ici.

Les événements S3 sont de nature asynchrone et la fonction lambda écoutant les événements S3 est réessayée au moins 3 fois avant que cet événement ne soit rejeté. Vous avez mentionné que votre fonction lambda n'est exécutée qu'une seule fois (sans erreur) lors d'un téléchargement de plus petite taille sur lequel vous effectuez une conversion et un nouveau téléchargement. Il est possible que le temps nécessaire à la conversion et au téléchargement à partir de votre code soit supérieur au paramètre de délai d'expiration de votre fonction lambda.

Par conséquent, vous souhaiterez peut-être essayer d'augmenter le paramètre de délai d'attente dans la configuration de votre fonction lambda.

Soit dit en passant, une façon de confirmer que votre fonction lambda est invoquée plusieurs fois consiste à consulter les journaux cloudwatch pour l'ID d'événement ( 67fe6073-e19c-11e5-1111-6bqw43hkbea3 ) occurrence -

START RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3 Version: $LATEST

Cet identifiant d'événement représente un événement spécifique pour lequel lambda a été appelé et doit être le même pour toutes les exécutions lambda responsables du même événement S3.

En outre, vous pouvez rechercher le temps d'exécution (durée) dans la ligne de journal suivante qui marque la fin d'une exécution lambda -

REPORT RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3  Duration: 244.10 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 20 MB

Si ce n'est pas une solution, cela vous donnera au moins de la place pour déboguer dans la bonne direction. Dites-moi comment ça se passe.

23
rk2

Tout événement exécutant Lambda plusieurs fois est dû au comportement de nouvelle tentative de Lambda comme spécifié dans document AWS .

Votre code peut déclencher une exception, expirer ou manquer de mémoire. Le runtime exécutant votre code peut rencontrer une erreur et s'arrêter. Vous risquez de manquer de simultanéité et d'être limité.

Il pourrait y avoir une erreur dans Lambda qui oblige le client ou le service à appeler la fonction Lambda pour réessayer.

Utilisez les journaux CloudWatch pour trouver l'erreur et la résoudre pourrait résoudre le problème.

Moi aussi, j'ai fait face au même problème, dans mon cas, c'est à cause d'une erreur d'application, le résoudre m'a aidé.

2
Tarun Mootala

L'objet context contient des informations sur l'ID de demande que vous traitez actuellement. Cet ID ne changera pas même si le même événement se déclenche plusieurs fois. Vous pouvez enregistrer cet ID à chaque fois qu'un événement se déclenche, puis vérifier que le dernier ID que vous avez géré n'est pas le même que celui en cours.

Voici mon code final pour résoudre ce problème (NodeJS avec le gestionnaire de base de données MongooseJS):

exports.handler = function(event, context, lambdaCallback) {        
    Events.findOneAndUpdate(
        { name: 'some-event-name' }, 
        { lastRequestId: context.awsRequestId }).then(function(event) {

        // Without specifying the option "new: true" the old document is returned
        // after the update, so we check the ID against the old value 

        if(event.lastRequestId == context.awsRequestId) {
            return;
        }

        /* Run the actual job */
        ...
    });
}

J'espère que cela t'aides!

2
maxpaj