Geplante AWS Lambda-Aufgaben


145

Amazon kündigte AWS Lambda an ( http://aws.amazon.com/lambda/ ).

Die Produktbeschreibung enthält:

Geplante Aufgaben

AWS Lambda-Funktionen können durch externe Ereigniszeitgeber ausgelöst werden, sodass Funktionen während regelmäßig geplanter Wartungszeiten oder außerhalb der Spitzenzeiten ausgeführt werden können. Sie können beispielsweise eine AWS Lambda-Funktion auslösen, um nächtliche Archivbereinigungen außerhalb der Geschäftszeiten durchzuführen.

Als ich dies las, wurde mir klar, dass ich endlich die Möglichkeit haben könnte, konsequent "cron-ähnliche" Aufgaben zu erledigen. Ich möchte jeden Tag um 17 Uhr eine bestimmte Abfrage ausführen.

Ich finde dies jedoch nirgendwo in der Dokumentation. Sie erwähnen nur Auslöser für programmatische Ereignisse oder Ereignisse von anderen AWS-Diensten.

Habe ich falsch verstanden? Oder kann mich jemand auf die Dokumentation verweisen?

Antworten:


159

Native Unterstützung für geplante Ereignisse hinzugefügt am 8. Oktober 2015:

Wie in diesem AWS-Blogbeitrag angekündigt , wird die Zeitplanung jetzt als Ereignisquellentyp (auch als Trigger bezeichnet) mit dem Namen " CloudWatch-Ereignisse - Zeitplan " unterstützt und kann als Rate oder Cron-Ausdruck ausgedrückt werden.

Geplantes Ereignis zu einem neuen Lambda hinzufügen

Navigieren Sie zum Erstellungsschritt "Trigger konfigurieren" und geben Sie den Trigger "CloudWatch-Ereignis - Zeitplan" an. Beispielkonfiguration unten:

Bild, das die Konfiguration zum Erstellen eines geplanten Ereignisses um 17 Uhr UTC zeigt.

Geplantes Ereignis zu einem vorhandenen Lambda hinzufügen

Navigieren Sie zur Registerkarte "Trigger" Ihres Lambda, wählen Sie "Trigger hinzufügen" und geben Sie den Trigger "CloudWatch-Ereignis - Zeitplan" an. Beispiel-Screenshot, in dem ich ein vorhandenes Lambda mit einem SNS-Trigger habe:

Abbildung, die zeigt, wie Sie navigieren, um eine Trigger-Benutzeroberfläche über die Lambda-Konsole hinzuzufügen.

Nach dem Laden ist die Benutzeroberfläche zum Konfigurieren dieses Triggers identisch mit dem Screenshot im obigen Abschnitt "Geplantes Ereignis zu einem neuen Lambda hinzufügen" oben.

Diskussion

Für Ihren Beispielfall möchten Sie cron()anstelle von verwenden rate(). Cron-Ausdrücke in Lambda erfordern alle Felder und werden in UTC ausgedrückt. Verwenden Sie den folgenden Cron-Ausdruck, um jeden Tag um 17 Uhr (UTC) eine Funktion auszuführen:

cron(0 17 * * ? *)

Weitere Ressourcen

Anmerkungen

  • Der Name dieses Ereignistyps wurde seit der ersten Veröffentlichung dieser Funktion von "Geplantes Ereignis" in "CloudWatch-Ereignisse - Zeitplan" geändert.
  • Vor der Veröffentlichung dieser Funktion bestand die empfohlene Lösung für dieses Problem (gemäß "Erste Schritte mit AWS Lambda" bei 42 Minuten und 50 Sekunden ) darin , SWF zum Erstellen eines Timers oder zum Erstellen eines Timers mit einer externen Anwendung zu verwenden.
  • Die Lambda-Benutzeroberfläche wurde seit Erscheinen des geplanten Event-Blogposts überarbeitet, und die darin enthaltenen Screenshots sind nicht mehr genau. Die neuesten Revisionen finden Sie in meinen aktualisierten Screenshots oben vom 10.03.2017.

Wissen Sie, ob Hoffnung auf eine 1-minütige Präzisionsunterstützung besteht?
Captan

2
Es ist ein bisschen wie ein Hack, aber Sie können dies für eine Frequenz von 1 Minute tun youtube.com/watch?v=FhJxTIq81AU
ingh.am

4
Ereignisquellentyp ist jetzt "CloudWatch Events - Schedule"
Guy Daher

@ GuyDaher Danke, ich habe meine Antwort entsprechend aktualisiert.
Anthony Neace

3
Es unterstützt jetzt 1min Rate. docs.aws.amazon.com/lambda/latest/dg/…
advncd

18

Seit dem Zeitpunkt dieses Beitrags scheint es eine andere Lösung gegeben zu haben: Planen Sie wiederkehrende AWS-Lambda-Aufrufe mit der unzuverlässigen Stadtuhr (UTC), in der der Autor vorschlägt, das SNS-Thema Unzuverlässige Stadtuhr zu abonnieren . Ich habe weder SWF noch SNS verwendet, aber es scheint mir, dass die SNS-Lösung einfacher ist. Hier ist ein Auszug aus dem Artikel

Unzuverlässige Stadtuhr (UTC)

Die unzuverlässige Stadtuhr (UR) ist ein neues, kostenloses, öffentliches SNS-Thema (Amazon Simple Notification Service), das vierteljährlich eine Glockenspielnachricht an alle Abonnenten sendet. Es kann das Glockenspiel an AWS Lambda-Funktionen, SQS-Warteschlangen und E-Mail-Adressen senden.

Sie können die Glockenspielattribute verwenden, um Ihren Code alle fünfzehn Minuten auszuführen, oder Sie können Ihren Code nur einmal pro Stunde (z. B. wenn Minute == "00") oder einmal pro Tag (z. B. wenn Stunde == "00" und Minute =) ausführen = "00") oder eine andere Reihe von Intervallen.

