Kuidas luua pistikprogrammi Golang ja kuidas AWS Lambda kihtidest kasu saada?

Golang - miks see on teie tähelepanu väärt?

Golang on avatud lähtekoodiga programmeerimiskeel, mille on välja töötanud ja rakendanud Google. Seda kasutatakse tänapäevastes rakendustes, eriti pilves, väga laialdaselt. Kõige iseloomulikumad omadused on järgmised:

  • Golang on staatiliselt kirjutatud - see pakub vähem paindlikkust, kuid kaitseb teid vigade tegemise eest,
  • See ei ole objektorienteeritud. Siiski saate luua struktuure ja liideseid ning see annab teile 3 4-st OOP-põhimõttest: andmete abstraktsioon, kapseldamine ja polümorfism. Ainult puudu on pärimine,
  • Glutines! - nende valgusniitide suurim rakendamine, mida ma kunagi kasutanud olen. See võimaldab teil luua väga lihtsal viisil uue lõime, kasutades operaatorit go ja suhelda kanalite kaudu erinevate gorutiinide vahel,
  • See kompileeritakse ühe kahendkoodiga kõigi sõltuvustega - enam pole pakettide konflikte!

Isiklikult pean Golangi suurimaks keeleks, mida ma igapäevaselt kasutan. See artikkel ei puuduta siiski teie esimese funktsiooni loomist ega „Tere maailma” printimist. Ma näitan sulle natuke arenenumaid asju. Kui olete algaja ja soovite Golangi kohta rohkem teada saada, külastage selle avalehte.

AWS Lambda ja Golang

AWS Lambda on üks populaarsemaid serverita arvutusteenuseid avalikus pilves, mille avaldas 2014. aasta novembris Amazon Web Services. See võimaldab teil oma koodi käivitada vastusena sellistele sündmustele nagu DynamoDB, SNS või HTTP päästikud ilma serverite eraldamise või haldamiseta! Kas sa tead, mis on tegelikult suurepärane? Alates jaanuarist 2018 toetab see Golangi käitusaega. AWS Lambdaga töötamine on tõesti lihtne - laadige lihtsalt üles ZIP-pakett koos oma koodiga ja kõigi sõltuvustega (Golangi kasutamisel ühe kahendkoodiga).

Edasiliikumine, neli aastat hiljem, 2018. aastal uuesti: Invent AWS vabastab Lambda kihid, mis võimaldab teil salvestada ja hallata andmeid, mida jagatakse erinevate funktsioonide vahel ühe või isegi mitme AWS-i kontol! Näiteks saate Pythoni kasutamise ajal panna kõik sõltuvused lisakihti, mida saavad hiljem kasutada ka teised Lambdas. Enam pole vaja igasse pakitud pakendisse erinevaid sõltuvusi panna! Golangi maailmas on olukord erinev, kuna AWS Lambda nõuab kompileeritud kahendkoodide üleslaadimist. Kuidas saame AWS Lambda kihtidest kasu? Vastus on lihtne - ehitage Golangi pistikprogrammide abil moodulrakendus!

Golangi pistikprogrammid - moodulrakenduse loomise viis

Golangi pistikprogrammid on Go1.8-s välja antud funktsioon, mis võimaldab teil dünaamiliselt laadida jagatud teeke (.so faile). See annab teile võimaluse eksportida osa oma koodist eraldi teeki või kasutada pistikprogrammi, mille on valmistanud ja koostanud keegi teine. See on paljulubav, kuid sellel on mõned piirangud:

  • Teie pistikprogramm peab olema üks peamoodul,
  • Saate laadida ainult funktsioone ja muutujaid, mida eksporditakse ELF-i sümbolitena,
  • Staatilise tippimise tõttu peate iga laaditud sümboli õigele tüübile valama. Halvimal juhul peate oma koodis määratlema õige liidese,
  • See töötab ainult Linuxi ja MacOSi jaoks. Mina isiklikult ei pea seda miinuseks :)

Esimese pistikprogrammi loomine ja testimine

