Cron Job AWS Lambda-funktioner Vejledning - Sådan planlægger du opgaver

Cron-job bruges normalt til at planlægge kommandoer på et bestemt tidspunkt. Du kan bruge dem til opgaver som at køre sikkerhedskopier, overvåge systemets status eller køre systemvedligeholdelsesopgaver.

Cron-job er et nyttigt hjælpeprogram for systemadministratorer. Og når du administrerer et system i skyen, er cron-job stadig meget nyttige - du skal stadig udføre mange administrative opgaver på dine systemer.

En måde at køre cron-job i skyen er at bruge en funktion som en service (FaaS), som Lambda i AWS-økosystemet.

Funktioner udføres, når de udløses til det, og de kører kode i skyen uden behov for tilvejebringelse eller vedligeholdelse af nogen infrastruktur. Funktioner kan også konfigureres til at køre på et bestemt tidspunkt eller med en bestemt periodicitet, som traditionelle cron-job.

I dette blogindlæg vil jeg bruge AWS-økosystemet til at vise dig et konkret eksempel på, hvordan du opretter et cron-job ved hjælp af en funktion i skyen.

Amazon CloudWatch begivenheder

For at bruge en Lambda-funktion som et cron-job er vi nødt til at forstå Amazon CloudWatch-begivenheder.

Amazon CloudWatch-begivenheder sendes, når der er ændringer i AWS-ressourcerne. Disse begivenheder kan udløse en AWS Lambda-funktion. Når dine AWS-ressourcer skifter tilstand, sender de CloudWatch-begivenheder automatisk til begivenhedsstrømmen.

Derfor kan du oprette en regel, der udløser en bestemt Lambda-funktion, når der sker noget. For eksempel kan du automatisk påberåbe sig en Lambda-funktion, når der er en ændring i en AutoScaling-gruppe.

Derudover kan CloudWatch-hændelser påberåbe sig en Lambda-funktion til at udføre på en regelmæssig tidsplan. Og på denne måde kan du for eksempel have en Lambda-funktion, der slukker for alle dine test- og udviklings-EC2-forekomster efter kl. 18 og en anden, der tænder dem efter kl.

Opsætning af demo

Jeg vil gerne vise dig et eksempel på en Lambda-funktion, der kan udføre handlinger på dine EC2-forekomster. Jeg bruger AWS SAM til at definere min Lambda-funktion som infrastruktur som kode.

Hvis du vil prøve denne demo, skal du have en AWS-konto og en eller flere EC2-forekomster konfigureret på din AWS-konto. Det er dem, vi vil manipulere fra Lambda-funktionerne. EC2-forekomster er AWS-versionen af ​​virtuelle maskiner i skyen.

Du kan prøve demoen på AWS Cloud9 IDE (en browserbaseret IDE), da AWS SAM allerede er konfigureret i den IDE. Hvis du vil vide, hvordan du bruger AWS Cloud9 IDE til at betjene Lambda-funktioner, kan du tjekke denne video.

I dette eksempel skal vi starte og stoppe EC2-forekomster ved hjælp af to forskellige AWS Lambdas, der bliver udløst på et givet tidspunkt. Vi starter forekomsterne kl. 8 hver dag og slukker dem kl. 18, når dagen er slut.

Til det skal vi bruge en CloudWatch-begivenhed til at udløse Lambda på det rigtige tidspunkt og også AWS SDK til at udføre operationerne i tilfælde.

Den færdige kode til dette eksempel er tilgængelig i dette GitHub-arkiv. For at få denne kode til at fungere i AWS Cloud9 IDE skal du konfigurere din GitHub-konto i IDE for at være i stand til at klone projektet og derefter klone det inde i IDE.

Når du har det klar, skal du bare køre denne kommando inde i det klonede bibliotek:

$ sam deploy --guided

Når du kører denne kommando, får du et sæt spørgsmål, som du skal besvare for at konfigurere dette projekt til at køre med succes.

Den første ting, du skal definere, er et navn til dit projekt. Derefter indstiller du regionen, hvor den bliver implementeret - vælg den samme, hvor dine EC2-forekomster er. Dernæst skal vi give implementeringsskriptet en liste over de forekomster, som vi vil manipulere. Og så er vi færdige - det vil distribuere projektet til vores AWS-konto.

Definition af AWS Lambda-funktionen

Den første ting, jeg vil vise dig, er, hvordan vi definerer en AWS Lambda-funktion, der bliver udløst på et bestemt tidspunkt ved hjælp af AWS SAM. Denne definition findes i filen kaldet "template.yml".

Sådan ser en funktion ud. Lad os se på de vigtige linjer:

Den første linje er navnet på funktionen, i dette tilfælde “ StartInstanceFunction ”.

Så har vi definitionen " Egenskaber ". Den første ejendom er " Handler ". Her vil vi specificere modulet (filen), hvor koden, der skal udføres, er, og derefter metoden inde i det modul.

Og så har vi " CodeUri ", som er stien, der viser dig, hvor du finder filen. I dette tilfælde vil vores kode være inde i en mappe kaldet "cron" i en fil kaldet "handler.js" og i en metode kaldet "startInstance".

