Чӣ гуна як замимаи Golang васл кардан мумкин аст ва аз қабатҳои AWS Lambda манфиат гиред.

Голанг - чаро сазовори таваҷҷӯҳи шумост?

Голанг забони барномасозии кушодаасос мебошад, ки онро Google таҳия ва татбиқ мекунад. Он дар замимаҳои муосир, махсусан дар абр хеле васеъ истифода мешавад. Онҳо хусусиятҳои аз ҳама хос мебошанд:

  • Golang статикӣ навишта шудааст - он чандирии камтарро пешниҳод мекунад, аммо шуморо аз хатогиҳо муҳофизат мекунад,
  • Ин ба объект нигаронида нашудааст. Аммо, шумо метавонед сохторҳо ва интерфейсҳоро эҷод кунед, ки дар натиҷа 3 аз 4 принсипи OOP ба даст оварда мешавад: абстраксияи маълумот, инкапсулясия ва полиморфизм. Ҳар чизе, ки намерасад, танҳо мерос аст
  • Гороутинҳо! - Беҳтарин татбиқи риштаҳои рӯшноӣ, ки ман ҳамеша истифода мекардам. Бо оператори go шумо метавонед ба осонӣ риштаи нав эҷод кунед ва тавассути каналҳо байни горутиниҳои гуногун муошират кунед.
  • Он дар файли ягонаи дуӣ бо ҳама вобастагӣ ҷамъ карда мешавад - дигар ихтилофи бастабандӣ нест!

Шахсан ман Голангро бузургтарин забоне мешуморам, ки ҳамарӯза истифода мекунам. Аммо, ин мақола дар бораи эҷоди вазифаи аввалини худ ё чопи "Hello World" нест. Ман ба шумо каме чизҳои пешрафтаро нишон медиҳам. Агар шумо навкор ҳастед ва мехоҳед дар бораи Голанг маълумоти бештар гиред, лутфан ба сафҳаи асосӣ ташриф оред.

AWS Lambda & Golang

AWS Lambda яке аз маъмултарин хидматҳои компютерии бидуни сервер дар абри ҷамъиятӣ мебошад, ки онро Amazon Web Services моҳи ноябри соли 2014 баровардааст. Шумо метавонед рамзи худро дар посух ба рӯйдодҳое, ба монанди DynamoDB, SNS ё HTTP триггерҳо бидуни насб ё идора кардани серверҳо иҷро кунед! Оё ту медонӣ, ки воқеан чӣ бузург аст? Он аз моҳи январи соли 2018 мӯҳлати Голангро дастгирӣ мекунад. Кор бо AWS Lambda воқеан осон аст - танҳо як бастаи фишурдашударо бо коди худ ва ҳамаи вобастагиҳо бор кунед (бинарии ягона, агар шумо Golang -ро истифода баред).

Бо суръати тез, пас аз 4 сол, 2018 дубора: Invent AWS қабатҳои Lambda -ро мебарорад, ки ба шумо имкон медиҳад, ки маълумоти дар вазифаҳои гуногун муштаракро дар як ё ҳатто якчанд ҳисобҳои AWS ҳифз ва идора кунед! Масалан, агар шумо Python -ро истифода баред, шумо метавонед ҳамаи вобастагиҳоро ба қабати иловагӣ гузоред, ки баъдтар онҳоро дигар лямбдаҳо истифода бурда метавонанд. Дигар лозим нест, ки дар ҳар як бастаи фишурда вобастагиҳои гуногун гузошта шаванд! Вазъият дар ҷаҳони Голанг гуногун аст, зеро AWS Lambda талаб мекунад, ки боргузории бинарҳои тартибдодашуда. Чӣ гуна мо метавонем аз қабатҳои AWS Lambda манфиат гирем? Ҷавоб оддӣ аст - бо модулҳои Golang барномаи модулӣ созед!

Васлкунаки Golang - роҳи сохтани замимаи модулӣ

