Wéi eng pluggabel Golang Uwendung ze kreéieren a profitéiert vun AWS Lambda Layers.

Golang - firwat ass et Iech opmierksam?

Golang ass eng Open Source Programmiersprache entwéckelt a implementéiert vu Google. Et gëtt ganz wäit a modernen Uwendunge benotzt, besonnesch an der Cloud. Si sinn déi charakteristeschsten Features:

  • Golang gëtt statesch geschriwwen - et bitt manner Flexibilitéit awer schützt Iech viru Feeler,
  • Et ass net objektorientéiert. Wéi och ëmmer, Dir kënnt Strukturen an Interfaces erstellen, an dat bréngt 3 vu 4 OOP Prinzipien: Datenabstraktioun, Kapselung a Polymorphismus. Alles wat fehlt ass Ierfschaft
  • Goroutines! - Déi bescht Ëmsetzung vun de Liichtfiedem, déi ech je benotzt hunn. Mat dem Go Operator kënnt Dir ganz einfach en neie Fuedem erstellen an iwwer Kanäl tëscht verschiddene Goroutinen kommunizéieren.
  • Et gëtt an déi eenzeg binär Datei mat all Ofhängegkeeten zesummegestallt - kee Package Konflikter méi!

Perséinlech gesinn ech de Golang als déi gréisste Sprooch déi ech all Dag benotzen. Wéi och ëmmer, dësen Artikel ass net drëm Är éischt Funktioun ze kreéieren oder "Hello World" ze drécken. Ech weisen Iech e bësse méi fortgeschratt Saachen. Wann Dir en Ufänger sidd a méi iwwer Golang léiere wëllt, besicht w.e.g. d'Haaptsäit.

AWS Lambda & Golang

AWS Lambda ass eng vun de populäersten serverlose Computerdéngschter an der ëffentlecher Cloud, verëffentlecht vun Amazon Web Services am November 2014. Dir kënnt Äre Code als Äntwert op Eventer wéi DynamoDB, SNS oder HTTP Ausléiser lafen ouni Server opzestellen oder ze managen! Wësst Dir wat wierklech super ass? Et huet de Golang Begrëff zënter Januar 2018 ënnerstëtzt. Schafft mat AWS Lambda ass wierklech einfach - lued just e kompriméierte Package mat Ärem Code an all Ofhängegkeeten erop (eenzel Binär wann Dir Golang benotzt).

Séier no vir, 4 Joer méi spéit, 2018 re: Invent AWS verëffentlecht Lambda Layers déi et erlaben Daten gespäichert a verwalt fir verschidde Funktiounen an engem oder souguer méi AWS Konten ze deelen! Zum Beispill, wann Dir Python benotzt, kënnt Dir all Ofhängegkeeten an eng zousätzlech Schicht setzen, déi spéider vun anere Lambdas benotzt kënne ginn. Et ass net méi noutwendeg fir verschidden Ofhängegkeeten an all zippéiert Package ze setzen! D'Situatioun ass anescht an der Golang Welt wéi AWS Lambda erfuerdert eropgeluede Binarien eropzelueden. Wéi kënne mir vun den AWS Lambda Layers profitéieren? D'Äntwert ass einfach - baut eng modulär Applikatioun mat Golang Plugins!

Golang Plugins - e Wee fir eng modulär Applikatioun ze bauen

Golang Plugins ass d'Feature verëffentlecht am Go1.8 déi et erlaabt dynamesch gedeelt Bibliothéiken (.so Dateien) ze lueden. Dir hutt d'Méiglechkeet en Deel vun Ärem Code an déi getrennte Bibliothéik ze exportéieren oder de Plugin ze benotzen dee vun engem aneren erstallt a kompiléiert gouf. Wéi och ëmmer, et ass encouragéiert datt et e puer Aschränkunge sinn:

  • Äre Plugin muss een eenzegt Haaptmodul sinn,
  • Dir kënnt nëmme Funktiounen a Variabelen lueden déi als ELF Symboler exportéiert ginn.
  • Wéinst dem stateschen Tippen musst Dir all gelueden Symbol an de richtegen Typ konvertéieren. Am schlëmmste Fall Szenario musst Dir déi richteg Interface an Ärem Code definéieren,
  • Et funktionnéiert nëmmen op Linux an MacOS. Perséinlech gesinn ech dat net als Nodeel :)

Erstellt an test Äert éischt Plugin

