Як стварыць падключаемы дадатак Golang і скарыстацца лямбда-слаямі AWS.

Голанг - чаму гэта варта вашай увагі?

Golang - гэта мова праграмавання з адкрытым зыходным кодам, распрацаваная і рэалізаваная Google. Ён вельмі шырока выкарыстоўваецца ў сучасных праграмах, асабліва ў воблаку. Яны з'яўляюцца найбольш характэрнымі рысамі:

  • Golang напісаны статычна - ён прапануе меншую гнуткасць, але абараняе вас ад памылак,
  • Гэта не аб'ектна. Аднак вы можаце ствараць структуры і інтэрфейсы, і гэта прыводзіць да 3 з 4 прынцыпаў ООП: абстракцыя дадзеных, інкапсуляцыя і палімарфізм. Не хапае толькі спадчыны
  • Гарутыны! - Лепшая рэалізацыя лёгкіх нітак, якія я калі-небудзь выкарыстоўваў. З дапамогай аператара go вы можаце лёгка стварыць новы паток і мець зносіны па розных каналах паміж каналамі.
  • Ён кампілюецца ў адзіны двайковы файл з усімі залежнасцямі - больш няма канфліктаў пакетаў!

Асабіста я лічу голанг найвялікшай мовай, якой карыстаюся кожны дзень. Аднак гэты артыкул не тычыцца стварэння вашай першай функцыі альбо друку "Hello World". Я пакажу вам крыху больш дасканалых матэрыялаў. Калі вы пачатковец і хочаце даведацца больш пра Голанг, наведайце галоўную старонку.

AWS Лямбда і Голанг

AWS Lambda - адна з самых папулярных бяссерверных вылічальных службаў у грамадскім воблаку, выпушчаная Amazon Web Services у лістападзе 2014 года. Вы можаце запускаць свой код у адказ на такія падзеі, як трыгеры DynamoDB, SNS або HTTP, без неабходнасці наладжваць серверы і кіраваць імі! Вы ведаеце, што сапраўды выдатна? Ён падтрымлівае тэрмін Голанг са студзеня 2018 года. Працаваць з AWS Lambda вельмі проста - проста загрузіце сціснуты пакет са сваім кодам і ўсімі залежнасцямі (адзін бінарны файл, калі вы выкарыстоўваеце Golang).

Пераход наперад, праз 4 гады, 2018 год: Invent AWS выпускае лямбда-слаі, якія дазваляюць захоўваць і кіраваць дадзенымі, якія абагульваюцца для розных функцый, у адным ці нават некалькіх уліковых запісах AWS! Напрыклад, калі вы выкарыстоўваеце Python, вы можаце змясціць усе залежнасці ў дадатковы пласт, які пазней можа выкарыстоўвацца іншымі лямбдамі. Больш неабавязкова змяшчаць розныя залежнасці ў кожны пакет-архіў! Інакш ідзе справа ў свеце Голанга, бо AWS Lambda патрабуе загрузкі скампанаваных двайковых файлаў. Як мы можам атрымаць выгаду з лямбда-слаёў AWS? Адказ просты - стварыце модульнае прыкладанне з убудовамі Golang!

Убудовы Golang - спосаб стварэння модульнага прыкладання

Убудовы Golang - гэта функцыя, выпушчаная ў Go1.8, якая дазваляе дынамічна загружаць агульныя бібліятэкі (файлы .so). У вас ёсць магчымасць экспартаваць частку кода ў асобную бібліятэку альбо выкарыстоўваць убудову, якую стварыў і скампіляваў нехта іншы. Аднак абнадзейвае тое, што ёсць некаторыя абмежаванні:

  • Убудова павінна быць адзіным асноўным модулем,
  • Вы можаце загружаць толькі функцыі і зменныя, якія экспартуюцца як сімвалы ELF.
  • З-за статычнага ўводу вам трэба пераўтварыць кожны загружаны сімвал у правільны тып. У горшым выпадку вам трэба вызначыць правільны інтэрфейс у вашым кодзе,
  • Ён працуе толькі на Linux і MacOS. Асабіста я не бачу ў гэтым недахопу :)

Стварыце і пратэстуйце свой першы убудова

Зараз давайце створым наш першы убудова. У якасці прыкладу мы створым просты модуль для шыфравання радкоў. Вернемся да асноў і рэалізуем два простыя алгарытмы шыфравання - Ceasar і Verman.

  • Шыфр Цэзара - алгарытм, упершыню выкарыстаны Юліем Стызамі. Ён зрушвае кожную літару ў тэксце зададзеную колькасць месцаў. Напрыклад, калі вы хочаце зашыфраваць слова golang ключом 4, вы атрымаеце ktpek. Расшыфроўка працуе гэтак жа. Трэба толькі перамясціць літары ў адваротным кірунку.
  • Шыфр Verman падобны на шыфр Ceaser, заснаваны на той самай ідэі змены. Розніца ў тым, што вы перамяшчаеце кожную літару рознай колькасцю пазіцый. Для таго, каб расшыфраваць тэкст, вам патрэбен ключ з пазіцыямі, дзе быў зашыфраваны тэкст. Напрыклад, калі вы хочаце зашыфраваць слова golang ключом [-1, 4, 7, 20, 4, -2], вы атрымаеце будучыню.

