Lucrările Cron sunt de obicei utilizate pentru a programa comenzi la un anumit moment. Le puteți utiliza pentru activități precum executarea copiilor de rezervă, monitorizarea stării sistemului sau executarea sarcinilor de întreținere a sistemului.

Lucrările Cron sunt un utilitar util pentru administratorii de sistem. Și când administrați un sistem în cloud, joburile cron sunt încă foarte utile – trebuie totuși să efectuați o mulțime de sarcini administrative pe sistemele dvs.

O modalitate de a rula joburi cron în cloud este utilizarea unei funcții ca serviciu (FaaS), cum ar fi Lambda în ecosistemul AWS.

Funcțiile se execută atunci când sunt declanșate pentru a face acest lucru și rulează cod în cloud fără a fi nevoie să provizioneze sau să întrețină nicio infrastructură. De asemenea, funcțiile pot fi configurate pentru a rula la un anumit moment sau cu o anumită periodicitate, cum ar fi joburile cron tradiționale.

În această postare de blog, voi folosi ecosistemul AWS pentru a vă arăta un exemplu concret despre cum să creați un job cron folosind o funcție în cloud.

Evenimente Amazon CloudWatch

Pentru a utiliza o funcție Lambda ca job cron, trebuie să înțelegem evenimentele Amazon CloudWatch.

Evenimentele Amazon CloudWatch sunt trimise atunci când există modificări în resursele AWS. Aceste evenimente pot declanșa o funcție AWS Lambda. Când resursele dvs. AWS își schimbă starea, acestea trimit automat evenimente CloudWatch la fluxul de evenimente.

Prin urmare, puteți crea o regulă care declanșează o anumită funcție Lambda atunci când se întâmplă ceva. De exemplu, puteți invoca automat o funcție Lambda atunci când există o modificare într-un grup AutoScaling.

În plus, evenimentele CloudWatch pot invoca o funcție Lambda pentru a se executa în mod regulat. Și în acest fel puteți avea, de exemplu, o funcție Lambda care vă oprește toate instanțele de testare și dezvoltare EC2 după ora 18:00 și alta care le activează după ora 8:00.

Cron Job AWS Lambda Functions Tutorial Cum sa programati
Când există o schimbare într-un grup de autoscalare, evenimentul de ceas cloud generat declanșează o funcție Lambda

Configurarea demonstrației

Vreau să vă arăt un exemplu de funcție Lambda care poate efectua acțiuni pe instanțele dvs. EC2. Voi folosi AWS SAM să definesc funcția mea Lambda ca infrastructură ca cod.

Dacă doriți să încercați această demonstrație, trebuie să aveți un cont AWS și una sau mai multe instanțe EC2 configurate în contul dvs. AWS. Acestea sunt cele pe care le vom manipula din funcțiile Lambda. Instanțele EC2 sunt versiunea AWS a mașinilor virtuale din cloud.

Puteți încerca demo-ul AWS Cloud9 IDE (un IDE bazat pe browser), deoarece AWS SAM este deja configurat în acel IDE. Dacă doriți să știți cum să utilizați AWS Cloud9 IDE pentru a opera funcțiile Lambda, puteți verifica acest lucru video.

În acest exemplu, vom porni și opri instanțele EC2 folosind două AWS Lambdas diferite care se declanșează la un moment dat. Începem instanțele la 8am în fiecare zi și le oprim la 6pm când ziua se termină.

Pentru aceasta, vom folosi un eveniment CloudWatch pentru a declanșa Lambda la momentul potrivit și, de asemenea, AWS SDK pentru a efectua operațiunile în instanțe.

1612124649 357 Cron Job AWS Lambda Functions Tutorial Cum sa programati
La un anumit moment este declanșată o funcție Lambda care va funcționa pe un set de instanțe EC2

Codul finalizat pentru acest exemplu este disponibil în acest document GitHub repertoriu. Pentru ca acest cod să funcționeze în AWS Cloud9 IDE, trebuie configurați-vă contul GitHub în IDE pentru a putea clona proiectul și apoi clona-l în interiorul IDE.

Când aveți gata, rulați această comandă în directorul clonat:

$ sam deploy --guided

Când executați acea comandă, veți primi un set de întrebări la care trebuie să răspundeți pentru a configura acest proiect să ruleze cu succes.

Cron Job AWS Lambda Functions Tutorial Cum sa programati
Cum să implementați proiectul în cloud folosind AWS SAM CLI

Primul lucru pe care trebuie să-l definiți este un Nume pentru proiectul dumneavoastră. Apoi veți seta regiune unde este implementat – alegeți același loc în care sunt instanțele dvs. EC2. Apoi, trebuie să oferim scriptul deploy a lista cazurilor că vrem să manipulăm. Și apoi am terminat – va implementa proiectul în contul nostru AWS.

Definirea funcției AWS Lambda

Primul lucru pe care vreau să-l arăt este modul în care definim o funcție AWS Lambda care se declanșează într-un anumit timp folosind AWS SAM. Această definiție va fi în fișierul numit „template.yml”.

1612124651 771 Cron Job AWS Lambda Functions Tutorial Cum sa programati
AWS SAM al funcției StartInstance

Așa arată o funcție. Să ne uităm la liniile importante:

Prima linie este numele funcției, în acest caz „StartInstanceFunction”.

Apoi avem „Proprietăți” definiție. Prima proprietate este „Handler”. Aici vom specifica modulul (fișierul) unde se află codul care trebuie executat și apoi metoda din interiorul acelui modul.

Și apoi avem „CodeUri”, Care este calea care vă arată unde să găsiți acel fișier. În acest caz, codul nostru va fi în cadrul unui director numit „cron” într-un fișier numit „handler.js” și într-o metodă numită „startInstance”.

