Zaplanowane zadania AWS Lambda

145

Amazon ogłosił AWS Lambda ( http://aws.amazon.com/lambda/ ).

Opis produktu zawiera:

Zaplanowane zadania

Funkcje AWS Lambda mogą być wyzwalane przez zewnętrzne zegary zdarzeń, dzięki czemu mogą być uruchamiane w okresach regularnej konserwacji lub poza godzinami szczytu. Na przykład można wyzwolić funkcję AWS Lambda, aby co noc czyściła archiwum w godzinach wolnych od ruchu.

Kiedy to przeczytałem, zrozumiałem, że w końcu mogę znaleźć sposób na konsekwentne wykonywanie zadań „podobnych do cronów”. Chcę uruchamiać konkretne zapytanie codziennie o 17:00, powiedzmy.

Jednak nie znajduję tego nigdzie w dokumentacji. Wspominają tylko o wyzwalaczach zdarzeń programowych lub zdarzeniach z innych usług AWS.

Czy źle zrozumiałem? Czy może ktoś wskazać mi dokumentację?

Nathan H.
źródło

Odpowiedzi:

159

Natywna obsługa zaplanowanych wydarzeń została dodana 8 października 2015 r .:

Jak ogłoszono w tym poście na blogu AWS , planowanie jest teraz obsługiwane jako typ źródła zdarzeń (zwane również wyzwalaczami) o nazwie „ CloudWatch Events - Schedule ” i może być wyrażone jako szybkość lub wyrażenie cron.

Dodaj zaplanowane wydarzenie do nowej lambdy

Przejdź do etapu tworzenia „Konfiguruj wyzwalacze” i określ wyzwalacz „Zdarzenie CloudWatch - Harmonogram”. Przykładowa konfiguracja poniżej:

Obraz przedstawiający konfigurację tworzenia zaplanowanego wydarzenia o godzinie 17:00 czasu UTC.

Dodaj zaplanowane wydarzenie do istniejącej lambdy

Przejdź do zakładki „Wyzwalacze” swojej lambda, wybierz „Dodaj wyzwalacz” i określ wyzwalacz „Zdarzenie CloudWatch - Harmonogram”. Przykładowy zrzut ekranu, na którym mam istniejącą lambdę z wyzwalaczem SNS:

Obraz, który pokazuje, jak nawigować w celu dodania interfejsu użytkownika wyzwalacza z konsoli Lambda.

Po załadowaniu interfejs użytkownika służący do konfigurowania tego wyzwalacza jest identyczny z zrzutem ekranu w powyższej sekcji „Dodaj zaplanowane zdarzenie do nowej sondy lambda” powyżej.

Dyskusja

W swoim przykładowym przypadku będziesz chciał użyć cron()zamiast rate(). Wyrażenia Crona w lambdzie wymagają wszystkich pól i są wyrażane w czasie UTC. Aby więc uruchamiać funkcję codziennie o 17:00 (UTC), użyj następującego wyrażenia cron:

cron(0 17 * * ? *)

Dalsze zasoby

Uwagi

  • Nazwa tego typu zdarzenia została zmieniona z „Zaplanowane wydarzenie” na „CloudWatch Events - Schedule” od czasu wprowadzenia tej funkcji po raz pierwszy.
  • Przed udostępnieniem tej funkcji zalecanym rozwiązaniem tego problemu (zgodnie z opisem „Rozpoczynanie pracy z AWS Lambda” przy 42 min i 50 s ) było użycie SWF do utworzenia timera lub do stworzenia timera z zewnętrzną aplikacją.
  • Interfejs użytkownika Lambda został zmieniony od czasu opublikowania wpisu na blogu zaplanowanego wydarzenia, a zrzuty ekranu w nim nie są już dokładne. Zobacz moje zaktualizowane zrzuty ekranu powyżej z 10.03.2017, aby zapoznać się z najnowszymi poprawkami.
Anthony Neace
źródło
Czy wiesz, czy jest nadzieja na 1-minutowe precyzyjne wsparcie?
kaptan
2
Trochę hack, ale możesz to zrobić przez 1 minutę youtube.com/watch?v=FhJxTIq81AU
ingh.am
4
Typ źródła zdarzenia to teraz „CloudWatch Events - Schedule”
Guy Daher
@GuyDaher Dziękuję, odpowiednio zaktualizowałem moją odpowiedź.
Anthony Neace
3
Obsługuje teraz stawkę 1 min. docs.aws.amazon.com/lambda/latest/dg/ ...
advncd
18

Wydaje się, że od czasu tego postu pojawiło się inne rozwiązanie: Zaplanuj powtarzające się wywołania lambda AWS z nierzetelnym zegarem miejskim (UTC), w którym autor proponuje subskrybowanie tematu SNS Unreliable Town Clock . Nie używałem ani SWF, ani SNS, ale wydaje mi się, że rozwiązanie SNS jest prostsze. Oto fragment artykułu

Nierzetelny zegar miejski (UTC)

Nierzetelny zegar miejski (UTC) to nowy, bezpłatny, publiczny temat SNS (Amazon Simple Notification Service), który co kwadrans wysyła wiadomość „gong” do wszystkich abonentów. Może wysyłać dzwonki do funkcji AWS Lambda, kolejek SQS i adresów e-mail.

Możesz użyć atrybutów gongu, aby uruchamiać swój kod co piętnaście minut lub uruchamiać kod tylko raz na godzinę (np. Gdy minuta == "00") lub raz dziennie (np. Gdy godzina == "00" i minuta = = „00”) lub dowolną inną serię interwałów.

Możesz nawet zasubskrybować funkcję, którą chcesz uruchamiać tylko raz w określonym czasie w przyszłości: niech funkcja ignoruje wszystkie wywołania, dopóki nie będzie po czasie, którego chce. Kiedy nadejdzie czas, może wykonać swoje zadanie, a następnie wypisać się z tematu SNS.

Podłączenie kodu do Unreliable Town Clock jest szybkie i łatwe. Nie jest wymagany proces składania wniosków ani tworzenie konta

shadi
źródło
9
Nie ma już prawidłowej odpowiedzi.
Nierzetelny
15

NOWE ROZWIĄZANIE: Zaplanowane zadania Lambda

Werner Vogel ogłosił dziś wieczorem (10/08) na re: Invent, że AWS Lambda ma teraz swój własny harmonogram.

Zobacz informację o wydaniu AWS Lambda 08.10.2015 :

Możesz również skonfigurować AWS Lambda, aby wywoływał Twój kod regularnie, zgodnie z harmonogramem, używając konsoli AWS Lambda. Możesz określić stałą stawkę (liczbę godzin, dni lub tygodni) lub możesz określić wyrażenie cron. Na przykład zobacz Przewodnik 5: Używanie funkcji Lambda do przetwarzania zaplanowanych zdarzeń (Python) .


STARE ROZWIĄZANIE: Szeregowanie za pomocą AWS Data Pipeline

Możesz użyć AWS Data Pipeline, aby zaplanować zadanie w danym okresie. Akcją może być dowolne polecenie podczas konfigurowania potoku za pomocą ShellCommandActivity .

Możesz na przykład uruchomić polecenie AWS CLI, aby:

  • Wyślij wiadomość do SQS
  • lub bezpośrednio wywołaj funkcję Lambda (zobacz invoke )

Możesz łatwo utworzyć zaplanowane zadanie AWS Data Pipeline bezpośrednio w konsoli AWS (np. Za pomocą polecenia AWS CLI):

wprowadź opis obrazu tutaj

Możesz również użyć interfejsu API do zdefiniowania harmonogramu:

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

Limity : minimalny interwał planowania to 15 minut.
Ceny : około 1,00 USD miesięcznie.

Yves M.
źródło
9

Oto jak to robię:

  • Utwórz lambdę, która:

  • Utwórz alarm CloudWatch dla: ApproximateNumberOfMessagesVisible> 0 przez 1 minutę

  • Subskrybuj temat SNS do alarmu
  • Subskrybuj Lambda do tematu SNS

Teraz masz zegar z rozdzielczością około 15 minut.

Następnie inne funkcje Lambda są subskrybowane w temacie SNS i wywoływane co 15 minut.

maplpro
źródło
4
Ta odpowiedź to w zasadzie instrukcje dotyczące jednego mechanizmu, który może zaimplementować nierzetelny zegar miejski opisany w odpowiedzi Shadiego . Biorąc pod uwagę, że autor UTC ostrzega, że ​​„może zniknąć w dowolnym momencie bez ostrzeżenia”, Twoje podejście jest prawdopodobnie znacznie lepsze.
Brian,
Pierwsza realizacja - 1 wiadomość - działa kilka dni i zatrzymuje się. Wygląda na to, że od czasu do czasu wiadomość nie jest dostarczana do SQS. Dodano 2 kolejne wiadomości (w sumie 3) - teraz działa już tydzień. W CloudWatch widzę okresowe chybienia - tylko 2 wiadomości dostarczone, nadal zegar odmierza czas. Gist został zaktualizowany gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro
@Brian Jako autor Unreliable Town Clock ( townclock.io ) zgadzam się, że prowadzenie własnego daje większą kontrolę niż poleganie na kimś obcym (mnie). W rzeczywistości zachęcam ludzi do uruchomienia własnego Unreliable Town Clock i opublikowania źródła na GitHub: github.com/alestic/alestic-unreliable-town-clock
Eric Hammond
4

Ponieważ teraz można łatwo wyzwalać funkcje lambda przez HTTP (np. Za pomocą GET lub curl), prostym rozwiązaniem jest użycie zarządzanego CRON, takiego jak easycron: https://www.easycron.com/, aby uruchomić funkcję lambda.

Mieliśmy ten sam problem i skończyło się na uruchomieniu usługi cron w Google App Engine w Pythonie, ponieważ pozwoliło to na większą elastyczność i złożoność samego zadania CRON.

Dirk Conrad Coetsee
źródło
Czasy się zmieniły i Lambda obsługuje teraz planowanie typu cron w pudełku docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
Dirk Conrad Coetsee,
2

Na stronie Funkcja, Dodaj wyzwalacz, możesz dodać zdarzenia CloudWatch i ustawić je jako typ harmonogramu

wprowadź opis obrazu tutaj

Daria Yu
źródło
1

Możesz zaplanować to również za pomocą wydarzeń w chmurze. Utwórz regułę -> dołącz cel (lambda) i skonfiguruj mądry harmonogram cron / rate dla swojej reguły.

Jasio
źródło
1

Sposób konsoli internetowej jest dość prosty. Po prostu utwórz CloudWatchregułę dla lambdy i dodaj ją w Triggerszakładce lambda .

Dla tych, którzy muszą to zautomatyzować aws cli, możemy

  1. stworzyć funkcję,
  2. utwórz regułę,
  3. udzielić pozwolenia,
  4. zasada i funkcja łącza

Utwórz funkcję

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}

