Verkkosovelluksia rakennettaessa on tehtävä monia valintoja, jotka voivat joko auttaa tai estää sovellustasi tulevaisuudessa, kun olet sitoutunut niihin. Valinnat, kuten kieli, kehys, isännöinti ja tietokanta, ovat ratkaisevan tärkeitä.
Yksi tällainen valinta on, luodaanko palvelupohjainen sovellus käyttämällä palvelukeskeistä arkkitehtuuria (SOA) vai perinteistä, monoliittista sovellusta. Tämä on yleinen arkkitehtoninen päätös, joka vaikuttaa startup-yrityksiin, laajennuksiin ja yritysyrityksiin.
Palvelukeskeistä arkkitehtuuria käyttävät monet tunnetut yksisarviset ja huipputeknologiayritykset, kuten Google, Facebook, Twitter, Instagram ja Uber. Näennäisesti tämä arkkitehtuurikuvio toimii suurille yrityksille, mutta voiko se toimia sinulle?
Tässä artikkelissa esittelemme palvelusuuntautuneen arkkitehtuurin aiheen ja kuinka AWS Lambdaa yhdessä Pythonin kanssa voidaan hyödyntää helposti skaalautuvien, kustannustehokkaiden palvelujen rakentamisessa. Näiden ideoiden esittelemiseksi rakennamme yksinkertaisen kuvien lataus- ja kokopalvelun Pythonilla, AWS Lambdalla, Amazon S3: lla ja muutamilla muilla asiaankuuluvilla työkaluilla ja palveluilla.
Palvelusuuntautunut arkkitehtuuri (SOA) ei ole uusi, sillä juuret ovat jo vuosikymmeniä sitten. Viime vuosina sen suosio mallina on kasvanut, koska se tarjoaa monia etuja web-sovelluksille.
SOA on pohjimmiltaan yhden suuren sovelluksen abstraktio moniin kommunikoiviin pienempiin sovelluksiin. Tämä noudattaa useita ohjelmistosuunnittelun parhaita käytäntöjä, kuten irrotus, huolenaiheiden erottaminen ja yhden vastuun arkkitehtuuri.
SOA: n toteutus vaihtelee tarkkuuden suhteen: hyvin harvoista palveluista, jotka kattavat suuret toiminnallisuudet, moniin kymmeniin tai satoihin pieniin sovelluksiin ns. mikropalvelu ' arkkitehtuuri. Riippumatta tarkkuustasosta, SOA: n harjoittajat sopivat yleisesti siitä, että se ei suinkaan ole ilmainen lounas. Kuten monet ohjelmistosuunnittelun hyvät käytännöt, se on investointi, joka vaatii ylimääräistä suunnittelua, kehittämistä ja testausta.
AWS Lambda on Amazon-verkkopalvelut foorumi. AWS Lambda antaa sinun ladata koodin, joka suoritetaan Amazonin hallinnoimassa on-demand-säilössä. AWS Lambda hallinnoi palvelimien valmistelua ja hallintaa koodin suorittamiseksi, joten käyttäjältä tarvitaan vain pakattu koodisarja suoritettavaksi ja muutama määritysvaihtoehto määritelläksesi kontekstin, jossa palvelin toimii. Näitä hallittuja sovelluksia kutsutaan Lambda-toiminnoiksi.
AWS Lambdalla on kaksi päätoimintatilaa:
Asynkroninen / tapahtumapohjainen:
Lambda-toimintoja voidaan käyttää vastauksena tapahtumaan asynkronisessa tilassa. Mitään tapahtumalähdettä, kuten S3, SNS, jne. Ei estetä, ja Lambda-toiminnot voivat hyödyntää tätä monin tavoin, kuten esimerkiksi luoda prosessointiputki jollekin tapahtumaketjulle. Tietolähteitä on monia, ja lähteestä riippuen tapahtumat siirretään Lambda-toimintoon tapahtumalähteestä tai AWS Lambda kysyy tapahtumista.
Synkroninen / pyyntö-> vastaus:
Sovelluksissa, jotka edellyttävät vastauksen palauttamista synkronisesti, Lambda voidaan ajaa synkronisessa tilassa. Tyypillisesti tätä käytetään yhdessä API Gateway -nimisen palvelun kanssa HTTP-vastausten palauttamiseksi AWS Lambdasta loppukäyttäjälle, mutta Lambda-toimintoja voidaan kutsua myös synkronisesti suoran puhelun kautta AWS Lambdalle.
AWS Lambda -toiminnot ladataan zip-tiedostona, joka sisältää käsittelijäkoodin käsittelijän toiminnalle tarvittavien riippuvuuksien lisäksi. Ladattuaan AWS Lambda suorittaa tämän koodin tarvittaessa ja skaalaa palvelimien määrän tarvittaessa nollasta tuhanteen ilman kuluttajan tarvitsemaa ylimääräistä väliintuloa.
Basic SOA on tapa rakentaa koodipohjasi pieniksi sovelluksiksi hyödyntääkseen sovellusta aiemmin tässä artikkelissa kuvatulla tavalla. Tästä johtuen näiden sovellusten välinen viestintätapa tulee keskipisteeseen. Tapahtumavetoinen SOA (alias SOA 2.0) sallii paitsi perinteisen suoran palvelujen välisen tiedonsiirron SOA 1.0: sta myös tapahtumien levittämisen koko arkkitehtuurissa muutosten kommunikoimiseksi.
Tapahtumavetoinen arkkitehtuuri on malli, joka luonnollisesti edistää löysää kytkentää ja sopeutettavuutta. Luomalla ja reagoimalla tapahtumiin palveluita voidaan lisätä tapauskohtaisesti uusien toimintojen lisäämiseksi olemassa olevaan tapahtumaan, ja useita tapahtumia voidaan sommitella tarjoamaan rikkaampi toiminnallisuus.
AWS Lambdaa voidaan käyttää alustana SOA 2.0 -sovellusten rakentamiseen helposti. Lambda-toiminto voidaan käynnistää monella tapaa; perinteisestä viestijono-lähestymistavasta Amazon SNS: n kanssa tapahtumiin, jotka ovat syntyneet Amazon S3: een ladattavan tiedoston tai Amazon SES: n kanssa lähetetyn sähköpostin kautta.
Rakennamme yksinkertaisen sovelluksen kuvien lataamiseen ja hakemiseen AWS-pinon avulla. Tämä esimerkkiprojekti sisältää kaksi lambda-toimintoa: yksi toimii pyyntö-> vastaustilassa, jota käytetään palvelemaan yksinkertaista web-käyttöliittymää, ja toinen, joka havaitsee lähetetyt kuvat ja muuttaa niiden kokoa.
Ensimmäinen lambda-toiminto toimii asynkronisesti vastauksena tiedostojen lataustapahtumaan, joka laukaistaan S3-ämpäriin, joka sisältää ladatut kuvat. Se ottaa toimitetun kuvan ja muuttaa sen kokoa 400 x 400 kuvaan.
Toinen lambda-toiminto palvelee HTML-sivua, joka tarjoaa sekä käyttäjän toiminnot tarkastella muiden Lambda-toimintojemme koon mukaisia kuvia että käyttöliittymän kuvan lataamiseen.
Ennen kuin voimme aloittaa, meidän on määritettävä joitain tarvittavia AWS-palveluja, kuten IAM ja S3. Nämä määritetään web-pohjaisen AWS-konsolin avulla. Suurin osa kokoonpanosta voidaan kuitenkin saavuttaa myös AWS-komentorivi-apuohjelmalla, jota käytämme myöhemmin.
S3 (tai yksinkertainen tallennuspalvelu) on Amazon-objektisäilöpalvelu, joka tarjoaa luotettavaa ja kustannustehokasta tietojen tallentamista. Käytämme S3: ta ladattavien kuvien sekä käsittelemiemme kuvien koon muuttamiseen.
S3-palvelu löytyy AWS-konsolin avattavasta ”Services” -valikosta ”Storage & Content Delivery” -alaryhmästä. Kun luot ryhmää, sinua pyydetään antamaan sekä ryhmän nimi että valitsemaan alue. Käyttäjille lähellä olevan alueen valitseminen sallii S3: n optimoinnin viiveelle ja kustannuksille sekä joillekin sääntelytekijöille. Tässä esimerkissä valitaan alue ”US Standard”. Samaa aluetta käytetään myöhemmin AWS Lambda -toimintojen isännöimiseen.
On syytä huomata, että S3-ämpärien nimien on oltava yksilöllisiä, joten jos valitset valitun nimen, sinun on valittava uusi, yksilöllinen nimi.
Tätä esimerkkiprojektia varten luomme kaksi tallennustilaa, joiden nimi on 'test-upload' ja 'test-resized'. Test-upload-ämpäriä käytetään kuvien lataamiseen ja ladatun kuvan tallentamiseen ennen sen käsittelyä ja koon muuttamista. Kun sen kokoa on muutettu, kuva tallennetaan “testikokoa” -säilöön ja raaka ladattu kuva poistetaan.
Oletusarvoisesti S3-käyttöoikeudet ovat rajoittavia eivätkä salli ulkoisten käyttäjien tai edes muiden kuin järjestelmänvalvojien lukea, kirjoittaa, päivittää tai poistaa mitään käyttöoikeuksien tai objektien ryhmästä. Tämän muuttamiseksi meidän on kirjauduttava sisään käyttäjänä, jolla on oikeudet hallita AWS-ryhmän oikeuksia.
Olettaen, että olemme AWS-konsolissa, voimme tarkastella lataussäiliömme käyttöoikeuksia valitsemalla ryhmän nimen mukaan, napsauttamalla näytön oikeassa yläkulmassa olevaa Ominaisuudet-painiketta ja avaamalla tiivistetyn Käyttöoikeudet-osan.
Jotta anonyymit käyttäjät voivat ladata tähän ryhmään, meidän on muokattava ryhmäkäytäntöä sallimaan erityinen käyttöoikeus, joka sallii lataamisen. Tämä tapahtuu JSON-pohjaisen määrityskäytännön avulla. Tällaisia JSON-käytäntöjä käytetään laajasti kaikkialla AWS: ssä yhdessä IAM-palvelun kanssa. Kun napsautat Muokkaa kopiokäytäntöä -painiketta, liitä seuraava teksti ja napsauta Tallenna, jolloin kuvien julkinen lataaminen on mahdollista:
{ 'Version': '2008-10-17', 'Id': 'Policy1346097257207', 'Statement': [ { 'Sid': 'Allow anonymous upload to /', 'Effect': 'Allow', 'Principal': { 'AWS': '*' }, 'Action': 's3:PutObject', 'Resource': 'arn:aws:s3:::test-upload/*' } ] }
Tämän jälkeen voimme varmistaa, että ryhmäkäytäntö on oikea yrittämällä ladata kuva ämpäriin. Seuraava komento cURL tekee temppun:
curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F ' [email protected] '
Jos palautetaan 200 alueen vastaus, tiedämme, että lähetyssäilön kokoonpano on onnistunut. S3-kauhamme tulisi nyt konfiguroida (enimmäkseen). Palaamme myöhemmin tähän palveluun konsolissa, jotta voimme yhdistää kuvien lataustapahtumamme kokotoiminnon kutsumiseen.
Kaikki lambda-roolit toimivat lupakontekstissa, tässä tapauksessa IAM-palvelun määrittelemässä 'roolissa'. Tämä rooli määrittelee kaikki ja kaikki oikeudet, jotka Lambda-funktiolla on kutsun aikana. Tämän esimerkkiprojektin tarkoituksiin luomme yleisen roolin, jota käytetään molempien Lambda-toimintojen välillä. Tuotantotilanteessa on kuitenkin suositeltavaa määritellä tarkemmin lupa-määritelmät, jotta varmistetaan, että kaikki tietoturva-hyödyntämiset on eristetty vain määriteltyyn lupakontekstiin.
IAM-palvelu löytyy avattavan ”Palvelut” -osiossa ”Turvallisuus ja henkilöllisyys”. IAM-palvelu on erittäin tehokas työkalu pääsyn hallintaan AWS-palveluissa, ja tarjottu käyttöliittymä voi olla aluksi hieman ylivoimainen, jos et tunne vastaavia työkaluja.
Kun IAM-hallintapaneelisivu on, Roolit-alaosio löytyy sivun vasemmalta puolelta. Täältä voimme käyttää Luo uusi rooli -painiketta tuodaksesi esiin monivaiheisen ohjatun toiminnon määritelläksesi roolin käyttöoikeudet. Käytetään yleisen luvan nimenä lambda_role. Kun olet jatkanut nimen määrittelysivulta, sinulle näytetään mahdollisuus valita roolityyppi. Koska vaadimme vain S3-pääsyä, napsauta 'AWS Service Roles' ja valitse valintaruudusta 'AWS Lambda'. Sinulle esitetään sivu käytäntöjä, jotka voidaan liittää tähän rooliin. Valitse AmazonS3FullAccess-käytäntö ja jatka seuraavaan vaiheeseen vahvistaaksesi luotavan roolin.
On tärkeää huomioida luodun roolin nimi ja ARN (Amazon Resource Name). Tätä käytetään uuden Lambda-toiminnon luomisessa funktion kutsumiseen käytettävän roolin tunnistamiseksi.
Huomautus: AWS Lambda kirjaa automaattisesti kaikki funktiokutsujen lähdöt AWS Cloudwatch -rekisteröintipalveluun. Jos tätä toimintoa suositellaan, mikä on suositeltavaa tuotantoympäristössä, lupa kirjoittaa Cloudwatch-lokivirtaan on lisättävä tämän roolin käytäntöihin.
Nyt olemme valmiita aloittamaan koodauksen. Oletamme tässä vaiheessa, että olet määrittänyt 'awscli' -komennon. Jos et ole, voit seurata ohjeita osoitteessa https://aws.amazon.com/cli/ määrittää awscli tietokoneellesi.
Huomautus: näissä esimerkeissä käytetty koodi on lyhennetty näytön katselun helpottamiseksi. Täydellisempi versio on osoitteessa https://github.com/gxx/aws-lambda-python/ .
Ensinnäkin, perustetaan projektimme luurankorakenne.
aws-lambda-python/ - image_list/ - handler.py - list.html - Makefile - requirements.txt - image_resize/ - handler.py - resize.py - Makefile - requirements.txt - .pydistutils.cfg
Rakenteessamme on kaksi alihakemistoa, yksi kullekin lambda-toiminnolle. Jokaisessa näistä on yhteiset handler.py-, Makefile- ja requirements.txt-tiedostot. Handler.py-tiedosto sisältää menetelmän kutsua kutakin lambda-toimintoa, ja sitä voidaan pitää toimintojen lähtökohtana. Vaatimukset.txt-tiedosto sisältää luettelon riippuvuuksistamme, joten voimme helposti määrittää ja päivittää vaatimukset. Lopuksi Makefile-komento, jota käytämme tarjoamaan helpon mekanismin vuorovaikutuksessa awsclin kanssa. Tämä tekee lambda-toiminnon luomisen ja päivittämisen paljon helpommaksi.
Huomaat .pydistutils.cfg-tiedoston projektihakemistomme juuressa. Tämä tiedosto vaaditaan, jos työskentelet Pythonin kanssa Homebrew-alla. Lambda-toiminnon käyttöönottomenetelmän vuoksi (käsitelty seuraavassa osassa) tätä tiedostoa tarvitaan. Katso lisätietoja arkistosta.
Alustamalla resize_image -toiminnolla jäädytämme Wand-riippuvuuden, kuvankäsittelykirjastomme, tallentamalla Wand==0.4.2
vaatimuksiin. txt. Tämä on ainoa riippuvuus image_resize lambda -toiminnostamme. Resize.py: n resize_image-funktion on käsiteltävä Wand-kirjaston kuvaresursseja ja muutettava sen kokoa määritettyjen leveys- ja korkeusparametrien mukaan. Koon muuttavan kuvan säilyttämiseksi käytämme 'parhaiten sopivan' koon muuttamisalgoritmia, joka ylläpitää alkuperäisen kuvan kuvasuhdetta pienentäen samalla kuvan kokoa sopivaksi määritettyyn leveyteen ja korkeuteen.
def resize_image(image, resize_width, resize_height): ... original_ratio = image.width / float(image.height) resize_ratio = resize_width / float(resize_height) # We stick to the original ratio here, regardless of what the resize ratio is if original_ratio > resize_ratio: # If width is larger, we base the resize height as a function of the ratio of the width resize_height = int(round(resize_width / original_ratio)) else: # Otherwise, we base the width as a function of the ratio of the height resize_width = int(round(resize_height * original_ratio)) if ((image.width - resize_width) + (image.height - resize_height)) <0: filter_name = 'mitchell' else: filter_name = 'lanczos2' image.resize(width=resize_width, height=resize_height, filter=filter_name, blur=1) return image
Tämän poissa ollessa vaaditaan käsittelijätoiminto, joka hyväksyy ladatun S3-kuvan luoman tapahtuman ja luovuttaa sen resize_image
-toiminto ja tallenna tulokseksi muutettu kuva.
from __future__ import print_function import boto3 from wand.image import Image from resize import resize_image def handle_resize(event, context): # Obtain the bucket name and key for the event bucket_name = event['Records'][0]['s3']['bucket']['name'] key_path = event['Records'][0]['s3']['object']['key'] response = boto3.resource('s3').Object(bucket_name, key_path).get() # Retrieve the S3 Object # Perform the resize operation with Image(blob=response['Body'].read()) as image: resized_data = resize_image(image, 400, 400).make_blob() # And finally, upload to the resize bucket the new image s3_connection.Object('test-resized', key_path).put(ACL='public-read', Body=resized_data) # Finally remove, as the bucket is public and we don't want just anyone dumping the list of our files! s3_object.delete()
Kun koodi on valmis, se on ladattava Amazon Lambdaan uutena Lambda-toimintona. Tässä tulee hakemistorakenteeseen lisätty Makefile. Tätä Makefile-tiedostoa käytetään luomiemme Lambda-toimintomääritelmien käyttöönottoon.
ROLE_ARN = arn:aws:iam::601885388019:role/lambda_role FUNCTION_NAME = ResizeImage REGION = us-west-1 TIMEOUT = 15 MEMORY_SIZE = 512 ZIPFILE_NAME = image_resize.zip HANDLER = handler.handle_resize clean_pyc : find . | grep .pyc$ | xargs rm install_deps : pip install -r requirements.txt -t . build : install_deps clean_pyc zip $(ZIPFILE_NAME) -r * create : build aws lambda create-function --region $(REGION) --function-name $(FUNCTION_NAME) --zip-file fileb://$(ZIPFILE_NAME) --role $(ROLE_ARN) --handler $(HANDLER) --runtime python2.7 --timeout $(TIMEOUT) --memory-size $(MEMORY_SIZE) update : build aws lambda update-function-code --region $(REGION) --function-name $(FUNCTION_NAME) --zip-file fileb://$(ZIPFILE_NAME) --publish
Tämän Makefile-ohjelman päätoiminnot ovat 'luo' ja 'päivitä'. Nämä toiminnot paketoivat ensin nykyisen hakemiston, joka edustaa kaikkia Lambda-toiminnon suorittamiseen tarvittavia koodeja. Seuraavaksi kaikki requirements.txt
-kohdassa määritetyt riippuvuudet tiedosto asennetaan nykyiseen pakattavaan alihakemistoon. Pakkausvaihe vetää hakemiston sisällön myöhemmin ladattavaksi “awscli” -komennolla. Makefile-tiedostomme voidaan mukauttaa käytettäväksi toisessa Lambda-toiminnon määrittelyssä.
Makefile-apuohjelmassa määritellään muutama muuttuja, jotka ovat välttämättömiä kuvan luomiseksi / päivittämiseksi. Määritä nämä tarpeen mukaan, jotta Makefile-komennot toimivat oikein.
ROLE_ARN
: Tämä on Amazon Resource Name, joka tunnistaa roolimme, jolla Lambda-toimintoa voidaan käyttää.FUNCTION_NAME
: Luotavan / päivitettävän Lambda-toiminnon nimi.REGION
: Alue, jolla Lambda-toiminto luodaan / päivitetään.TIMEOUT
: Aikakatkaisu sekunneissa ennen kuin Lambda-kutsu tapetaan.MEMORY_SIZE
: Muistin koko megatavuina, johon Lambda-toiminto saa pääsyn, kun sitä kutsutaan.ZIPFILE_NAME
: Pakatun paketin nimi, joka sisältää Lambda-toimintokoodin ja riippuvuudet.HANDLER
: Handler-funktion absoluuttinen tuontipolku pistemerkinnässä.Kun asetukset on määritetty, suorita make create
komento luo jotain samanlaista kuin seuraava lähtö:
$ make create pip install -r requirements.txt -t . ... find . | grep .pyc| xargs rm zip image_resize.zip -r * ... aws lambda create-function --region ap-northeast-1 --function-name ResizeImage2 --zip-file fileb://image_resize.zip --role arn:aws:iam::11111111111:role/lambda_role --handler handler.handle_resize --runtime python2.7 --timeout 15 --memory-size 512 { 'CodeSha256': 'doB1hsujmZnxZHidnLKP3XG2ifHM3jteLEBvsK1G2nasKSo=', 'FunctionName': 'ResizeImage', 'CodeSize': 155578, 'MemorySize': 512, 'FunctionArn': 'arn:aws:lambda:us-west-1:11111111111:function:ResizeImage', 'Version': '$LATEST', 'Role': 'arn:aws:iam::11111111111:role/lambda_role', 'Timeout': 15, 'LastModified': '2016-01-10T11:11:11.000+0000', 'Handler': 'handler.handle_resize', 'Runtime': 'python2.7', 'Description': '' }
Luontikomennon suorittamisen jälkeen kuvien koon muuttamisfunktiota voidaan käyttää, mutta sitä ei ole yhdistetty S3-ämpäriin tapahtumien vastaanottamiseksi. Voimme edelleen testata toimintoa AWS-konsolin kautta varmistaaksemme, että toiminto käsittelee S3-tiedostojen lataustapahtumia oikein. Valitse luomamme toiminnon nimi AWS Lambda -hallintapaneelista, joka löytyy avattavan Palvelut-osion Laske-osiosta. Tämä Lambda-toiminnon tietosivu tarjoaa avattavan valikon nimeltä 'Toiminnot', joka sisältää vaihtoehdon 'Määritä testitapahtuma'.
Napsauttamalla tätä avautuu modeemi, jonka avulla voit määrittää testitapahtuman ja joitain esimerkkimalleja. Valitse S3 Put -esimerkki ja korvaa kaikki kauhan nimen maininnat asetetun kauhan nimellä. Kun tämä on määritetty, seuraava 'Test' -painikkeen käyttö Lambda-toiminnon sivulla käynnistää Lambda-toiminnon ikään kuin aiemmin määritetty tapahtuma olisi todella tapahtunut.
Voit seurata mahdollisia virhepinon jälkiä tai lokiviestejä tarkastelemalla lokivirtaa Cloudwatchissa. Uusi lokiryhmä on luotu samaan aikaan, kun Lambda-toiminto luotiin. Nämä lokivirrat ovat hyödyllisiä ja ne voidaan siirtää muihin palveluihin.
Laajenna Ominaisuudet-valikossa oleva tiivistetty 'Tapahtumat' -osio takaisin S3-hallintapaneeliin näyttämään Tapahtumailmoitukset-lomakkeen. Pakolliset kentät, jotka meidän on täytettävä, ovat “Tapahtumat” ja “Lähetä vastaanottajat”. Valitse Tapahtumat-kohdasta Luotu objekti (kaikki) -tapahtuma. Tämä mahdollistaa kaikkien tapahtumien sieppaamisen, jotka luovat objektin lähetyssäilöön. Valitse “Lähetetty” -tuloksi “Lambda-toiminto” -valintanappi. Uusi osa avautuu avattavaan valikkoon, joka sisältää “ResizeImage” lambda-toiminnon, jonka olemme määrittäneet vaihtoehtona. Kun napsautat “Tallenna”, kaikki “Objekti luodut” -tapahtumat ohjataan nyt syötteenä ”ResizeImage” Lambda -toiminnon kutsumiseen.
Meillä on nyt sovelluksen ydintoiminnot. Suoritetaan toinen CURL-testi varmistaaksemme, että kaikki toimii odotetulla tavalla. Käytä cURL-painiketta kuvan lähettämiseen S3-ämpäriin ja tarkista manuaalisesti, että kuva on ladattu koon muutossäiliöön.
curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F ' [email protected] '
Tämän komennon suorittamisen jälkeen koon muuttanut kuva tulisi luoda 'testikokoa' sisältävään ämpäriin 50-1000 ms: n kuluttua sen mukaan, onko Lambda-toiminto jo lämmitetty.
ListImage Lambda -toiminto hakee luettelon muutetuista kuvista ja näyttää ne käyttäjän HTML-sivulla. Tämä HTML-sivu tarjoaa myös toiminnot, joiden avulla käyttäjä voi ladata omia kuvia. Jinja2: ta käytetään funktiossa renderöimään HTML mallipohjan määrityksestä. Aivan kuten aiemmin, nämä vaatimukset määritetään requirements.txt
tiedosto.
from __future__ import print_function import os import boto3 from jinja2 import Environment from jinja2 import FileSystemLoader def _render_template(image_urls): env = Environment(loader=FileSystemLoader(os.path.abspath(os.path.dirname(__file__)))) template = env.get_template('list.html') rendered_template = template.render(image_urls=image_urls) return rendered_template def handle_list_image(event, context): bucket = boto3.resource('s3').Bucket('test-resized') image_summaries = sorted((image_summary for image_summary in bucket.objects.all()), key=lambda o: o.last_modified) image_urls = [] for summary in image_summaries: image_urls.append( boto3.client('s3').generate_presigned_url( 'get_object', Params={ 'Bucket': summary.bucket_name, 'Key': summary.key } ) ) return {'htmlContent': _render_template(image_urls)}
List Images var uploadImage = (function () { var inProgress = false; return function () { if (inProgress) { return; } inProgress = true; var formData = new FormData(); var fileData = $('#image-file').prop('files')[0]; formData.append('key', parseInt(Math.random() * 1000000)); formData.append('acl', 'public-read'); formData.append('file', fileData); $.ajax({ url: 'https://test-upload.s3.amazonaws.com/', type: 'POST', data: formData, processData: false, contentType: false, success: function (data) { window.location.reload(); } }); } })(); .image__container { float: left; width: 30%; margin-left: 2.5%; margin-right: 2.5%; max-width: 400px; } {% for image_url in image_urls %} {% endfor %}
Jälleen kerran voimme muuttaa edellistä Makefile-tiedostoa ja käyttää Create -komentoa lambda-funktion käyttöönottoon.
ImageList Lambda -toiminto on valmis, mutta sitä ei voida palvella kenellekään käyttäjälle. Tämä johtuu siitä, että Lambda-toimintoja voidaan kutsua vain vastauksena toisen palvelun tapahtumaan tai ohjelmallisesti. Täällä Amazon AWS API Gateway -palvelu tulee paikalleen. API-yhdyskäytävä löytyy kohdasta ”Application Services”.
API-yhdyskäytävä on tapa mallintaa päätepisteitä resurssien ja menetelmien joukona, lähinnä REST-käyttöliittymä. Sen lisäksi, että API Gateway tarjoaa palvelun pyyntöjen validointiin ja muuntamiseen, se suorittaa muita toimintoja, kuten tarjoaa kuristus- / nopeutta rajoittavia pyyntöjä.
Luo API-yhdyskäytävän hallintapaneelista uusi sovellusliittymä ListImage-toiminnon palvelemiseen. Nimi ja kuvaus voidaan asettaa mieltymyksesi mukaan. Kun olet luonut, napsauta uuden sovellusliittymän nimeä saadaksesi käyttöliittymän tiedot. Luo uusi resurssi juuri-URL-osoitteelle “/”. Tätä URL-osoitetta käytetään HTML-sivun näyttämiseen.
Kun tarkastelet juuriresurssisivun tietoja, lisää GET-menetelmä. Aseta ”Integrointityyppi” -asetukseksi “Lambda-toiminto”, aseta ”Lambda-alue” -asetukseksi “us-west-1” tai valitsemallesi alueelle ja kirjoita ListImage Lambda -toiminnon nimi.
Ennen kuin voimme aloittaa vastauksemme kartoituksen HTML-lähdössä, meidän on määriteltävä 'malli', joka määrittelee mallin palvelimen vastaukselle sen lisäksi, että tämä vastaus kartoitetaan sisältötyyppiin. Valitse sovellusliittymän ”Mallit” -osio ja luo uusi malli napsauttamalla “Luo”. Anna mallille nimi HTML, sisältötyypillä 'text / html', ja määrittele malli seuraavasti:
{ '$schema': 'http://json-schema.org/draft-04/schema#', 'title' : 'HTML', 'type' : 'object' }
Palaa sovellusliittymän hallintapaneeliin valitsemalla luomamme resurssi ja siirry Integration Response -osioon. Tässä osassa määritellään kaikki prosessin muunnokset saatuaan vastauksen Lambda-toiminnolta ennen vastauksen lähettämistä viimeiseen vaiheeseen.
Avaa 'Mapping Templates' -osio ja lisää uusi 'Content Type' -asetukseksi 'text / html'. Poista vanha Sisältötyyppi samaan aikaan. Muuta oikealla olevasta avattavasta valikosta ”Output Passsthrough” - ”Mapping template”. Tämä antaa meille mahdollisuuden muuttaa API-yhdyskäytävän hyväksymää raakaa JSON-tiedostoa ja käyttää sen sijaan HTML-sisältöä palautettujen tietojen 'htmlContent' -ominaisuuden sisällä. Määritä kartoitusmalliksi malliksi $ input.htmlContent. Muuta lopuksi 'Method Response' -osaa poistamalla 'application / json' 'Response Models for 200' -kohdasta ja lisäämällä sen sijaan 'text / html'.
Palatessasi sovellusliittymän hallintapaneeliin, sivun vasemmassa yläkulmassa on painike, jonka nimi on 'Ota sovellusliittymä käyttöön'. Napsauttamalla tätä painiketta voit päivittää tai luoda sovellusliittymän määritetyillä resursseilla, menetelmillä, malleilla ja yhdistelmillä. Kun tämä on tehty, URL-osoite näytetään valitulle käyttöönottovaiheelle (oletusasetus). Lopuksi esimerkki on täydellinen! Voit ladata muutaman tiedoston testataksesi ja tarkastellaksesi koonmuutettuja kuvia.
AWS on suuri palvelu, eikä se ole poistumassa pian. Vaikka toimittajan lukitsemisessa on aina oltava varovainen, AWS Lambda tarjoaa suhteellisen ohuen palvelun, jossa on runsaasti lisäasetuksia. AWS-palvelun hyödyntäminen helposti skaalautuvien ja ylläpidettävien sovellusten toteuttamiseksi tuottaa suurimman hyödyn AWS-alustan käytöstä. AWS Lambda tarjoaa tyylikkään, skaalautuvan ja kustannustehokkaan ratkaisun, jota tukee yritystason alusta, jota käyttävät hyvin monet kuluttajat. Uskon, että 'palvelimettomat' sovellukset ovat tulevaisuuden tie. Kerro meille, mitä mieltä olet alla olevissa kommenteissa.