Kako izraditi utični Golang program i iskoristiti AWS Lambda Slojeve.

Golang - zašto je vrijedna vaše pažnje?

Golang je programski jezik otvorenog koda koji je dizajnirao i implementirao Google. Vrlo se široko koristi u modernim aplikacijama, posebno u oblaku. Najkarakterističnije karakteristike su:

  • Golang je statički tipkan - pruža manju fleksibilnost, ali štiti vas od grešaka,
  • Nije objektno orijentirana. Međutim, možete stvoriti strukture i sučelja i to vam daje 3 od 4 OOP načela: apstrakcija podataka, enkapsulacija i polimorfizam. Nasljedstvo jedino nedostaje,
  • Goroutines! - najveća primjena laganih niti koje sam ikad koristio. Omogućava vam da stvorite novu nit na super jednostavan način koristeći go operator i komunicirate između različitih goroutina koristeći kanale,
  • Sastavlja se u jednu binarnu mrežu sa svim ovisnostima - nema više sukoba paketa!

Osobno smatram Golang najvećim jezikom koji koristim svakodnevno. Međutim, u ovom se članku neće raditi o izradi prve funkcije ili ispisu "Hello World". Pokazat ću vam malo naprednije stvari. Ako ste početnik i želite saznati više o Golangu, posjetite njegovu glavnu stranicu.

AWS Lambda & Golang

AWS Lambda jedan je od najpopularnijih računarskih servisa bez poslužitelja u javnom oblaku koji je u studenom 2014. objavio Amazon Web Services. Omogućuje vam pokretanje koda kao odgovor na događaje poput okidača DynamoDB, SNS ili HTTP bez osiguravanja i upravljanja poslužiteljima! Znate li što je stvarno sjajno? Od siječnja 2018. podržava Golang vrijeme izvođenja. Rad s AWS Lambda stvarno je jednostavan - samo prenesite zip paket s vašim kodom i svim ovisnostima (jedinstveni binarni kod upotrebe Golang-a).

Brzo naprijed, 4 godine kasnije u 2018. godini re: Invent AWS izdaje Lambda Slojeve koji vam omogućuje pohranjivanje i upravljanje podacima koji se dijele na različite funkcije u jednom ili čak više AWS računa! Na primjer, dok koristite Python, sve ovisnosti možete staviti u dodatni sloj koji će kasnije koristiti drugi Lambdasi. Više nema potrebe stavljati različite ovisnosti u svaki komprimirani paket! U Golang svijetu je situacija drugačija jer AWS Lambda zahtijeva da pošaljete sastavljene binarne zapise. Kako možemo imati koristi od AWS Lambda Slojeva? Odgovor je jednostavan - napravite modularnu aplikaciju pomoću Golang dodataka!

Golang dodaci - način za izgradnju modularne aplikacije

Golang dodaci značajka je objavljena u Go1.8 koja vam omogućuje dinamično učitavanje zajedničkih knjižnica (.so datoteke). Pruža vam mogućnost da neki svoj kôd izvezite u zasebnu knjižnicu ili upotrijebite dodatak koji je pripremio i sastavio netko drugi. Međutim, obećava, postoji nekoliko ograničenja:

  • Vaš dodatak mora biti jedan glavni modul,
  • Možete učitati samo funkcije i varijable koje se izvoze kao simboli ELF,
  • Zbog statičkog tipkanja svaki učitani simbol morate odbaciti u ispravnu vrstu. U najgorem scenariju, morate definirati ispravno sučelje u vašem kodu,
  • Radi samo za Linux i MacOS. Osobno to ne smatram nedostatkom :)

Izrada i testiranje vašeg prvog dodatka

Sada napravimo svoj prvi dodatak. Kao primjer, stvorit ćemo jednostavan modul za šifriranje niza. Vratimo se osnovama i implementirati 2 jednostavna algoritma za enkripciju - Ceasar i Verman.

  • Cezarova šifra je algoritam koji je prvi upotrijebio Julius Ceases. Svako slovo u tekstu pomiče prema fiksnom broju položaja. Na primjer, ako želite šifrirati riječ golang tipkom 4, dobit ćete ktpek. Dešifriranje djeluje na isti način. Trebate samo prebaciti slova u suprotnom smjeru.
  • Vermanova šifra slična je Ceaser-u, a temelji se na istoj ideji pomicanja, razlika je u tome što svako slovo pomičete različitim brojem pozicija. Za dešifriranje teksta potreban vam je ključ koji sadrži položaje za šifriranje teksta. Na primjer, ako želite šifrirati riječ golang ključem [-1, 4, 7, 20, 4, -2], dobit ćete budućnost.

