Führen Sie die geplante Aufgabe in AWS ohne Cron aus

72

Derzeit habe ich einen einzigen Server in Amazon, auf dem ich alle meine Cronjobs platziere. Ich möchte diesen einzelnen Fehlerpunkt beseitigen und alle meine Aufgaben als Webdienste verfügbar machen. Ich möchte die Dienste hinter einer VPC-ELB einigen Servern zugänglich machen, auf denen die Aufgaben ausgeführt werden, wenn sie aufgerufen werden.

Gibt es einen Dienst, den Amazon (AWS) anbietet, der in wiederkehrenden Intervallen einen wiederkehrenden Job ausführen kann (wirklich einen Webservice aufrufen)? Ich möchte wirklich in der Lage sein, die Cron-Funktionalität in Bezug auf die Zeit- / Tagesspezifikation beizubehalten, aber die HA des Treibers (das Endpunkte zum richtigen Zeitpunkt aufruft) an AWS weiterzuleiten.

Ich mag, wie SQS Web-Endpunkte anbietet, aber soweit ich das beurteilen kann, kann ich sie nicht planen. SWF scheint auch nicht gut zu passen.

rynop
quelle

Antworten:

68

AWS kündigte auf seiner Konferenz re: Invent 2015 die Unterstützung für geplante Funktionen in Lambda an. Mit dieser Funktion können Benutzer Lambda-Funktionen planmäßig mit einer Cron-ähnlichen Syntax ausführen. Die Lambda-Dokumente zeigen ein Beispiel für die Verwendung von Python zum Ausführen geplanter Ereignisse.

Derzeit beträgt die Mindestauflösung, mit der ein geplantes Lambda ausgeführt werden kann, 1 Minute (wie bei cron, jedoch nicht so feinkörnig wie bei systemd-Timern).

Das Lambder- Projekt hilft, die Verwendung geplanter Funktionen auf Lambda zu vereinfachen.

Das Cron-Beispiel von λ Gordon bietet möglicherweise die einfachste Schnittstelle für die Bereitstellung geplanter Lambda-Funktionen.


Ursprüngliche Antwort, für die Nachwelt gespeichert.

Wie Eric Hammond und andere angegeben haben, gibt es keinen nativen AWS-Service für geplante Aufgaben. Es gibt nur Problemumgehungen und halbe Lösungen, wie in anderen Antworten erwähnt.

So fassen Sie die aktuellen Optionen zusammen:

  • Die Einzelinstanz-Autoscale-Gruppe, die nach einem Zeitplan gestartet und gestoppt wird, wie von Eric Hammond beschrieben.
  • Verwenden eines Simple Workflow Service-Timers , der überhaupt nicht intuitiv ist. In dieser Fallstudie wird erwähnt, dass JPL SWF zum Erstellen eines verteilten Cron verwendet hat, es gibt jedoch keine Implementierungsdetails. Es gibt auch einen Verweis auf ein Codebeispiel, das in den SWF-Codebeispielen vergraben ist.
  • Führen Sie es selbst mit etwas wie Cronlock aus .
  • Verwenden Sie so etwas wie die unzuverlässige Stadtuhr (UTC) , um Lambda-Funktionen nach einem Zeitplan auszuführen. Denken Sie daran, dass Lambda derzeit nicht auf Ressourcen innerhalb einer VPC zugreifen kann

Hoffentlich kommt bald eine bessere Lösung.

Ben Whaley
quelle
Vielen Dank für die Bereitstellung der aktualisierten Details. Hoffentlich arbeitet Amazon an einem neuen Dienst, der dieses Problem in Zukunft lösen wird.
Thatidiotguy
2
@thatidiotguy Falls Sie die Ankündigung nicht gesehen haben, behebt AWS Lambda jetzt diese Lücke. Antwort entsprechend aktualisiert.
Ben Whaley
2
Lambda muss die Arbeit nicht erledigen. Wenn Sie mit dem Lambda ein SQS erstellt haben, das den Job auf einem Ihrer Server auslösen kann, können Sie das Problem umgehen, dass Lambda nicht in einer VPC ausgeführt werden kann.
Thomas Redstone
16

Einführung in Ereignisse in AWS Cloudwatch

Sie können nach Minuten, Stunden, Tagen oder mithilfe des CRON-Ausdrucks über die Konsole und ohne Lambda oder Programmierung planen.

Ich habe gerade meine ASP.net-WEB-API (HTTP-Post) mit dem SNS-HTTP-Endpunkt so geplant, dass sie jede Minute ausgeführt wird, und sie funktioniert einwandfrei.

Geben Sie hier die Bildbeschreibung ein

Vikash Rathee
quelle
Dies scheint großartig, um die Lambda-Funktion aufzurufen.
Athar
Ich hatte eine Methode entworfen, die von einem Scheduler auf einer Single Instance Beanstalk aufgerufen wurde. Als die Zeit gekommen war, zu einer ELB zu wechseln, musste ich einen Weg finden, um die vom Scheduler nur eine aufgerufene Methode zu erhalten. Ich denke, das wird funktionieren: Cron-Job, der SNS auslöst, trifft einen Endpunkt, der die Methode aufruft, die früher vom Scheduler aufgerufen wurde!
Payne
7

Gibt es einen von Amazon (AWS) angebotenen Dienst, mit dem ein wiederkehrender Job in festgelegten Intervallen ausgeführt werden kann?

Dies ist einer der wenigen Fehlerpunkte, die Menschen (einschließlich mir) beim Entwerfen von Architekturen mit AWS immer wieder erwähnen. Bis Amazon es mit einem Service löst, habe ich einen Hack veröffentlicht, der von einigen Unternehmen aktiv genutzt wird.

AWS Auto Scaling kann Instanzen mithilfe eines wiederkehrenden Zeitplans ausführen und beenden, der im Cron-Format angegeben ist.

http://docs.amazonwebservices.com/AutoScaling/latest/APIReference/API_PutScheduledUpdateGroupAction.html

Sie können die Instanz beim Start automatisch einen Prozess ausführen lassen.

Wenn Sie nicht wissen, wie lange der Job dauern wird, können Sie die Einstellungen so vornehmen, dass Ihr Job die Instanz nach Abschluss beendet.

Hier ist ein Artikel, den ich geschrieben habe und der die genauen Befehle beschreibt, die zum Einrichten erforderlich sind:

Ausführen von EC2-Instanzen nach einem wiederkehrenden Zeitplan mit automatischer Skalierung
http://alestic.com/2011/11/ec2-schedule-instance

Das Starten einer ganzen Instanz, nur um eine Reihe von Jobs zu starten, scheint ein bisschen übertrieben zu sein, aber wenn es sich um ein t1.micro handelt, kostet es nur ein paar Cent.

Das t1.micro muss auch nicht die eigentliche Arbeit erledigen. Ihre Instanz kann Nachrichten in SQS oder über SNS einfügen, sodass die anderen redundanten Server die Aufgaben übernehmen.

Eric Hammond
quelle
Dies funktioniert für einen Cron. Es erhöht jedoch die Komplexität und die Kosten, wenn Sie mehrere solcher Jobs in unterschiedlichen Intervallen ausführen müssen.
Wasif
Ja, ich stimme Eric zu. Dies ist eines der häufigsten Probleme, auf die ich mit AWS stoße. Sie haben viele gute Services, aber dies ist eine Sache, die in AWS wirklich fehlt. Das heißt nicht, dass einer der anderen Cloud-Anbieter eine bessere Alternative bietet.
Bwight
Ja, ich habe darüber nachgedacht, etwas Ähnliches zu tun, aber es ist nicht so robust, wie ich es brauche / will. Neugierig, würden Sie AWS-Power-User bereit sein, für eine Software als Service zu bezahlen, der dieses Problem gelöst hat? Ich weiß, dass ich etwas machen könnte, das einige zusätzliche aws-spezifische Integration hat, und mich nur frage, ob es die Investition in Zeit / $ wert ist. Ich dachte, das Preis- / Busmodell würde in Anlehnung an pingdom.com
rynop
@mwasif: Wenn Sie jeden Tag 20 Cron-Jobs ausführen müssen, können Sie diese in einem einzigen geplanten Ereignis stapeln, sodass eine Instanz alle auslöst. Wenn Sie viele verschiedene Zeitpläne haben, ist es möglicherweise billiger, nur eine Vollzeitinstanz auszuführen. Sie können die automatische Skalierung verwenden, um sicherzustellen, dass die Instanz ersetzt wird, wenn sie fehlschlägt.
Eric Hammond
@rynop: Inwiefern ist dieser Ansatz nicht robust für Ihre Bedürfnisse?
Eric Hammond
3

Klingt so, als wäre dies für Sie nützlich: http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-using-task-runner.html

Task Runner ist eine Task-Agent-Anwendung, die AWS Data Pipeline nach geplanten Aufgaben abfragt und diese auf Amazon EC2-Instanzen, Amazon EMR-Clustern oder anderen Rechenressourcen ausführt und dabei den Status meldet. Abhängig von Ihrer Anwendung können Sie Folgendes wählen:

  • Ermöglichen Sie AWS Data Pipeline, eine oder mehrere Task Runner-Anwendungen für Sie auf Rechenressourcen zu installieren und zu verwalten, die automatisch verwaltet werden. In diesem Fall müssen Sie Task Runner nicht wie in diesem Abschnitt beschrieben installieren oder konfigurieren. Dies ist die empfohlene Konfiguration.

  • Installieren und konfigurieren Sie Task Runner manuell auf einer Rechenressource wie einer lang laufenden EC2-Instanz oder einem physischen Server. Verwenden Sie dazu die in diesem Abschnitt beschriebenen Verfahren.

  • Entwickeln und installieren Sie einen benutzerdefinierten Task-Agenten anstelle von Task Runner. Die Vorgehensweise hierfür hängt von der Implementierung des benutzerdefinierten Task-Agenten ab.