Plugins Golang ин хусусиятест, ки дар Go1.8 бароварда шудааст, ки ба шумо имкон медиҳад, ки китобхонаҳои муштаракро (.so файлҳо) ба таври динамикӣ бор кунед. Шумо имконият доред, ки як қисми коди худро ба китобхонаи алоҳида содир кунед ё плагинеро, ки аз ҷониби касе сохта ва тартиб дода шудааст, истифода баред. Аммо, рӯҳбаландкунанда аст, ки баъзе маҳдудиятҳо мавҷуданд:

  • Васлкунаки шумо бояд як модули ягонаи асосӣ бошад,
  • Шумо метавонед танҳо функсияҳо ва тағирёбандаҳоро, ки ҳамчун рамзҳои ELF содир карда мешаванд, бор кунед.
  • Аз сабаби чопкунии статикӣ, шумо бояд ҳар як рамзи боршударо ба навъи дуруст табдил диҳед. Дар сенарияи бадтарин, шумо бояд интерфейси дурустро дар коди худ муайян кунед,
  • Он танҳо дар Linux ва MacOS кор мекунад. Шахсан ман инро ҳамчун нуқс намебинам :)

Аввалин плагини худро созед ва санҷед

Акнун биёед аввалин плагини худро созем. Ҳамчун мисол мо як модули оддиро барои рамзгузории сатр эҷод мекунем. Биёед ба асосҳо баргардем ва ду алгоритми оддии рамзгузорӣ - Сесар ва Верманро амалӣ кунем.

  • Шифри қайсар ин алгоритме мебошад, ки бори аввал Юлий Сисз истифода мебарад. Он ҳар як ҳарфи матнро ҷойҳои муқарраршударо иваз мекунад. Масалан, агар шумо хоҳед, ки калимаи голангро бо тугмаи 4 рамз кунед, шумо ktpek мегиред. Рамзкушоӣ низ ҳамин тавр амал мекунад. Ба шумо танҳо ҳарфҳоро ба самти муқобил интиқол додан лозим аст.
  • Шифри Верман ба рамзи Ceaser шабоҳат дорад, ки ба ҳамон як идеяи тағирёбанда асос ёфтааст. Тафовут дар он аст, ки шумо ҳар як ҳарфро шумораи мавқеъҳоро гуногун мекӯчонед. Барои рамзкушоӣ кардани матн ба шумо калид бо мавқеъҳое, ки дар он матн рамзгузорӣ шудааст, лозим аст. Масалан, агар шумо хоҳед, ки калимаи голангро бо калиди [-1, 4, 7, 20, 4, -2] рамзгузорӣ кунед, шумо оянда хоҳед ёфт.

Татбиқи пурраи ин мисолро дар инҷо пайдо кардан мумкин аст.

Татбиқи плагин

Фасли зерин татбиқи ду алгоритми дар боло зикршударо дар бар мегирад. Барои ҳарду, мо ду усули рамзгузорӣ ва рамзкушоӣ кардани матни худро амалӣ мекунем:

Тавре ки шумо мебинед, мо дар ин ҷо 3 рамзи гуногунро содир кардем (Голанг танҳо ин нишондодҳоро содир мекунад, ки бо ҳарфи боло оғоз мешаванд):

  • EncryptCeasar - func (int, string) Сатр, ки матнро бо алгоритми Сеасар рамзгузорӣ мекунад.
  • DecryptCeaser - func (int, string) Сатре, ки матнро бо истифодаи алгоритми Caeser декод мекунад,
  • VermanCipher - тағирёбандаи навъи vermanCipher, ки 2 усулро амалӣ мекунад: Рамзгузорӣ: string (func) string ва Decrypt: func () (* string, error)

Барои тартиб додани ин плагин ба шумо фармони зеринро иҷро кардан лозим аст:

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

Дар айни замон ҳеҷ чизи махсусе вуҷуд надорад - танҳо якчанд функсияҳои оддӣ сохта шудаанд ва модул бо илова кардани далели -buildmode = plugin ҳамчун плагин тартиб дода шудааст.

Васлкунакро бор кунед ва санҷед

Вақтхушӣ вақте оғоз меёбад, ки мо мехоҳем плагини тартибдодашударо дар барномаи худ истифода барем. Биёед як мисоли оддӣ эҷод кунем:

Аввал ба шумо лозим аст, ки бастаи плагини Golang -ро ворид кунед. Он танҳо ду вазифаро дар бар мегирад - якум бор кардани китобхонаи муштарак ва дуюм пайдо кардани рамзи содиротӣ. Барои бор кардани китобхонаи худ, шумо бояд функсияи Open -ро истифода баред, ки барои он бояд роҳ ба плагини муштараки шумо ва тағирёбандаи бозгашти навъи плагини намуд муайян карда шавад. Агар китобхона бор карда нашавад (масалан, роҳи хато ё файли вайроншуда), ин функсия хатогие, ки бояд ҳал карда шавад, бармегардонад.

Қадами оянда бор кардани ҳар як рамзи содиротӣ бо истифодаи усули ҷустуҷӯ мебошад. Камбудии хурд он аст, ки шумо бояд ҳар як функсияи содиршударо алоҳида бор кунед. Аммо, шумо метавонед якчанд функсияҳоро бо ҳамон тарзе, ки барои рамзи VermanCipher иҷро кардаед, муттаҳид кунед. Пас аз бор кардани ҳамаи рамзҳое, ки шумо мехоҳед истифода баред, шумо бояд онҳоро ба намуди дуруст табдил диҳед. Голанг забони статикӣ аст, бинобар ин роҳи дигари истифодаи ин рамзҳо бе кастинг вуҷуд надорад. Дар хотир доред, ки агар шумо як тағирёбандаро содир карда истодаед, ки баъзе усулҳоро иҷро мекунад, ба шумо лозим аст, ки онро ба намуди дурусти интерфейс гузаронед (ман бояд интерфейси encryptionEngine -ро муайян кунам). \ Newline \ хати нав

Барои тартиб додан ва кор фармудани барнома фармони зеринро истифода баред:

биравед app.go ./app созед

Дар натиҷа, шумо бояд матни рамзгузорӣ ва рамзкушоиро ҳамчун далели дуруст кор кардани алгоритм бинед.

Плагинро дар AWS Lambda истифода баред

Барои истифодаи плагини мо дар AWS Lambda, мо бояд дар барномаи худ баъзе тағиротҳо ворид кунем:

  • AWS Lambda қабатҳои каталоги / opt дар контейнери Lambda ҷойгир мекунад, бинобар ин мо бояд плагини худро аз ин директория бор кунем.
  • Мо бояд функсияи коркардкунандаро созем, ки онро муҳаррики Lambda барои коркарди рӯйдоди санҷишии мо истифода хоҳад бурд.

Дар порчаи зерин замимаи мо мавҷуд аст, ки барои истифода аз ҷониби Lambda мутобиқ карда шудааст:

Тавре ки шумо мебинед, татбиқ ба татбиқи қаблӣ шабеҳ аст. Мо танҳо директорияро тағир додем, ки аз он плагини худро бор кардем ва ба ҷои чоп кардани арзишҳо, посухи функсияро илова кардем. Барои маълумоти иловагӣ дар бораи навиштани лямбдаҳо дар Голанг, ба ҳуҷҷатҳои AWS нигаред.

AWS ҷойгиркунии Lambda

Ду роҳи ҷойгиркунии функсияҳо ва қабатҳои AWS Lambda мавҷуданд. Шумо метавонед бастаи фишурдаро дастӣ созед ва бор кунед ё чаҳорчӯбаи пешрафтаро истифода баред, ки онро хеле осонтар ва зудтар мекунад. Барои аксари лоиҳаҳои худ ман чаҳорчӯбаи бе серверро истифода мебарам. Аз ин рӯ, ман аллакай файли конфигуратсияи оддии serverless.yml -ро бо ин асбоб омода кардам:

Хизмат: cipherService frameworkVersion: "> = 1.28.0 <2.0.0" Таъминкунанда: Ном: aws Runtime: go1.x
Қабатҳо: cipherLayer: Path: bin / plugin вақти мувофиқ: - go1.x
Вазифаҳо: Engine: Handler: bin / cipherEngine Package: Истисно: - ./** Дохил кунед: - ./bin/cipherEngine Layers: - {Истинод: CipherLayerLambdaLayer}

Дар минтақаи қабат, мо як қабати ягонаеро бо роҳи плагин муайян кардем, ки аллакай сохта шудааст - ин бо функсияи Lambda таъмин карда шудааст. Шумо метавонед то 5 сатҳи гуногунро муайян кунед, ки тартиби онҳо воқеан муҳим аст. Онҳо дар як каталоги / opt насб карда шудаанд, аз ин рӯ қабатҳои дорои шумораи бештар метавонанд файлҳоро аз қабатҳои қаблан насбшуда бардоранд. Барои ҳар як сатҳ шумо бояд ҳадди аққал 2 параметрро нишон диҳед: роҳ ба директория бо манбаи сатҳ (дар ҳолати шумо ба файли дутарафаи васлшаванда) ва рӯйхати вақти мувофиқ.

Фасли навбатии функсия ҷоест, ки шумо рӯйхати функсияҳои иҷрошавандаро муайян мекунед. Барои ҳар як функсия шумо бояд ҳадди аққал роҳи барномаҳои тартибдодашударо муайян кунед. Ғайр аз он, мо бояд параметрҳои қабатро бо истинод ба қабати дар боло муайяншуда муайян кунем. Ин ба таври худкор қабатро ба функсияи Lambda мо ҳангоми ҷойгиркунӣ илова мекунад. Аҷибаш он аст, ки агар шумо хоҳед, ки ба ин манбаъ муроҷиат кунед, шумо бояд номи қабати Lambda-и худро ба TitleCased табдил диҳед ва пасванди LambdaLayer илова кунед. Чунин ба назар мерасад, ки дастаи бе сервер онро барои ҳалли ихтилоф дар бораи намудҳои гуногуни захираҳо амалӣ кардааст.

Ҳамин ки файли конфигуратсияи serverless.yml омода шуд, охирин чизе, ки шумо бояд тартиб диҳед, васл кунед ва ҷойгир кунед. Барои ин, мо метавонем Makefile оддиро истифода барем:

.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 deploy --verbose

Шумо метавонед функсияи худро бо иҷро кардани фармони зерин сохта ва ҷойгир кунед:

таъмин менамояд

AWS Lambda -ро санҷед

Тавре ки қаблан гуфта шуд, AWS Lambda Code дар вокуниш ба ин ҳодиса кор мекунад. Бо вуҷуди ин, мо ягон триггери рӯйдодро танзим накардаем, бинобар ин онҳоро бе кӯмаки мо даъват кардан мумкин нест. Мо бояд онро бо Framework Serverless ё воситаи awscli дастӣ иҷро кунем:

sls -f функсия-номи aws лямбда invoke - номи функсия-функсия-номи баромади файл

Дар ҷавоб шумо бояд ҳамон натиҷаи пештараро бинед, ки ин дуруст кор кардани функсияи лямбдаи моро нишон медиҳад ва плагин аз қабати иловагӣ бор мекунад. Акнун шумо метавонед функсияҳои дигаре эҷод кунед, ки ҳамон як қабатро истифода мебаранд ё ҳатто онро бо дигар ҳисобҳои AWS мубодила кунед.

Хулоса

Истифодаи модулҳои Golang ва санҷидани он, ки чӣ гуна онҳо бо қабатҳои тозаи AWS Lambda ҳамгироӣ карда мешуданд, хеле шавқовар буд. Китобхонаи плагин воқеан ҳам олӣ аст, аммо онро танҳо дар сенарияҳои муайян бо сабаби маҳдудиятҳо ва мушаххасоти Голанг истифода бурдан мумкин аст. Ман фикр мекунам, ки барои аксари таҳиягароне, ки дар лоиҳаҳои стандартӣ кор мекунанд, плагинҳо талаб карда намешаванд ё ҳатто имконпазиранд. Ман танҳо дар бораи ду сабаб фикр карда метавонам:

  • Татбиқи алгоритмҳои мураккабе, ки аз ҷониби дигар замимаҳо истифода мешаванд, масалан. Рамзгузории видео ё алгоритмҳои рамзгузорӣ.
  • Алгоритми худро бидуни интишори код ба дигарон мубодила кунед.