Hogyan építsünk be pluggable Golang alkalmazást és hogyan profitálhatunk az AWS Lambda Layers-ből.

Golang - miért érdekli a figyelmet?

A Golang egy nyílt forráskódú programozási nyelv, amelyet a Google tervez és hajt végre. Nagyon széles körben használják a modern alkalmazásokban, különösen a felhőben. A legjellemzőbb tulajdonságok a következők:

  • A Golang statikusan tipizált - kevesebb rugalmasságot biztosít, de megóvja a hibákatól,
  • Nem objektum-orientált. Hozhat létre struktúrákat és interfészeket, és ez megadja a 4-ből 3 OOP alapelvét: az adatok absztrakciója, beágyazása és a polimorfizmus. Az örökségből egyetlen hiányzik,
  • Goroutines! - a fényszálak legnagyobb megvalósítása, amit valaha használtam. Ez lehetővé teszi egy új szál létrehozását, rendkívül egyszerű módon, a go operátor segítségével, és csatornák segítségével kommunikálhat a különféle gorutinok között,
  • Összeáll az egyetlen binárisan, minden függőséggel - nincs több csomag ütközés!

Személy szerint Golangot tartom a legnagyobb nyelvnek, amelyet naponta használok. Ez a cikk azonban nem az első funkció létrehozásáról vagy a „Hello World” kinyomtatásáról szól. Megmutatom egy kicsit fejlettebb dolgokat. Ha Ön kezdő és többet szeretne tudni a Golangról, kérjük, keresse fel a főoldalát.

AWS Lambda & Golang

Az AWS Lambda az egyik legnépszerűbb szerver nélküli számítási szolgáltatás a nyilvános felhőben, amelyet az Amazon Web Services 2014. novemberében bocsátott ki. Ez lehetővé teszi a kód futtatását olyan eseményekre válaszul, mint a DynamoDB, SNS vagy HTTP eseményindítók kiszolgálók kiépítése vagy kezelése nélkül! Tudja, mi az igazán nagyszerű? 2018 januárja óta támogatja a Golang futásiidejét. Az AWS Lambda-val való együttműködés nagyon egyszerű - töltsön fel egy ZIP-csomagot a kóddal és az összes függőséggel (egyetlen bináris, ha Golang-ot használsz).

Gyors előre, négy évvel később, 2018-ban újra: Az Invent AWS kiadja a Lambda Rétegeket, amely lehetővé teszi az adatok tárolását és kezelését, amelyek különböző funkciók között vannak megosztva egy vagy akár több AWS fiókban! Például, a Python használata közben az összes függőséget egy további rétegbe teheti, amelyet később más Lambda is használhat. Nincs szükség különféle függőségek megadására az egyes ZIP-csomagokba! A Golang világában a helyzet más, mivel az AWS Lambda megköveteli, hogy töltsön fel összeállított bináris fájlokat. Hogyan profitálhatunk az AWS lambda rétegekből? A válasz egyszerű - épít egy moduláris alkalmazást a Golang plugins segítségével!

Golang plugins - egy moduláris alkalmazás felépítésének módja

A Golang Plugins a Go1.8 kiadása, amely lehetővé teszi a megosztott könyvtárak (.so fájlok) dinamikus betöltését. Lehetőséget nyújt arra, hogy kódja egy részét exportálja a külön könyvtárba, vagy használja valaki más által készített és összeállított bővítményt. Ígéretes azonban néhány korlátozás:

  • A bővítménynek egyetlen fő modulnak kell lennie,
  • Csak olyan funkciókat és változókat tölthet be, amelyeket ELF szimbólumokként exportálnak,
  • A statikus gépelés miatt minden betöltött szimbólumot a megfelelő típusba kell dobnia. A legrosszabb esetben meg kell határoznia a helyes felületet a kódjában,
  • Csak Linux és MacOS esetén működik. Személy szerint ezt nem gondolom hátrányként :)

Az első bővítmény létrehozása és tesztelése