Loosst eis eisen éischte Plugin erstellen. Als Beispill wäerte mir en einfachen Modul fir String Verschlësselung erstellen. Komme mer zréck op d'Grondlagen an implementéieren zwee einfach Verschlësselungsalgorithmen - Ceasar a Verman.

  • Caesar Chiffer ass den Algorithmus als éischt vum Julius Ceases benotzt. Et verréckelt all Buschtaf am Text déi spezifizéiert Zuel u Plazen. Zum Beispill, wann Dir d'Wuert golang mam Schlëssel 4 verschlëssele wëllt, kritt Dir ktpek. Entschlësselung funktionnéiert déiselwecht Manéier. Alles wat Dir maache musst ass d'Buschtawen an déi entgéintgesate Richtung ze réckelen.
  • De Verman Chiffer ass ähnlech wéi de Ceaser Chiffer, baséiert op der selwechter verréckelter Iddi. Den Ënnerscheed ass datt Dir all Buschtaf déi verschidden Unzuel u Positioune réckelt. Fir den Text z'entschlësselen, braucht Dir de Schlëssel mat de Positiounen wou den Text verschlësselt war. Zum Beispill, wann Dir d'Wuert golang mam Schlëssel [-1, 4, 7, 20, 4, -2] verschlëssele wëllt, kritt Dir Zukunft.

Déi voll Ëmsetzung vun dësem Beispill fannt Dir hei.

Plugin Ëmsetzung

De folgenden Ausschnëtt enthält d'Ëmsetzung vun den zwou uewe genannten Algorithmen. Fir jidderee implementéiere mir zwou Methoden fir eisen Text ze verschlësselen an z'entschlësselen:

Wéi Dir kënnt gesinn, hu mir 3 verschidde Symboler hei exportéiert (Golang exportéiert nëmmen dës Identifizéierer déi mam Bréif uewen ufänken):

  • EncryptCeasar - func (int, string) String déi den Text mam Ceasar Algorithmus verschlësselt.
  • DecryptCeaser - func (int, string) String déi den Text mat dem Caeser Algorithmus dekodéiert,
  • VermanCipher - Variabel vum Typ vermanCipher, déi 2 Methoden implementéiert: Encrypt: func (string) string an Decrypt: func () (* string, error)

Fir dëse Plugin ze kompiléieren musst Dir de folgenden Kommando ausféieren:

géi bauen -buildmode = Plugin -o Plugin / cipher.so Plugin / cipher.go

Grad elo ass et näischt Besonnesches - just e puer einfache Funktioune goufen erstallt an e Modul gouf als Plugin kompiléiert andeems den -buildmode = Plugin Argument bäigefüügt gëtt.

Lueden an testen de Plugin

De Spaass fänkt u wa mir de kompiléierte Plugin an eiser App benotze wëllen. Loosst eis en einfacht Beispill erstellen:

Als éischt musst Dir de Golang Plugin Package importéieren. Et enthält nëmmen zwou Funktiounen - déi éischt ass eng gemeinsam Bibliothéik ze lueden an déi zweet ass en exportéiert Symbol ze fannen. Fir Är Bibliothéik ze lueden, musst Dir d'Open Funktioun benotzen, fir déi de Wee zu Ärem gemeinsame Plugin an d'Retour Variabel vum Plugin Typ spezifizéiert musse ginn. Wann d'Bibliothéik net kann gelueden ginn (z. B. falsche Wee oder beschiedegt Datei), gëtt dës Funktioun de Feeler zréck, deen ze behandele gëtt.

De nächste Schrëtt ass all exportéiert Symbol mat der Lookup Method ze lueden. E klengen Nodeel ass datt Dir all exportéiert Funktioun getrennt luede musst. Wéi och ëmmer, Dir kënnt verschidde Funktiounen op déiselwecht Manéier kombinéiere wéi Dir et mam VermanCipher Symbol gemaach hutt. Nodeems Dir all d'Symboler gelueden hutt, déi Dir benotze wëllt, musst Dir se an de richtegen Typ konvertéieren. Golang ass eng statesch getippte Sprooch, also gëtt et keen anere Wee fir dës Symboler ze benotzen ouni Goss. Denkt drun, wann Dir eng Variabel exportéiert déi verschidde Methoden implementéiert, musst Dir se op de richtegen Interface Typ werfen (ech hunn d'VerschlësselungsEngine Interface definéiert fir dëst ze handhaben). \ Newline \ newline

Benotzt de folgenden Kommando fir d'App ze kompiléieren an auszeféieren:

géi bauen app.go ./app

An der Ausgab sollt Dir de verschlësselte an entschlësselte Text als Beweis gesinn datt den Algorithmus richteg funktionnéiert.

Benotzt de Plugin an AWS Lambda

Fir eise Plugin an AWS Lambda ze benotzen, musse mir Ännerungen an eiser Applikatioun maachen:

  • AWS Lambda montéiert Schichten am / opt Verzeechnes am Lambda Container, also musse mir eise Plugin aus dësem Verzeechnes lueden.
  • Mir mussen eng Handlerfunktioun kreéieren déi vum Lambda Motor benotzt gëtt fir eisen Test Event ze verarbeiten.

De folgenden Ausschnëtt enthält eis Applikatioun déi ugepasst gouf fir vun der Lambda benotzt ze ginn:

Wéi Dir kënnt gesinn, ass d'Ëmsetzung ganz ähnlech wéi déi virdrun. Mir hunn just de Verzeechnes geännert, aus deem mir eise Plugin gelueden hunn an d'Funktiounsreaktioun derbäigesat hunn amplaz Wäerter ze drécken. Fir méi Informatiounen iwwer d'Lambdas zu Golang ze schreiwen, kuckt d'AWS Dokumentatioun.

AWS Lambda Asaz

Et ginn zwou Weeër fir AWS Lambda Funktiounen a Schichten z'installéieren. Dir kënnt e kompriméierte Package manuell erstellen an eroplueden oder de fortgeschratte Framework benotzen deen et vill méi einfach a méi séier mécht. Fir déi meescht vu menge Projete benotze ech de Serverlose Kader. Dofir hunn ech déi einfach Konfiguratiounsdatei serverless.yml mat dësem Tool scho virbereet:

Service: Chiffer Service Framework Versioun: "> = 1.28.0 <2.0.0" Fournisseur: Numm: aws Runtime: go1.x
Schichten: cipherLayer: Wee: bin / Plugin kompatibel Betriebszäiten: - go1.x
Funktiounen: Motor: Handler: bin / cipherEngine Package: Ausgeschloss: - ./** Enthält: - ./bin/cipherEngine Layers: - {Ref: CipherLayerLambdaLayer}

Am Layerberäich hu mir eng eenzeg Schicht definéiert mam Wee zum Plug-in dee scho erstallt gouf - dëst gëtt zesumme mat der Lambda Funktioun zur Verfügung gestallt. Dir kënnt bis zu 5 verschidden Niveauen definéieren, hir Uerdnung ass wierklech wichteg. Si sinn am selwechten / opt Verzeechnes montéiert, sou datt Schichten mat der héijer Zuel Dateie vun de virdru montéierte Schichten iwwerschreiwe kënnen. Fir all Niveau musst Dir op d'mannst 2 Parameteren spezifizéieren: Wee an de Verzeechnes mat der Niveauquell (an Ärem Fall Wee zu der Plugin-binärer Datei) an der Lëscht mat kompatiblen Dauer.

Déi nächst Funktiounssektioun ass eng Plaz wou Dir d'Lëscht vun de Funktiounen definéiert déi implementéiert ginn. Fir all Funktioun musst Dir op d'mannst de Wee fir déi kompiléiert Uwendung spezifizéieren. Zousätzlech musse mir de Schichtparameter definéieren mat Referenz zu der uewen definéierter Schicht. Dëst füügt automatesch d'Schicht un eis Lambda Funktioun beim Deployment. Déi witzeg Saach ass datt wann Dir op dës Ressource bezitt, musst Dir Ären Lambda Layer Numm op TitleCased konvertéieren an de LambdaLayer Suffix bäifügen. Et schéngt datt de serverlosen Team et sou implementéiert huet fir de Konflikt iwwer déi verschidden Aarte vu Ressourcen ze léisen.

Soubal eis Konfiguratiounsdatei serverless.yml fäerdeg ass, ass dat lescht wat Dir maache musst kompiléieren, uschléissen an eis App asetzen. Fir dëst kënne mir einfach Makefile benotzen:

.PHONY: Build BuildPlugin propper asetzen
bauen: dep sécher -v env GOOS = Linux go bauen -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
propper: rm -rf ./bin ./vendor Gopkg.lock
asetzen: propper bauen Plugin bauen sls asetzen --verbose

Dir kënnt Är Funktioun bauen an deplacéieren andeems Dir de kommende Kommando ausféiert:

verschaffen

Probéiert AWS Lambda

Wéi virdru scho gesot, leeft den AWS Lambda Code an der Äntwert op d'Evenement. Wéi och ëmmer, mir hunn keng Event Trigger konfiguréiert sou datt se net ouni eis Hëllef geruff ginn. Mir mussen et manuell maachen mam Serverless Framework oder mam awscli-Tool:

sls rifft -f Funktiounsnumm aws lambda opruffen - Funktiouns Numm Funktiouns Numm Ausgabdatei

An der Äntwert sollt Dir déiselwecht Ausgab wéi virdrun gesinn, wat beweist datt eis Lambda-Funktion korrekt funktionnéiert an datt de Plugin vun der extra Schicht lued. Elo kënnt Dir aner Funktiounen erstellen déi déiselwecht Schicht benotzen oder se och mat aneren AWS Konten deelen.

Resumé

Et war super Spaass Golang Moduler ze benotzen an ze testen wéi se mat den nei verëffentlechten AWS Lambda Layers integréiert kéinte ginn. D'Plugin Bibliothéik ass wierklech super, awer et kann nëmme a bestëmmten Szenarien benotzt ginn wéinst senge Beschränkungen an der Golang Spezifikatioun. Ech denken datt fir déi meescht vun den Entwéckler déi un de Standardprojete schaffen, Plugins net erfuerderlech sinn oder och méiglech. Ech kann nëmmen un zwee Grënn denken:

  • Ëmsetzung vu komplizéierten Algorithmen déi vun deenen aneren Uwendunge kënne benotzt ginn, z. Videokodéierung oder Verschlësselungsalgorithmen.
  • Deelt Ären Algorithmus mat aneren ouni de Code ze publizéieren.