Skip to the content

Bakgrundsjobb i molnet – en Azure Web Jobs-tutorial

Bakgrund

Microsoft Azure ger oss utvecklare en massa härliga möjligheter att driftsätta kod utan att behöva fundera på hårdvara, operativsystem och istället fokusera på att leverera mesta möjliga kundnytta genom att göra det vi är bäst på: Koda.

De flesta har säkert redan använt Web Apps i Azure, men ibland vill man enkelt kunna schemalägga jobb för att till exempel hantera integrationer, övervakning eller andra småjobb som inte passar in i en vanlig webbapplikation. Här kommer Azure Web Jobs till undsättning!

Vad är Azure web jobs?

Azure Web Jobs låter dig köra ett program eller script i en Azure App Service plan. Programmet kan schemaläggas, köras kontinuerligt eller triggas av event i andra Azure-tjänster. Då Web Jobs kan dela App Service plan med andra tjänster uppstår det ofta inga extra kostnader för att drifta din tjänst.

En mängd olika filtyper och script tillåts som .cmd, .bat, .exe men även python och php. Det finns även ett antal olika jobbtyper som går att läsa mer om här.

Tutorial

Nedan följer en tutorial där vi via ett .NET-jobb hämtar valutakurser och sparar i en Azure SQL Server-databas. Jobbet schemaläggs att köra 1 gång per dag med hjälp av ett cron-schema. Hela projektet finns att ladda hem längst ner i inlägget.

Förberedelser

Skapa ett Azure-konto

Skapa upp ett Azure-konto om du inte redan har ett. Om du är en ny användare går det just nu att få en 1600 kr kredit att använda i Azure under en 30-dagarsperiod.

Skapa en Azure App Service plan för ditt projekt

Nästa steg är att logga in i Azure och skapa en App service plan för projektet. En app-service plan kan liknas vid en applikations-server där alla tjänster som installeras i planen delar samma resurser. I det här fallet behöver vi skapa en Basic B1 plan för att stödja att vårt jobb alltid är igång.

Skapa en Azure Web App

Skapa upp en Web App där jobbet ska köras, se till att jobbet hamnar i den plan som precis skapats.

Gå in under "Application settings" i din web app och säkerställ att "Always On" är satt till "On". Detta är ett krav för att ditt jobb ska fungera.

Skapa en Azure SQL Server-databas

Slutligen behöver vi skapa upp en Azure SQL server-databas för att spara våra valutor i. Tyvärr finns i nuläget ingen gratis version men Basic 2GB kostar 40kr per månad och duger för ändamålet.

Passa på att öppna upp för din utvecklardators IP-nummer under "Firewalls and virtual networks" samt spara connectionstring till databasen.

Implementation

Nu till det roligaste: Själva implementationen! Tutorialen är byggd med Visual Studio 2017 Professional. Viktigt också att "Azure development"-funktionen är aktiverad för att stödja deploy till Azure direkt från Visual Studio.

Skapa ett Visual Studio-projekt

Skapa upp ett Azure Webjob-projekt, det fungerar även med ett vanligt Console-projekt men vi väljer att vara ändamålsenliga.

Hämta hem paket via Nuget 

Hämta hem senaste versionen av Entity Framework som kommer användas för att lagra valutakurserna samt senaste versionen av Restsharp som är ett utmärkt paket för att anropa REST-tjänster. Uppgradera samtidigt de standardpaket som följer med i projektet om detta inte redan är gjort.

Hämta valutadata

Vi använder oss av Fixer, ett enkelt gratis REST-api, för att hämta Euro-baserade valutakurser från ECB.

Spara valutadata

Vi använder Entity Framework Code First för att utföra följande logik:

  • Säkerställa att valutadata inte redan finns för nuvarande dag.
  • Skapa valutadata för nuvarande dag från Fixer.

Uppdatera med aktuell connectionstring från databasen som skapades ovan i app.config.

Knyt ihop säcken

Vi skriver nu ihop vår lilla controller som anropas när programmet startas som ser till att dagens valutakurser hämtas och sparas om de inte redan finns.

Konfigurera schemaläggning

Det sista vi gör är att konfigurera schemat där vi väljer Cron som är ett flexibelt format som klarar de flesta scheman. I vårt fall vill vi köra 1 gång per dag kl 12:00 vilket motsvarar 0 0 12 * * *.

Skapa en textfil och kalla den "settings.job". Lägg in följande text i filen: {"runMode": "OnDemand","schedule": "0 0 12 * * *"}. Öppna properties för filen och sätt "Build Action" till "Content" och "Copy Always". Du kan även behöva öppna /Properties/webjob-publish-settings.json och ändra till "runMode":"OnDemand" för att schemaläggningen ska fungera och jobbet inte ska köras kontinuerligt. Lite krångligt men förhoppningsvis lägger Microsoft till UI-stöd för detta senare.

Deploy

Vi är nu klara för deploy av vår tjänst. Högerklicka på lösningen och välj "Publish as Azure Web Job". Klicka "Microsoft Azure App Service" och klicka dig fram till Webappen som skapades tidigare och klicka dig vidare tills det går att trycka på "Publish". Det som händer nu är:

  • Lösningen byggs och publiceras som ett Web Job i din Web App.
  • Databas-tabellen för valutorna skapas automatiskt upp första gången tjänsten körs.

Grattis, om allt gått rätt hur du skapat ditt första schemalagda Azure-jobb!

Monitorering

Då detta är en snabb tutorial har ingen fokus lagts på loggning. En smidig grej med Web Jobs är dock att man kan gå in och se allt som skrivs på Console direkt i Azure (gå in i appen/Web Jobs/logs). Detta gäller även exceptions och liknande.

Sammanfattning

Vi hoppas att detta inlägg varit givande och lärorikt! Ladda gärna hem källkodenoch laborera vidare.

Spot On