Most hozzuk létre az első pluginunkat. Példaként létrehozunk egy egyszerű modult a karakterlánc-titkosításhoz. Térjünk vissza az alapokhoz, és hajtsunk végre 2 egyszerű titkosítási algoritmust - Ceasar és Verman.

  • A Caesar rejtjel az az algoritmus, amelyet először Julius Ceases használt. Ez eltolja a szöveg minden betűjét a rögzített pozíciók számával. Például, ha a 4 kulccsal akar titkosítani a golang szót, akkor ktpek lesz. A dekódolás ugyanúgy működik. A betűket csak az ellenkező irányba kell elmozdítani.
  • A Verman rejtjel hasonló a Ceaserhez, ugyanazon változó ötlet alapján, a különbség az, hogy minden betűt különböző pozíciószámmal mozgat el. A szöveg visszafejtéséhez a kulcsnak rendelkeznie kell a szöveg titkosításához használt pozíciókkal. Például, ha a [-1, 4, 7, 20, 4, -2] gombbal titkosítani akarja a golang szót, akkor jövőben lesz.

A példa teljes megvalósítása itt érhető el.

Beépülő modul megvalósítása

A következő rész a fent említett két algoritmus megvalósítását tartalmazza. Mindegyiknél kétféle módon valósítjuk meg a szöveg titkosítását és visszafejtését:

Mint láthatja, három különböző szimbólumot exportáltunk ide (Golang csak ezeket az azonosítókat exportálja, amelyek nagybetűvel kezdődnek):

  • EncryptCeasar - func (int, karakterlánc) karakterlánc, amely Ceasar algoritmussal titkosítja a szöveget,
  • DecryptCeaser - func (int, karakterlánc) karakterlánc, amely a Caeser algoritmus segítségével dekódolja a szöveget,
  • VermanCipher - vermanCipher típusú változó, amely két módszert valósít meg: Titkosítás: func (karakterlánc) karakterlánc és dekódolás: func () (* karakterlánc, hiba)

A plugin lefordításához a következő parancsot kell futtatnia:

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

Jelenleg nincs semmi különös - kevés egyszerű függvényt hoztunk létre, és egy modult plug-inként fordítottuk össze a -buildmode = plugin argumentum hozzáadásával.

Töltse be és tesztelje a plugint

A móka akkor kezdődik, amikor a lefordított plugint akarjuk használni az alkalmazásunkban. Készítsünk egy egyszerű példát:

Először importálnia kell a Golang plugin csomagot. Csak két funkciót tartalmaz - az első a megosztott könyvtár betöltése és a második az exportált szimbólum megtalálására szolgál. A könyvtár betöltéséhez Open funkciót kell használnia, amely megköveteli a megosztott plugin elérési útjának megadását, és a plugin típusú változót adja vissza. Ha a könyvtár betöltése nem lehetséges (pl. Helytelen útvonal vagy sérült fájl), ez a funkció visszaadja a kezelt hibát.

A következő lépés az exportált szimbólumok betöltése a Lookup módszerrel. Enyhe kellemetlenség, hogy minden exportált funkciót külön kell betöltenie. Ugyanakkor több funkciót is kombinálhat ugyanúgy, mint a VermanCipher szimbólumhoz. Miután betöltötte az összes használni kívánt szimbólumot, a megfelelő típusba kell dobnia azokat. A Golang statikusan tipizált nyelv, tehát nincs más módszer ezeknek a szimbólumoknak casting nélkül történő használatára. Ne felejtse el, ha olyan változót exportál, amely néhány módszert megvalósít, akkor a megfelelő interfész típusba kell adnia (a encryptionEngine interfészt meg kellett határoznom ennek kezelésére). \ Newline \ newline

Az alkalmazás fordításához és futtatásához használja a következő parancsot:

megy épít app.go
./app

A kimeneten a titkosított és a dekódolt szöveget látnia kell az algoritmus megfelelő működésének bizonyítékaként.

Használjon bővítményt az AWS lambda-ban

A plugin használatához az AWS Lambda-ban néhány módosítást kell végrehajtanunk alkalmazásunkban:

  • Az AWS Lambda rétegeket helyez a / opt könyvtárba a lambda tárolóban, tehát be kell töltenünk a plugin-t ebből a könyvtárból.
  • Ki kell hoznunk egy kezelő funkciót, amelyet a Lambda motor fog használni a teszt eseményünk kezelésére.

A következő részlet tartalmazza a Lambda általi alkalmazáshoz igazított alkalmazást:

Mint láthatja, a megvalósítás nagyon hasonló az előzőhöz. Csak azt a könyvtárat módosítottuk, ahonnan betöltöttük a plugin-t, és az érték nyomtatás helyett hozzáadtuk a függvényválaszt. Ha többet szeretne megtudni a Lambdas írásáról golang nyelven, kérjük, ellenőrizze az AWS dokumentációját.

Az AWS Lambda telepítése

