Attività pianificate AWS Lambda


145

Amazon ha annunciato AWS Lambda ( http://aws.amazon.com/lambda/ ).

La descrizione del prodotto include:

Attività pianificate

Le funzioni AWS Lambda possono essere attivate da timer eventi esterni, quindi le funzioni possono essere eseguite durante i tempi di manutenzione regolarmente programmati o le ore non di punta. Ad esempio, puoi attivare una funzione AWS Lambda per eseguire pulizie notturne degli archivi durante le ore non occupate.

Quando ho letto questo, ho capito che finalmente avrei potuto avere un modo per svolgere costantemente attività "simil-cron". Voglio eseguire una query specifica ogni giorno alle 17:00, diciamo.

Tuttavia non lo trovo da nessuna parte nella documentazione. Citano solo i trigger su eventi programmatici o eventi di altri servizi AWS.

Ho frainteso? O qualcuno può indicarmi la documentazione?

Risposte:


159

Supporto nativo per eventi programmati aggiunto l'8 ottobre 2015:

Come annunciato in questo post sul blog AWS , la pianificazione è ora supportata come un tipo di origine evento (chiamato anche trigger) chiamato " Eventi CloudWatch - Pianificazione " e può essere espresso come frequenza o espressione cron.

Aggiungi evento pianificato a una nuova lambda

Passare alla fase di creazione "Configura trigger" e specificare il trigger "Evento CloudWatch - Pianificazione". Esempio di configurazione di seguito:

Immagine che mostra la configurazione per la creazione di un evento programmato alle 17:00 UTC.

Aggiungi un evento pianificato a un lambda esistente

Passare alla scheda "Trigger" del lambda, selezionare "Aggiungi trigger" e specificare il trigger "Evento CloudWatch - Pianificazione". Schermata di esempio in cui ho una lambda esistente con un trigger SNS:

Immagine che mostra come navigare per aggiungere l'interfaccia utente del trigger dalla console Lambda.

Una volta caricata, l'interfaccia utente per configurare questo trigger è identica allo screenshot nella precedente sezione "Aggiungi evento pianificato a una nuova lambda".

Discussione

Per il tuo esempio, ti consigliamo di utilizzare cron()invece di rate(). Le espressioni cron in lambda richiedono tutti i campi e sono espresse in UTC. Quindi, per eseguire una funzione ogni giorno alle 17:00 (UTC), utilizzare la seguente espressione cron:

cron(0 17 * * ? *)

Ulteriori risorse

Appunti

  • Il nome di questo tipo di evento è cambiato da "Evento pianificato" a "Eventi CloudWatch - Pianificazione" da quando questa funzione è stata rilasciata per la prima volta.
  • Prima del rilascio di questa funzione, la soluzione consigliata a questo problema (per "Introduzione a AWS Lambda" a 42 minuti e 50 secondi ) era di utilizzare SWF per creare un timer o per creare un timer con un'applicazione esterna.
  • L'interfaccia utente di Lambda è stata revisionata da quando è uscito il post sul blog dell'evento programmato e gli screenshot all'interno non sono più esatti. Vedi i miei screenshot aggiornati sopra dal 3/10/2017 per le ultime revisioni.

sai se c'è speranza per un supporto di precisione di 1 minuto?
kaptan il

2
È un po 'un trucco ma puoi farlo per una frequenza di 1 minuto youtube.com/watch?v=FhJxTIq81AU
ingh.am

4
Il tipo di origine evento è ora "Eventi CloudWatch - Programma"
Guy Daher,

@GuyDaher Grazie, ho aggiornato la mia risposta di conseguenza.
Anthony Neace,


18

Sin dai tempi di questo post, sembra essersi alzata un'altra soluzione: Pianifica invocazioni ricorrenti AWS Lambda con The Unreliable Town Clock (UTC) in cui l'autore propone di iscriversi all'argomento SNS Unreliable Town Clock . Non ho usato né SWF né SNS, ma mi sembra che la soluzione SNS sia più semplice. Ecco un estratto dall'articolo

Unreliable Town Clock (UTC)

L'Unreliable Town Clock (UTC) è un nuovo argomento SNS pubblico gratuito (Amazon Simple Notification Service) che trasmette un messaggio "chime" ogni quarto d'ora a tutti gli abbonati. Può inviare i carillon alle funzioni AWS Lambda, alle code SQS e agli indirizzi e-mail.

È possibile utilizzare gli attributi chime per eseguire il codice ogni quindici minuti o eseguirlo solo una volta all'ora (ad es. Quando minuto == "00") o una volta al giorno (ad es. Quando ora == "00" e minuto = = "00") o qualsiasi altra serie di intervalli.

Puoi anche iscriverti a una funzione che desideri eseguire solo una volta in un momento specifico in futuro: fai in modo che la funzione ignori tutte le invocazioni fino a quando non è trascorso il tempo desiderato. Quando è il momento, può svolgere il suo lavoro, quindi annullare l'iscrizione all'argomento SNS.

Il collegamento del codice a Unreliable Town Clock è semplice e veloce. Non è richiesta alcuna procedura di iscrizione o creazione di account


9
Non è più una risposta valida. The Unreliable Town Clock non è più disponibile
blueskin l'

15

NUOVA SOLUZIONE: Lavori programmati Lambda

Werner Vogel ha annunciato stasera (10/08) in merito a: Inventa che AWS Lambda ora ha il suo schedulatore.

Vedi la nota di rilascio di AWS Lambda il 08-10-2015 :

Puoi anche configurare AWS Lambda per invocare il tuo codice su base regolare e programmata utilizzando la console AWS Lambda. È possibile specificare una tariffa fissa (numero di ore, giorni o settimane) oppure è possibile specificare un'espressione cron. Per un esempio, vedere Procedura dettagliata 5: utilizzo delle funzioni Lambda per elaborare eventi pianificati (Python) .


VECCHIA SOLUZIONE: pianificazione con pipeline di dati AWS

Puoi utilizzare AWS Data Pipeline per pianificare un'attività con un determinato periodo. L'azione può essere qualsiasi comando quando si configura la pipeline con ShellCommandActivity .

Ad esempio, puoi eseguire un comando CLI AWS per:

  • Invia un messaggio a SQS
  • o invoca direttamente una funzione Lambda (vedi invoke )

Puoi creare facilmente l'attività pianificata della pipeline di dati AWS direttamente all'interno della console AWS (ad es. Con un comando CLI AWS):

inserisci qui la descrizione dell'immagine

È inoltre possibile utilizzare l'API per definire la pianificazione:

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

Limiti : l'intervallo di pianificazione minimo è di 15 minuti.
Prezzi : circa $ 1,00 al mese.


9

Ecco come lo faccio:

  • Crea Lambda che:

  • Crea allarme CloudWatch per: ApproximateNumberOfMessagesVisible> 0 per 1 minuto

  • Sottoscrivi l'argomento SNS all'allarme
  • Abbonati Lambda all'argomento SNS

Ora hai un timer con una risoluzione di circa 15 minuti.

Quindi altre funzioni Lambda sono iscritte all'argomento SNS e chiamate ogni 15 minuti.


4
Questa risposta è sostanzialmente istruzioni per un meccanismo che può implementare l'orologio della città inaffidabile descritto nella risposta di Shadi . Dato che l'autore di UTC avverte che "potrebbe scomparire senza preavviso in qualsiasi momento", il tuo approccio è probabilmente di gran lunga superiore.
Brian,

La prima implementazione - 1 messaggio - funziona un paio di giorni e si ferma. Sembra che il messaggio periodicamente non venga recapitato a SQS. Aggiunti altri 2 messaggi (3 in totale) - ora funziona già una settimana. In CloudWatch vedo mancate periodiche: solo 2 messaggi recapitati, il timer continua a funzionare bene. Gist è stato aggiornato gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro

@Brian Come autore di Unreliable Town Clock ( townclock.io ) sono d'accordo sul fatto che eseguendo il tuo ti dà più controllo che dipendere da qualche estraneo (me). In effetti, incoraggio la gente a gestire il proprio orologio inaffidabile della città e hanno pubblicato la fonte su GitHub: github.com/alestic/alestic-unreliable-town-clock
Eric Hammond

4

Dal momento che ora è facilmente possibile attivare le funzioni lambda su HTTP (ad es. Usando GET o curl) una soluzione semplice è usare un CRON gestito come easycron: https://www.easycron.com/ per attivare la funzione lambda.

Abbiamo avuto lo stesso problema e abbiamo finito per eseguire un servizio cron su Google App Engine in Python poiché ciò consentiva una maggiore flessibilità e complessità nel lavoro CRON stesso.


I tempi sono cambiati e Lambda ora supporta la pianificazione cron-type fuori dagli schemi docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
Dirk Conrad Coetsee

2

Nella pagina Funzione, Aggiungi trigger, è possibile aggiungere un evento CloudWatch e renderlo come tipo di pianificazione

inserisci qui la descrizione dell'immagine


1

Puoi pianificarlo anche con eventi cloudWatch. Crea regola -> collega destinazione (lambda) e imposta cron / rate saggio programma sulla tua regola.


1

Il modo di console web è piuttosto semplice. Basta creare una CloudWatchregola per la lambda e aggiungerla nella Triggersscheda della lambda .

Per chi ha bisogno di automatizzarlo aws cli, possiamo

  1. creare la funzione,
  2. creare la regola,
  3. concedere l'autorizzazione,
  4. regola e funzione di collegamento

Crea funzione

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}

