web-dev-qa-db-fra.com

Tâches planifiées AWS Lambda

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 temporisateurs d'événements externes. Par conséquent, elles peuvent être exécutées pendant les périodes de maintenance planifiées ou 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 pouvais enfin avoir un moyen de faire systématiquement des tâches "semblables à celles du cron". Je veux exécuter une requête spécifique tous les jours à 17 heures, par exemple.

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

Ai-je mal compris? Ou quelqu'un peut-il m'indiquer la documentation?

127
Nathan H

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

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

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

Accédez à l'étape de création "Configurer les déclencheurs" et spécifiez le déclencheur "CloudWatch Event - Schedule". Exemple de configuration ci-dessous:

Image that shows configuration for creating a scheduled event at 5pm 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 "CloudWatch Event - Schedule". Exemple de capture d’écran où j’ai un lambda existant avec un déclencheur SNS:

Image that shows how to navigate to add trigger UI from Lambda console.

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

Discussion

Dans votre cas, utilisez plutôt cron() au lieu 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 à 17h00 (UTC), utilisez l’expression cron suivante:

cron(0 17 * * ? *)

Ressources supplémentaires

Remarques

  • Le nom de ce type d'événement est passé de "Evénement planifié" à "Evénement CloudWatch - Planification" depuis la première publication de cette fonctionnalité.
  • Avant la sortie de cette fonctionnalité, la solution recommandée pour ce problème (par "Introduction à AWS Lambda" à 42min 50secs ) était de tilisez SWF pour créer un minuteur , ou pour créer une minuterie avec une application externe.
  • L’interface utilisateur Lambda a été remaniée depuis la publication du blog d’événement prévu et les captures d’écran ne sont plus exactes. Voir mes captures d'écran mises à jour ci-dessus à partir du 3/10/2017 pour les dernières révisions.
144
Anthony Neace

Depuis la publication de cet article, une autre solution semble s'être présentée: Planifiez des invocations AWS Lambda récurrentes avec l'horloge de la ville non fiable (UTC) dans laquelle l'auteur propose de s'abonner au sujet SNS Horloge de la ville peu 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 locale non fiable (UTC)

L'UTC (Unreliable Town Clock) est un nouveau sujet SNS public et 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 électroniques.

Vous pouvez utiliser les attributs de carillon pour exécuter votre code toutes les quinze minutes ou seulement une fois par heure (par exemple, minute == "00") ou une fois par jour (par exemple, 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 à une heure ultérieure: demandez à la fonction d’ignorer tous les appels jusqu’à ce qu’elle se soit écoulée. Le moment venu, il peut effectuer son travail, puis se désabonner du sujet SNS.

Connecter votre code à l’heure non fiable de la ville est simple et rapide. Aucun processus de demande ou création de compte n'est requis

16
shadi

NOUVELLE SOLUTION: Travaux planifiés Lambda

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

Voir le note de version d'AWS Lambda du 2015-10-08 :

Vous pouvez également configurer AWS Lambda pour appeler votre code sur une base 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 une expression cron. Pour un exemple, voir Procédure 5: Utiliser des fonctions Lambda pour traiter des événements planifiés (Python) .


OLD SOLUTION: Planification avec AWS Data Pipeline

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

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

  • Mettez un message à SQS
  • ou directement invoquer 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):

enter image description here

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" }
      ]
    }
  ]
}

Limits : l'intervalle de planification minimum est de 15 minutes.
Prix : environ 1,00 $ par mois.

14
Yves M.

Voici comment je le fais:

  • Créer Lambda qui:

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

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

Maintenant, vous avez une minuterie avec une résolution d'environ 15 minutes.

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

7
maplpro

Comme il est maintenant facilement possible de déclencher des fonctions lambda sur 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 dans python, car cela permettait plus de flexibilité et de complexité dans le travail CRON lui-même.

4
Dirk Conrad Coetsee

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 >> règles >> calendrier. et définissez l'expression cron et dans la section cible, sélectionnez la fonction lambda que vous souhaitez déclencher.

1
PKP

La méthode de la console Web est assez simple. Créez simplement une règle CloudWatch pour le lambda et ajoutez-la dans l'onglet Triggers du lambda.

Pour ceux qui ont besoin d’automatiser cela avec aws cli, on peut

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

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
LeOn - Han Li

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

Vous pouvez désormais utiliser les préconfigurations AWS dans les expressions de planification, telles que rate = 15 min, ou utiliser une expression cron.

enter image description here

Pour votre besoin, l'horaire de facturation est "0 0 17 1/1 *? *"

0
AMS

Vous pouvez le programmer avec des événements cloudWatch. Créer une règle -> attachez la cible (lambda) et configurez un programme cron/rate sage sur votre règle.

0
johnny

Dans la page Fonction, déclencheur Ajouter, vous pouvez ajouter un événement CloudWatch et le définir comme type de planification.

enter image description here

0
Vicky