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?
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.
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:
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:
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.
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 * * ? *)
lambda-canary
qui peut être sélectionnée lors de la création de fonctions à partir de la console AWS.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
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) .
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:
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):
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.
Voici comment je le fais:
Créer Lambda qui:
Créer une alarme CloudWatch pour: ApproximateNumberOfMessagesVisible> 0 pendant 1 minute
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.
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.
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.
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
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"}]'
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.
Pour votre besoin, l'horaire de facturation est "0 0 17 1/1 *? *"
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.