Tâches planifiées AWS Lambda


145

Amazon a annoncé AWS Lambda ( http://aws.amazon.com/lambda/ ).

La description du produit comprend:

Tâches planifiées

Les fonctions AWS Lambda peuvent être déclenchées par des minuteries d'événements externes, de sorte que les fonctions peuvent être exécutées pendant les périodes de maintenance planifiées régulièrement ou pendant les heures creuses. Par exemple, vous pouvez déclencher une fonction AWS Lambda pour effectuer des nettoyages d'archives nocturnes pendant les heures creuses.

Quand j'ai lu ceci, j'ai compris que je pourrais enfin avoir un moyen de faire systématiquement des tâches «cron». Je veux exécuter une requête spécifique tous les jours à 17 heures, disons.

Cependant, je ne trouve cela nulle part dans la documentation. Ils ne mentionnent que les déclencheurs sur les événements programmatiques ou les événements d'autres services AWS.

Ai-je mal compris? Ou quelqu'un peut-il me diriger vers la documentation?

Réponses:


159

Prise en charge native des événements planifiés ajoutée le 8 octobre 2015:

Comme annoncé dans cet article de blog AWS , la planification est désormais prise en charge en tant que type de source d'événement (également appelé déclencheur) appelé " Événements CloudWatch - Planification », et peut être exprimée sous forme de taux ou d'expression cron.

Ajouter un événement planifié à un nouveau lambda

Accédez à l'étape de création «Configurer les déclencheurs» et spécifiez le déclencheur «Événement CloudWatch - Planifier». Exemple de configuration ci-dessous:

Image qui montre la configuration pour créer un événement planifié à 17 h UTC.

Ajouter un événement planifié à un lambda existant

Accédez à l'onglet "Déclencheurs" de votre lambda, sélectionnez "Ajouter un déclencheur" et spécifiez le déclencheur "Événement CloudWatch - Planification". Exemple de capture d'écran où j'ai un lambda existant avec un déclencheur SNS:

Image qui montre comment naviguer pour ajouter une interface utilisateur de déclencheur à partir de la console Lambda.

Une fois chargée, l'interface utilisateur pour configurer ce déclencheur est identique à la capture d'écran dans la section ci-dessus «Ajouter un événement planifié à un nouveau lambda» ci-dessus.

Discussion

Pour votre exemple de cas, vous voudrez utiliser à la cron()place de rate(). Les expressions Cron dans lambda nécessitent tous les champs et sont exprimées en UTC. Donc, pour exécuter une fonction tous les jours à 17 heures (UTC), utilisez l'expression cron suivante:

cron(0 17 * * ? *)

Autres ressources

Remarques

  • Le nom de ce type d'événement est passé de «Événement planifié» à «Événements CloudWatch - Planification» depuis la première sortie de cette fonctionnalité.
  • Avant la sortie de cette fonctionnalité, la solution recommandée à ce problème (par «Premiers pas avec AWS Lambda» à 42 min 50 s ) était d' utiliser SWF pour créer un minuteur ou pour créer un minuteur avec une application externe.
  • L'interface utilisateur Lambda a été révisée depuis la publication du billet de blog de l'événement programmé, et les captures d'écran ne sont plus exactes. Voir mes captures d'écran mises à jour ci-dessus du 10/03/2017 pour les dernières révisions.

savez-vous s'il y a de l'espoir pour un support de précision d'une minute?
kaptan

2
C'est un peu un hack mais vous pouvez le faire pour une fréquence de 1 min youtube.com/watch?v=FhJxTIq81AU
ingh.am

4
Le type de source d'événement est maintenant "CloudWatch Events - Schedule"
Guy Daher

@GuyDaher Merci, j'ai mis à jour ma réponse en conséquence.
Anthony Neace

3
Il prend en charge le taux de 1min maintenant. docs.aws.amazon.com/lambda/latest/dg/…
advncd

18

Depuis le moment de cet article, il semble y avoir eu une autre solution: planifier des invocations AWS Lambda récurrentes avec l'horloge de ville non fiable (UTC) dans laquelle l'auteur propose de s'abonner au sujet SNS Horloge de ville non fiable . Je n'ai utilisé ni SWF ni SNS, mais il me semble que la solution SNS est plus simple. Voici un extrait de l'article

Horloge de ville non fiable (UTC)

L'horloge de ville non fiable (UTC) est un nouveau sujet SNS public gratuit (Amazon Simple Notification Service) qui diffuse un message «carillon» tous les quarts d'heure à tous les abonnés. Il peut envoyer les carillons aux fonctions AWS Lambda, aux files d'attente SQS et aux adresses e-mail.

Vous pouvez utiliser les attributs carillon pour exécuter votre code toutes les quinze minutes, ou exécuter votre code uniquement une fois par heure (par exemple, lorsque minute == "00") ou une fois par jour (par exemple, lorsque heure == "00" et minute = = "00") ou toute autre série d'intervalles.

Vous pouvez même souscrire à une fonction que vous ne souhaitez exécuter qu'une seule fois à un moment précis dans le futur: demandez à la fonction d'ignorer toutes les invocations jusqu'à ce qu'elle soit dépassée. Quand il est temps, il peut effectuer son travail, puis se désinscrire du sujet SNS.

La connexion de votre code à l'horloge de ville non fiable est rapide et facile. Aucun processus de demande ou création de compte n'est requis


9
Ce n'est plus une réponse valable. The Unreliable Town Clock n'est plus disponible
blueskin

15

NOUVELLE SOLUTION: Tâches planifiées Lambda

Werner Vogel a annoncé ce soir (10/08) à re: Invent qu'AWS Lambda dispose désormais de son propre planificateur.

Se la note d'libération Lambda sur AWS 08/10/2015 :

Vous pouvez également configurer AWS Lambda pour appeler votre code de manière régulière et planifiée à l'aide de la console AWS Lambda. Vous pouvez spécifier un taux fixe (nombre d'heures, de jours ou de semaines) ou vous pouvez spécifier une expression cron. Pour obtenir un exemple, consultez Procédure pas à pas 5: Utilisation des fonctions Lambda pour traiter les événements planifiés (Python) .


