Kuinka rakentaa kytkettävä Golang-sovellus ja hyötyä AWS Lambda -kerroksista.

Golang - miksi se on huomion arvoinen?

Golang on Googlen suunnittelema ja toteuttama avoimen lähdekoodin ohjelmointikieli. Sitä käytetään erittäin laajasti nykyaikaisissa sovelluksissa, etenkin pilvessä. Sille on tyypillisimmät ominaisuudet:

  • Golang on staattisesti kirjoitettu - se tarjoaa vähemmän joustavuutta, mutta suojaa sinua virheistä,
  • Se ei ole oliokeskeistä. Voit kuitenkin luoda rakenteita ja rajapintoja, ja se antaa sinulle 3/4 OOP-periaatteesta: tietojen abstraktio, kapselointi ja polymorfismi. Perintö puuttuu ainoasta,
  • Goroutines! - kaikkien aikojen käyttämäni kevytlankojen suurin toteutus. Sen avulla voit luoda uuden säikeen erittäin helpoalla tavalla go-operaattorin avulla ja kommunikoida eri gorutiinien välillä kanavien avulla,
  • Se kääntyy yhdeksi binaariksi kaikilla riippuvuuksilla - ei enää pakettien ristiriitoja!

Henkilökohtaisesti pidän Golangia suurimpana kielenä, jota käytän päivittäin. Tämä artikkeli ei kuitenkaan koske ensimmäisen toiminnon luomista tai "Hello World" -tulostamista. Näytän sinulle vähän edistyneempiä juttuja. Jos olet aloittelija ja haluat lisätietoja Golangista, käy sen pääsivulla.

AWS Lambda & Golang

AWS Lambda on yksi suosituimmista palvelimettomista julkisen pilven laskentapalveluista, jonka Amazon Web Services julkaisi marraskuussa 2014. Sen avulla voit suorittaa koodisi vastauksena tapahtumiin, kuten DynamoDB-, SNS- tai HTTP-laukaisuihin, ilman palvelimien asettamista tai hallintaa! Tiedätkö mikä on todella hienoa? Tammikuusta 2018 lähtien se tukee Golangin suoritusaikaa. Työskentely AWS Lambdan kanssa on todella helppoa - lähetä vain vetoketjullinen paketti koodillasi ja kaikilla riippuvuuksilla (yksi binaarinen käytettäessä Golangia).

Pikakelaus eteenpäin, 4 vuotta myöhemmin vuonna 2018 uudelleen: Invent AWS julkaisee Lambda-kerrokset, joiden avulla voit tallentaa ja hallita tietoja, jotka on jaettu eri toimintojen välillä yhdessä tai jopa useassa AWS-tilissä! Esimerkiksi Pythonin käytön aikana voit laittaa kaikki riippuvuudet lisäkerrokseen, jota myöhemmin voivat käyttää muut Lambdat. Jokaiseen zip-pakettiin ei tarvitse enää laittaa erilaisia ​​riippuvuuksia! Golangin maailmassa tilanne on erilainen, koska AWS Lambda edellyttää, että lähetät kootun binaarin. Kuinka voimme hyötyä AWS Lambda -kerroksista? Vastaus on yksinkertainen - rakenna modulaarinen sovellus Golang-laajennusten avulla!

Golang-laajennukset - tapa rakentaa modulaarinen sovellus

Golang Plugins on Go1.8: ssa julkaistu ominaisuus, jonka avulla voit ladata dynaamisesti jaetut kirjastot (.so-tiedostot). Se antaa sinulle mahdollisuuden viedä osa koodistasi erilliseen kirjastoon tai käyttää jonkun muun valmistamaa ja koottua laajennusta. On lupaavaa, että on kuitenkin joitain rajoituksia:

  • Laajennuksesi on oltava yksi päämoduuli,
  • Voit ladata vain toimintoja ja muuttujia, jotka viedään ELF-symboleina,
  • Staattisen kirjoittamisen vuoksi sinun on heitettävä jokainen ladattu symboli oikean tyyppiseksi. Pahimmassa tilanteessa sinun on määritettävä oikea käyttöliittymä koodissasi,
  • Se toimii vain Linuxissa ja MacOS: issa. Henkilökohtaisesti en pidä tätä haittana :)

Ensimmäisen laajennuksen luominen ja testaaminen

Luokaamme nyt ensimmäinen laajennus. Esimerkiksi luomme yksinkertaisen moduulin merkkijonojen salaukselle. Palataan takaisin perusteisiin ja toteutetaan 2 yksinkertaista salausalgoritmia - Ceasar ja Verman.

  • Caesar-salaus on algoritmi, jota ensin käytti Julius Ceases. Se siirtää jokaista tekstin kirjainta kiinteän määrän paikkoja. Esimerkiksi, jos haluat salata sanan golang näppäimellä 4, saat ktpek. Salauksen purku toimii samalla tavalla. Sinun tarvitsee vain siirtää kirjaimia vastakkaiseen suuntaan.
  • Verman-salaus on samanlainen kuin Ceaser, perustuen samaan muuttuvaan ajatukseen, ero on siinä, että siirrät jokaista kirjainta eri määrillä paikkoja. Tekstin salauksen purkamiseen tarvitaan avain, joka sisältää tekstin salaamiseen käytetyt sijainnit. Esimerkiksi, jos haluat salata sanan golang näppäimellä [-1, 4, 7, 20, 4, -2], saat tulevaisuuden.

Tämän esimerkin täydellinen toteutus on täällä.

Laajennuksen toteutus

Seuraava katkelma sisältää kahden edellä mainitun algoritmin toteutuksen. Jokaisessa tapauksessa toteutamme 2 tapaa salata ja purkaa tekstin salaus:

Kuten näette, vietimme tänne 3 erilaista symbolia (Golang vie vain nämä tunnukset, jotka alkavat suurella kirjaimella):

  • EncryptCeasar - func (int, merkkijono) merkkijono, joka salaa tekstin Ceasar-algoritmin avulla,
  • DecryptCeaser - func (int, merkkijono) merkkijono, joka purkaa tekstin salauksen Caeser-algoritmin avulla,
  • VermanCipher - vermanCipher-tyypin muuttuja, joka toteuttaa 2 menetelmää: Salaa: func (merkkijono) merkkijono ja purkaa: func () (* merkkijono, virhe)

Tämän laajennuksen kääntämiseksi sinun täytyy suorittaa seuraava komento:

Siirry rakenna -buildmode = plugin -o plugin / cipher.so plugin / cipher.go

Toistaiseksi ei ole mitään erityistä - muutama yksinkertainen toiminto luotiin ja moduuli käännettiin laajennukseksi lisäämällä argumentti -buildmode = plugin.

Lataa ja testaa laajennus

Hauska alkaa, kun haluamme käyttää käännettyä laajennusta sovelluksessamme. Luodaan yksinkertainen esimerkki:

Ensin sinun täytyy tuoda golang-laajennuspaketti. Se sisältää vain kaksi toimintoa - ensimmäinen on jaetun kirjaston lataamista varten ja toinen on viedyn symbolin löytämiseksi. Kirjaston lataamiseen on käytettävä Open-toimintoa, joka vaatii polun antamisen jaetulle laajennukselle ja palauttaa plugin-tyypin muuttujan. Jos kirjaston lataaminen ei ole mahdollista (esim. Väärä polku tai vioittunut tiedosto), tämä toiminto palauttaa virheen, joka on käsiteltävä.

Seuraava vaihe on ladata kaikki viedyt symbolit hakutapaa käyttämällä. Pieni haitta on, että jokaisesta vietystä toiminnosta on ladattava erikseen. Voit kuitenkin yhdistää useita toimintoja yhdessä samalla tavalla kuin se tehtiin VermanCipher-symbolille. Kun olet ladannut kaikki käytettävät symbolit, sinun on heitettävä ne oikean tyyppisiin. Golang on staattisesti kirjoitettu kieli, joten ei ole muuta tapaa käyttää näitä symboleja ilman valua. Muista, että kun viet muuttujaa, joka toteuttaa muutama menetelmä, sinun on annettava se oikealle käyttöliittymätyypille (minun oli määritettävä encryptionEngine-käyttöliittymä tämän käsittelemiseksi). \ Newline \ newline

Sovelluksen kääntämiseksi ja ajamiseksi käytä seuraavaa komentoa:

mene rakentamaan app.go
./sovellus

Tulosteessa salatun ja salatun tekstin pitäisi nähdä todisteena siitä, että algoritmi toimii oikein.

Käytä laajennusta AWS-lambdassa

Jotta voimme käyttää laajennustamme AWS Lambdassa, meidän on tehtävä sovellukseen muutama muutos:

  • AWS Lambda asentaa kerrokset / opt-hakemistoon lambda-säilössä, joten meidän on ladattava laajennus tästä hakemistosta.
  • Meidän on luotava käsittelytoiminto, jota Lambda-moottori käyttää käsittelemään testitapahtumiamme.

Seuraava katkelma sisältää sovelluksemme, jota on mukautettu käyttämään Lambda:

Kuten näette, toteutus on hyvin samanlainen kuin edellinen. Olemme muuttaneet vain hakemistoa, josta latasimme laajennuksen, ja lisäsimme funktion vastauksen arvojen tulostamisen sijasta. Jos haluat lisätietoja Lambdan kirjoittamisesta golang-ohjelmassa, tarkista AWS-ohjeet.

AWS Lambdan käyttöönotto