Sie können sogar eine Funktion abonnieren, die Sie in Zukunft nur noch einmal zu einem bestimmten Zeitpunkt ausführen möchten: Lassen Sie die Funktion alle Aufrufe ignorieren, bis die gewünschte Zeit abgelaufen ist. Wenn es Zeit ist, kann es seinen Job ausführen und sich dann vom SNS-Thema abmelden.

Das Verbinden Ihres Codes mit der unzuverlässigen Stadtuhr ist schnell und einfach. Es ist kein Bewerbungsprozess oder Kontoerstellung erforderlich


9
Keine gültige Antwort mehr. Die unzuverlässige
Stadtuhr

15

NEUE LÖSUNG: Lambda Scheduled Jobs

Werner Vogel hat heute Abend (10/08) bei re: Invent angekündigt, dass AWS Lambda jetzt einen eigenen Scheduler hat.

Siehe den AWS Lambda Release Note am 08.10.2015 :

Sie können AWS Lambda auch so einrichten, dass Ihr Code regelmäßig und geplant über die AWS Lambda-Konsole aufgerufen wird. Sie können eine feste Rate (Anzahl der Stunden, Tage oder Wochen) oder einen Cron-Ausdruck angeben. Ein Beispiel finden Sie unter Exemplarische Vorgehensweise 5: Verwenden von Lambda-Funktionen zum Verarbeiten geplanter Ereignisse (Python) .


ALTE LÖSUNG: Planen mit AWS Data Pipeline

Mit AWS Data Pipeline können Sie eine Aufgabe mit einem bestimmten Zeitraum planen . Die Aktion kann ein beliebiger Befehl sein, wenn Sie Ihre Pipeline mit ShellCommandActivity konfigurieren .

Sie können beispielsweise einen AWS CLI-Befehl ausführen, um:

  • Stellen Sie eine Nachricht an SQS
  • oder direkt eine Lambda-Funktion aufrufen (siehe aufrufen )

Sie können die geplante Aufgabe der AWS Data Pipeline problemlos direkt in der AWS-Konsole erstellen (z. B. mit einem AWS CLI-Befehl):

Geben Sie hier die Bildbeschreibung ein

Sie können auch die API verwenden, um Ihre Planung zu definieren :

{
 "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 : Das minimale Planungsintervall beträgt 15 Minuten.
Preisgestaltung : ca. 1,00 USD pro Monat.


9

So mache ich das:

  • Erstellen Sie Lambda, die:

  • Erstellen Sie einen CloudWatch-Alarm für: ApproximateNumberOfMessagesVisible> 0 für 1 Minute

  • Abonnieren Sie das SNS-Thema für den Alarm
  • Abonnieren Sie Lambda für SNS Topic

Jetzt haben Sie einen Timer mit einer Auflösung von ca. 15 Minuten.

Dann werden andere Lambda-Funktionen für SNS Topic abonniert und alle 15 Minuten aufgerufen.


4
Diese Antwort ist im Grunde eine Anweisung für einen Mechanismus, der die in Shadis Antwort beschriebene unzuverlässige Stadtuhr implementieren kann . Angesichts der Tatsache, dass der Autor von UTC warnt, dass es "jederzeit ohne Vorwarnung verschwinden kann", ist Ihr Ansatz wahrscheinlich weit überlegen.
Brian

Die erste Implementierung - 1 Nachricht - funktioniert einige Tage und stoppt. Es sieht so aus, als würde eine regelmäßige Nachricht einfach nicht an SQS übermittelt. 2 weitere Nachrichten hinzugefügt (3 in Summe) - jetzt funktioniert es bereits eine Woche. In CloudWatch sehe ich regelmäßige Fehler - nur 2 Nachrichten werden zugestellt, der Timer tickt immer noch einwandfrei. Gist wurde aktualisiert gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro

@Brian Als Autor der unzuverlässigen Stadtuhr ( townclock.io ) würde ich zustimmen, dass das Ausführen Ihrer eigenen Uhr Ihnen mehr Kontrolle gibt als von einem Fremden (mir) abhängig zu sein. Tatsächlich ermutige ich die Leute, ihre eigene unzuverlässige Stadtuhr zu betreiben, und habe die Quelle auf GitHub veröffentlicht: github.com/alestic/alestic-unreliable-town-clock
Eric Hammond

4

Da es jetzt leicht möglich ist , Lambda-Funktionen über HTTP auszulösen (z. B. mithilfe von GET oder Curl), besteht eine einfache Lösung darin, einen verwalteten CRON wie easycron zu verwenden: https://www.easycron.com/ , um die Ausführung Ihrer Lambda-Funktion auszulösen.

Wir hatten das gleiche Problem und führten schließlich einen Cron-Dienst in Google App Engine in Python aus, da dies mehr Flexibilität und Komplexität im CRON-Job selbst ermöglichte.


Die Zeiten haben sich geändert und Lambda unterstützt jetzt die Planung von Cron-Typen aus der Box docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
Dirk Conrad Coetsee

2

Auf der Seite Funktion, Trigger hinzufügen, können Sie CloudWatch-Ereignisse hinzufügen und als Zeitplantyp festlegen

Geben Sie hier die Bildbeschreibung ein


1

Sie können es auch mit CloudWatch-Ereignissen planen. Regel erstellen -> Ziel anhängen (Lambda) und Cron / Rate-Zeitplan für Ihre Regel einrichten.


1

Die Webkonsole ist ziemlich einfach. Erstellen Sie einfach eine CloudWatchRegel für das Lambda und fügen Sie sie in die TriggersRegisterkarte des Lambda ein .

Für diejenigen, die das automatisieren müssen, aws clikönnen wir

  1. Erstellen Sie die Funktion,
  2. Erstellen Sie die Regel,
  3. die Erlaubnis erteilen,
  4. Linkregel und Funktion

Funktion erstellen

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}

Regeln erstellen

## 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

Eine einfache Möglichkeit, Ihre Abfrage in Lambda für ein bestimmtes Zeitintervall auszuführen, besteht darin, eine Regel für Ihre Lambda-Funktion festzulegen. Gehen Sie dazu nach dem Erstellen der Lambda-Funktion zu Cloudwatch >> Regeln >> Zeitplan. und definieren Sie den Cron-Ausdruck und wählen Sie im Zielabschnitt die Lambda-Funktion aus, die Sie auslösen möchten.


0

Erstellen Sie beim Erstellen der Lambda-Funktion den Trigger "CloudWatch Events - Schedule".

Jetzt können Sie entweder AWS-Voreinstellungen im Zeitplanausdruck wie rate = 15 min verwenden oder einen Cron-Ausdruck verwenden.

Geben Sie hier die Bildbeschreibung ein

Für Ihre Anforderung lautet der Cron-Zeitplan "0 0 17 1/1 *? *"


-1

Diksha ist AWS Lambda Scheduler basierend auf AWS SWF Trigger, wie vom AWS Team empfohlen . Sie können Jobs mithilfe von Cron-Ausdrücken planen und angeben, wie oft Sie ausgeführt werden möchten, wann Sie beginnen oder wann Sie enden sollen. Sie können den Status sowie den Verlauf geplanter Jobs anzeigen. Die Sicherheit wird durch AWS-Richtlinien verwaltet.

Sobald Sie die Diksha-Engine eingerichtet haben, können Sie Funktionen mithilfe des Cron-Ausdrucks folgendermaßen planen:

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

In diesem Job wird der Job 10 Mal pro Minute ausgeführt. AWS SWF löst die Funktion von selbst aus.

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

Haftungsausschluss: Ich bin Mitwirkender am Projekt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.