Kaip sukurti įjungiamą „Golang“ programą ir gauti naudos iš „AWS Lambda“ sluoksnių.

Golangas - kodėl verta jūsų dėmesio?

„Golang“ yra atvirojo programavimo kalba, sukurta ir įgyvendinta „Google“. Jis labai plačiai naudojamas šiuolaikinėse programose, ypač debesyje. Būdingiausios savybės yra šios:

  • „Golang“ yra statiškai įvestas - jis suteikia mažiau lankstumo, tačiau apsaugo nuo klaidų,
  • Tai nėra orientuota į objektą. Tačiau galite sukurti struktūras ir sąsajas. Tai suteikia jums 3 iš 4 OOP principus: duomenų abstrakciją, kapsuliavimą ir polimorfizmą. Paveldėjimo trūksta vienintelio,
  • Goruteines! - didžiausias mano naudojamų šviesos siūlų įgyvendinimas. Tai leidžia labai lengvai sukurti naują giją naudojant „go“ operatorių ir bendrauti tarp skirtingų gorutinų naudojant kanalus,
  • Jis kaupiamas į vieną dvejetainį failą su visomis priklausomybėmis - nebereikia pakuočių konfliktų!

Asmeniškai aš laikau Golangą didžiausia kalba, kurią aš kasdien vartoju. Tačiau šis straipsnis nebus apie jūsų pirmosios funkcijos sukūrimą ar „Sveikas pasaulis“ spausdinimą. Aš jums parodysiu šiek tiek sudėtingesnių dalykų. Jei esate pradedantysis ir norite sužinoti daugiau apie „Golang“, apsilankykite jo pagrindiniame puslapyje.

„AWS Lambda & Golang“

„AWS Lambda“ yra viena populiariausių viešojo debesies kompiuterių be serverių skaičiavimo paslaugų, kurią 2014 m. Lapkričio mėn. Išleido „Amazon Web Services“. Tai leidžia paleisti kodą reaguojant į tokius įvykius kaip „DynamoDB“, SNS ar HTTP aktyvikliai, nenumatydami ir nevaldydami serverių! Ar žinai, kas iš tikrųjų yra puiku? Nuo 2018 m. Sausio mėn. Palaiko „Golang runtime“. Darbas su „AWS Lambda“ yra labai paprastas - tiesiog įkelkite supakuotą paketą su savo kodu ir visomis priklausomybėmis (viena dvejetainė, kai naudojate „Golang“).

Greitai į priekį, po 4 metų 2018 m. Vėl: „Invent AWS“ išleidžia „Lambda“ sluoksnius, leidžiančius saugoti ir tvarkyti duomenis, kurie yra bendrai naudojami skirtingose ​​funkcijose vienoje ar net keliose AWS sąskaitose! Pavyzdžiui, naudodamiesi Python, visas priklausomybes galite sudėti į papildomą sluoksnį, kurį vėliau galės naudoti kiti „Lambdas“. Nebereikia dėti skirtingų priklausomybių į kiekvieną užklijuotą pakuotę! Golango pasaulyje padėtis yra kitokia, nes „AWS Lambda“ reikalauja įkelti sudarytą dvejetainį failą. Kaip galime gauti naudos iš „AWS Lambda“ sluoksnių? Atsakymas paprastas - sukurkite modulinę programą naudodami „Golang“ papildinius!

„Golang“ papildiniai - būdas sukurti modulinę programą

„Golang“ papildiniai yra „Go1.8“ išleista funkcija, leidžianti dinamiškai įkelti bendrinamas bibliotekas (.so failus). Tai suteikia jums galimybę eksportuoti dalį savo kodo į atskirą biblioteką arba naudoti kažkieno parengtą ir sudarytą papildinį. Vis dėlto žadama, kad yra keletas apribojimų:

  • Jūsų papildinys turi būti vienas pagrindinis modulis,
  • Galite įkelti tik tas funkcijas ir kintamuosius, kurie eksportuojami kaip ELF simboliai,
  • Dėl statinio spausdinimo kiekvieną įkeltą simbolį turite atiduoti tinkamo tipo. Blogiausiu atveju turite apibrėžti teisingą sąsają savo kode,
  • Tai veikia tik „Linux“ ir „MacOS“. Asmeniškai nelaikau to trūkumu :)

Sukurkite ir išbandykite savo pirmąjį papildinį