Kétféle módon telepítheti az AWS Lambda funkciókat és rétegeket. Manuálisan létrehozhat és feltölthet ZIP-csomagokat, vagy használhatja a fejlettebb keretrendszert is, ami sokkal könnyebbé és gyorsabbá teszi. A legtöbb projektnél a Serverless keretet használom, tehát az eszköz segítségével már elkészítettem az egyszerű serverless.yml konfigurációs fájlt:

szolgáltatás: cipherService
frameworkVersion: "> = 1.28.0 <2.0.0"
szolgáltató:
  név: aws
  futási idő: go1.x
rétegek:
  cipherLayer:
    elérési út: bin / plugin
    compatibleRuntimes:
      - go1.x
funkciók:
  motor:
    kezelő: bin / cipherEngine
    csomag:
      kizárják:
        - ./**
      a következők:
        - ./bin/cipherEngine
    rétegek:
      - {Ref: CipherLayerLambdaLayer}

A rétegek szakaszban egy réteget definiáltunk a már létrehozott plugin elérési útjával - ez a lambda funkcióval együtt kerül telepítésre. Legfeljebb 5 különböző réteget definiálhat, mely sorrend igazán fontos. Ugyanazon / opt könyvtárba vannak csatolva, így a nagyobb számú rétegek felülbírálhatják az előzőleg csatlakoztatott rétegek fájljait. Minden réteghez legalább 2 paramétert meg kell adnia: a rétegforrást tartalmazó könyvtár elérési útja (az Ön esetére a bináris plugin elérési útja) és a kompatibilis futási idők listája.

A következő funkció szakasz egy olyan hely, ahol meghatározza a telepíteni kívánt funkciók listáját. Minden funkcióhoz meg kell adnia legalább az összeállított alkalmazás elérési útját. Ezen túlmenően meg kell határoznunk a rétegek paraméterét a fent meghatározott rétegre való hivatkozással. Ez automatikusan rögzíti a réteget a Lambda funkcióhoz a telepítés során. Vicces dolog az, hogy a lambda réteg nevét TitleCased-re kell konvertálnia, és hozzá kell adnia a LambdaLayer utótagot, ha hivatkozni szeretne erre az erőforrásra. Úgy tűnik, hogy a Serverless csapat ilyen módon valósította meg a konfliktust a különféle típusú erőforrásokra hivatkozva.

Amint a serverless.yml konfigurációs fájl készen áll, az utolsó lépés az, hogy összeállítsuk alkalmazásunkat, beépítsük és telepítsük. Ehhez egyszerű Makefile-t használhatunk:

.PHONY: build buildPlugin tiszta központi telepítés
épít:
 dep biztosít -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
tiszta:
 rm -rf ./bin ./vendor Gopkg.lock
telepítés: tiszta buildPlugin build
 sls telepíteni --verbose

A függvényt a következő parancs futtatásával építheti és telepítheti:

telepíteni

Tesztelje az AWS Lambdat

Mint korábban említettem, az AWS Lambda az eseményre adott válaszként kódot hajt végre. Az eseményindítókat azonban nem konfiguráltuk, ezért segítségünkre nem hívjuk meg őket. Kézzel kell elvégeznünk a Serverless keretrendszer vagy az awscli eszköz használatával:

sls hívja -f függvénynév
aws lambda izsake - function-name function_name output_file

A válaszban ugyanazt a kimenetet kell látnia, mint korábban, ami igazolja, hogy a lambda funkciónk megfelelően működik, és a kiegészítő rétegről betölti a plugint. Most létrehozhat más funkciókat is, amelyek ugyanazt a réteget használják, vagy akár megoszthatják más AWS-fiókokkal.

összefoglalás

Nagyon szórakoztató volt a Golang modulok használata, és kipróbálni, hogyan lehet azokat integrálni az újonnan kiadott AWS Lambda rétegekbe. A plugin könyvtár valóban félelmetes, azonban korlátozásai és Golang specifikációi miatt csak bizonyos speciális esetekben használható. Úgy gondolom, hogy a fejlesztők többsége számára, akik a szabványos projektekkel dolgoznak, nem szükséges, sőt nem is lehet plug-inek használata. Csak két ok jut eszembe:

  • Bonyolult algoritmusok végrehajtása, amelyeket a többi alkalmazás is használhat pl. videokódolási vagy titkosítási algoritmusok.
  • Az algoritmus megosztása másokkal, annak kódjának közzététele nélkül.