Толтырылатын Голанг қосымшасын қалай құруға болады және AWS Lambda қабаттарынан пайда табуға болады.

Голанг - бұл неге назар аударуға тұрарлық?

Голанг - бұл Google әзірлеген және жүзеге асырған бағдарламалық жасақтаманың ашық тілі. Ол заманауи қосымшаларда, әсіресе бұлтта өте кең қолданылады. Олар ең тән белгілер:

  • Голанг статикалық түрде жазылған - бұл икемділікті азырақ ұсынады, бірақ сізді қателіктерден қорғайды,
  • Бұл объектіге бағытталған емес. Дегенмен, сіз құрылымдар мен интерфейстерді жасай аласыз, нәтижесінде OOP принциптерінің 3-тен 3-і шығады: деректерді абстракциялау, инкапсуляция және полиморфизм. Тек мұра ғана жетіспейді
  • Гороутиндер! - Мен бұрын-соңды қолданған жарық талшықтарының ең жақсы орындалуы. Go операторымен сіз жаңа ағынды оңай құра аласыз және әртүрлі горутиндер арасындағы арналар арқылы байланыс жасай аласыз.
  • Ол барлық тәуелділіктермен біртұтас екілік файлға жинақталған - енді бума қайшылықтары болмайды!

Мен жеке өзім Голангты күнделікті қолданатын ең ұлы тіл деп санаймын. Алайда, бұл мақала сіздің алғашқы функцияны құру немесе «Сәлем әлемін» басып шығару туралы емес. Мен сізге сәл жетілдірілген материалдарды көрсетемін. Егер сіз жаңадан бастаушы болсаңыз және Голанг туралы көбірек білгіңіз келсе, басты бетке кіріңіз.

AWS Lambda & Golang

AWS Lambda - бұл Amazon Web Services 2014 жылдың қарашасында шығарған, жалпыға танымал бұлттағы ең танымал серверсіз есептеу қызметтерінің бірі. Сіз өз кодтарыңызды DynamoDB, SNS немесе HTTP триггерлері сияқты оқиғаларға жауап ретінде серверлерді орнатпай немесе басқармай-ақ басқара аласыз! Сіз шынымен ненің керемет екенін білесіз бе? Ол 2018 жылдың қаңтарынан бастап Голанг мерзімін қолдайды. AWS Lambda-мен жұмыс істеу өте оңай - сығылған буманы өзіңіздің кодыңызбен және барлық тәуелділіктермен жүктеңіз (егер сіз Golang қолдансаңыз, екілік екілік).

4 жылдан кейін жылдам алға жылжу, 2018 жыл: AWS-ті Lambda Layers шығарады, бұл әртүрлі функциялар үшін бір немесе бірнеше AWS есептік жазбаларында бөлісетін деректерді сақтауға және басқаруға мүмкіндік береді! Мысалы, егер сіз Python қолдансаңыз, сіз барлық тәуелділіктерді қосымша қабатқа енгізе аласыз, оны кейінірек басқа лямбдалар қолдана алады. Енді әр ықшамдалған пакетке әртүрлі тәуелділіктер қоюдың қажеті жоқ! Голанг әлемінде жағдай басқаша, өйткені AWS Lambda компиляцияланған екілік файлдарды жүктеуді қажет етеді. AWS Lambda қабаттарынан біз қандай пайда көре аламыз? Жауап қарапайым - модульдік қосымшаны Golang плагиндерімен жасаңыз!

Golang плагиндері - модульдік қосымшаны құру тәсілі

Golang Plugins - бұл Go1.8-де шығарылған, бұл сізге ортақ кітапханаларды (.so файлдары) динамикалық жүктеуге мүмкіндік береді. Сізде кодтың бір бөлігін бөлек кітапханаға экспорттауға немесе біреу жасаған және құрастырған плагинді пайдалануға болады. Алайда кейбір шектеулердің болуы көңілге қуаныш ұялатады:

  • Сіздің плагиніңіз бір негізгі модуль болуы керек,
  • Сіз тек ELF символы ретінде экспортталатын функциялар мен айнымалыларды жүктей аласыз.
  • Статикалық терудің арқасында әр жүктелген символды дұрыс түрге ауыстыру керек. Ең нашар сценарийде сіз өзіңіздің кодыңызда дұрыс интерфейсті анықтауыңыз керек,
  • Ол тек Linux және MacOS жүйелерінде жұмыс істейді. Жеке мен мұны кемшілік деп санамаймын :)

Бірінші плагинді жасаңыз және тексеріңіз

Енді алғашқы плагинді құрайық. Мысал ретінде жолдарды шифрлау үшін қарапайым модуль жасаймыз. Негізгіге оралып, екі қарапайым шифрлау алгоритмін - Сеасар мен Верманды іске асырайық.

  • Цезарь шифры - Юлий Циз бірінші қолданған алгоритм. Ол мәтіндегі әр әріпті белгіленген орынға ауыстырады. Мысалы, егер сіз голанг сөзін 4 пернесі арқылы шифрлағыңыз келсе, сіз ktpek аласыз. Шифрды шешу дәл осылай жұмыс істейді. Сізге тек әріптерді қарсы бағытта жылжыту керек.
  • Верман шифры сол ауыспалы идеяға негізделген Ceaser шифрына ұқсас. Айырмашылығы - сіз әр әріпті әр түрлі позициялар санымен жылжытасыз. Мәтіннің шифрын ашу үшін сізге мәтін шифрланған позициялары бар кілт қажет. Мысалы, егер сіз голанг сөзін [-1, 4, 7, 20, 4, -2] кілтімен шифрлағыңыз келсе, сіз болашақ аласыз.

Осы мысалды толығымен енгізу туралы мына жерден таба аласыз.

Плагинді енгізу

Келесі үзіндіде жоғарыда аталған екі алгоритмнің орындалуы бар. Әрқайсысы үшін біз мәтінді шифрлау мен шифрды ашудың екі әдісін қолданамыз:

Көріп отырғаныңыздай, біз мұнда 3 түрлі белгілерді экспорттадық (Голанг тек жоғарыдағы әріптен басталатын осы идентификаторларды экспорттайды):

  • EncryptCeasar - func (int, string) Ceasar алгоритмімен мәтінді шифрлайтын жол.
  • DecryptCeaser - Caeser алгоритмін пайдаланып мәтінді декодтайтын жол (func (int, string))
  • VermanCipher - 2 әдісті жүзеге асыратын vermanCipher типінің айнымалысы: Шифрлау: func (жол) жолы және Decrypt: func () (* жол, қате)

Бұл плагинді компиляциялау үшін келесі команданы орындау керек:

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

Қазіргі уақытта ерекше ештеңе жоқ - бірнеше қарапайым функциялар жасалды және -buildmode = плагин аргументін қосу арқылы модуль плагин ретінде жинақталды.

Плагинді жүктеңіз және тексеріңіз

Біз өз бағдарламамызда жинақталған плагинді қолданғымыз келсе, көңілділік басталады. Қарапайым мысал жасайық:

Алдымен сіз Golang плагин пакетін импорттауыңыз керек. Онда тек екі функция бар - біріншісі - ортақ кітапхананы жүктеу, ал екіншісі - экспортталған символды табу. Кітапхананы жүктеу үшін сіз Open плагинін пайдалануыңыз керек, ол үшін жалпы қосылатын модульге жол және плагин типінің қайтарылатын айнымалысы көрсетілуі керек. Егер кітапхананы жүктеу мүмкін болмаса (мысалы, қате жол немесе бүлінген файл), бұл функция өңделуі керек қатені қайтарады.

Келесі қадам - ​​іздеу әдісі арқылы әрбір экспортталған символды жүктеу. Кішкентай кемшілігі - сіз экспортталған әрбір функцияны бөлек жүктеуіңіз керек. Дегенмен, сіз бірнеше функцияларды VermanCipher белгісіндегі сияқты біріктіре аласыз. Сіз қолданғыңыз келетін барлық белгілерді жүктегеннен кейін оларды дұрыс түрге ауыстыруыңыз керек. Голанг - бұл статикалық түрде терілген тіл, сондықтан бұл белгілерді кастингсіз қолданудың басқа әдісі жоқ. Есіңізде болсын, егер сіз кейбір әдістерді жүзеге асыратын айнымалыны экспорттайтын болсаңыз, оны дұрыс интерфейс түріне ауыстыруыңыз керек (мен оны өңдеу үшін encryptionEngine интерфейсін анықтауым керек еді). \ Newline \ newline

Бағдарламаны құрастыру және іске қосу үшін келесі команданы пайдаланыңыз:

app.go ./app құрастыруға өтіңіз

Шығарылымда сіз шифрланған және шифрланған мәтінді алгоритмнің дұрыс жұмыс істейтіндігінің дәлелі ретінде қарауыңыз керек.

AWS Lambda плагинін қолданыңыз

Біздің плагинді AWS Lambda-да қолдану үшін қолданбамызға бірнеше өзгертулер енгізу қажет:

  • AWS Lambda Lambda контейнеріндегі / opt каталогына қабаттарды орнатады, сондықтан біз өз плагинімізді осы каталогтан жүктеуіміз керек.
  • Біз Lambda қозғалтқышы біздің сынақ оқиғамызды өңдеу үшін қолданылатын өңдеуші функцияны құруымыз керек.

Келесі үзіндіде Lambda пайдалануға бейімделген біздің қосымшамыз бар:

Көріп отырғаныңыздай, іске асыру алдыңғыға өте ұқсас. Біз тек өз плагинімізді жүктеген каталогты өзгерттік және мәндерді басып шығарудың орнына функция жауабын қостық. Голангта ламбда жазу туралы қосымша ақпаратты AWS құжаттамасынан қараңыз.

AWS Lambda орналастыру

AWS Lambda функциялары мен қабаттарын орналастырудың екі әдісі бар. Сіз қысылған буманы қолмен жасай аласыз және жүктей аласыз немесе кеңейтілген шеңберді қолдана аласыз, бұл оны жеңілдетеді және тездетеді. Менің жобаларымның көпшілігінде мен серверсіз кадрларды қолданамын. Сондықтан мен serverless.yml қарапайым конфигурация файлын осы құралмен дайындап қойдым:

Service: cipherService frameworkVersion: «> = 1.28.0 <2.0.0» Провайдер: Атауы: aws Орындалу уақыты: go1.x
Қабаттар: шифрLayer: Path: bin / plugin үйлесімді жұмыс уақыты: - go1.x
Функциялар: Қозғалтқыш: өңдеуші: қоқыс жәшігі / машинасы Бума: Шығару: - ./** Қосу: - ./bin/cipherEngine Қабаттары: - {Сілт: CipherLayerLambdaLayer}

Қабат аймағында біз бұрыннан жасалған қосылатын модульге жолмен бір қабатты анықтадық - бұл Lambda функциясымен бірге ұсынылған. Сіз әр түрлі деңгейлерге дейін 5-ті анықтай аласыз, олардың тәртібі өте маңызды. Олар бірдей / оптикалық каталогта орнатылған, сондықтан саны көп қабаттар бұрын орнатылған қабаттардың файлдарын қайта жаза алады. Әр деңгей үшін сіз кем дегенде 2 параметрді көрсетуіңіз керек: деңгей көзі бар каталогқа жол (қосылатын модуль екілік файлына жолыңыз) және үйлесімді жұмыс уақытының тізімі.

Келесі функциялар бөлімі - бұл орындалатын функциялар тізімін анықтайтын орын. Әрбір функция үшін сіз кем дегенде компиляцияланған қосымшаның жолын көрсетуіңіз керек. Сонымен қатар, біз қабат параметрін жоғарыда анықталған қабатқа сілтеме жасай отырып анықтауымыз керек. Бұл орналастыру кезінде қабатты Lambda функциясына автоматты түрде қосады. Бір қызығы, егер сіз осы ресурсқа сілтеме жасағыңыз келсе, Lambda қабат атауын TitleCased түріне ауыстырып, LambdaLayer жұрнағын қосуыңыз керек. Серверсіз команда оны ресурстардың әртүрлі түрлеріне қатысты қақтығысты шешу үшін қолданған сияқты.

Біздің serverless.yml конфигурация файлы дайын болғаннан кейін, сізге ең соңғы нәрсе - біздің бағдарламаны жинақтау, қосу және орналастыру. Ол үшін қарапайым макияжды қолдануға болады:

.PHONY: BuildPlugin бағдарламасын таза түрде орналастырыңыз
build: dep secure -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
deploy: clean buildPlugin build sls deploy --verbose

Сіз келесі команданы орындау арқылы өз функцияңызды құра аласыз және қолдана аласыз:

қамтамасыз ету

AWS Lambda-ны қолданып көріңіз

Бұрын айтылғандай, оқиғаға жауап ретінде AWS Lambda коды жұмыс істейді. Алайда, біз ешқандай оқиға триггерлерін конфигурацияламадық, сондықтан оларды біздің көмегімізсіз шақыруға болмайды. Серверсіз жақтауды немесе awscli құралын қолданып, оны қолмен жасауымыз керек:

sls -f функциясы-аты aws lambda шақыруы - функция-аты-функциясы-аты-шығыс файлы

Жауапта сіз бұрынғы нәтижені көруге тиіссіз, бұл біздің лямбда функциясының дұрыс жұмыс істейтіндігін және плагин қосымша қабаттан жүктелетінін дәлелдейді. Енді сіз бір қабатты қолданатын немесе басқа AWS есептік жазбаларымен бөлісетін басқа функцияларды жасай аласыз.

Қысқаша мазмұны

Голанг модульдерін пайдалану және оларды жаңадан шыққан AWS Lambda Layers-мен қалай біріктіруге болатындығын тексеру өте қызықты болды. Плагиндер кітапханасы өте жақсы, бірақ оны шектеулеріне және Голанг спецификациясына байланысты тек белгілі сценарийлерде қолдануға болады. Менің ойымша, стандартты жобалармен жұмыс жасайтын көптеген жасаушылар үшін плагиндер қажет емес, тіпті мүмкін емес. Мен тек екі себеп туралы ойлана аламын:

  • Басқа қосымшаларда қолдануға болатын күрделі алгоритмдерді енгізу, мысалы. Бейнені кодтау немесе шифрлау алгоритмдері.
  • Алгоритмді кодты жарияламай, басқалармен бөлісіңіз.