Crea regole

## 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 modo semplice per eseguire la query in lambda per un determinato intervallo di tempo è impostare la regola per la funzione lambda. per quello dopo aver creato la funzione lambda vai su cloudwatch >> regole >> programma. e definire l'espressione cron e nella sezione target selezionare la funzione lambda che si desidera attivare.


0

Durante la creazione della funzione lambda, creare il trigger "Eventi CloudWatch - Pianificazione"

Ora puoi utilizzare i preset AWS nell'espressione del programma come rate = 15 min oppure puoi usare un'espressione cron.

inserisci qui la descrizione dell'immagine

Per le tue esigenze, il Cron Schedule è "0 0 17 1/1 *? *"


-1

Diksha è AWS Lambda Scheduler basato sul trigger AWS SWF come raccomandato dal team AWS . Si possono pianificare i lavori usando espressioni cron e si può anche specificare quante volte si desidera eseguire, quando iniziare o quando terminare. È possibile visualizzare lo stato e la cronologia dei lavori pianificati. La sicurezza è gestita dalle politiche di AWS.

Una volta impostato il motore diksha, è possibile pianificare le funzioni utilizzando l'espressione cron nel modo seguente:

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

In questo lavoro il lavoro verrà eseguito ogni minuto per 10 volte. AWS SWF attiverà la funzione da solo.

Dettagli: https://github.com/milindparikh/diksha

Disclaimer: sono un collaboratore del progetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.