Loome nüüd meie esimese pistikprogrammi. Näitena loome stringi krüptimiseks lihtsa mooduli. Läheme tagasi põhitõdede juurde ja rakendame 2 lihtsat krüptimisalgoritmi - Ceasar ja Verman.

  • Caesari šifr on algoritm, mida kõigepealt kasutas Julius Ceases. See nihutab teksti iga tähte kindla arvu positsioonide võrra. Näiteks kui soovite sõna golang krüptida võtmega 4, saate ktpek. Dekrüptimine töötab samal viisil. Tähed peate lihtsalt vastupidises suunas nihutama.
  • Vermani šifr sarnaneb Ceaseriga, tuginedes samal nihkuvale ideele, erinevus seisneb selles, et nihutate iga tähte erineva arvu positsioonide võrra. Teksti dekrüpteerimiseks peab teil olema võti, mis sisaldab teksti krüptimiseks kasutatavaid positsioone. Näiteks kui soovite sõna golang krüptida võtmega [-1, 4, 7, 20, 4, -2], saate tuleviku.

Selle näite täielik rakendamine on saadaval siin.

Pistikprogrammi juurutamine

Järgmine fragment sisaldab kahe ülalnimetatud algoritmi rakendamist. Igaühe jaoks rakendame 2 teksti krüptimise ja dekrüptimise meetodit:

Nagu näete, eksportisime siia 3 erinevat sümbolit (Golang ekspordib ainult neid tunnuseid, mis algavad suure tähega):

  • EncryptCeasar - func (int, string) string, mis krüpteerib teksti Ceasari algoritmi abil,
  • DecryptCeaser - func (int, string) string, mis dekrüpteerib teksti Caeseri algoritmi abil,
  • VermanCipher - vermanCipher tüüpi muutuja, mis rakendab 2 meetodit: Krüptimine: func (string) string ja dešifreerimine: func () (* string, viga)

Selle pistikprogrammi kompileerimiseks peate käivitama järgmise käsu:

mine ehita -buildmode = plugin -o plugin / cipher.so plugin / cipher.go

Praegu pole midagi erilist - loodi vähe lihtsaid funktsioone ja moodul kompileeriti pistikprogrammina, lisades argumendi -buildmode = plugin.

Laadige sisse ja testige pistikprogrammi

Lõbus algab siis, kui tahame oma rakenduses kasutada kompileeritud pistikprogrammi. Loome lihtsa näite:

Esiteks peate importima golangi pistikprogrammi paketi. See sisaldab ainult kahte funktsiooni - esimene on jagatud teegi laadimiseks ja teine ​​eksporditud sümboli leidmiseks. Raamatukogu laadimiseks peate kasutama funktsiooni Ava, mis eeldab tee jagatud pistikprogrammile ja tagastab plugina tüüpi muutuja. Kui teegi laadimine pole võimalik (nt vale tee või rikutud fail), tagastab see funktsioon vea, mis tuleb lahendada.

Järgmine samm on iga eksporditud sümboli laadimine otsingumeetodi abil. Väike ebamugavus on see, et peate iga eksporditud funktsiooni eraldi laadima. Siiski saate ühendada mitu funktsiooni samal viisil, nagu seda tehti sümboli VermanCipher jaoks. Kui olete kõik sümbolid, mida soovite kasutada, laadinud, peate need õigesti sisestama. Golangi keel on staatiliselt kirjutatud, seega pole muud võimalust nende sümbolite kasutamiseks ilma castinguta. Pidage meeles, et kui ekspordite muutujat, mis rakendab mõnda meetodit, peate selle sisestama õigele liidese tüübile (selle töötlemiseks pidin määratlema krüptimismasina liidese). \ Newline \ newline

Rakenduse kompileerimiseks ja käitamiseks kasutage järgmist käsku:

minge ehitage app.go
./app

Väljundis peaksite nägema krüptitud ja dekrüptitud teksti tõestusena, et algoritm töötab õigesti.

Kasutage pistikprogrammi AWS-i lambdas

Meie plugina kasutamiseks AWS Lambdas peame oma rakenduses tegema mõned muudatused:

  • AWS Lambda ühendab kihid lambda konteineri kataloogi / opt, seega peame oma pistikprogrammi laadima sellest kataloogist.
  • Peame looma käitlejafunktsiooni, mida Lambda mootor kasutab meie katsesündmuse käsitlemiseks.

Järgmine katkend sisaldab meie rakendust, mida on kohandatud kasutama Lambda:

Nagu näete, on rakendamine eelmisega väga sarnane. Oleme muutnud ainult kataloogi, kust laadisime pistikprogrammi, ja lisasime väärtuste printimise asemel funktsiooni vastuse. Kui soovite lisateavet lambdade golangi keeles kirjutamise kohta, lugege palun AWS-i dokumentatsiooni.

