Ինչպես ստեղծել pluggable Golang հավելված և օգտվել AWS Lambda շերտերից:

Գոլանգ - ինչու՞ է դա արժե ձեր ուշադրությունը:

Golang- ը բաց կոդով ծրագրավորման լեզու է, որը մշակվել և իրականացվում է Google- ի կողմից: Այն շատ լայնորեն օգտագործվում է ժամանակակից կիրառություններում, հատկապես ամպի մեջ: Դրանք ամենաբնորոշ գծերն են.

  • Golang- ը գրված է ստատիկորեն. Այն առաջարկում է ավելի քիչ ճկունություն, բայց պաշտպանում է ձեզ սխալներից,
  • Այն օբյեկտիվ չէ: Այնուամենայնիվ, դուք կարող եք ստեղծել կառուցվածքներ և ինտերֆեյսեր, և դա հանգեցնում է OOP- ի 4 սկզբունքներից 3-ին `տվյալների վերացում, ծածկապատում և բազմանդամություն: Բացակայում է միայն ժառանգությունը
  • Goroutines! - Լույսի թելերի լավագույն իրականացումը, որը ես երբևէ օգտագործել եմ: «Գո» օպերատորի միջոցով դուք հեշտությամբ կարող եք ստեղծել նոր թեմա և հաղորդակցվել տարբեր գորտնիների միջև:
  • Այն կազմված է մեկ երկուական ֆայլի մեջ ՝ բոլոր կախվածություններով. Այլևս փաթեթային բախումներ չկան:

Անձամբ ես Գոլանգը համարում եմ ամենամեծ լեզուն, որն ամեն օր օգտագործում եմ: Այնուամենայնիվ, այս հոդվածը ձեր առաջին գործառույթը ստեղծելու կամ «Բարև աշխարհ» տպելու մասին չէ: Ես ձեզ մի փոքր ավելի առաջադեմ նյութեր ցույց կտամ: Եթե ​​սկսնակ եք և ցանկանում եք ավելին իմանալ Golang- ի մասին, այցելեք հիմնական էջ:

AWS Lambda & Golang

AWS Lambda- ն հանրային ամպի ամենահայտնի սերվերային համակարգչային ծառայություններից մեկն է, որը թողարկվել է Amazon Web Services- ի կողմից 2014-ի նոյեմբերին: Կարող եք գործարկել ձեր կոդը ՝ ի պատասխան DynamoDB, SNS կամ HTTP ազդանշանների նման իրադարձությունների ՝ առանց սերվերների կայացման կամ կառավարման: Գիտե՞ք ինչն է իրականում հոյակապ: Այն աջակցում է Գոլանգի ժամկետին 2018-ի հունվարից: AWS Lambda- ի հետ աշխատելը իսկապես հեշտ է. Պարզապես վերբեռնեք սեղմված փաթեթ ձեր կոդով և բոլոր կախվածություններով (մեկական երկուական, եթե օգտագործում եք Golang):

Արագ առաջ, 4 տարի անց, 2018-ը. Հորինեք AWS- ը թողարկում է Lambda շերտերը, որոնք թույլ են տալիս պահպանել և կառավարել մեկ կամ նույնիսկ բազմաթիվ AWS հաշիվներում տարբեր գործառույթների համար կիսված տվյալներ: Օրինակ, եթե Python եք օգտագործում, բոլոր կախվածությունները կարող եք տեղադրել լրացուցիչ շերտի մեջ, որը հետագայում կարող է օգտագործվել այլ լամբդաների կողմից: Այլևս կարիք չկա յուրաքանչյուր կախված zip փաթեթին ավելացնել տարբեր կախվածություններ: Golang աշխարհում իրավիճակն այլ է, քանի որ AWS Lambda- ն պահանջում է վերբեռնել կազմված երկուական թվեր: Ինչպե՞ս կարող ենք օգուտ քաղել AWS Lambda շերտերից: Պատասխանը պարզ է. Կառուցեք մոդուլային ծրագիր Golang պլագիններով:

Golang plugins - մոդուլային ծրագիր կառուցելու միջոց

Golang Plugins- ը Go1.8- ում թողարկված հատկությունն է, որը թույլ է տալիս դինամիկ կերպով բեռնել ընդհանուր գրադարանները (.այլ ֆայլեր): Դուք ունեք տարբերակը `ձեր կոդի մի մասը արտահանելու առանձին գրադարան կամ օգտագործելու այն plugin- ը, որը ստեղծվել և կազմվել է ուրիշի կողմից: Այնուամենայնիվ, հուսադրող է, որ կան որոշ սահմանափակումներ.

  • Ձեր կոնտակտը պետք է լինի մեկ հիմնական մոդուլ,
  • Կարող եք բեռնել միայն գործառույթներն ու փոփոխականները, որոնք արտահանվում են որպես ELF խորհրդանիշներ:
  • Ստատիկ մուտքագրման շնորհիվ դուք պետք է փոխեք յուրաքանչյուր բեռնված խորհրդանիշը ճիշտ տիպի: Վատագույն սցենարում անհրաժեշտ է ձեր կոդում ճիշտ ինտերֆեյս սահմանել,
  • Այն աշխատում է միայն Linux- ի և MacOS- ի վրա: Անձամբ ես դա որպես թերություն չեմ տեսնում :)

