
Ինչպես ստեղծել 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- ի բնութագրերի պատճառով: Կարծում եմ, որ ստանդարտ նախագծերի վրա աշխատող մշակողների մեծամասնության համար պլագինները չեն պահանջվում կամ նույնիսկ հնարավոր են: Ես կարող եմ մտածել միայն երկու պատճառ.
- Բարդ ալգորիթմների իրականացում, որոնք կարող են օգտագործվել մյուս ծրագրերի կողմից, օրինակ. Տեսանյութի կոդավորման կամ կոդավորման ալգորիթմներ:
- Կիսվեք ձեր ալգորիթմով ուրիշների հետ ՝ առանց կոդը հրապարակելու: