5
votes

Comment forcer un démarrage à froid complet d'une fonction AWS lambda sur un VPC?

J'ai une fonction lambda écrite en Python qui utilise quelques dépendances lourdes (NumPy, pandas, goodtables, etc.) et est également connectée à un VPC (pour accéder à une instance Postgres RDS)

Le temps d'exécution du démarrage à froid de cette fonction est énorme (16,2 secondes) lorsqu'elle est exécutée après un certain temps (> 4-6 heures)

Cependant, si je mets à jour le code de la fonction et que je l'invoque une seconde fois (peu de temps après la première exécution), le temps d'exécution du démarrage à froid diminue considérablement (3 secondes)

Si j'invoque à nouveau la fonction sans la mettre à jour, donc c'est un démarrage à chaud, le temps d'exécution diminue encore plus (313 ms)

Je soupçonne que le premier démarrage à froid (16,2 secondes) se produit lorsque Lambda configure un ENI pour accéder aux ressources VPC et que l'ENI est réutilisé pendant le deuxième démarrage à froid (3 secondes) donc le temps nécessaire pour recréer l'ENI est évité.

J'essaie d'optimiser le temps de démarrage à froid de cette fonction et je veux qu'elle recommence à zéro pour voir à quelle vitesse elle peut s'exécuter lors d'un démarrage à froid (c'est-à-dire pas d'ENI + démarrage à froid).

Existe-t-il un moyen de le faire et de le faire à plusieurs reprises?


7 commentaires

Et si vous créez une nouvelle fonction au lieu d'une simple version nouvelle (ou "mise à jour")? Les opérations de gestion ENI et la logique associée sont presque entièrement opaques, mais vous pouvez les voir rétrospectivement dans vos journaux CloudTrail.


@ Michael-sqlbot J'espérais éviter de créer une nouvelle fonction à chaque fois que je voulais un démarrage à froid. Cependant, à partir de la sortie de aws ec2 describe-network-interfaces | grep -C5 Je peux voir si un ENI est attaché ou non et l'heure de l'attachement (s'il y en a un). Si je pouvais détacher / supprimer cet ENI, pensez-vous que cela forcera Lambda à recréer l'ENI lors du prochain appel?


Vous pouvez l'essayer mais je doute que cela fonctionnera comme prévu. Lambda ne s'attend pas à ce que vous retiriez les interfaces de dessous et vous constaterez peut-être que cela empêche simplement la fonction de fonctionner complètement. Je ne suis pas sûr de votre objection à la création d'une nouvelle fonction. Le tout peut être automatisé en utilisant aws-cli.


@ Michael-sqlbot Je ne savais pas que je pouvais l'automatiser en utilisant aws-cli. Est-il possible de créer une nouvelle fonction en utilisant le code d'une fonction existante sans avoir à télécharger un nouveau ZIP?


aws lambda create-function accepte --code pour récupérer le fichier zip depuis S3 ou --zip-file pour télécharger directement le zip.


@ Michael-sqlbot génial! Merci!


@Vinayak avez-vous déjà trouvé une solution à cela?


3 Réponses :


0
votes

Au lieu de simplement modifier le code, vous pouvez essayer de publier une nouvelle version de votre fonction lambda à des fins de test. Selon AWS, chaque fois que vous publiez une nouvelle version de votre fonction lambda, tous les conteneurs dans lesquels votre fonction s'exécute sont détruits puis recréés, ce qui devrait forcer un démarrage à froid complet.


4 commentaires

Si vous vouliez exécuter update-function -code , c'est ce que je fais actuellement et il démarrera à froid mon lambda mais le temps de démarrage à froid est inférieur à 5 secondes donc je soupçonne que l'ENI est réutilisé et non recréé.


Non, je ne suis pas. Laissez-moi essayer de faire ça et je vous répondrai.


Non, cela n'a rien fait à part publier une nouvelle version de la fonction. L'heure de démarrage à froid n'a pas été affectée (2,5 secondes).


@MatusDubrava mettant à jour le code de fonction publie également une nouvelle version - mais pas une version numérotée. $ LATEST pointe vers la version nouvellement publiée, autrement anonyme.



0
votes

Je me demandais la même chose et bien que vous puissiez "réduire" le nombre réservé à zéro dans un scénario de test, cela ne sera probablement pas une option viable dans un scénario de production. Pour cela, jetez un œil aux réponses dans Forcer la suppression du conteneur AWS Lambda ou Redémarrage de la fonction AWS lambda pour vider le cache .


1 commentaires

Je vais devoir l'essayer. Cependant, je ne sais pas si l'ENI serait détruit dans ce cas



4
votes

Vous pouvez augmenter la mémoire, l'enregistrer et la réinitialiser à nouveau.

Vous pouvez également ajouter une nouvelle variable d'environnement.

Cela force tous les lambda chauds existants à être éliminés et un nouveau démarrage à froid lors de la prochaine invocation du lambda.


4 commentaires

Si je me souviens bien, cela n'a pas fonctionné (voir ma question) car l'ENI n'a pas été recréé


Merci - J'ai vu la question, dans la pratique, nous utilisons cette méthode tout le temps, peut-être que l'ENI actuel prend un certain temps à se débarrasser?


Changer la mémoire à une valeur inférieure puis sauvegarder a fonctionné pour moi.


Grâce à cette réponse, au cours de la dernière année, j'ai utilisé la méthode consistant à ajouter ou simplement modifier l'une des variables d'environnement. Je crée généralement juste un nouveau tel forceRestart et incrémente le compteur.