Institute of Computer Science
  1. Courses
  2. 2021/22 spring
  3. Development of web services and distributed systems (LTAT.00.000)
ET
Log in

Development of web services and distributed systems 2021/22 spring

  • Pealeht
  • Loengud
  • Praktikumid
  • Lahenduste Esitamine

Kümnes praktikum - Azure pilvefunktsioonid

Selles praktikumis uurime kuidas töötab Azure pivefunktsioonide platvorm ning loome lihtsad näite funktsioonid. Kasutame neid teadmisi, et lisada Azure funktsioonide abil uue funktsionaalsuse enda praktikumi Python Flask teenusesse. Selleks funktsionaalsuseks on Raamatu failide automaatne konverteetimine PDF failideks peale raamatu tekstifaili üles laadimist Azure Blob andmehoidlasse.

Viited

  1. Azure Functions App Python'i keskkonna dokumentatsioon: https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-python?tabs=asgi%2Cazurecli-linux%2Capplication-level
  2. Azure functions käsurea kliendi installeerimine ja kasutamine: https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local

Probleemide korral kontrollige:

  1. Pinnitud sõnumeid #praktikum-10-nano kanalis kursuse Slacki's.
  2. Võimalikud probleemid ja nende potentsiaalsed lahendused osa praktikumi juhendi lõpus.
  3. Küsige otse #praktikum-10-nano Slacki kanalis.
    • Ka siis kui soovite lihtsalt viheid.

Ülesanne 10.1: Azure funktsiooni loomine

Selles ülesandes loome lihtsa pilve näidis-funktsiooni Azure platvormil. Kasutame Node.js ehk JavaScripti, kuna Pythoni funktsioone ei saa läbi veebiliidese otse muuta. Aga järgmistes ülesannetes vaatame ka seda kuidas Pythoni põhiseid Azure pilve funktsioone luua.

  • Logige Azure'i pilve sisse: https://portal.azure.com/#home
    • Kasutage oma ülikooli e-posti aadressi ja parooli
  • Otsige üles Azure function App teenus
  • Looge uus Azure Function App rakendus. See töötab konteinerina Azure funktsiooni jaoks.
    • Seadistage Resource Group väärtuseks varasem Resource Group, mida kasutasite praktikumis 8 (Kus kasutasime Azure Blob teenust). Me soovime kasutada sama Azure Blob storage konteinerit, mida meie Flask Rakendus kasutab Raamatote hoidmiseks.
    • Seadke selle nimeks enda poolt valitud nimi.
    • Valige Runtime stack väärtuseks; Node.js
    • Version väärtuseks: 16.LTS
    • Regioon: North Europe
  • Oodake kuni Functions App ressurss on valmis
  • Looge uus (alam-)funktsioon Functions App sees
    • Valime malliks (template): HTTP trigger
      • See defineerib, et funktsiooni käivitamise päästik-sündmuseks on "sisse tulev" HTTP päring.
  • Muutke funktsiooni nimi (New Function) enda poolt valitud väärtuseks
  • Looge funktsioon.
  • Funktsiooni vaates avage vasakul: Code+Test
    • Saate funktsiooni JavaScript koodi otse brauseri kaudu muuta.
    • Üleval paremal pool saate lingi Get Function URL kaudu kopeerida fuktsiooni HTTP lõpppunkti.
      • Kasutage seda link brauseris, ning kontrollige kas funktsioon töötab
      • Lisage funktsiooni urlile argument name kaudu oma nimi. Näiteks nii: &name=pelle
  • Muutke funktsiooni poolt väljsastatavat väärtust (responseMessage).

Küsimus: Kui kiiresti muutub funktsiooni poolt väljastatav tulemus peale teie poolse muudatuse tegemist.

Azure funktsiooni väljakutseid ning veateateid saab vaadata Azure portaalis, funktsiooni lehel, Monitor alamlehel?

Ülesanne 10.2: Azure käsurea liidese installeerimine

Selles ülesandes installeerime Azure käsurea rakenduse Linuksis. Kui kasutate Windowsit oma arvutis, siis saate Kasutada varasemas praktikumis WSL kaudu üles seatud ubuntu2004 virtuaalmasinat. Soovi korral võite proovida ka Windows versiooni nendest tööriistadest, mille õpetuse leiate siit: https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local?tabs=v4%2Cwindows%2Ccsharp%2Cportal%2Cbash

Linuksis:

  • Uuendage Linuksi pakettide nimekiri:
    • sudo apt update
  • Instaleerime Python 3 virtuaalse keskkonna loomise käsu
    • sudo apt-get install python3-venv
  • Seadistame ja installeerime Azure käsurea tööriistad:
    • wget -q https://packages.microsoft.com/config/ubuntu/19.04/packages-microsoft-prod.deb
      sudo dpkg -i packages-microsoft-prod.deb
      sudo apt-get update
      sudo apt-get install azure-functions-core-tools-4
  • Installeerimine Azure käsurea käsud sisse logimiseks:
    • curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
  • Kasutage käsurida, et sisse logida Azure platvormi:
    • az login
      • See käsk suunab teid edasi (või annab lingi mida tuleks kasutada) brauserisse, mille kaudu saate autentida enda (ülikooli) MS kontoga.
    • Kui tekib probleem sisse logimisega, korrake seda protsessi mitu korda. Kui ikka ei õnnestu, võtke ühendust õppejõuga.
    • Selle tulemusena seadistatakse juurdepääsu info lokaalselt.
  • Selleks, et kontrollida kas kõik on üles seatud korrektsels, vaatame, millised Azure funktsioonide mallid on saadaval. Neid saab funktsioonide loomisel alusena kasutada:
    • func templates list -l python

Ülesanne 10.3: Azure Pyhton funktsiooni loomine.

Selles ülesandes loome uue Azure Python funktsiooni, kasutades malli, mis seab selle funktsiooni päästik-sündmuseks uue faili tekkimise Azure blob storage teenuses. Samuti testime, et seda funktsiooni õnnestub Azure platvormi üles laadida.

Funktsiooni eesmärk on sisendina tulev tekst (Raamatu sisu) ümber konventeerida PDF faili sisuks (failidest lugemise ja failidesse salvestamisega me tegelema ei pea)

  • Otsige üles Azure function App teenus Azure portaalis
  • Looge uus Azure Function App rakendus. See töötab konteinerina Azure funktsiooni jaoks.
    • Seadistage Resource Group väärtuseks varasem Resource Group, mille kasutasite praktikumis esimeses ülesandes.
    • Seadke selle nimeks enda poolt valitud nimi, aga seda läheb meil hiljem vaja (FUNCTION_APP_NAME)
    • Valige Runtime stack väärtuseks: Python
    • Version väärtuseks: 3.8
    • Regioon: North Europe
  • Loome Linuksis uue kausta meie Azure Functions projekti jaoks.
    • mkdir azure
  • Liigume kausta sisse:
    • cd azure
  • Loome uue Python virtuaalse keskkonna
    • python3 -m venv venv
  • Aktiveerime keskkonna:
    • . ./venv/bin/activate
  • Installeerime uue Python pip versiooni:
    • sudo apt install python3-pip
  • Loome uue lokaalse Azure Funktsioonide teenuse projekti, mis kasutab Python keskkonda:
    • func init localhsproj --python
  • Liigume loodud kausta sisse:
    • cd localhsproj
  • Genereerime funktsioonile koodi:
    • Meie valime funktsiooni alustüübiks: Azure Blob Storage trigger malli.
      • See tähendab seda, et see funktsioon on disainitud käivituma Azure Blob teenuse sündmuste korral (nt uue blob üles laadimise korral).
    • func new --name FUNCTION_NAME --template "Azure Blob Storage trigger"
      • NB! Asendage FUNCTION_NAME oma poolt valitud nimega.
      • Selle tulemusena luuakse FUNCTION_NAME nimeline kaust
  • Muutke FUNCTION_NAME kaustas oleva function.json faili sisu.
    • Seame connection väärtuseks: AzureWebJobsStorage
      • AzureWebJobsStorage keskkonna muutuja kaudu saab meie funktsioon ligipääsu Azure blob storage ühenduse infole, mida saab kasutada uue ühenduse loomiseks (näiteks faili loomiseks või muutmiseks)
    • Seame path väärtuseks oma Azure Blog Storage' konteineri asukoha: raamatud/{name}
      • See seadistab integratsiooni raamatud blob konteineri ka meie poolt loodava funktsiooni vahel. Iga uue faili puhul käivitatakse see funktsioon.
  • Publitseerime nüüd funktsiooni koodi Azure platvormi:
    • func azure functionapp publish FUNCTION_APP_NAME --build remote --python
    • Asendage selles käsus FUNCTION_APP_NAME oma funktsiooni rakenduse nimega, mille me varasemalt Azure portaalis tegime veebiliidese kaudu.