Derefter har vi definitionen " Runtime ". Jeg bruger NodeJS version 12, men du kan bruge Python, Java, Go, C # eller hvad der gør dig glad. Lambda understøtter flere driftstider ud af kassen, og du kan medbringe din egen runtime, hvis du vil.

Så har vi den ” miljø ” -definition, som vi vil bruge til at definere den ene miljøvariabel. Denne variabel giver os mulighed for at sende forskellige koder id'er til koden, afhængigt af konfigurationen, når vi implementerer.

Derefter har vi et afsnit kaldet " Politikker ", hvor vi definerer de tilladelser, som denne særlige Lambda-funktion vil have.

Det er vigtigt at vide, at alle Lambda-funktioner oprettes uden tilladelse. Det betyder, at de ikke kan gøre noget på andre AWS-ressourcer.

For at denne Lambda-funktion skal starte en EC2-forekomst, har den brug for tilladelser til at udføre den pågældende handling på den pågældende AWS-ressource. I denne særlige politik giver vi tilladelse til at starte ALLE EC2-forekomster på denne AWS-konto. ALL er repræsenteret med “*” i ressourceafsnittet.

Hvis du har dette stykke kode kørende i produktion, anbefaler jeg, at du begrænser ressourcerne til nøjagtigt dem, som du vil have denne Lambda til at kunne starte.

Og endelig er den sidste sektion afsnittet " Begivenheder ". Her vil vi definere, hvordan denne Lambda-funktion bliver udløst. Denne funktion udløses med en planlagt CloudWatch-begivenhed, der udløser Lambda hver dag kl. 8 om morgenen. Dybest set kl. 8 hver dag tænder det for alle de EC2-forekomster, du angiver.

Der er mange regler for at danne dette cron-udtryk: for eksempel at sige, at du gerne vil have, at dette kun kører mandag til fredag, skriv cron (0 8? * MON-FRI *). Du kan finde mere information på dokumentationssiden for CloudWatch-begivenheder her: //docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents-expressions.html.

Kodning af AWS Lambda-funktionen

Nu hvor vi har defineret Lambda-funktionen, skal vi give den noget kode. I mappen "cron" i filen "handler.js" skal vi tilføje metoden kaldet " startInstance ", der ser sådan ud:  

Denne metode kaldes, når funktionen udløses hver dag kl. 8. Det får listen over EC2-forekomster fra en miljøvariabel, som vi passerede alle forekomster-id'er under implementeringstiden. Derefter opretter det en række af dem.

Når det har det, kalder det AWS SDK og sender arrayet af instanser id som en parameter. Og hvis der er nogen fejl, logger den det og fuldfører. Umiddelbart efter at Lambda er færdig med udførelsen, kan du gå til din EC2-konsol og se, hvordan dine forekomster tænder.

Funktionen til at slukke for EC2-forekomsterne er meget ens med nogle få forskelle. Du kan finde koden til denne funktion i dette link og tjekke den ud.

Kører cron job

For at køre dette cron-job er der ikke meget tilbage at gøre. Når de to funktioner er implementeret i din AWS-konto, i samme region som dine forekomster, vil de udføre og gøre, hvad de var programmeret til at gøre.

Nu skal du vente til kl. 8 eller kl. 18 for at se, om de fungerer. Eller hvis du vil teste det lige nu, skal du ændre begivenhedstiden i Lambda-definitionen til et tidspunkt, der fungerer for dig. Sørg for, at forekomsten er tændt, hvis du planlægger at slå dem fra eller omvendt, så du kan se ændringerne.

Vent nu og se hvad der sker i EC2-konsollen. Lige efter det tidspunkt, du opretter, vil du se forekomsten gå af eller til og derefter gøre det modsatte på det andet tidspunkt, du konfigurerer. Dette vil vare evigt, indtil du fjerner Lambda-funktionerne.

Oprydning af din AWS-konto

Efter at have gennemført denne demo, anbefaler jeg dig at slukke (eller fjerne den forekomst, du oprettede for at teste) og fjerne de Lambda-funktioner, du lige har oprettet.

Fjernelse af lambda-funktionerne er lige så let som at gå ind i din CloudFormation-tjeneste i din AWS-styringskonsol og fjerne stakken af ​​ressourcer, som AWS SAM oprettede.

Glem ikke at afslutte og fjerne EC2-forekomsterne, hvis du oprettede dem til denne demo.

Til afslutning

AWS Lambda-funktioner er et meget nyttigt værktøj til at udføre alle slags opgaver i din AWS-konto. Du kan stort set få besked om eventuelle ændringer i AWS-ressourcerne gennem CloudWatch-begivenheder, og så kan du få adgang til næsten alle tjenester ved hjælp af AWS SDK. Så du kan udføre alle slags vedligeholdelsesopgaver og automatiserede opgaver over din infrastruktur.

Tak for læsningen.

Jeg er Marcia Villalba, Developer Advocate for AWS og vært for en youtube-kanal kaldet FooBar, hvor jeg har over 250 video-tutorials om serverløs, AWS og software engineer-praksis.

  • Twitter: //twitter.com/mavi888uy
  • Youtube: //youtube.com/foobar_codes