bekk / serverless-workshop

Serverless workshop
0 stars 0 forks source link

Serverless workshop

Velkommen til serverless workshop!

Oppgave 1

I denne oppgaven skal dere integrere med en-tur for å hente de fem neste avgangstidene fra Vippetangen.

Brukernavn, passord og lignende til AWS finner dere her.


Det første dere må gjøre er å opprette en tabell i DynamoDB. Finn frem til konsollet for DynamoDB og klikk "Create table" for å lage en ny tabell.


Klon dette repositoryet og gå til katalogen oppgave1 i en Terminal og skriv:

yarn global add claudia
yarn install

I tillegg må dere sette opp aws-credentials. Filen ~/.aws/credentials skal se slik ut:

[default]
aws_access_key_id = <Access Key>
aws_secret_access_key = <Secret Access Key>

Da er det på tide å begynne å programmere. Åpne filen oppgave1/entur-api-reader.js

Spørringen til En-tur ser slik ut:

const query = `{stopPlace(id: \"NSR:StopPlace:4227\") {id name estimatedCalls(startTime: \"${moment().format()}\", timeRange: 72100, numberOfDepartures: 10) { realtime aimedArrivalTime aimedDepartureTime expectedArrivalTime expectedDepartureTime actualArrivalTime actualDepartureTime date forBoarding forAlighting destinationDisplay { frontText } quay {   id } serviceJourney {   journeyPattern {     line {  id  name  transportMode     }   } }    }}}`;

For å integrere med en-tur kan dere gjøre det slik:

const response = await fetch("https://api.entur.org/journeyplanner/2.0/index/graphql", {
    method: "POST",
    body: JSON.stringify({ query }),
    headers: {
        "Content-Type": "application/json",
        "ET-Client-Name": "Serverless workshop @ BEKK",
        Accept: "application/json",
    },
});

const json = await response.json();

Strukturen på dataene fra en-tur er litt slitsom. En enkel måte å hente ut det vi er ute etter er dette:

const expectedDepartureTimes = json.data.stopPlace.estimatedCalls.map(call => {
    return {
        expectedDeparture: call.expectedDepartureTime,
        line: call.serviceJourney.journeyPattern.line.name,
        realtime: call.realtime,
    };
})

For å skrive til DynamoDB bruker vi DocumentClient fra aws-sdk. Syntaxen for å skrive til databasen er slik:

const params = {
    Item: {
        StopPlace: "Vippetangen",
        Times: expectedDepartureTimes,
    },
    TableName: TABLE_NAME,
};
return await dynamoDB.put(params).promise();

Dersom du har fått til alt dette, kan du deploye og teste lambdaen.

For å installere skriver du:

claudia create \
--region <din-region> \
--name <brukernavn>-reader \
--handler entur-api-reader.handler \
--policies policies

For å oppdatere skriver du:

claudia update

For å teste skriver du:

claudia test-lambda

Til slutt må du lage en scheduler som sørger for at buss-tidene i databasen blir oppdatert. Det gjør du ved å kjøre følgende kommando:

claudia add-scheduled-event \
--rate "5 minutes" \
--event event.json \
--name <brukernavn>-schedule

Oppgave 2

Nå har dere en database som jevnlig blir oppdatert med nye data om buss-avganger, så da er det på tide å tilgjengeliggjøre disse dataene gjennom et api.

Gå til katalogen oppgave2 og kjør yarn install. Åpne filen api.js.


For å lage et api-punkt skriver man f.eks:

api.get("/vippetangen", async () => {
    return "pong";
});

For å lese data fra dynamoDB kan man enten bruke documentClient.get for å hente et spesifikt data-element, eller documentClient.scan for å søke. I dette tilfelle bruker vi documentClient.get.

En måte å gjøre dette på er:

const params = {
    TableName: TABLE_NAME,
    Key: {
        StopPlace: "Vippetangen",
    },
};

const data = await dynamoDB.get(params).promise();

Når funksjonen er klar må den deployes til AWS. Det gjøres slik:

claudia create \
  --name <brukernavn>-api \
  --region <din-region> \
  --api-module api \
  --policies policies

Test at api-et fungerer ved å gå til url-en som ble skrevet ut fra kommandoen (Husk å legge på /vippetangen). F.eks. [https://kxs0txz1x2.execute-api.eu-central-1.amazonaws.com/latest/vippetangen]

Oppgave 3

I denne oppgaven skal vi integrere en frontend applikasjon med API-et vi skrev i oppgave 2 sånn at vi faktisk får vist de ulike avgangene.

Vi har laget en enkel frontend-applikasjon for dere som viser alle avgangene som hentes fra API-et. Du må kun gjøre et par endringer for å få applikasjonen til å peke mot ditt API. Applikasjonen er satt opp til å hente nye data hvert 10. sekund.

Bonusoppgaver

Er du ferdig? Bra jobba! Her er noen bonusoppgaver som du kan bryne deg på den siste tiden.

Frontend til S3

Simple Storage Service (S3) er en filhostingtjeneste fra AWS. I en moderne webapplikasjon, med statisk frontend med REST-API som backend, kan frontenden hostes på S3.

Først må vi bygge frontenden vår slik at den kan deployes til S3.

Da er frontenden bygget og vi er klare til å opprette og konfigurere en S3-bøtte.

Da er bøtten ferdig konfigurert og den skal være tilgjengelig på adressen: http://<bucket-name>.s3-website-<region>.amazonaws.com/ f.eks: http://entur-sanntid.s3-website-eu-west-1.amazonaws.com/

Noen andre bonusoppgaver

Sjekk dokumentasjonen fra En-tur, AWS SNS og AWS DynamoDB trigger for hjelp til å løse disse oppgavene.