ANCIENNE SOLUTION: Planification avec AWS Data Pipeline

Vous pouvez utiliser AWS Data Pipeline pour planifier une tâche avec une période donnée. L'action peut être n'importe quelle commande lorsque vous configurez votre pipeline avec ShellCommandActivity .

Vous pouvez par exemple exécuter une commande AWS CLI pour:

  • Mettre un message à SQS
  • ou appeler directement une fonction Lambda (voir invoke )

Vous pouvez facilement créer la tâche planifiée AWS Data Pipeline directement dans la console AWS (par exemple avec une commande AWS CLI):

entrez la description de l'image ici

Vous pouvez également utiliser l'API pour définir votre planification:

{
 "pipelineId": "df-0937003356ZJEXAMPLE",
 "pipelineObjects": [
    {
      "id": "Schedule",
      "name": "Schedule",
      "fields": [
        { "key": "startDateTime", "stringValue": "2012-12-12T00:00:00" }, 
        { "key": "type", "stringValue": "Schedule" }, 
        { "key": "period", "stringValue": "1 hour" }, 
        { "key": "endDateTime", "stringValue": "2012-12-21T18:00:00"  }
       ]
     }, {
      "id": "DoSomething",
      "name": "DoSomething",
      "fields": [
        { "key": "type", "stringValue": "ShellCommandActivity" },
        { "key": "command", "stringValue": "echo hello" },
        { "key": "schedule", "refValue": "Schedule" }
      ]
    }
  ]
}

Limites : L'intervalle de programmation minimum est de 15 minutes.
Prix : environ 1,00 $ par mois.


9

Voici comment je le fais:

  • Créez Lambda qui:

  • Créer une alarme CloudWatch pour: ApproximateNumberOfMessagesVisible> 0 pendant 1 minute

  • Abonnez-vous au sujet SNS à l'alarme
  • Abonnez-vous à Lambda au sujet SNS

Vous avez maintenant une minuterie avec une résolution d'environ 15 minutes.

Ensuite, d'autres fonctions Lambda sont abonnées à SNS Topic et appelées toutes les 15 minutes.


4
Cette réponse est essentiellement des instructions pour un mécanisme qui peut implémenter l'horloge de ville non fiable décrite dans la réponse de Shadi . Étant donné que l'auteur d'UTC prévient qu'il "peut disparaître sans avertissement à tout moment", votre approche est probablement bien supérieure.
Brian

Première implémentation - 1 message - fonctionne quelques jours et s'arrête. Il semble que périodiquement, le message n'est tout simplement pas livré à SQS. Ajout de 2 messages supplémentaires (3 en somme) - maintenant cela fonctionne déjà une semaine. Dans CloudWatch, je vois des échecs périodiques - seulement 2 messages livrés, le minuteur fonctionne toujours bien. Gist a été mis à jour gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro

@Brian En tant qu'auteur de l'horloge de ville non fiable ( townclock.io ), je conviens que gérer le vôtre vous donne plus de contrôle que de dépendre d'un étranger (moi). En fait, j'encourage les gens à exécuter leur propre horloge de ville non fiable et j'ai publié la source sur GitHub: github.com/alestic/alestic-unreliable-town-clock
Eric Hammond

4

Puisqu'il est maintenant facilement possible de déclencher des fonctions lambda via HTTP (par exemple en utilisant GET ou curl), une solution simple consiste à utiliser un CRON géré comme easycron: https://www.easycron.com/ pour déclencher votre fonction lambda en cours d'exécution.

Nous avons eu le même problème et avons fini par exécuter un service cron sur Google App Engine en python, car cela permettait plus de flexibilité et de complexité dans le travail CRON lui-même.


Les temps ont changé et Lambda prend désormais en charge la planification de type cron hors de la boîte docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
Dirk Conrad Coetsee

2

Dans la page Fonction, Ajouter un déclencheur, vous pouvez ajouter un événement CloudWatch et en faire un type de planification

entrez la description de l'image ici


1

Vous pouvez également le planifier avec des événements cloudWatch. Créez une règle -> attachez une cible (lambda) et configurez un calendrier cron / rate sage sur votre règle.


1

La méthode de la console Web est assez simple. Créez simplement une CloudWatchrègle pour le lambda et ajoutez-la dans l' Triggersonglet lambda .

Pour ceux qui ont besoin d'automatiser cela avec aws cli, nous pouvons

  1. créer la fonction,
  2. créer la règle,
  3. accorder la permission,
  4. règle et fonction de lien

Créer une fonction

aws lambda create-function --function-name ${FUNCTION-NAME} \
--runtime java8 \
--role 'arn:aws:iam::${Account}:role/${ROLE}' \
--handler org.yourCompany.LambdaApp \
--code '{"S3Bucket":"yourBucket", "S3Key": "RC/yourapp.jar"}' \
--description 'check hive connection' \
--timeout 180 \
--memory-size 384 \
--publish \
--vpc-config '{"SubnetIds": ["subnet-1d2e3435", "subnet-0df4547a"], "SecurityGroupIds": ["sg-cb17b1ae", "sg-0e7ae277"]}' \
--environment Variables={springEnv=dev}

Créer des règles

## create
aws events put-rule --name ${ruleName} \
--schedule-expression 'rate(5 minutes)' \
--state ENABLED \
--description 'check hive connection'

# grant permission to the Rule to allow it to trigger the function
aws lambda add-permission --function-name ${functionName} \
--statement-id 123 \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:acc:rule/${ruleName}

# link rule and function
aws events put-targets --rule ${ruleName} \
--targets '[{"Id":"1", "Arn":"arn:aws:lambda:us-east-1:acc:function:RC-checkhive"}]'

1

Un moyen simple d'exécuter votre requête dans lambda pour un intervalle de temps particulier consiste à définir une règle pour votre fonction lambda. pour cela, après avoir créé la fonction lambda, accédez à cloudwatch >> rules >> planning. et définissez l'expression cron et dans la section cible, sélectionnez la fonction lambda que vous souhaitez déclencher.


0

Lors de la création de la fonction lambda, créez le déclencheur "CloudWatch Events - Schedule"

Vous pouvez maintenant utiliser les préréglages AWS dans une expression de planification comme rate = 15 min ou vous pouvez utiliser une expression cron.

entrez la description de l'image ici

Pour vos besoins, le calendrier Cron est "0 0 17 1/1 *? *"


-1

Diksha est AWS Lambda Scheduler basé sur AWS SWF Trigger tel que recommandé par AWS Team . On peut planifier des travaux à l'aide d'expressions cron et peut également spécifier combien de fois vous voulez exécuter, quand commencer ou quand terminer. Vous pouvez afficher l'état ainsi que l'historique des travaux planifiés. La sécurité est gérée par les politiques AWS.

Une fois que vous avez configuré le moteur diksha, vous pouvez planifier des fonctions à l'aide de l'expression cron de la manière suivante:

java -jar diksha-client-0.0.1.jar -lcfg cf1 -cj "jobName | functionName | context | 0 0-59 * * * * | 10"

Dans ce travail, le travail s'exécutera toutes les minutes 10 fois. AWS SWF déclenchera la fonction par lui-même.

Détails: https://github.com/milindparikh/diksha

Avertissement: je suis contributeur au projet.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.