Http-pyyntöihin vastaava Python flask-sovellus toimii vihdoin koneellasi. Organisaatiossasi sovelluksia ajetaan ensisijaisesti pilvessä, joten seuraava tehtävä on paketoida sovellus konttiin, ladata se konttivarastoon (container registry) ja sen jälkeen ajaa sitä Azuressa tehtävään sopivalla konttialustalla.

Tämä on tekninen jatko-osa Koneoppimismallien julkaiseminen – artikkeliini, jossa luotiin yksinkertainen Python/Flask API-sovellus mallin julkaisemiseksi. Tässä blogissa aiheena miten julkaista mikä tahansa Python-pohjainen web-sovellus Azuressa. Menetelmä sopii täysin edellisen artikkelin API-sovelluksen julkaisemiseen. Kaikki tarvittava löytyy edellisen blogin git-reposta!

Python, Kontit ja Azure

Azure tarjoaa muutamia hieman toisistaan poikkeavia menetelmiä Pythonilla kirjoitettujen web-sovellusten julkaisemiseen. Menemättä yksityiskohtiin, yksinkertaisin tapa on 1) Laittaa sovellus ensin konttiin, 2) Siirtää kontti Azuren Container Registryyn ja sen jälkeen 3) käyttää Azuren Web App for Containers – palvelua kontin ajamiseen.

Prosessiin voi liittää niin paljon (tai vähän) automaatiota kun kukin katsoo tarpeelliseksi, mutta tämän artikkelin aiheena on miten sovellus saadaan tuotantoon nyt. Keskitymme siis vain mitä on tehtävä, jotta sovellus saadaan ajoon Azuressa. Tarvitset vähintään seuraavat:

  1. Sovellus + ohjeet miten sovellus pakataan konttiin (käytännössä Dockerfile). Yleensä hakemistorakenne, joka sisältää kaiken, mitä sovellus tarvii asentuakseen oikein ja toimiakseen tuotannossa.
  2. Konttivarasto (Container registry – tiedän, outo suomeksi). Keskitetty paikka, johon ajovalmiit kontit sijoitetaan varastoon, ja josta ne poimitaan edelleen ajettavaksi.
  3. Konttien ajoalusta. Organisaatio voi käyttää useampia ajoalustoja, joista kukin soveltuu tietyn tyyppisten sovellusten ajamiseen.

 

Prosessi, välivaiheet ja lopputulos

Alla olevassa kuvassa näkyy koko pakollinen prosessi alusta loppuun. Työ alkaa vasemman ylänurkan sovelluksesta, joka pakataan ensin konttiin ja aletaan kuljettamaan välivaiheiden kautta kohti tuotantoa.

The minimum setup to run a containerized web app on Azure.

Image: Minimiprosessi kontitetun sovelluksen ajamiseen Azuressa.

 

Artikkeli olettaa lukijaltaan perustaitoja Python-kehityksestä, Azuren Paas-palveluiden käyttöönotosta, Git-repon käytöstä ja mielellään perusymmärryksen docker-konttien toiminnasta. Olen yrittänyt linkittää artikkeliin sivustoja, joista pääset kuitenkin tutustumaan näihinkin aiheisiin hieman paremmin.

 

Tein käytännön kokeiluja varten minimaalisen python/flask – sovelluksen, jolla voit itse kokeilla prosessin läpikäyntiä. Lataa sovellus Git-reposta alla olevalla napilla.

 

Kontin luominen

Esivaatimukset: Python3, Docker ja Git asennettuna (mielellään linux) koneellasi.

Aloita kloonaamalla git-repo mikäli et vielä sitä tehnyt. runserver.py on itsenäinen flask-sovellus, jonka voit ajaa suoraan “python3 runserver.py” – komennolla. Ohjelma käynnistää koneellesi http-serverin localhostin porttiin 5000. Käynnistä sovellus, ja testaa selaimellasi, että se toimii suoraan python-komennolla ajettaessa:

Sovelluksen hakemistosta löytyy myös valmis Dockerfile, joka kuvaa miten kontti kasataan. Jos avaat tiedoston, huomaat että kontin perusimage on python3, vaaditut kirjastot ajetaan sisään pip3-komennolla, lähdekoodi kopioidaan konttiin, flaskin oletus portti 5000 avataan kutsuille ja lopuksi annetaan komento, jolla koko komeus lähtee käyntiin.

Kasaa (build) kontti ajamalla seuraava komento (luultavasti tarvii “sudon” koneellasi):

docker build -t pythonflaskapp .

ja kun kontti on kasassa, käynnistä kontti komennolla:

docker run -p 5000:5000 pythonflaskapp

Testaa uudelleen selaimellasi, että myös kontitettu sovellus edelleen toimii. URL-osoitteet ovat samat kuin edellisessä kokeilussa. Jos kaikki toimi, kontti on nyt kasassa ja tallessa paikallisen koneesi omassa konttivarastossa.

Kontin siirto Azure Container Registryyn

Esivaatimukset: Azure-tilaus (subscription) käytössäsi. Tarvittaessa saat ilmaisen tilauksen kokeiluja varten täältä. Luo itsellesi Azure Container Registry portaalin kautta. Koneellesi täytyy olla asennettuna Azure Azure CLI (command line interface).

Nyt kun kontti on kasassa, seuraava vaihe on kopioida kontti työasemaltasi Azure Container Registryyn (ACR). Kun kontti on Azuressa, se voidaan edelleen antaa sieltä käsin ajettavaksi mille tahansa Azuren ajoalustalle. Täydellisemmät (pitkät) ohjeet kontin siirtoon löytyvät tältä sivulta.

Prosessi lyhyesti:

  1. Merkkaa (tag – tiedän, taas outo suomennos) paikallinen kontin image ACR:ään siirtoa varten komennolla: docker tag pythonflaskapp [myAcrName].azurecr.io/pythonflaskapp:v1
  2. Kirjaudu sisään Azure ACR:ään komennolla: az acr login –name [MyAcrName] ja seuraa ruudulle ilmentyviä ohjeita.
  3. Työnnä image ACRään komennolla: docker push [myAcrName].azurecr.io/pythonflaskapp:v1

Paikallinen konttisi on nyt kopioitu Azuren Container Registryyn. Voit käydä katsomassa Azuressa ACR:stä, että kontti todella siirtyi Azureen.

Kontin ajaminen Azuressa

Viimeinen tehtävä on pystyttää kontille ajoalusta, ja komentaa se ajamaan juuri Azureen lataamaasi kontti-imagea. Azuren sekä hyvä että huono puoli on se, että konttien ajoalustoja on tarjolla jälleen useita. Mikä pitäisi valita? Pääasialliset vaihtoehtosi ovat:

  • Luo virtuaalikone, jossa ajetaan dockeria. (Ei näin kiitos. Kukaan ei toimi näin.)
  • Azure Container Instance (ACI) on PaaS-palvelu, jossa voit ajaa mitä tahansa yhtä konttia. Valitse konetyyppi (prosessori, muisti) ja laita kontti ajoon. Ei skaalaudu automaattisesti. (Web-sovelluksille – ei paras vaihtoehto)
  • Azure Web App for Containers: Web App on PaaS-palvelu, joka on erityisesti tarkoitettu http-palvelimeen perustuvien sovellusten ajamiseen. Valitse konetyyppi jossa haluat sovellustasi ajettavan (prosessori, muisti). Skaalautuu pyynnöstä automaattisesti useampaan instanssiin. Tarjoaa erityisen helpon tavan kutsujan autentikointiin jos on tarvetta + muuta käyttökelpoista. Tämä on hyvä!
  • Azure Container Service (AKS): Useamman koneen Kubernetes-klusteri, jossa kontteja voidaan ajaa. Jos sinulla on tarve ajaa useita eri kontitettuja sovelluksia keskitetyssä ympäristössä, tämä on hyvä vaihtoehto. Useimpiin tarpeisiin ylimitoitettu ratkaisu.
  • RedHat OpenShift virtuaalikonekluseri Azuressa. Jotkut tykkäävät. Kuten AKS, useimpiin tapauksiin melkoinen ylilyönti.