AWS Lambda juurutamine

AWS Lambda funktsioonide ja kihtide juurutamiseks on kaks viisi. ZIP-paketti saate käsitsi luua ja üles laadida või kasutada keerukamat raamistikku, mis muudab selle palju lihtsamaks ja kiiremaks. Enamiku oma projektide jaoks kasutan serverita raamistikku, seega olen selle tööriista abil juba ette valmistanud lihtsa serverless.yml konfiguratsioonifaili:

teenus: cipherService
frameworkVersion: "> = 1.28.0 <2.0.0"
pakkuja:
  nimi: aws
  käitusaeg: go1.x
kihid:
  cipherLayer:
    tee: prügikast / pistikprogramm
    ühilduv kestus:
      - go1.x
funktsioonid:
  mootor:
    käitleja: bin / cipherEngine
    pakett:
      välista:
        - ./**
      sisaldama:
        - ./bin/cipherEngine
    kihid:
      - {Viide: CipherLayerLambdaLayer}

Kihtide jaotises määratlesime ühe kihi juba loodud pistikprogrammi teega - see võetakse kasutusele koos funktsiooniga lambda. Saate määratleda kuni 5 erinevat kihti, milline järjekord on tõesti oluline. Need on paigaldatud samasse / opt kataloogi, nii et suurema arvu kihid saavad varem ühendatud kihtide failid alistada. Iga kihi jaoks peate esitama vähemalt 2 parameetrit: tee kataloogi, mis sisaldab kihiallikat (teie puhul binaarse pistikprogrammi tee) ja ühilduvate tööaegade loendit.

Järgmine funktsioonide jaotis on koht, kus saate määratleda kasutatavate funktsioonide loendi. Iga funktsiooni jaoks peate sisestama vähemalt tee kompileeritud rakenduse juurde. Lisaks peame defineerima kihtide parameetri, viidates eespool määratletud kihile. See lisab kihi juurutamise ajal automaatselt meie Lambda funktsioonile. Naljakas on see, et peate oma lambda kihi nime teisendama pealkirjaks Cases ja lisama LambdaLayeri järelliide, kui soovite sellele ressursile viidata. Näib, et serverita meeskond rakendas selle sel viisil, et lahendada konflikt erinevat tüüpi ressursside alusel.

Kui meie serverless.yml konfiguratsioonifail on valmis, on viimane asi meie rakenduse kompileerimine, pistikprogrammi installimine ja juurutamine. Selle jaoks saame kasutada lihtsat Makefile'i:

.PHONY: ehitage buildPlugin puhas juurutamine
ehitama:
 dep tagada -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
puhas:
 rm -rf ./bin ./vendor Gopkg.lock
juurutamine: puhas buildPlugin build
 sls juurutada --verbose

Oma funktsiooni saate luua ja juurutada, käivitades järgmise käsu:

kasutusele võtma

Test AWS Lambda

Nagu ma varem mainisin, täidab AWS Lambda sündmuse vastuseks koodi. Kuid me ei konfigureerinud ühtegi sündmuse päästikut, nii et sellele ei kutsuta ilma meie abita. Peame seda käsitsi tegema, kasutades serverita raamistikku või tööriista awscli:

sls kutsub -f funktsiooni_nimi
aws lambda kutsu - funktsiooni nimi funktsiooni_nimi väljundfail

Vastuses peaksite nägema sama väljundit kui varem, mis tõestab, et meie lambda funktsioon töötab õigesti ja laadib pistikprogrammi lisakihist. Nüüd saate luua muid funktsioone, mis kasutavad sama kihti või isegi jagada seda teiste AWS-i kontodega.

Kokkuvõte

Oli väga lõbus kasutada Golangi mooduleid ja katsetada, kuidas neid värskelt välja antud AWS Lambda kihtidega integreerida. Pistikprogrammi teek on tõesti fantastiline, kuid oma piirangute ja Golangi spetsifikatsioonide tõttu saab seda kasutada ainult mõnes eristsenaariumis. Arvan, et enamiku standardprojektidega töötavate arendajate jaoks pole pistikprogrammide kasutamine vajalik ega isegi võimalik. Ainult kahel põhjusel tuleb mul meelde:

  • Keeruliste algoritmide juurutamine, mida saavad kasutada ka muud rakendused. video kodeerimise või krüpteerimise algoritmid.
  • Algoritmi jagamine teistega, ilma selle koodi avaldamata.