← Tous les guides

Guide · AWS

Surveiller AWS Lambda (planifié / cron) avec un interrupteur homme mort

CloudWatch vous montre les erreurs d'invocation, mais pas l'invocation qui n'a jamais eu lieu : une règle EventBridge désactivée, une expression cron cassée, une permission retirée par erreur. Un check-in attrape aussi ce silence, avec un seul appel HTTPS depuis le handler, sans agent ni SDK à installer.

1. Créez un check

Créez un check dans Mortemain, réglez sa planification sur celle de votre règle EventBridge ou de votre expression Scheduler, et copiez l'URL de ping :

 votre URL de ping
https://ping.mortemain.com/your-check-uuid

2. Faites le check-in en cas de succès depuis le handler

Rien à installer : la bibliothèque standard Python urllib.request suffit pour l'appel HTTPS. Faites le check-in une fois la logique du job terminée sans exception :

 lambda_function.py
import urllib.request

PING_URL = "https://ping.mortemain.com/your-check-uuid"

def handler(event, context):
    do_the_work()                            # votre job
    urllib.request.urlopen(PING_URL, timeout=10)

Sur un runtime Node.js, le fetch global (Node 18+) fait la même chose sans dépendance :

 index.mjs
export const handler = async (event) => {
  await doTheWork();                     // votre job
  await fetch("https://ping.mortemain.com/your-check-uuid");
};

3. Alertez immédiatement en cas d'échec

Entourez le travail d'un try/except et appelez l'URL /fail avant de relever l'exception. Un plantage ou une exception non gérée déclenche alors une alerte immédiate au lieu d'attendre que le check reste silencieux :

 lambda_function.py
import urllib.request

PING_URL = "https://ping.mortemain.com/your-check-uuid"

def handler(event, context):
    try:
        do_the_work()
    except Exception:
        urllib.request.urlopen(PING_URL + "/fail", timeout=10)
        raise
    else:
        urllib.request.urlopen(PING_URL, timeout=10)

Une fonction qui expire ou qui est tuée pour dépassement de mémoire n'atteint aucun des deux appels, et c'est très bien ainsi : Mortemain alerte une fois la fenêtre de grâce dépassée, exactement comme pour une règle qui aurait cessé de se déclencher. Un point à vérifier d'abord : une Lambda rattachée à un VPC a besoin d'une route vers Internet (une passerelle NAT, ou un sous-réseau public avec IGW) pour joindre ping.mortemain.com ; sans sortie internet, même une exécution réussie ne peut pas faire le check-in.

4. Planifiez-la et faites correspondre la période

Déclenchez la fonction sur une expression cron ou rate avec EventBridge Scheduler (ou une règle CloudWatch Events classique) :

 shell
aws scheduler create-schedule \
  --name nightly-report \
  --schedule-expression "cron(0 3 * * ? *)" \
  --flexible-time-window '{"Mode": "OFF"}' \
  --target '{"Arn": "arn:aws:lambda:eu-west-1:123456789012:function:nightly-report", "RoleArn": "arn:aws:iam::123456789012:role/scheduler-invoke-lambda"}'

Réglez la planification du check sur cette même expression cron(0 3 * * ? *), pour détecter aussi bien une règle désactivée, un déploiement raté ou une panne du scheduler qu'une simple erreur de code. Vous voulez mesurer la durée de l'invocation ? Appelez …/your-check-uuid/start en toute première ligne du handler et Mortemain calculera la durée jusqu'au ping de succès.

Testez

Invoquez la fonction une fois (aws lambda invoke, ou un déclenchement manuel depuis la console) et vérifiez que le check passe actif. Puis forcez une exception et vérifiez que le ping /fail se déclenche et que l'alerte arrive immédiatement.