Eli valintamme tähän käyttötarkoitukseen on:

Azure Web App for Containers

Jos Azure ja Web Appit ovat uutta, tässä hyvä (englanninkielinen), uudehko video aiheeseen perehtymiseksi!

Valintamme on siis Azure Web App for Containers. Saat tarvittaessa helpon menetelmän käyttäjän tunnistautumista ja sisäänkirjautumista varten, autoskaalauksen (ilman erillisiä load balancereita), mukavan autodeploy-ominaisuuden, oman domain-nimen, SSL-sertit jne.

Mene azure portaaliin, ja luo uusi resurssi: Web App for Containers. Azure kysyy muutaman tiedon, täytä nämä seuraavaksi:

  1. Anna sovelluksellesi nimi. Tästä tulee sovelluksen url-osoitteen etuliite. URL osoitteiden täytyy olla yksilöiviä. Osoitteesta tulee lopulta [sovelluksennimi].azurewebsites.net – muotoinen.
  2. Valitse tilaus jota haluat käyttää (sinulla on luultavasti vain yksi vaihtoehto).
  3. Luo uusi Resource Group. Resurssiryhmä on eräänlainen kansio, johon kaikki luodut resurssit laitetaan.
  4. Valitse tai luo uusi App Service Plan, alla hieman lisätietoa tästä.
  5. Valitse kontti jota haluat ajaa ACR-vaihtoehdon alta.

 

Kuva: Web App for Container valmiina luontiin. 

 

App Service plan ja hinnoittelu

App service plan määrittelee mm. millaisessa koneessa sovelluksesi lopulta ajetaan (muisti, coret), sekä muutamia muita ominaisuuksia kuten mahdollisuus omaan domain-nimeen, skaalautuminen jne. Nämä tekijät vaikuttavat web appin minuuttihintaan.

Tätä harjoitusta varten:

  1. Luo uusi App Service Plan, anna sille joku nimi (ei niin väliä mikä).
  2. Valitse sijainniksi West Europe (Suomea lähin datacenter, Amsterdam)
  3. Valitse Pricing Tier: B1 Dev/Test valinnan alta. Näet samalla oletetun kustannuksen.
  4. Paina Apply

 

Kuva: App Service Plan & Pricing Tier – hinnoittelumallit

Kontin valinta “Configure container”

Viimeinen työvaihe on valita mitä konttia tässä Web Appissa halutaan ajaa. Valitse tässä registry, sovellus, versio, eli ACR:ään äsken lataamasi kontti. Jätä startup file – boksi tyhjäksi.

Jos et näe luomaasi ACR:ää listalla, on yksi pikku juttu joka on vaan tiedettävä: Mene luomasi ACR:n asetuksiin, ja laita päälle “Admin User” valinta Azure Container Registry – Acceess keys – sivulla. Katso kuva alla. Tämän jälkeen ACR ilmestyy listoillesi.

 

Kuva: Admin user – valinta ACR:n Access keys-sivulla.

Nyt oletkin valmis, klikkaa Create, niin Azure ryhtyy luomaan sovellustasi. Ensimmäisellä kerralla tämä voi kestää 15 minuttia, joskus jopa kauemmin. Pikkuinen kellon kuva yläpalkissa huomauttaa kun sovellus on mukamas valmis. Web App for Containers tapauksessa sovelluksen julkaisu on luultavasti vielä tämänkin jälkeen kesken, älä hämmenny kun sovellus ei heti vastaa. Kärsivällisyyttä, se tulee sieltä kyllä!