Potpuna provedba ovog primjera dostupna je ovdje.

Implementacija dodatka

Sljedeći isječak sadrži implementaciju dva gore spomenuta algoritma. Za svaku implementiramo 2 načina šifriranja i dešifriranja našeg teksta:

Kao što vidite, izvezli smo ovdje 3 različita simbola (Golang izvozi samo ove identifikatore koji počinju s gornjim slovom):

  • EncryptCeasar - niz func (int, string) koji šifrira tekst pomoću Ceasar algoritma,
  • DecryptCeaser - func (int, string) niz koji dešifrira tekst pomoću algoritma Caeser,
  • VermanCipher - varijabla tipa vermanCipher koja provodi 2 metode: Šifriranje: func (string) string i Dešifriranje: func () (* string, pogreška)

Za sastavljanje ovog dodatka morate pokrenuti sljedeću naredbu:

go build -buildmode = dodatak -o plugin / cipher.so plugin / cipher.go

Za sada nema ništa posebno - stvoreno je nekoliko jednostavnih funkcija i modul je sastavljen kao dodatak dodavanjem argumenta -buildmode = plugin.

Učitajte i testirajte dodatak

Zabava počinje kada u našoj aplikaciji želimo koristiti sastavljeni dodatak. Kreirajmo jednostavan primjer:

Prvo, morate uvesti paket dodataka golang. Sadrži samo dvije funkcije - prva je za učitavanje zajedničke knjižnice, a druga za pronalaženje izvezenog simbola. Za učitavanje knjižnice morate koristiti Open funkciju koja zahtijeva davanje puta do vašeg zajedničkog dodatka i vraća varijablu tipa Plugin. Ako učitavanje knjižnice nije moguće (npr. Pogrešan put ili oštećena datoteka), ova funkcija vraća pogrešku s kojom se mora rukovati.

Sljedeći je korak učitavanje svakog izvezenog simbola metodom pretraživanja. Mala neugodnost je da trebate učitati svaku eksportiranu funkciju zasebno. Međutim, možete kombinirati više funkcija zajedno na isti način kao što je to učinjeno za simbol VermanCipher. Nakon što napunite sve simbole koje želite upotrijebiti, morate ih baciti u odgovarajući tip. Golang je jezik statički tipkan, tako da nema drugog načina za upotrebu ovih simbola bez lijevanja. Zapamtite, kada izvozite varijablu koja implementira nekoliko metoda, morate je prebaciti na ispravnu vrstu sučelja (morao sam definirati encryptionEngine sučelje da bih se nosio s tim). \ Newline \ newline

Za sastavljanje i pokretanje aplikacije koristite sljedeću naredbu:

go build app.go
./app

Na izlazu bi trebali vidjeti šifrirani i dešifrirani tekst kao dokaz da algoritam ispravno radi.

Upotrijebite dodatak u AWS lambda

Da bismo koristili dodatak u AWS Lambda, moramo napraviti nekoliko izmjena u našoj aplikaciji:

  • AWS Lambda postavlja slojeve u / opt direktorijum u lambda spremniku, tako da moramo učitati naš dodatak iz ove mape.
  • Moramo stvoriti funkciju rukovanja koja će Lambda motor koristiti za obradu našeg testnog događaja.

Sljedeći isječak sadrži našu aplikaciju prilagođenu za korištenje od strane Lambde:

Kao što vidite, implementacija je vrlo slična prethodnoj. Izmijenili smo samo direktorij iz kojeg smo učitali naš dodatak i dodali odgovor funkcije umjesto ispisa vrijednosti. Ako želite saznati više o pisanju Lambdasa u golangu, molimo pogledajte dokumentaciju AWS.

AWS Lambda implementacija