Joe Zack
quelle
Markierung als korrekt aufheben. Nachdem ich endlich die Zeit bekommen habe, mich wirklich mit diesem Problem zu befassen, scheint die Datenpipeline mein spezifisches Problem nicht zu lösen. Es ist gut zum Einrichten eines nicht variablen Zeitplans. Aufgaben wie das tägliche Sichern der Dynamotabelle. Ein System, das viele (Tausende) verschiedener Jobs (sogenannte Aktivitäten) erfordert, die alle zu unterschiedlichen Zeiten mit unterschiedlichen "Parametern" ausgeführt werden, wäre meiner Meinung nach unhaltbar.
Rynop
3

Amazon hat Lambda letztes Jahr für NodeJS eingeführt. Gestern hat Amazon die Funktionen Geplante Funktionen, VPC-Unterstützung und Python-Unterstützung hinzugefügt.

Durch die Nutzung der geplanten Funktion kann ein ordnungsgemäßer Ersatz für CRON erreicht werden.

Weitere Informationen - http://aws.amazon.com/lambda/details/

Geben Sie hier die Bildbeschreibung ein

Naveen Vijay
quelle
Vielen Dank dafür. Gibt es Nachteile bei der Verwendung der geplanten Funktionen?
Goke Obasa
Geplante Funktionen? @AdegokeObasa Könnten Sie bitte näher erläutern, was Sie unter "Geplante Funktionen" verstehen?
Naveen Vijay
Entschuldigung, ich meinte geplante Veranstaltungen
Goke Obasa
Immer noch nicht klar :) Erwähnen Sie CloudWatch-Ereignisse?
Naveen Vijay
Ja, ich habe gefragt, ob die Verwendung der geplanten Cloudwatch-Ereignisse Nachteile hat. Es tut mir leid, dass ich nicht klar genug war.
Goke Obasa
0

CloudWatch-Ereignisse sind großartig, aber ihre Anzahl ist begrenzt . Wenn Sie eine Skala benötigen und bereit sind, auf die Präzision zu verzichten, können Sie die TTL von DynamoDB als Timer verwenden.

Die Idee ist, Elemente in eine DynamoDB-Tabelle einzufügen, deren TTL auf die Zeit festgelegt ist, zu der Sie eine Aufgabe ausführen müssen. DynamoDB löscht diese Elemente irgendwo um die angegebene Zeit (innerhalb von 48 Stunden nach Ablauf). Diese gelöschten Elemente werden im DynamoDB-Stream angezeigt, der einer Tabelle zugeordnet ist. Eine Lambda-Funktion könnte den Stream abhören und bei den Löschungen geeignete Maßnahmen ergreifen.

Lesen Sie mehr in " DynamoDB TTL als Ad-hoc-Planungsmechanismus " von theburningmonk.com.

verrückter Kopf
quelle
0

Ab August 2020 hat Amazon die Lambda / CloudWatch-Ereignisse auf einen Dienst namens EventBridge ( https://aws.amazon.com/eventbridge/ ) verschoben . Es wurde im Juli 2019 nach den meisten Antworten auf diese Frage gestartet.

Hodgson
quelle
-2

Die AWS Elastic Load Balancers pingen Ihre Instanzen an, um zu überprüfen, ob sie fehlerfrei sind. Sie können dem Skript, das die ELB anpingt, Ihre Cron-ähnlichen Aufgaben hinzufügen, die sehr regelmäßig ausgeführt werden.

Sie möchten eine Logik hinzufügen, damit jede Aufgabe die richtige Anzahl von Malen und im richtigen Intervall ausgeführt wird. Dies kann jedoch mit einer Datenbanktabelle erreicht werden, die die Ausführung verfolgt. Jedes Mal, wenn die ELB Ihren Server anpingt, überprüft Ihr Server die Datenbank, um festzustellen, ob ein Job aussteht, und führt diesen Job dann aus.

Die ELB läuft ab, wenn die Ausführung des Skripts zu lange dauert. Daher ist es wichtig, keine Situation zu erstellen, in der die Überprüfung der Cron-Aufgaben durch die Überprüfung der ELB-Integrität viele Sekunden dauert. Um dies zu überwinden, können Sie den AWS Simple Notification Service einsetzen. Ihr ELB-Integritätsprüfungsskript kann einfach eine Nachricht in einem SNS-Thema veröffentlichen, und dieses Thema kann die Nachricht dann über eine HTTP-Anforderung an Ihren Webserver senden.

Mit anderen Worten: ELB pingt Ihre EC2-Instanz an ... Die EC2-Instanz sucht nach ausstehenden Jobs und sendet eine Nachricht an SNS, falls welche gefunden werden ... SNS benachrichtigt Ihre App über HTTP ... Der HTTP-Aufruf von SNS verarbeitet die tatsächlich Cron-Job

Travis Austin
quelle
5
Es wäre einfacher, nur Cron, Chronos oder Quartz auf der Maschine einzurichten.
eSniff
1
Ja, guter Punkt. Ob ELB oder Cron regelmäßig feuern, spielt keine Rolle. Du hast recht. Meine Antwort ist eine viel zu komplizierte Lösung. :-)
Travis Austin