Testaa sovelluksesi!

Sovelluksen osoite näkyy web appin Overview-palkissa. Avaa selain. Tällä kertaa jätä osoitteesta pois portti 5000 – Azure on automaagisesti vaihtanut sovelluksesi ajettavaksi normaaleihin 80 ja 443 portteihin. Testaa sovelluksesi näillä osoitteilla:

  • https://[yourappname].azurewebsites.net — tervetuloa-sivu.
  • https://[yourappname].azurewebsites.net/api?input=5 — REST api testi.

Sovelluksen käynnistyminen kestää (pitkän) tovin, mutta lopputulemana kontitettu python flask sovelluksesi on nyt Azuressa ajettavana.

Mitä seuraavaksi?

Blogin tarkoituksena oli näyttää helpoin tapa Python – sovelluksen julkaisemiseksi Azureen. Tein puolestasi päätöksen, että sovelluksen työntäminen konttiin ja sen ajaminen Azuressa on paras tapa tähän käyttötarkoitukseen.

Todellisuudessa voit ajaa Azuren Web Appissa myös “raakoja” python-sovelluksia – kontittaminen ei ole pakollista. Jos tämä tapa kiinnostaa, tällä sivulla on ohjeet miten temppu tehdään. Menetelmien ero on lähinnä missä kohdassa haluat käydä taistelun ajoympäristöön tuotavista python-kirjastoista (tensorflow ja joskus jopa numpy voivat olla todellinen riesa tuoda ajoympäristöön). Konttimenetelmässä taistelu käydään konttia luodessa (Dockerfile), raakamenetelmässä usein Web Appin kudu-konsolin kautta. IMHO, sota on helpompi voittaa kontin kokoamisessa, mutta saat vapaasti olla eri mieltä asiasta.

DevOps näkökulmasta käy ainakin kääntämässä Web App for Containersin “Continuous Deployment” vipu päälle. Optio ilmestyy näkyville Container Settings – sivulle kun sovellus on julkaistu. Vivun ollessa päällä, aina kun tuot ACR:ään uuden version sovelluksestasi, Web App for Containers vie uuden imagen tuotantoon automaattisesti. Yksinkertaista.

Jos olet kiinnostunut viemään devops-näkökulmaa vielä pidemmälle, katso mitä DevOps Project tekee. DevOps projectin avulla saat hieman esimakua siitä, mitä varsinainen Azure DevOps mahdollistaa.

Jos tarvitset kutsuvan sovelluksen tai käyttäjän tunnistamista, mene Web App – Authentication / Authorization sivulle, ja väännä tunnistusvipu päälle niin näet vaihtoehdot. Tarkempi kuvaus mitä tämä tarkoittaa löytyy tältä sivulta.

Ja jos tuntuu siltä, käy sallimassa sovelluksen skaalata itseään automaattisesti niin, että kuorman kasvaessa palvelu nostaa useamman instanssin vastaamaan pyyntöihin. Tämä tehdään Web App – Scale Out (App Service) sivulla.

Siellä se lepää. Enjoy!

 

Päivitykset

  • 5.6.2019 Dockerfile: Lisätty Gunicorn ajamaan flask-sovellusta. Gunicorn hoitaa tuotantokäyttöä varten pyyntöjen jonotuttamisen sekä jonon jakamisen rinnakkain ajettaville prosesseille. Flaskia ei oikeastan koskaan ole tarkoitettu ajettavaksi ilman tätä – ei osaa itse ajaa rinnakkain yhtään mitään. 
  • 5.6.2019 runserver.py: Print() –> app.logger. Hieman järkevämpi tapa tulostaa.
  • 5.6.2019 scripts apuskriptit kontin rakentamiseen ja siirtoon ACR:ään. Ei tarvitse kenenkään muistaa ulkoa.