Поўную рэалізацыю гэтага прыкладу можна знайсці тут.

Укараненне ўбудовы

Наступны фрагмент утрымлівае рэалізацыю двух згаданых алгарытмаў. Для кожнага з іх мы рэалізуем два спосабы шыфравання і дэшыфравання нашага тэксту:

Як бачыце, мы экспартавалі тут 3 розныя сімвалы (Голанг экспартуе толькі гэтыя ідэнтыфікатары, якія пачынаюцца з літары вышэй):

  • EncryptCeasar - func (int, string) Радок, які шыфруе тэкст з дапамогай алгарытму Ceasar.
  • DecryptCeaser - func (int, string) Радок, які дэкадуе тэкст з выкарыстаннем алгарытму Caeser,
  • VermanCipher - зменная тыпу vermanCipher, якая рэалізуе 2 метады: Шыфраванне: func (string) string і Decrypt: func () (* string, error)

Каб скампіляваць гэты убудова, трэба выканаць наступную каманду:

перайсці будаваць -buildmode = убудова -o убудова / cipher.so убудова / cipher.go

Зараз нічога асаблівага няма - было створана некалькі простых функцый, і модуль быў скампіляваны як убудова, дадаўшы аргумент -buildmode = plugin.

Загрузіце і праверце убудова

Самае цікавае пачынаецца, калі мы хочам скампанаваны убудова выкарыстоўваць у нашым дадатку. Давайце створым просты прыклад:

Спачатку трэба імпартаваць пакет убудоў Golang. Ён утрымлівае толькі дзве функцыі - першая - загрузка агульнай бібліятэкі, а другая - пошук экспартаванага сімвала. Каб загрузіць вашу бібліятэку, вам трэба выкарыстаць функцыю Open, для якой павінен быць указаны шлях да вашага агульнага ўбудовы і зменнай вяртання тыпу убудовы. Калі бібліятэка не можа быць загружана (напрыклад, няправільны шлях альбо пашкоджаны файл), гэтая функцыя вяртае памылку, з якой трэба апрацаваць.

Наступны крок - загрузка кожнага экспартаванага сімвала з выкарыстаннем метаду пошуку. Невялікі недахоп заключаецца ў тым, што вы павінны загружаць кожную экспартаваную функцыю асобна. Аднак вы можаце аб'яднаць некалькі функцый такім жа чынам, як і для сімвала VermanCipher. Пасля загрузкі ўсіх сімвалаў, якія вы хочаце выкарыстоўваць, вам трэба пераўтварыць іх у правільны тып. Golang - мова, якая набіраецца статычна, таму няма іншага спосабу выкарыстоўваць гэтыя сімвалы без ліцця. Памятаеце, калі вы экспартуеце зменную, якая рэалізуе некаторыя метады, вам трэба перакінуць яе на правільны тып інтэрфейсу (мне трэба было вызначыць інтэрфейс encryptionEngine, каб справіцца з гэтым). \ Newline \ newline

Выкарыстоўвайце наступную каманду для кампіляцыі і запуску прыкладання:

перайсці да зборкі app.go ./app

У выхадзе вы павінны ўбачыць зашыфраваны і расшыфраваны тэкст як сведчанне таго, што алгарытм працуе належным чынам.

Выкарыстоўвайце убудова ў AWS Lambda

Для таго, каб выкарыстоўваць наш убудова ў AWS Lambda, нам трэба ўнесці некаторыя змены ў наша дадатак:

  • AWS Lambda ўсталёўвае пласты ў каталог / opt у кантэйнеры Lambda, таму нам трэба загрузіць наш убудова з гэтага каталога.
  • Нам трэба стварыць функцыю апрацоўшчыка, якая будзе выкарыстоўвацца лямбда-рухавіком для апрацоўкі нашага тэставага мерапрыемства.

Наступны фрагмент змяшчае наша дадатак, якое было адаптавана для выкарыстання лямбдай:

Як бачыце, рэалізацыя вельмі падобная на папярэднюю. Мы проста змянілі каталог, з якога мы загрузілі наш убудова, і дадалі адказ функцыі замест таго, каб раздрукоўваць значэнні. Для атрымання дадатковай інфармацыі пра напісанне лямбд у Golang глядзіце дакументацыю AWS.

Разгортванне AWS Lambda

