Artikler / PowerShell

Byg et API med PowerShell og Azure

Man behøves ikke have kendskab til C# eller have et stort IT-miljø for at bygge et API. I dag ser vi nærmere på hvordan man kan lave et HTTP API med Azure og PowerShell.

Vores API vil returnere en tilfældig Chuck Norris joke vha. af en HTTP-forespørgsel. Før vi dykker ned i selve koden og implementeringen, skal vi se lidt på de forskellige elementer som vi skal bruge.

Hvad er et API?

Application Programming Interface (API), er en softwaregrænseflade, der tillader et stykke software at interagere med andet software. Et API kan betegnes som en måde at tilbyde tjenester, herunder data, fra et system til det andet system.

Et eksempel – tænk på en mobilapp som Instagram der bruger kameraet i din mobiltelefon. Udviklerne af Instagram behøves ikke at programmere hvordan telefonen præsentere eller tager billeder med kameraet, de udnytter blot et API (framework) som Apple (iOS) eller Google (Android) udstiller i styresystemet.

Hvad er Azure Functions?

Serverless computing er det seneste buzzword i IT-verdenen, og Azure Functions er Microsofts svar på en moderne serverløs arkitektur, der leverer hændelsesdrevet computing i skyen. Serveruafhængige arkitekturer er særdeles skalerbare og hændelsesdrevne som kun bruger ressourcer, når en specifik funktion eller hændelse sker.

Med Azure Functions kan man udvikle og køre kode i skyen, uden besværet med at administrere servere eller containere, derfor kalder man det serverless computing. Det lader udviklere fokusere på at bygge appfunktionalitet uden at bruge tid på løbende administration af servere og infrastruktur.

Function-as-a-Service (FaaS) er et udtryk for en serverløs arkitektur. Softwareudviklere kan udnytte dette til at implementere og køre en individuel “funktion”, handling eller forretningslogik uden kompleksiteten af servere og netværk. Selvom man siger ”serverløs”, er der stadig en eller flere servere bagved, det er dog cloududbyderen som står for installation, planlægning af kapacitet og serveradministration.

Azure Functions understøtter flere programmeringssprog, og udviklerne bestemmer selv hvilket sprog de vil benytte i deres funktioner.

Muligheder i Azure Functions?

Med Microsoft Azure er det nemt at drage fordel af Function-as-a-Service (FaaS). Her er nogle af de funktioner der findes i Azure Functions:

  • Intuitiv, browserbaseret brugergrænseflade – Du kan skrive kode direkte i det brugervenlige web-interface eller bruge dit fortrukne udviklingsværktøj såsom Visual Studio Code eller Visual Studio til at bygge eller fejlsøge kode. Azure Functions har en intuitiv browserbaseret brugergrænseflade så man nemt kan reagere på hændelser genereret af services som Event Hubs, HTTP forespørgsler, timers, Azure Queues, Table Storage, Blob Storage osv.
  • Forskellige programmeringssprog – Azure Functions acceptere sprog såsom C#, F#, Node.js, Python, PHP, Bash, Java og PowerShell.
  • Compute-on-demand – Funktioner kan skalere automatisk på baggrund af forespørgsler, og dermed justere antallet af bagvedliggende servere.
  • Understøtter kontinuerlig deployment og integrationer – Continuous deployment (CD) og continuous integration (CI) er understøttet som man kender det fra traditionelle udviklingsformer. Dette kan ske igennem værktøjer som GitHub og Azure DevOps.
  • Flere miljøer – Microsoft har gjort Azure Functions flytbar, så det er nemt at bygge og deploye serverløse applikationer til hvilken som helst cloud-udbyder eller til et on-premise datacenter. På den måde kan koden køre alle steder.
  • Pay-as-you-use – Man betaler kun for den tid som funktionerne kører, derfor behøver man ikke bekymre sig om ressourcehåndtering.

For at udvikle og lave funktioner i Azure Functions, skal man have et aktiv Azure abonnement samt en Azure Storage konto. Når man udarbejder en funktion, bliver der oprettet 3 logiske enheder for hhv. deployment, administrering og delte ressourcer. Hver enhed fungerer som en mikroservice.

Her er et par simple eksempler på hvad en funktion kan:

  • Processer forudbestemte handlinger som at tage backup af en database.
  • Processer individuelle filer som at rydde op på et on-premise fil share.
  • Administrer og processer meddelelser i en besked kø.
  • Modtage og sende API kald.

Funktioner kan blive aktiveret på forskellige måder, såsom:

  • Tidsbaseret kørsel – Ligesom man kender det fra planlagte opgaver i Windows eller CRON-opgaver fra Linux.
  • Ændringer i Azure Storage – Ved tilføjelser eller ændringer i Azure Storage konto.
  • Azure Queues – På baggrund af nye meddelser i Azure Queues.
  • Service Bus – Reagere på meddelser i en Azure Service Bus kø.
  • HTTP – Start en funktion med en HTTP-forespørgsel.

Overstående udløsere definerer om en funktion skal aktiveres. Man bør som udgangspunkt holde sig til en udløser pr. funktion.

Function Bindings gør det muligt for funktioner at modtage input parametre og returnerer et svar tilbage eller sende det videre i processen. Dette gør at man kan opbygge sine funktioner modulært.

Azure Functions eksempler

Azure Functions gør udviklingsprocessen mere produktiv og lader dig starte serverløse applikationer i Azure. Funktionerne hjælper med at processere data, kordinere Internet-of-Things (IoT) trafik eller bygge små API’er og microservices. Azure Functions passer perfekt til opgaver såsom behandling af billeder, behandle forskellige ordre, systemvedligeholdelse eller køre planlagte opgaver.