Ստեղծեք և փորձարկեք ձեր առաջին կոնտակտը

Հիմա եկեք ստեղծենք մեր առաջին կոնտակտը: Որպես օրինակ, մենք կստեղծենք տողի կոդավորման պարզ մոդուլ: Եկեք վերադառնանք հիմունքներին և իրականացնենք կոդավորման երկու պարզ ալգորիթմներ ՝ Ceasar և Verman:

  • Կեսարի ծածկագիրն այն ալգորիթմն է, որն առաջին անգամ օգտագործվել է Julուլիուս Չեսեսի կողմից: Այն տեքստի յուրաքանչյուր տառ է տեղափոխում նշված վայրերի նշված քանակը: Օրինակ, եթե ցանկանում եք ծածկագրել golang բառը 4 ստեղնով, կստանաք ktpek: Վերծանումը գործում է նույն կերպ: Դուք պետք է ընդամենը տառերը հակառակ ուղղությամբ տեղափոխեք:
  • Վերման ծածկագիրը նման է Ceaser ծածկագրին, որը հիմնված է նույն տեղափոխման գաղափարի վրա: Տարբերությունն այն է, որ յուրաքանչյուր տառ տեղափոխում եք դիրքերի տարբեր քանակ: Տեքստը վերծանելու համար ձեզ հարկավոր է բանալին ՝ այն դիրքերով, որտեղ կոդավորվել է տեքստը: Օրինակ, եթե ուզում եք golang բառը ծածկագրել [-1, 4, 7, 20, 4, -2] բանալիով, ապա ապագա կստանաք:

Այս օրինակի ամբողջական իրականացմանը կարող եք ծանոթանալ այստեղ:

Պլագինի ներդրում

Հաջորդ հատվածը պարունակում է վերոհիշյալ երկու ալգորիթմների իրականացումը: Յուրաքանչյուրի համար մենք իրականացնում ենք մեր տեքստի գաղտնագրման և վերծանման երկու մեթոդ.

Ինչպես տեսնում եք, մենք այստեղ 3 տարբեր խորհրդանիշներ ենք արտահանել (Golang- ն արտահանում է միայն այս նույնացուցիչները, որոնք սկսվում են վերևում նշված տառով).

  • EncryptCeasar - func (int, string) Տող, որը ծածկագրում է տեքստը ՝ օգտագործելով Ceasar ալգորիթմը:
  • DecryptCeaser - ֆունկցիա (int, string) տող, որը վերծանում է տեքստը ՝ օգտագործելով Caeser ալգորիթմը,
  • VermanCipher - vermanCipher տիպի փոփոխական, որն իրականացնում է 2 մեթոդ. Գաղտնագրում. Func (string) տող և Decrypt: func () (* string, error)

Այս plugin- ը կազմելու համար անհրաժեշտ է գործարկել հետևյալ հրահանգը.

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

Այս պահին ոչ մի առանձնահատուկ բան չկա. Պարզապես ստեղծվել են մի քանի պարզ գործառույթներ և մոդուլը կազմվել է որպես պլագին ՝ ավելացնելով -buildmode = plugin փաստարկը:

Բեռնել և ստուգել պլագինը

Theվարճանքն սկսվում է այն ժամանակ, երբ մենք ցանկանում ենք օգտագործել մեր հավելվածում կազմված ներդիրը: Եկեք ստեղծենք մի պարզ օրինակ.

Նախ անհրաժեշտ է ներմուծել Golang plugin փաթեթը: Այն պարունակում է ընդամենը երկու գործառույթ. Առաջինը ՝ ընդհանուր գրադարան բեռնելը, երկրորդը ՝ արտահանված խորհրդանիշ գտնելը: Ձեր գրադարանը բեռնելու համար դուք պետք է օգտագործեք Open գործառույթը, որի համար պետք է նշվեն ձեր ընդհանուր plug-in- ի ուղին և plug-in տեսակի վերադարձի փոփոխականը: Եթե ​​գրադարանը չի կարող բեռնվել (օր. ՝ սխալ ուղի կամ վնասված ֆայլ), այս գործառույթը վերադարձնում է այն սխալը, որը պետք է կարգավորվի:

Հաջորդ քայլը `բեռնաթափել յուրաքանչյուր արտահանված խորհրդանիշ` որոնման եղանակով: Մի փոքր անբավարարություն այն է, որ դուք պետք է բեռնեք յուրաքանչյուր արտահանված գործառույթ առանձին: Այնուամենայնիվ, կարող եք համատեղել բազմաթիվ գործառույթներ նույն կերպ, ինչպես դա արեցիք VermanCipher խորհրդանիշի համար: Այժմ, երբ դուք բեռնել եք բոլոր խորհրդանիշները, որոնք ցանկանում եք օգտագործել, անհրաժեշտ է դրանք փոխարկել ճիշտ տիպի: Golang- ը ստատիկորեն մուտքագրված լեզու է, ուստի այդ ձևաթղթերն առանց ձուլման այլ եղանակ օգտագործելու այլ տարբերակ չկա: Հիշեք, եթե դուք արտահանում եք փոփոխական, որն իրականացնում է որոշ մեթոդներ, դուք պետք է այն գցեք ճիշտ ինտերֆեյսի տիպի (ես պետք է որ սահմանեի encryptionEngine ինտերֆեյսը `դա կարգավորելու համար): \ Newline \ newline

Theրագիրը կազմելու և գործարկելու համար օգտագործեք հետևյալ հրահանգը.

գնացեք կառուցեք app.go ./app

Արդյունքում դուք պետք է կոդավորված և վերծանված տեքստը տեսնեք որպես ալգորիթմի ճիշտ աշխատանքի ապացույց:

Օգտագործեք հավելվածը AWS Lambda- ում

Որպեսզի մեր կոնտակտը AWS Lambda- ում օգտագործենք, մենք պետք է որոշ փոփոխություններ կատարենք մեր ծրագրում.

  • AWS Lambda- ն շերտեր է ամրացնում Lambda կոնտեյների մեջ / opt գրացուցակում, այնպես որ մենք ստիպված ենք բեռնել մեր plug-in- ը այս գրացուցակից:
  • Մենք պետք է ստեղծենք կարգավար գործառույթ, որը կօգտագործվի Lambda շարժիչի կողմից ՝ մեր փորձարկման իրադարձությունը մշակելու համար:

Հետևյալ հատվածը պարունակում է մեր ծրագիրը, որը հարմարեցված է Lambda- ի օգտագործման համար.

Ինչպես տեսնում եք, իրականացումը շատ նման է նախորդին: Մենք պարզապես փոխեցինք գրացուցակը, որից բեռնեցինք մեր կոնտակտը և արժեքները տպելու փոխարեն ավելացրեցինք ֆունկցիայի պատասխանը: Գոլանգում լամբդա գրելու մասին լրացուցիչ տեղեկությունների համար տե՛ս AWS փաստաթղթերը:

AWS Lambda- ի տեղադրում

AWS Lambda գործառույթներն ու շերտերը տեղակայելու երկու եղանակ կա: Կարող եք ձեռքով ստեղծել և վերբեռնել սեղմված փաթեթ կամ օգտագործել առաջադեմ շրջանակ, որը այն շատ ավելի հեշտ և արագ կդարձնի: Իմ նախագծերի մեծ մասի համար ես օգտագործում եմ առանց սերվերների շրջանակ: Ուստի ես արդեն պատրաստել եմ պարզ կազմաձևման ֆայլ serverless.yml այս գործիքի միջոցով.

Serviceառայություն ՝ cipherService frameVersion: "> = 1.28.0 <2.0.0" Մատակարար ՝ Անուն ՝ aws Runtime: go1.x
Շերտեր. Ծածկագիր. Շերտ: athանապարհ: աղբարկղ / պլագինի համատեղելիության տևողություններ. - go1.x
Գործառույթներ. Շարժիչ ՝ Վերամշակող ՝ աղբարկղ / ծածկագրիչՇարժիչի փաթեթ. Բացառել ՝ - ./** Ներառել ՝ - ./bin/cipherEngine շերտերը ՝ - {Ref: CipherLayerLambdaLayer}

Շերտի տարածքում մենք սահմանել ենք մեկ շերտ `արդեն ստեղծված plug-in- ի ուղով, որը տրամադրվում է Lambda գործառույթի հետ միասին: Կարող եք սահմանել մինչև 5 տարբեր մակարդակ, որոնց կարգը իսկապես կարևոր է: Դրանք տեղադրված են նույն / օպտիկական գրացուցակում, այնպես որ ավելի մեծ թվով շերտերը կարող են վերաշարադրել ֆայլերը նախկինում տեղադրված շերտերից: Յուրաքանչյուր մակարդակի համար դուք պետք է նշեք առնվազն 2 պարամետր. Ուղին դեպի գրացուցակ մակարդակի աղբյուրով (ձեր դեպքում ՝ դեպի plug-in երկուական ֆայլ) և համատեղելի տևողությունների ցուցակ:

Հաջորդ գործառույթի բաժինը մի տեղ է, որտեղ դուք սահմանում եք իրականացվելիք գործառույթների ցանկը: Յուրաքանչյուր գործառույթի համար առնվազն պետք է նշեք կազմված դիմումի ուղին: Բացի այդ, մենք պետք է սահմանենք շերտի պարամետրը `վերևում նշված շերտի հղումով: Տեղակայման ընթացքում սա շերտը ավտոմատ կերպով կցելու է մեր Lambda գործառույթին: Theավեշտալին այն է, որ եթե ուզում եք հղում կատարել այս ռեսուրսին, դուք պետք է փոխեք ձեր Lambda շերտի անունը TitleCased- ի և ավելացնեք LambdaLayer վերջածանցը: Թվում է, որ առանց սերվերների թիմը դա իրականացրել է տարբեր տեսակի ռեսուրսների հետ կապված հակամարտությունը լուծելու համար:

Հենց որ մեր կոնֆիգուրացիոն ֆայլը serverless.yml պատրաստ լինի, վերջին բանը, որ պետք է անեք ՝ կազմել, միացնել և տեղադրել մեր ծրագիրը: Դրա համար մենք կարող ենք օգտագործել պարզ ֆայլ:

.PHONY. Կառուցեք BuildPlugin- ը մաքուր տեղակայելու համար
կառուցել. dep safe -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
մաքուր ՝ rm -rf ./bin ./vendor Gopkg.lock
տեղակայել. մաքուր կառուցում Plugin build sls տեղակայել - verbose

Կարող եք կառուցել և տեղակայել ձեր գործառույթը ՝ գործարկելով հետևյալ հրահանգը.

ապահովել

Փորձեք AWS Lambda- ն

Ինչպես ավելի վաղ նշվեց, AWS Lambda Code- ը գործում է ի պատասխան իրադարձության: Այնուամենայնիվ, մենք չենք կազմաձևել որևէ իրադարձության ազդակ Մենք պետք է դա անենք ձեռքով ՝ օգտագործելով Serverless Framework կամ awscli գործիքը.

sls զանգեր -f ֆունկցիա-անուն aws լամբդա կանչում - ֆունկցիա-անուն ֆունկցիա-անուն ելքային ֆայլ

Ի պատասխան, դուք պետք է տեսնեք նույն արդյունքը, ինչպես նախկինում, ինչը փաստում է, որ մեր lambda ֆունկցիան ճիշտ է աշխատում, և որ plugin- ը բեռնում է լրացուցիչ շերտից: Այժմ դուք կարող եք ստեղծել այլ գործառույթներ, որոնք օգտագործում են նույն շերտը կամ նույնիսկ այն կիսում այլ AWS հաշիվների հետ:

Ամփոփում

Հիանալի զվարճալի էր Golang մոդուլների օգտագործումը և փորձարկել, թե ինչպես են դրանք ինտեգրվել նոր թողարկված AWS Lambda Layers- ի հետ: Պլագինների գրադարանն իսկապես հոյակապ է, բայց այն կարող է օգտագործվել միայն որոշակի սցենարներում `իր սահմանափակումների և Golang- ի բնութագրերի պատճառով: Կարծում եմ, որ ստանդարտ նախագծերի վրա աշխատող մշակողների մեծամասնության համար պլագինները չեն պահանջվում կամ նույնիսկ հնարավոր են: Ես կարող եմ մտածել միայն երկու պատճառ.

  • Բարդ ալգորիթմների իրականացում, որոնք կարող են օգտագործվել մյուս ծրագրերի կողմից, օրինակ. Տեսանյութի կոդավորման կամ կոդավորման ալգորիթմներ:
  • Կիսվեք ձեր ալգորիթմով ուրիշների հետ ՝ առանց կոդը հրապարակելու: