Velkommen til serverless workshop!
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.
StopPlace
, type stringKlon 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
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]
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.
frontend
.npm install
for å installere alle nødvendige avhengigheter.src/App.js
og endre verdien til API_URL
til ditt API (ikke ta med /vippetangen
).npm run start
for å starte applikasjonen.Er du ferdig? Bra jobba! Her er noen bonusoppgaver som du kan bryne deg på den siste tiden.
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.
frontend
npm run build
Da er frontenden bygget og vi er klare til å opprette og konfigurere en S3-bøtte.
Create Bucket
for å opprette en ny S3 bøtte.Bucket Name
og trykk på Create
.frontend/build
. Husk å få med mappen static
. Det enkleste er å dra filene over.Properties
og trykk på Static website hosting
.Use this bucket to host a website
og skriv index.html
som index document
.Save
.Overview
, velg alle filene og mappene du har lastet opp og klikk på More
og Make public
.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/
Sjekk dokumentasjonen fra En-tur, AWS SNS og AWS DynamoDB trigger for hjelp til å løse disse oppgavene.