Lad os tage et kig på to eksempler.

Eksempel 1: Mobil app backend

  1. HTTP API-kald fra en mobil app.
  2. Kaldet processeres af funktionen.
  3. Funktionen sender den processeret data videre til Azure Cosmos DB.
  4. Data overførslen til Azure Cosmos DB, aktivere funktion nr. 2.
  5. Funktion nr. 2 sender til sidst beskeder gennem Azure Notifications Hub.

Eksempel 2: Webapplikation backend

  1. En forespørgsel bliver lavet i en webapplikation.
  2. Forespørgslen bliver sat i kø i Azure Service Bus.
  3. Funktionen ser beskeden i Azure Service Bus.
  4. Funktionen sender forespøgslen ned i en Azure Cosmos DB.

Hands on

Før vi går i gang med at lave vores API, har vi brug for en Azure subscription.
Microsoft tilbyder en prøveperiode på 90 dage, eller op til 1300 kr, læs mere om det her.

Function App

Lad os starte med at oprette en ressource i Azure kaldet “Function App“. Denne ressource vil indeholde PowerShell koden og de udløsere som aktivere funktionen.

  1. Tilgå https://portal.azure.com, derefter klik på “Function App” i venstre side af browseren.
  2. Klik på “Add“.
  3. Udfyld nu følgende, og klik på “Create“.
    • App Name: ZwableChuckNorrisApi
    • Subscription: Free Trial (i dette eksempel)
    • Resource Group: Create new “ChuckNorrisResourceGroup”
    • OS: Windows
    • Hosting Plan: Consumtion Plan
    • Location: West Europe
    • Runtime Stack: Powershell (Preview)
    • Storage: Create new “chucknorrisstorage”
  4. Den nye “Function App” bør nu blive vist i portalen. Hvis ikke, prøv og tryk på “Refresh“-knappen.

Opret en ny funktion

Efter at vi har oprettet skallen (Function App) til det nye API, skal vi nu tilføje en funktion og udløseren. I dette eksempel bruger vi en HTTP-udløser, og samtidigt gør det muligt for alle at kontakte API’et uden at man skal angive bruger eller kodeord.

  1. Tilgå nu app’en ved at klikke på “ZwableChuckNorrisApi“.
  2. Klik på “Functions” og derefter “New function“.
  3. Vælg “HTTP trigger“.
  4. Skriv “Jokes” i “Name” og vælg “Anonymous” ved “Authorization level“. Tryk på “Create“.

PowerShell koden

Koden vi bruger retunerer en tilfældig Chuck Norris joke og er skrevet i PowerShell. Kopier koden, så vi kan bruge den i næste afsnit.

  1. Importere System.Net assembly så vi kan drage nytte af WebRequest og WebResponse klasserne i .NET.
  2. Gør det muligt og tage imod input parametre med param().
  3. Laver et array med fem forskellige jokes.
  4. Får en tilfældig værdi mellem 0 og 4. Dette bruger vi i array indekset.
  5. Vi laver en outputbinding, så vi kan returnere joken tilbage til klienten. Denne cmdlet er indbygget i Azure Functions.
#1. Import .NET assembly.
using namespace System.Net

#2. Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

#3. Set jokes in an array.
$ChuckNorrisJokes = @(
    "Chuck Norris does not wear a condom because there is no protection from Chuck Norris.",
    "Chuck Norris can play the violin with a piano",
    "Chuck Norris don't get cancer, cancer get Chuck Norris.",
    "Chuck Norris can pull a hat out of a rabbit.",
    "Chuck Norris can finish Mario Bros without using the jump button."
)

#4. Get random number between 0 and 4. Then return value from the jokes array.
$Body = $ChuckNorrisJokes[(Get-Random -Minimum 0 -Maximum 4)]

#5. Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $Body
})

Tilføj koden til funktionen

Det eneste der mangler, er at uploade koden til den nye funktion. Lad os se nærmere på hvordan vi gør dette.

  1. Efter at have oprettet HTTP-udløseren bliver man sendt videre til funktionen. Her indsættes ovenstående PowerShell kode i “run.ps1” panelet.
  2. Tryk på “Save“.
  3. Lad os teste vores funktion. Tryk på “Run“.
  4. I “output-panelet” skulle vi meget gerne få én af de fem Chuck Norris jokes vist.

Test af API’et

Web-adressen til vores API bliver konstrueret på baggrund af API- og funktionsnavnet, i dette eksempel vil det se således ud “https://zwablechucknorrisapi.azurewebsites.net/api/Jokes“.

  • zwablechucknorrisapi – Er navnet på “Function App“.
  • Jokes – Funktionsnavnet inde i vores “Function App“.

Vi starter med at teste vores API igennem en browser. Tilgå URL’en i browseren.

Lad os prøve at teste vores API vha. PowerShell. Åben en PowerShell terminal og kør følgende kode.

Invoke-RestMethod -Method Get -Uri "https://zwablechucknorrisapi.azurewebsites.net/api/Jokes"

Det burde give dette resultat.

Konklusion

Med Azure Functions er det nemt at udvikle microservices. Traditionel applikationsudvikling kræver ofte en kompleks IT-infrastruktur, der er dyr og tidskrævende at vedligeholde, det løser Microsoft på en elegant måde. Hos Zwable udnytter vi selv tjenester som Azure Functions til at automatisere store dele af vores infrastruktur så vi kan levere “infrastructure as code” til vores kunder. Er du interesseret i at høre mere, så står vi selvfølgelig klar til en uforpligtende samtale.