După aceea avem „Runtime” definiție. Voi folosi NodeJS versiunea 12, dar puteți folosi Python, Java, Go, C # sau orice altceva care vă face fericit. Lambda acceptă mai multe runtime ieșit din cutie și îți poți aduce propriul timp de rulare dacă doriți să.

Apoi avem „Mediu inconjurator”Definiție pe care o vom folosi pentru a defini singura variabilă de mediu. Această variabilă ne va permite să trimitem codului dinamic diferite instanțe ID, în funcție de configurație atunci când vom implementa.

După aceea avem o secțiune numită „Politici”Unde definim permisiunile pe care le va avea această funcție Lambda.

Este important să știm că toate funcțiile Lambda sunt create fără permisiuni. Asta înseamnă că nu pot face nimic cu alte resurse AWS.

Pentru ca această funcție Lambda să înceapă o instanță EC2, are nevoie de permisiuni pentru a face acea acțiune specială asupra acelei resurse AWS. În această politică specială acordăm permisiuni pentru a porni TOATE instanțele EC2 din acest cont AWS. ALL este reprezentat cu „*” în secțiunea resurse.

Dacă aveți această bucată de cod care rulează în producție, vă recomand să limitați resursele exact la cele pe care doriți să le poată începe această Lambda.

Și, în sfârșit, ultima secțiune este „Evenimente” secțiune. Aici vom defini modul în care această funcție Lambda va fi declanșată. Această funcție va fi declanșată cu un eveniment CloudWatch programat care declanșează Lambda în fiecare zi la 8 dimineața. Practic la 8 în fiecare zi va porni toate instanțele EC2 pe care le specificați.

Există multe reguli pentru a forma această expresie cron: de exemplu, pentru a spune că doriți ca aceasta să ruleze doar de luni până vineri, scrieți cron (0 8? * MON-FRI *). Puteți găsi mai multe informații pe site-ul de documentare al evenimentelor CloudWatch aici: https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents-expressions.html.

Codificarea funcției AWS Lambda

Acum că am definit funcția Lambda, trebuie să îi oferim un anumit cod. În dosarul „cron”, în fișierul „handler.js”, trebuie să adăugăm metoda numită „startInstance”Care arată astfel:

1612124651 58 Cron Job AWS Lambda Functions Tutorial Cum sa programati
Codul funcției startInstance

Această metodă va fi apelată atunci când funcția este declanșată în fiecare zi la 8 dimineața. Va primi lista instanțelor EC2 dintr-o variabilă de mediu pe care am trecut toate ID-urile instanțelor în timpul implementării. Apoi va crea o serie de ele.

Când are acest lucru, va apela AWS SDK și va trimite matricea de instanțe id ca parametru. Și dacă există vreo eroare, aceasta o va înregistra și va completa. Imediat după ce Lambda a terminat execuția, puteți merge la consola EC2 și a vedea cum se activează instanțele dvs.

1612124651 242 Cron Job AWS Lambda Functions Tutorial Cum sa programati
Instanțele EC2 pornesc automat când funcția Lambda se execută

Funcția de a dezactiva instanțele EC2 este foarte similară cu câteva diferențe. Puteți găsi codul pentru funcția respectivă în aceasta legătură și verifică-l.

Rularea jobului cron

Pentru a rula acest job cron, nu mai sunt multe de făcut. După ce cele două funcții sunt implementate în contul dvs. AWS, în aceeași regiune cu instanțele dvs., acestea vor executa și vor face ceea ce au fost programate să facă.

1612124652 173 Cron Job AWS Lambda Functions Tutorial Cum sa programati
Funcții AWS Lambda pentru pornirea și oprirea instanțelor implementate în contul meu AWS

Acum trebuie să așteptați până la 8am sau 6pm pentru a vedea dacă funcționează. Sau dacă doriți să îl testați chiar acum, schimbați ora evenimentului din definiția Lambda la o oră care funcționează pentru dvs. Asigurați-vă că instanța este activată dacă intenționați să le opriți sau invers, astfel încât să puteți vedea modificările.

Acum așteptați și vedeți ce se întâmplă în consola EC2. Imediat după momentul în care ați configurat, veți vedea cum instanța se oprește sau se aprinde și apoi faceți opusul la cealaltă dată când configurați. Acest lucru va rămâne veșnic până când veți elimina funcțiile Lambda.

Curățarea contului dvs. AWS

După finalizarea acestei demonstrații, vă recomand să opriți (sau să eliminați instanța pe care ați creat-o pentru a testa) și să eliminați funcțiile Lambda pe care tocmai le-ați creat.

Eliminarea funcțiilor lambda este la fel de ușoară ca accesarea serviciului CloudFormation din consola de administrare AWS și eliminarea stivei de resurse create de AWS SAM.

De asemenea, nu uitați să încheiați și să eliminați instanțele EC2 dacă le-ați creat pentru această demonstrație.

1612124653 735 Cron Job AWS Lambda Functions Tutorial Cum sa programati
Cum să eliminăm funcțiile AWS Lambda pe care le-am creat în această demonstrație

A concluziona

Funcțiile AWS Lambda sunt un instrument foarte util pentru a efectua tot felul de sarcini în contul dvs. AWS. Practic puteți primi notificări cu privire la orice modificare a resurselor AWS prin intermediul evenimentelor CloudWatch și apoi puteți accesa aproape toate serviciile folosind AWS SDK. Astfel, puteți efectua tot felul de sarcini de întreținere și sarcini automate pe infrastructura dvs.

Mulțumesc pentru lectură.

Sunt Marcia Villalba, avocat dezvoltator pentru AWS și gazda unui canal de YouTube numit FooBar, unde am peste 250 de tutoriale video despre Serverless, AWS și practici de ingineri software.