Kā izveidot pievienojamu Golang lietojumprogrammu un kā gūt labumu no AWS Lambda slāņiem.

Golangs - kāpēc tas ir jūsu uzmanības vērts?

Golang ir atvērtā koda programmēšanas valoda, ko izstrādājis un ieviesis Google. Tas ir ļoti plaši izmantots mūsdienu lietojumprogrammās, it īpaši mākonī. Tās ir raksturīgākās iezīmes:

  • Golangs ir statiski tipizēts - tas nodrošina mazāku elastību, bet aizsargā jūs no kļūdu pieļaušanas,
  • Tas nav orientēts uz objektu. Tomēr jūs varat izveidot struktūras un saskarnes, un tas dod jums 3 no 4 OOP principiem: datu abstrakcija, iekapsulēšana un polimorfisms. Mantojuma trūkst,
  • Gorutines! - vislielākā gaismas diegu ieviešana, ko jebkad esmu izmantojusi. Tas ļauj jums izveidot ļoti vienkāršu pavedienu, izmantojot Go operatoru, un sazināties starp dažādiem rutīnas, izmantojot kanālus,
  • Tas apkopo vienu bināro ar visām atkarībām - vairs nav konfliktu pakešu!

Es personīgi uzskatu Golangu par lielāko valodu, kuru lietoju ikdienā. Tomēr šis raksts nebūs par pirmās funkcijas izveidi vai “Hello World” drukāšanu. Es jums parādīšu mazliet sarežģītākas lietas. Ja esat iesācējs un vēlaties uzzināt vairāk par Golang, lūdzu, apmeklējiet tā galveno lapu.

AWS Lambda & Golang

AWS Lambda ir viens no populārākajiem bezkontakta skaitļošanas pakalpojumiem publiskajā mākonī, kuru 2014. gada novembrī izlaida Amazon Web Services. Tas ļauj jums palaist savu kodu, reaģējot uz tādiem notikumiem kā DynamoDB, SNS vai HTTP aktivizētāji, neizmantojot vai pārvaldot serverus! Vai jūs zināt, kas ir patiešām lieliski? Kopš 2018. gada janvāra tas atbalsta Golang izpildlaiku. Darbs ar AWS Lambda ir patiešām vienkāršs - vienkārši augšupielādējiet saspiestu pakotni ar savu kodu un visām atkarībām (viens binārais, lietojot Golang).

Ātri uz priekšu, četrus gadus vēlāk, 2018 re: Invent AWS izlaiž Lambda slāņus, kas ļauj uzglabāt un pārvaldīt datus, kas tiek koplietoti dažādās funkcijās vienā vai pat vairākos AWS kontos! Piemēram, izmantojot Python, visas atkarības var ievietot papildu slānī, kuru vēlāk var izmantot citas Lambdas. Katrā rāvējslēdzēja iepakojumā vairs nav jāievieto dažādas atkarības! Golangas pasaulē situācija ir atšķirīga, jo AWS Lambda pieprasa augšupielādēt apkopotus bināros failus. Kā mēs varam gūt labumu no AWS Lambda slāņiem? Atbilde ir vienkārša - izveidojiet modulāru lietojumprogrammu, izmantojot Golang spraudņus!

Golang spraudņi - veids, kā izveidot modulāru lietojumprogrammu

Golang spraudņi ir Go1.8 izlaista funkcija, kas ļauj dinamiski ielādēt koplietotās bibliotēkas (.so failus). Tas dod jums iespēju daļu sava koda eksportēt uz atsevišķu bibliotēku vai izmantot spraudni, ko sagatavojis un apkopojis kāds cits. Tas ir daudzsološi, tomēr ir daži ierobežojumi:

  • Jūsu spraudnim jābūt vienam galvenajam modulim,
  • Jūs varat ielādēt tikai funkcijas un mainīgos, kas tiek eksportēti kā ELF simboli,
  • Statiskās mašīnrakstīšanas dēļ katrs ielādētais simbols ir jālieto pareizajā tipā. Sliktākajā gadījumā jums jādefinē pareizs interfeiss kodā,
  • Tas darbojas tikai operētājsistēmās Linux un MacOS. Personīgi es to neuzskatu par neizdevīgu stāvokli :)

Pirmā spraudņa izveidošana un pārbaude

Tagad izveidosim mūsu pirmo spraudni. Kā piemēru mēs izveidosim vienkāršu virknes šifrēšanas moduli. Atgriezīsimies pie pamatiem un ieviesīsim 2 vienkāršus šifrēšanas algoritmus - Ceasar un Verman.

  • Cēzara šifrs ir algoritms, kuru vispirms izmantoja Jūlijs Ceases. Tas katru burtu tekstā pārbīda par fiksētu pozīciju skaitu. Piemēram, ja vēlaties šifrēt vārdu golang ar taustiņu 4, jūs saņemsit ktpek. Atšifrēšana darbojas tāpat. Jums vienkārši jāpārvieto burti pretējā virzienā.
  • Vērmana šifrs ir līdzīgs Ceaser, balstoties uz to pašu mainīgo ideju, atšķirība ir tā, ka jūs katru burtu nobīdāt ar atšķirīgu pozīciju skaitu. Lai atšifrētu tekstu, jums ir jābūt atslēgai, kurā ir pozīcijas, kuras tiek izmantotas teksta šifrēšanai. Piemēram, ja vēlaties šifrēt vārdu golang ar taustiņu [-1, 4, 7, 20, 4, -2], jūs iegūsit nākotni.