Postoje dva načina implementacije AWS Lambda funkcija i slojeva. Paket sa komprimiranim možete stvoriti i prenijeti ručno ili upotrijebiti napredniji okvir koji ga čini mnogo lakšim i bržim. Za većinu svojih projekata koristim Frameworkless Server, tako da sam već pripremio jednostavnu konfiguracijsku datoteku serverless.yml pomoću ovog alata:

usluga: cipherService
FrameworkVersion: "> = 1.28.0 <2.0.0"
usluga:
  ime: aws
  vrijeme izvođenja: go1.x
slojevi:
  cipherLayer:
    put: kanta / dodatak
    compatibleRuntimes:
      - go1.x
funkcije:
  motor:
    rukovalac: kanta / šifraEngine
    paket:
      isključiti:
        - ./**
      uključuju:
        - ./bin/cipherEngine
    slojevi:
      - {Ref: CipherLayerLambdaLayer}

U odjeljku slojeva definirali smo jedan sloj s putanjom do već stvorenog dodatka - bit će raspoređen zajedno s lambda funkcijom. Možete definirati do 5 različitih slojeva koji je redoslijed zaista važan. Montirani su na isti / opt direktorij, tako da slojevi s većim brojem mogu nadjačati datoteke s prethodno montiranih slojeva. Za svaki sloj morate navesti najmanje 2 parametra: put do mape koja sadrži izvor sloja (put do binarnog dodatka u vašem slučaju) i popis kompatibilnih vremena izvođenja.

Sljedeći odjeljak funkcija je mjesto na kojem definirate popis funkcija koje će se rasporediti. Za svaku funkciju morate navesti najmanje putanju do sastavljene aplikacije. Pored toga, trebamo definirati parametar slojeva s referencama na gore definirani sloj. Ovo će automatski povezati sloj s našom Lambda funkcijom tijekom implementacije. Smiješno je što morate pretvoriti svoje ime lambda sloja u TitleCased i dodati LambdaLayer sufiks ako se želite uputiti na taj resurs. Čini se da ga je tim bez poslužitelja implementirao na ovaj način da riješi sukob u odnosu na različite vrste resursa.

Jednom kada je naša konfiguracijska datoteka serverless.yml spremna, posljednja stvar koju trebate učiniti je sastaviti našu aplikaciju, priključiti je i implementirati. Za to možemo koristiti jednostavan Makefile:

.PHONY: izgraditi buildPlugin clean implementirati
izgraditi:
 dep osigurati -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 = dodatak -o bin / plugin / cipher.so ../plugin/cipher.go
čist:
 rm -rf ./bin ./vendor Gopkg.lock
implementirati: čistiti buildPlugin build
 sls implementirati --verbose

Možete izgraditi i rasporediti svoju funkciju izvođenjem sljedeće naredbe:

napraviti implementaciju

Ispitajte AWS Lambda

Kao što sam ranije spomenuo, AWS Lambda izvršava kod u odgovoru na događaj. Međutim, nismo konfigurirali nijednu okidač događaja, pa se neće moći pozivati ​​bez naše pomoći. To moramo učiniti ručno pomoću okvira Serverless ili awscli alata:

sls pozvati -f function_name
aws lambda invoke - ime-funkcije function_name output_file

U odgovoru biste trebali vidjeti isti izlaz kao i prije, što dokazuje da naša lambda funkcija ispravno radi i učitava dodatak iz dodatnog sloja. Sada možete stvoriti druge funkcije koje će koristiti isti sloj ili ih čak dijeliti s drugim AWS računima.

Sažetak

Bilo je zabavno koristiti Golang module i testirati kako ih integrirati s novoizbavljenim AWS Lambda Slojevima. Biblioteka dodataka je zaista fenomenalna, ali zbog svojih ograničenja i Golang specifikacije može se koristiti samo u nekim posebnim scenarijima. Mislim da za većinu programera koji rade na standardnim projektima neće biti potrebna niti je moguće upotreba dodataka. Na pamet mi padaju samo dva razloga:

  • Primjena složenih algoritama koje mogu koristiti druge aplikacije, npr. algoritmi za kodiranje ili šifriranje video zapisa.
  • Dijeljenje algoritma s drugima bez objavljivanja njegovog koda.