AWS Lambda -toimintoja ja -tasoja voidaan ottaa käyttöön kahdella tavalla. Voit luoda ja lähettää zip-paketin manuaalisesti tai käyttää edistyneempiä puitteita, mikä tekee siitä paljon helpompaa ja nopeampaa. Useimmissa projekteissa käytän Serverless-kehystä, joten olen jo valmistellut yksinkertaisen serverless.yml -määritystiedoston tällä työkalulla:

palvelu: cipherService
FrameworkVersion: "> = 1.28.0 <2.0.0"
tarjoaja:
  nimi: aws
  ajonaika: go1.x
kerrokset:
  cipherLayer:
    polku: bin / plugin
    compatibleRuntimes:
      - go1.x
toiminnot:
  moottori:
    käsittelijä: bin / cipherEngine
    paketti:
      jättää:
        - ./**
      sisältää:
        - ./bin/cipherEngine
    kerrokset:
      - {Viite: CipherLayerLambdaLayer}

Kerrokset-osassa määrittelimme yhden kerroksen polulla jo luotuun laajennukseen - se otetaan käyttöön yhdessä lambda-toiminnon kanssa. Voit määrittää jopa viisi eri tasoa, mikä järjestys on todella tärkeä. Ne on asennettu samaan / opt-hakemistoon, joten kerrokset, joilla on suurempi lukumäärä, voivat ohittaa aiemmin asennettujen tasojen tiedostot. Jokaiselle kerrokselle on annettava vähintään 2 parametria: polku hakemistoon, joka sisältää tasolähteen (polku binaariseen pluginiin sinun tapauksessa) ja luettelo yhteensopivista ajoista.

Seuraava toiminto-osa on paikka, jossa määrität luettelon käytettävistä toiminnoista. Jokaiselle toiminnolle on annettava ainakin polku käännettyyn sovellukseen. Lisäksi meidän on määriteltävä kerrosparametri viittaamalla edellä määriteltyyn kerrokseen. Tämä liittää kerroksen automaattisesti Lambda-toimintoomme käyttöönoton aikana. Hauska asia on, että sinun on muunnettava lambda-kerroksen nimi TitleCasediksi ja lisättävä LambdaLayer -liite, jos haluat viitata kyseiseen resurssiin. Näyttää siltä, ​​että Serverless-tiimi on toteuttanut sen tällä tavoin konfliktin ratkaisemiseksi viitaten erityyppisiin resursseihin.

Kun serverless.yml -määritystiedostomme on valmis, viimeinen tehtävä on koota sovellus, laajennus ja ottaa se käyttöön. Voimme käyttää yksinkertaista Makefileä siihen:

.PHONY: build buildPlugin puhdas käyttöönotto
rakentaa:
 dep varmistaa -v
 env GOOS = linux go build -ldflags = "- s -w" -o bin / cipherEngine cipherEngine / main.go
buildPlugin:
 env GOOS = linux go build -ldflags = "- s -w" -buildmode = plugin -o bin / plugin / cipher.so ../plugin/cipher.go
puhdas:
 rm -rf ./bin ./vendor Gopkg.lock
käyttöönotto: clean buildPlugin build
 sls ottaa käyttöön --verbose

Voit rakentaa ja ottaa käyttöön toimintosi suorittamalla seuraavan komennon:

tee käyttöönotto

Testaa AWS-lambda

Kuten aiemmin mainitsin, AWS Lambda suorittaa koodin vastauksena tapahtumaan. Emme kuitenkaan määrittäneet mitään tapahtumalaukaisimia, joten siihen ei voida vedota ilman apua. Meidän on tehtävä se manuaalisesti käyttämällä Serverless-kehystä tai awscli-työkalua:

sls kutsuu -f toiminimi
aws lambda kutsu - toiminimi toiminto_nimi tulostetiedosto

Vastauksessa sinun pitäisi nähdä sama lähtö kuin ennen, mikä todistaa, että lambda-toiminto toimii oikein ja lataa plugin lisäkerroksesta. Nyt voit luoda muita toimintoja, jotka käyttävät samaa tasoa tai jopa jakaa sen muiden AWS-tilien kanssa.

Yhteenveto

Oli hauskaa käyttää Golang-moduuleja ja testata kuinka integroida ne vasta julkaistuihin AWS Lambda -kerroksiin. Plugin-kirjasto on todella mahtava, mutta sen rajoitusten ja Golang-eritelmien vuoksi sitä voidaan käyttää vain joissain erityisissä tilanteissa. Mielestäni useimmille standardiprojekteissa työskenteleville kehittäjille ei tarvitse tai edes mahdollista käyttää laajennuksia. Mielestäni tulee vain kaksi syytä:

  • Toteutetaan monimutkaisia ​​algoritmeja, joita voidaan käyttää muissa sovelluksissa. videokoodaus- tai salausalgoritmit.
  • Algoritmin jakaminen muiden kanssa julkaisematta sen koodia.