Pilnīga šī piemēra ieviešana ir pieejama šeit.

Spraudņa ieviešana

Šis fragments satur divu iepriekš minēto algoritmu ieviešanu. Katrā no tām mēs izmantojam 2 teksta šifrēšanas un atšifrēšanas metodes:

Kā redzat, mēs šeit eksportējām 3 dažādus simbolus (Golang eksportē tikai šos identifikatorus, kas sākas ar lielo burtu):

  • EncryptCeasar - func (int, virkne) virkne, kas šifrē tekstu, izmantojot Ceasar algoritmu,
  • DecryptCeaser - func (int, virkne) virkne, kas atšifrē tekstu, izmantojot Caeser algoritmu,
  • VermanCipher - vermanCipher tipa mainīgais, kas ievieš 2 metodes: Šifrēt: func (virkne) virkne un Atšifrēt: func () (* virkne, kļūda)

Lai apkopotu šo spraudni, jāizpilda šāda komanda:

ejiet būvēt -buildmode = spraudnis -o spraudnis / cipher.so spraudnis / cipher.go

Pagaidām nekas īpašs nav izveidots - tika izveidotas dažas vienkāršas funkcijas, un modulis tika sastādīts kā spraudnis, pievienojot argumentu -buildmode = spraudnis.

Ielādējiet un pārbaudiet spraudni

Jautrība sākas tad, kad mēs savā lietotnē vēlamies izmantot apkopotu spraudni. Izveidosim vienkāršu piemēru:

Pirmkārt, jums jāimportē Golang spraudņa pakotne. Tajā ir tikai divas funkcijas - pirmā ir paredzēta koplietojamas bibliotēkas ielādei, bet otrā - eksportētā simbola atrašanai. Lai ielādētu bibliotēku, ir jāizmanto funkcija Open, kurai nepieciešams norādīt ceļu uz jūsu koplietoto spraudni un kas atgriež plugin tipa mainīgo. Ja bibliotēkas ielāde nav iespējama (piemēram, nepareizs ceļš vai bojāts fails), šī funkcija atgriež kļūdu, kas jārisina.

Nākamais solis ir ielādēt katru eksportēto simbolu, izmantojot uzmeklēšanas metodi. Nelielas neērtības ir tādas, ka katra eksportētā funkcija jāielādē atsevišķi. Tomēr jūs varat apvienot vairākas funkcijas kopā tādā pašā veidā, kā tas tika darīts VermanCipher simbolam. Kad esat ielādējis visus simbolus, kurus vēlaties izmantot, tie ir jāievieto pareizajā formā. Golangas valoda ir statiskā valodā, tāpēc nav citu iespēju, kā šos simbolus izmantot bez liešanas. Atcerieties, ka, eksportējot mainīgo, kas ievieš dažas metodes, jums tas ir jānorāda pareizajā saskarnes tipā (lai to apstrādātu, man bija jādefinē encryptionEngine interfeiss). \ Newline \ newline

Lai apkopotu un palaistu lietotni, izmantojiet šo komandu:

ejiet veidot app.go
./app

Izejā jums vajadzētu redzēt šifrētu un atšifrētu tekstu kā pierādījumu tam, ka algoritms darbojas pareizi.

Izmantojiet spraudni AWS lambda

Lai izmantotu mūsu spraudni AWS Lambda, mums savā lietojumprogrammā jāveic dažas modifikācijas:

  • AWS Lambda slāņus ievieto lambda konteinera direktorijā / opt, tāpēc mums ir jāielādē mūsu spraudnis no šī direktorija.
  • Mums jāizveido apstrādātāja funkcija, kuru Lambda motors izmantos, lai apstrādātu mūsu testa notikumu.

Šajā fragmentā ir mūsu lietojumprogramma, kas pielāgota Lambda lietošanai:

Kā redzat, ieviešana ir ļoti līdzīga iepriekšējai. Mēs esam mainījuši tikai direktoriju, kurā ielādējām spraudni, un pievienojām funkcijas atbildi, nevis drukājot vērtības. Ja vēlaties uzzināt vairāk par Lambdas rakstīšanu golang valodā, lūdzu, pārbaudiet AWS dokumentāciju.

AWS Lambda izvietošana

AWS Lambda funkciju un slāņu izvietošanai ir divi veidi. Jūs varat manuāli izveidot un augšupielādēt saspiestu pakotni vai izmantot sarežģītāku sistēmu, kas to padara daudz vieglāku un ātrāku. Lielākajai daļai savu projektu es izmantoju Serverless sistēmu, tāpēc es jau esmu sagatavojis vienkāršu serverless.yml konfigurācijas failu, izmantojot šo rīku:

pakalpojums: cipherService
frameworkVersion: "> = 1.28.0 <2.0.0"
sniedzējs:
  nosaukums: aws
  izpildlaiks: go1.x
slāņi:
  cipherLayer:
    ceļš: atkritumu tvertne / spraudnis
    saderīgsRuntimes:
      - go1.x
funkcijas:
  dzinējs:
    apdarinātājs: bin / cipherEngine
    pakete:
      izslēgt:
        - ./**
      ietver:
        - ./bin/cipherEngine
    slāņi:
      - {Ref: CipherLayerLambdaLayer}

Slāņu sadaļā mēs definējām vienu slāni ar ceļu uz jau izveidoto spraudni - tas tiks izvietots kopā ar lambda funkciju. Varat definēt līdz 5 dažādiem slāņiem, kura secība ir patiešām svarīga. Tie ir uzstādīti tajā pašā / izvēles direktorijā, tāpēc slāņi ar lielāku skaitu var ignorēt failus no iepriekš uzstādītajiem slāņiem. Katram slānim ir jāsniedz vismaz 2 parametri: ceļš uz direktoriju, kurā ir slāņa avots (ceļš uz bināro spraudni jūsu gadījumā) un saderīgo izpildlaiku saraksts.

Nākamā funkciju sadaļa ir vieta, kur jūs definējat izvietojamo funkciju sarakstu. Katrai funkcijai jums ir jānorāda vismaz ceļš uz apkopoto lietojumprogrammu. Turklāt mums jādefinē slāņu parametrs ar atsauci uz iepriekš definēto slāni. Tas izvietojuma laikā automātiski pievienos slāni mūsu funkcijai Lambda. Smieklīgi ir tas, ka jums jākonvertē savs lambda slāņa nosaukums uz TitleCased un jāpievieno LambdaLayer piedēklis, ja vēlaties atsaukties uz šo resursu. Liekas, ka Serverless komanda to ieviesa šādā veidā, lai atrisinātu konfliktu, atsaucoties uz dažāda veida resursiem.

Kad mūsu serverless.yml konfigurācijas fails ir gatavs, pēdējais, kas jādara, ir apkopot mūsu lietotni, spraudni un to izvietot. Tam mēs varam izmantot vienkāršu Makefile:

.FONIJA: veidot buildPlugin tīru izvietošanu
būvēt:
 dep nodrošināt -v
 lv GOOS = linux iet build -ldflags = "- s -w" -o bin / cipherEngine cipherEngine / main.go
buildPlugin:
 lv GOOS = linux go build -ldflags = "- s -w" -buildmode = spraudnis -o bin / plugin / cipher.so ../plugin/cipher.go
tīrs:
 rm -rf ./bin ./vendor Gopkg.lock
izvietot: tīru buildPlugin būvēt
 sls izvietot --verbose

Varat izveidot un izvietot savu funkciju, izpildot šo komandu:

veikt izvietošanu

Pārbaudiet AWS Lambda

Kā jau minēju iepriekš, AWS Lambda, atbildot uz notikumu, izpilda kodu. Tomēr mēs nekonfigurējām nevienu notikumu aktivizētāju, tāpēc uz to netiks izsaukts bez mūsu palīdzības. Mums tas jādara manuāli, izmantojot Serverless sistēmu vai awscli rīku:

sls izsaukt -f funkcijas_nosaukums
aws lambda izsaukums - function-name function_name output_file

Atbildē jums vajadzētu redzēt to pašu izvadi kā iepriekš, kas pierāda, ka mūsu lambda funkcija darbojas pareizi un ielādē spraudni no papildu slāņa. Tagad jūs varat izveidot citas funkcijas, kuras izmantos to pašu slāni, vai pat to koplietot ar citiem AWS kontiem.

Kopsavilkums

Bija ļoti jautri izmantot Golang moduļus un pārbaudīt, kā tos integrēt ar nesen atbrīvotajiem AWS Lambda slāņiem. Spraudņa bibliotēka ir patiešām satriecoša, taču ierobežotības un Golanga specifikācijas dēļ to var izmantot tikai dažos īpašos scenārijos. Es domāju, ka lielākajai daļai izstrādātāju, kuri strādā pie standarta projektiem, spraudņi nebūs vajadzīgi vai pat iespējami. Man prātā nāk tikai divi iemesli:

  • Ieviešot sarežģītus algoritmus, kurus var izmantot citas programmas, piem. video kodēšanas vai šifrēšanas algoritmi.
  • Kopīgojiet savu algoritmu ar citiem, nepublicējot tā kodu.