Dabar sukurkime pirmąjį papildinį. Kaip pavyzdį mes sukursime paprastą styginių šifravimo modulį. Grįžkime prie pagrindų ir įgyvendinkime 2 paprastus šifravimo algoritmus - „Ceasar“ ir „Verman“.

  • Cezario šifras yra algoritmas, kurį pirmiausia panaudojo Julius Ceases. Tai kiekviena raidė tekste pasislenka fiksuotu pozicijų skaičiumi. Pvz., Jei norite užšifruoti žodį golang raktu 4, gausite ktpek. Dešifravimas veikia taip pat. Jums tiesiog reikia pakeisti raides priešinga kryptimi.
  • Vermano šifras yra panašus į „Ceaser“, pagrįstas ta pačia besikeičiančia idėja, skirtumas yra tas, kad kiekvieną raidę keičiate skirtingu pozicijų skaičiumi. Norėdami iššifruoti tekstą, turite turėti raktą su pozicijomis, naudojamomis šifruoti tekstą. Pvz., Jei norite užšifruoti žodį golang raktu [-1, 4, 7, 20, 4, -2], gausite ateitį.

Visą šio pavyzdžio įgyvendinimą galite rasti čia.

Įskiepio įgyvendinimas

Šiame fragmente pateiktas dviejų aukščiau paminėtų algoritmų įgyvendinimas. Kiekvienam iš jų pritaikome 2 savo teksto šifravimo ir iššifravimo būdus:

Kaip matote, mes čia eksportavome 3 skirtingus simbolius („Golang“ eksportuoja tik šiuos identifikatorius, prasidedančius viršutine raide):

  • EncryptCeasar - func (int, string) eilutė, užkoduojanti tekstą naudojant „Ceasar“ algoritmą,
  • DecryptCeaser - func (int, string) eilutė, kuri iššifruoja tekstą, naudodama Caeser algoritmą,
  • VermanCipher - vermanCipher tipo kintamasis, įgyvendinantis 2 metodus: Šifruoti: func (eilutės) eilutė ir iššifruoti: func () (* eilutė, klaida)

Norėdami sudaryti šį papildinį, turite paleisti šią komandą:

eikite kurti -buildmode = įskiepis -o įskiepis / cipher.so įskiepis / cipher.go

Kol kas nėra nieko ypatingo - buvo sukurtos kelios paprastos funkcijos ir modulis buvo sudarytas kaip įskiepis pridedant -buildmode = įskiepio argumentą.

Įkelkite ir išbandykite papildinį

Linksmybės prasideda tada, kai norime naudoti kompiliuotą papildinį savo programoje. Sukurkime paprastą pavyzdį:

Pirmiausia turite importuoti „golang“ papildinių paketą. Jame yra tik dvi funkcijos - pirmoji skirta bendrintos bibliotekos įkėlimui, o antroji - eksportuoto simbolio radimui. Norėdami įkelti savo biblioteką, turite naudoti funkciją Atidaryti, kuriai reikia nurodyti kelią į jūsų bendrinamą papildinį ir grąžinti kintamojo tipo papildinį. Jei bibliotekos įkelti neįmanoma (pvz., Neteisingas kelias arba sugadintas failas), ši funkcija grąžina klaidą, kurią reikia pašalinti.

Kitas žingsnis - įkelti kiekvieną eksportuotą simbolį naudojant paieškos metodą. Nedidelis nepatogumas yra tas, kad kiekvieną eksportuotą funkciją turite įkelti atskirai. Tačiau jūs galite sujungti kelias funkcijas kartu taip, kaip tai buvo padaryta naudojant „VermanCipher“ simbolį. Įkėlę visus norimus naudoti simbolius, turite juos atiduoti tinkamo tipo. Golango kalba yra statiškai rašoma, todėl nėra kito būdo naudoti šiuos simbolius nekeičiant. Atminkite, kad kai eksportuojate kintamąjį, įgyvendinantį keletą metodų, turite nurodyti jį į teisingą sąsajos tipą (aš turėjau apibrėžti „encryptionEngine“ sąsają, kad galėčiau tai tvarkyti). \ Newline \ newline

Norėdami kompiliuoti ir paleisti programą, naudokite šią komandą:

eikite kurti „app.go“
./app

Išvestyje turėtumėte pamatyti užšifruotą ir iššifruotą tekstą kaip įrodymą, kad algoritmas veikia tinkamai.

Naudokite papildinį „AWS lambda“

Norėdami naudoti savo papildinį „AWS Lambda“, savo programoje turime atlikti keletą pakeitimų:

  • „AWS Lambda“ kloja sluoksnius į „/ opt“ katalogą „lambda“ konteineryje, todėl turime įkelti savo papildinį iš šio katalogo.
  • Turime sukurti prižiūrėtojo funkciją, kurią „Lambda“ variklis naudos mūsų bandymo įvykiui tvarkyti.

Šiame fragmente yra mūsų programa, pritaikyta naudoti „Lambda“:

Kaip matote, diegimas yra labai panašus į ankstesnį. Mes pakeitėme tik katalogą, iš kurio įkėlėme savo papildinį, ir pridėjome funkcijos atsakymą, o ne spausdinimo reikšmes. Jei norite sužinoti daugiau apie „Lambdas“ rašymą golango kalba, patikrinkite AWS dokumentus.

„AWS Lambda“ diegimas

Yra du „AWS Lambda“ funkcijų ir sluoksnių diegimo būdai. Galite sukurti ir įkelti paketą, į kurį įtrauktas ZIP kodas, rankiniu būdu arba naudoti sudėtingesnę sistemą, kuri leidžia daug lengviau ir greičiau. Daugumoje savo projektų naudoju „Serverless“ struktūrą, todėl naudodamas šį įrankį jau paruošiau paprastą serverless.yml konfigūracijos failą:

paslauga: cipherService
frameworkVersion: "> = 1.28.0 <2.0.0"
teikėjas:
  vardas: aws
  vykdymo laikas: go1.x
sluoksniai:
  cipherLayer:
    kelias: šiukšliadėžė / papildinys
    suderinamasRuntimes:
      - go1.x
funkcijos:
  variklis:
    prižiūrėtojas: šiukšliadėžė / cipherEngine
    paketas:
      Neįtraukti:
        - ./**
      apima:
        - ./bin/cipherEngine
    sluoksniai:
      - {Nuoroda: CipherLayerLambdaLayer}

Sluoksnių skyriuje mes apibrėžėme vieną sluoksnį su keliu į jau sukurtą papildinį - jis bus įdiegtas kartu su „lambda“ funkcija. Galite apibrėžti iki 5 skirtingų sluoksnių, kurių tvarka yra tikrai svarbi. Jie yra sujungti į tą patį / opt katalogą, todėl didesnio skaičiaus sluoksniai gali nepaisyti failų iš anksčiau sujungtų sluoksnių. Kiekvienam sluoksniui turite pateikti bent 2 parametrus: kelią į katalogą, kuriame yra sluoksnio šaltinis (jūsų atveju kelias į dvejetainį papildinį) ir suderinamų vykdymo laikotarpių sąrašą.

Kitas funkcijų skyrius yra vieta, kur apibrėžiate diegiamų funkcijų sąrašą. Kiekvienai funkcijai reikia nurodyti bent kelią į sukompiliuotą programą. Be to, mes turime apibrėžti sluoksnių parametrą, remdamiesi aukščiau apibrėžtu sluoksniu. Diegimo metu sluoksnis bus automatiškai pritvirtintas prie „Lambda“ funkcijos. Juokingiausias dalykas yra tai, kad jūs turite konvertuoti savo „lambda“ sluoksnio pavadinimą į „TitleCased“ ir pridėti „LambdaLayer“ priesagą, jei norite remtis tuo šaltiniu. Panašu, kad „Serverless“ komanda tai įgyvendino tokiu būdu, kad išspręstų konfliktą atsižvelgiant į skirtingus išteklių tipus.

Kai mūsų serverless.yml konfigūracijos failas bus paruoštas, paskutinis dalykas, kurį reikia padaryti, yra kompiliuoti mūsų programą, papildinį ir įdiegti. Tam galime naudoti paprastą „Makefile“:

.FONIJA: kurti „buildPlugin“ švarų diegimą
statyti:
 dep užtikrinti -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
švarus:
 rm -rf ./bin ./vendor Gopkg.lock
diegti: išvalyti „buildPlugin“
 sls dislokuoti --verbose

Savo funkciją galite sukurti ir įdiegti vykdydami šią komandą:

priversti dislokuoti

Testas „AWS Lambda“

Kaip jau minėjau anksčiau, „AWS Lambda“ vykdo kodą reaguodama į įvykį. Tačiau mes nesukonfigūravome jokių įvykių aktyviklių, todėl be mūsų pagalbos jis nebus iškviestas. Mes turime tai padaryti rankiniu būdu, naudodamiesi Serverless Framework arba awscli įrankiu:

sls iškviečia -f funkcijos_pavadinimas
„aws lambda“ - funkcijos pavadinimas „function_name output_file“

Atsakyme turėtumėte pamatyti tą patį išėjimą, kaip ir anksčiau, kuris įrodo, kad mūsų lambda funkcija veikia tinkamai ir įkelia papildinį iš papildomo sluoksnio. Dabar galite sukurti kitas funkcijas, kurios naudos tą patį sluoksnį, ar netgi bendrinti ją su kitomis AWS paskyromis.

Santrauka

Buvo labai smagu naudoti „Golang“ modulius ir išbandyti, kaip juos integruoti su naujai išleistais „AWS Lambda“ sluoksniais. Įskiepių biblioteka yra tikrai nuostabi, tačiau dėl savo apribojimų ir „Golang“ specifikacijos ji gali būti naudojama tik kai kuriuose specialiuose scenarijuose. Manau, kad daugumai kūrėjų, dirbančių prie standartinių projektų, nereikės ar net bus galima naudoti papildinius. Galvoju tik dėl dviejų priežasčių:

  • Įdiegti sudėtingus algoritmus, kuriuos gali naudoti kitos programos, pvz. vaizdo kodavimo arba šifravimo algoritmai.
  • Savo algoritmo bendrinimas su kitais, neskelbiant jo kodo.