Ёсць два спосабы разгортвання функцый і слаёў AWS Lambda. Вы можаце стварыць і загрузіць сціснуты пакет уручную альбо выкарыстаць прасунуты фреймворк, які зробіць гэта нашмат прасцейшым і хутчэйшым. Для большасці сваіх праектаў я выкарыстоўваю безсерверную структуру. Таму я ўжо падрыхтаваў просты канфігурацыйны файл serverless.yml з дапамогай гэтага інструмента:

Служба: cipherService frameworkVersion: "> = 1.28.0 <2.0.0" Пастаўшчык: Імя: aws Час выканання: go1.x
Пласты: cipherLayer: Шлях: сумяшчальныя з bin / plugin час выканання: - go1.x
Функцыі: Рухавік: Апрацоўшчык: bin / cipherEngine Пакет: Выключыць: - ./** Уключыць: - ./bin/cipherEngine Пласты: - {Ref: CipherLayerLambdaLayer}

У вобласці слаёў мы вызначылі адзін пласт з ужо створаным шляхам да ўбудовы - гэта прадастаўляецца разам з функцыяй Лямбда. Вы можаце вызначыць да 5 розных узроўняў, парадак якіх сапраўды важны. Яны мантуюцца ў адным каталогу / opt, таму пласты з большай колькасцю могуць перазапісваць файлы з раней усталяваных слаёў. Для кожнага ўзроўню неабходна ўказаць мінімум 2 параметры: шлях да каталога з крыніцай узроўняў (у вашым выпадку шлях да двайковага файла ўбудовы) і спіс сумяшчальных праграм выканання.

Наступны раздзел функцый - гэта месца, дзе вы вызначаеце спіс функцый, якія будуць рэалізаваны. Для кожнай функцыі неабходна па меншай меры ўказаць шлях да скампіляванага прыкладання. Акрамя таго, нам трэба вызначыць параметр пласта са спасылкай на пласт, вызначаны вышэй. Гэта аўтаматычна дадасць пласт да нашай лямбда-функцыі падчас разгортвання. Самае смешнае, што калі вы хочаце спасылацца на гэты рэсурс, вам трэба пераўтварыць імя пласта лямбда ў TitleCased і дадаць суфікс LambdaLayer. Падобна на тое, што каманда без сервераў рэалізавала гэта такім чынам, каб вырашыць канфлікт адносна розных тыпаў рэсурсаў.

Як толькі наш файл канфігурацыі serverless.yml будзе гатовы, апошняе, што вам трэба зрабіць, гэта скампіляваць, падключыць і разгарнуць наша дадатак. Для гэтага мы можам выкарыстоўваць просты Makefile:

.PHONY: Стварыце BuildPlugin чыста разгортваць
зборка: dep secure -v env GOOS = Linux пераходзіць да зборкі -ldflags = "-s -w" -o bin / cipherEngine cipherEngine / main.go
buildPlugin: env GOOS = Linux go build -ldflags = "- s -w" -buildmode = Убудова -o bin / plugin / cipher.so ../plugin/cipher.go
чыста: rm -rf ./bin ./vendor Gopkg.lock
разгортванне: чысты buildPlugin build sls deploy --verbose

Вы можаце стварыць і разгарнуць сваю функцыю, выканаўшы наступную каманду:

забяспечыць

Паспрабуйце AWS Lambda

Як ужо згадвалася раней, у адказ на падзею дзейнічае лямбда-код AWS. Аднак мы не сканфігуравалі ніякіх трыгераў падзей, таму іх нельга выклікаць без нашай дапамогі. Мы павінны зрабіць гэта ўручную, выкарыстоўваючы Serverless Framework альбо інструмент awscli:

sls-выклікі -f імя-функцыі aws лямбда-выклік - імя-функцыі выхадны файл-імя

У адказе вы павінны ўбачыць той самы вывад, што і раней, што даказвае, што наша лямбда-функцыя працуе правільна і што убудова загружаецца з дадатковага пласта. Цяпер вы можаце ствараць іншыя функцыі, якія выкарыстоўваюць той жа пласт, альбо нават дзяліцца ім з іншымі ўліковымі запісамі AWS.

Рэзюмэ

Было вельмі весела выкарыстоўваць модулі Golang і праверыць, як іх можна інтэграваць з нядаўна выпушчанымі лямбда-слаямі AWS. Бібліятэка убудоў сапраўды выдатная, але яе можна выкарыстоўваць толькі ў пэўных сцэнарах з-за сваіх абмежаванняў і спецыфікацыі Golang. Я думаю, што для большасці распрацоўшчыкаў, якія працуюць над стандартнымі праектамі, убудовы не патрэбныя і нават не магчымыя. Я магу думаць толькі пра дзве прычыны:

  • Укараненне складаных алгарытмаў, якія могуць выкарыстоўвацца іншымі дадаткамі, напрыклад Алгарытмы кадавання відэа ці шыфравання.
  • Падзяліцеся сваім алгарытмам з іншымі, не публікуючы код.