Ülesanne 10.4: Azure Python funktsiooni implementeerimine.

Selles ülesandes implementeerime genereeritud funktsiooni sisu.

  • Muudame requirement.txt faili, et lisada PDF failide loomise Python teek:
    • lisage rida fpdf teegi jaoks
  • Muudame function.json faili
    • See fail defineerib kust võtab funktsioon sisendid ning millised väljundid selle on.
    • Hetkel on failis defineeritud vaid sisend (myblob, mis on tüüpi blobTrigger).
      • Selle tulemusena otsitakse raamatud kaustast/konteinerist blob'e - selle funktsiooni sündmuste genereerimiseks
    • Lisake bindings listi üks plokk juurde väljundi jaoks:
      •     {
              "name": "blobout",
              "type": "blob",
              "direction": "out",
              "path": "pdf/{name}.pdf",
              "connection": "AzureWebJobsStorage"
            }
        
        • Seadistame väljundiks samuti Azure blob teenuse.
        • Seadistame väljundi asukohaks pdf kausta/konteineri. Ning selle, et faili nimele peaks lõppu lisama .pdf.
        • NB! Ärge unustake koma panna nende kahe bloki vahele. Umbes nii:
          •       "connection": "AzureWebJobsStorage"
                },
                {
                  "name": "blobout",

Implementeerime __init__.py faili sisu

  • Importige vajalikud teegid:
    • from fpdf import FPDF
    • import os
  • Lisage uus meetod tekst tüüpi sisendi (Raamatu sisu) genereerimiseks PDF väljundiks:
    • def text_to_pdf(text):
      
          pt_to_mm = 0.35
          fontsize_pt = 11
          fontsize_mm = fontsize_pt * pt_to_mm
          margin_bottom_mm = 20
      
          pdf = FPDF(orientation='P', unit='mm', format='A4')
          pdf.set_auto_page_break(True, margin=margin_bottom_mm)
          pdf.add_page()
          pdf.set_font(family='Courier', size=fontsize_pt)
      
          splitted = text.split('\n')
      
          for line in splitted:
              if len(line) == 0:
                  pdf.ln()
              pdf.cell(0, fontsize_mm, line, ln=1)
      
          return(pdf.output(dest='S').encode('latin-1'))
    • Muudame main() meetodi kirje ära, lisades argumentidesse ka väljundi objekti viite ja conteksti objekti viite.
      • See peaks nüüd olema selline:
        • def main(myblob: func.InputStream, blobout: func.Out[bytes], context: func.Context):
    • Muutame main() meetodi sisu:
      • Meetodi alguses loeme sisse sisendblobi sisu:
        • input = myblob.read()
      • Kodeerime selle ümber (väike häkkimine siin, et PDF teek saaks õiges vormingus sisu, ja et eemaldada karakterid millega see teek ei saa hakkama)
        • input_str = input.decode("UTF-8").encode('latin-1', 'ignore').decode('latin-1')
      • Kutsume välja pdf genereerimise funktsiooni:
        • sisu = text_to_pdf(input_str)
      • Seadistame main() meetodi välja kutse tulemusena väljund-pdf-faili sisu:
        • blobout.set(sisu)

Publitseerige funktsioon üles uuesti Azure pilve.

Ülesanne 10.5: Testime funktsiooni käivitust Azure pilves

Selles ülesandes testime, et meie poolt loodud muudatused töötavad.

  • Laadige Azure Blob sisend konteinerisse üles uus tekstifail.
  • Kontrollige, et luuakse selle vastav PDF fail.
  • Laadige PDF fail alla ning kontrollige, et selle sisu vastaks raamatu faili sisule.

Azure funktsiooni väljakutseid ning veateateid saab vaadata Azure portaalis, funktsiooni lehel, Monitor alamlehel.

Vaadake ka Võimalikud probleemid ja nende potentsiaalsed lahendused osa praktikumi juhendi lõpus, kuhu on lisatud infot selle kohta, kuidas lahendust debugida.

  • Tehke sama protsess läbi. Aga seekord ärge looge raamatu faili käsitsi, vaid kasutage oma Azure Blob andmehoidla pühist Flask Raamatu halduse rakendust praktikumidest 9 (või 7).
  • Kontrollige, et peale POST päringu tegemsist API /raamatud aadressile luuakse Azure Blob storage konteineris uus teksti fail ning taustal genereeritakse ka PDF fail.

Esitamiseks: Tehke ekraanivaated, mis näitavad Flask veebirakendusega sooritatud testimise protsessi samm-sammult.

Lahenduse esitamine

Praktikumi lahendusena tuleb esitada:

  1. Ülesandes 10.1 loodud HTTP funktsiooni URL (Peale hindamist saate selle eemaldada)
  2. Küsimuse vastus ülesandest 10.1
  3. Python koodi projekt/kaust ülesandest: 10.4
    • Faile saab kopeerida WSL ubuntu virtuaalmasina seest "väljaspoole"
    • WSL virtuaalmasina seest on välise arvuti failisüsteem kätte saadab läbi /mnt kausta.
      • Näiteks minu sülearvuti kodu kaust on virtuaalmasina seest vaadates: /mnt/c/Users/pelle
      • Sinna faile kopeerides on need kätte saadavad väljaspool virtuaalmasinat
  4. Ekraanivaated ülesandest 10.5
10. Praktikum 10
Solutions for this task can no longer be submitted.

Võimalikud probleemid ja nende potentiaalsed lahendused.

  • Vältige Azure resursside nimedes suuri tähti, alakriipse ning muid spetsiaalseid tähti või karaktereid kui võimalik.
  • Kui tekib probleem sellega, et meie PDF funktsioon kasutab erinevat Azure Storage kontot kui Flask rakendus, siis saab flask rakenduses ära muuta Storage Account connection string muutuja väärtus, et oleks sama, mis sellel kontol mida PDF funktsioon kasutab.
    • Selleks, et kontrollida täpselt millist Storage Account/kontot Azure Blob tüüpi päästikuga funktsioon kuulab:
      • Saab Function App - > Settings -> Configuration lehelt vaadata, mis on AzureWebJsonStorage muutuja sisemine (storage) AccountName väärtus. See määrab ära millise storage account'i sees selle Azure Function APP funktsioonid kuulavad.
  • Kui funktsioon ei paista kävitavat peale seda kui laete üles uue teksti faili:
    • Kontrollige, et laete üles faili kausta/konteinerisse, mille nimi on raamatud
    • Kontrollige, ega teil ei ole mitut storage kontot, ning te kasutate teist kui see funktsioon kasutab.
    • Kontrollige, et funktsioni Trigger Tüüp on Blob
  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment