Obtenir le temps (temps de séjour) entre la création d'un travail et l'exécution de Lambda Quand je créais Lambda J'utilisais datetime pour obtenir la date et l'heure actuelles, J'étais donc vraiment intéressé parce que "AWS Lambda réutilise les instances de fonction". J'aimerais faire un article.
Premier pour obtenir la date et l'heure actuelles de l'exécution de Lambda Voici une version simplifiée du code.
from datetime import datetime
now = datetime.now()
def lambda_handler(event, context):
method_a()
def method_a():
method_b()
def method_b():
method_c()
def method_c():
#x représente la date et l'heure de création du travail.
time = now - x
print(data)
Il est exprimé comme.
Déclarer maintenant en tant que variable globale pour représenter l'heure J'ai rendu possible l'utilisation de n'importe quelle méthode.
Depuis que j'ai pu obtenir le temps de séjour localement, Je viens de le construire et de le déployer pour créer Lambda. Le premier test Lambda a également été un succès et il n'y a eu aucun problème.
Le temps de séjour obtenu avec succès la première fois Je n'ai pas pu bien comprendre après la deuxième fois.
«Le temps» est étrange, peu importe le nombre de fois que j'essaye.
Alors construisez et déployez à nouveau J'ai mis à jour Lambda et cela a fonctionné.
Cependant, ce n'était pas bon après la deuxième fois.
Alors quand j'enquêtais sur diverses choses pour enquêter sur la cause Je suis tombé sur un article ici!
La cause était la variable globale «now» déclarée en dehors de lambda_handler.
Apparemment, Lambda est pour l'amélioration des performances C'est comme réutiliser une instance d'une fonction.
https://aws.amazon.com/jp/lambda/faqs/
En d'autres termes, la date et l'heure du premier "maintenant" acquis sont mises en cache. Il semble que la même valeur ait été réutilisée à partir de la deuxième fois.
Dites toujours que les instances de fonction Lambda sont nouvellement créées Je réfléchissais, donc je ne l'ai pas remarqué du tout! !!
Après avoir compris la cause
Pour le moment, j'ai mis now
dans lambda_handler
.
Cela obtiendra une nouvelle date et heure «maintenant» à chaque exécution de Lambda.
from datetime import datetime
def lambda_handler(event, context):
now = datetime.now()
method_a(now)
def method_a(now):
method_b(now)
def method_b(now):
method_c(now)
def method_c(now):
#x représente la date et l'heure de création du travail.
time = now - x
print(data)
Cela peut également être fait sous cette forme, Ce n'est pas cool de le transmettre via une méthode comme celle-ci Je l'ai corrigé comme suit.
from datetime import datetime
def lambda_handler(event, context):
global now
now = datetime.now()
method_a()
def method_a():
method_b()
def method_b():
method_c()
def method_c():
#x représente la date et l'heure de création du travail.
time = now - x
print(data)
C'est sûr, même après la deuxième fois
Vous pouvez maintenant obtenir la date et l'heure auxquelles now
a été correctement exécuté.
J'ai pu bien gagner du temps.
Pour réutiliser des instances de fonction Lambda C'était la première fois que j'entendais, alors j'ai beaucoup appris.
Après cela, les variables globales sont très pratiques, Qu'il est facile de provoquer des bugs inattendus Je l'ai réalisé avec mon propre corps.
Je ferai attention à son utilisation.
Recommended Posts