Twórz reguły

## 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"}]'
LeOn - Han Li
źródło
1

Prostym sposobem na uruchomienie zapytania w lambdzie dla określonego przedziału czasu jest ustawienie reguły dla funkcji lambda. w tym celu po utworzeniu funkcji lambda przejdź do Cloudwatch >> Rules >> Schedule. i zdefiniuj wyrażenie cron, aw sekcji docelowej wybierz funkcję lambda, którą chcesz wyzwolić.

PKP
źródło
0

Podczas tworzenia funkcji lambda utwórz wyzwalacz „CloudWatch Events - Schedule”

Teraz możesz użyć presetów AWS w wyrażeniu harmonogramu, na przykład rate = 15 min, lub możesz użyć wyrażenia cron.

wprowadź opis obrazu tutaj

Dla twojego wymagania harmonogram Cron to „0 0 17 1/1 *? *”

AMS
źródło
-1

Diksha to AWS Lambda Scheduler oparty na AWS SWF Trigger zgodnie z zaleceniami AWS Team . Można zaplanować zadania za pomocą wyrażeń crona, a także określić, ile czasu chcesz uruchomić, kiedy rozpocząć lub kiedy zakończyć. Możesz wyświetlić stan, a także historię zaplanowanych zadań. Bezpieczeństwo jest zarządzane przez zasady AWS.

Po skonfigurowaniu silnika diksha możesz zaplanować funkcje za pomocą wyrażenia cron w następujący sposób:

java -jar diksha-client-0.0.1.jar -lcfg cf1 -cj "nazwa_zadania | nazwa_funkcji | kontekst | 0 0-59 * * * * | 10"

W tym zadaniu zadanie będzie uruchamiane co minutę 10 razy. AWS SWF sam uruchomi funkcję.

Szczegóły: https://github.com/milindparikh/diksha

Zastrzeżenie: Jestem współtwórcą projektu.

Nehal Mehta
źródło