Pluggable Golang тиркемесин кантип түзсө болот жана AWS Lambda Layersден пайда көрөт.

Голанг - эмне үчүн көңүл бурууга арзыйт?

Голанг - Google тарабынан иштелип чыккан жана ишке ашырылган ачык булактуу программалоо тили. Бул заманбап тиркемелерде, айрыкча булутта абдан кеңири колдонулат. Алар эң мүнөздүү белгилер:

  • Golang статикалык түрдө жазылган - ал ийкемдүүлүктү азыраак кылат, бирок каталардан сактайт,
  • Бул объект багытталган эмес. Бирок, сиз түзүмдөрдү жана интерфейстерди түзсөңүз болот, ошондо OOPтун 4 принцибинин үчөө иштелип чыгат: маалыматтарды абстракциялоо, инкапсуляция жана полиморфизм. Болгону мурас гана жетишпейт
  • Гороутиндер! - Мен буга чейин колдонуп келген жарык жипчелерин мыкты жүзөгө ашыруу. Go оператору менен сиз жаңы жипти оңой эле түзүп, ар кандай горутаиндер арасындагы каналдар аркылуу байланышка чыга аласыз.
  • Ал бардык көзкарандылыктары бар бирдиктүү бинардык файлга топтолгон - мындан ары пакеттеги чыр-чатактар ​​болбойт!

Жеке мен Голанг тилин күн сайын колдонгон эң улуу тил деп эсептейм. Бирок, бул макала сиздин биринчи функцияны түзүү же "Салам дүйнөсүн" басып чыгаруу жөнүндө эмес. Мен сизге бир аз өркүндөтүлгөн нерселерди көрсөтөм. Эгер сиз башталгыч жана Голанг жөнүндө көбүрөөк маалымат алгыңыз келсе, анда башкы бетке өтүңүз.

AWS Lambda & Golang

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

Ылдам алдыга, 4 жылдан кийин, 2018 кайрадан: AWS ойлоп тапкан Lambda Layers, ар кандай функциялар үчүн бөлүшүлгөн маалыматтарды бир же ал тургай бир нече AWS эсептеринде сактоого жана башкарууга мүмкүндүк берет! Мисалы, эгер сиз Python колдонуп жатсаңыз, анда бардык көз карандылыктарды кошумча катмарга киргизсеңиз болот, кийинчерээк башка лямбдалар колдоно алышат. Ар бир zip-пакетке ар кандай көзкарандылыктарды кошуунун кажети жок! Голанг дүйнөсүндө кырдаал башкача, анткени AWS Lambda түзүлгөн экилик файлдарды жүктөөнү талап кылат. AWS Lambda Layersден кандай пайда алабыз? Жообу жөнөкөй - Golang плагиндери менен модулдук тиркеме куруңуз!

Golang плагиндери - модулдук тиркеме куруунун жолу

Golang Plugins - бул Go1.8де чыгарылган, жалпы китепканаларды (.so файлдары) динамикалык түрдө жүктөөгө мүмкүнчүлүк берет. Сизде айрым коддорду өзүнчө китепканага экспорттоо же башка бирөө түзүп, түзгөн плагинди колдонуу мүмкүнчүлүгү бар. Бирок, кээ бир чектөөлөр бар экени кубандырат:

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

Биринчи плагинди түзүп, сынап көрүңүз

Эми биринчи плагинди түзөлү. Мисал катары биз сапты шифрлөө үчүн жөнөкөй модул түзөбүз. Келгиле, негиздерине кайтып, эки жөнөкөй шифрлөө алгоритмин ишке ашыралы - Чизар жана Верман.

  • Цезардык шифр - Юлий Сизз биринчи жолу колдонгон алгоритм. Ал тексттеги ар бир тамганы белгиленген орундардын санына жылдырат. Мисалы, голанг сөзүн 4-баскыч менен шифрлегиңиз келсе, ktpek аласыз. Шифрди чечүү ошол эле жол менен иштейт. Болгону тамгаларды тескери жакка жылдырсаңыз болот.
  • Verman шифри Ceaser шифрине окшош, ошол эле өзгөрүү идеясына негизделген. Айырмасы, сиз ар бир тамганы позициялардын ар кандай санына жылдырасыз. Текстти чечмелөө үчүн, тексттин шифрленген орду менен ачкыч керек. Мисалы, голанг сөзүн [-1, 4, 7, 20, 4, -2] баскычы менен шифрлөөнү кааласаңыз, анда сиз келечекке ээ болосуз.

Бул мисалды толугу менен ишке ашыруу бул жерден тапса болот.

Плагинди ишке ашыруу

Төмөнкү үзүндү жогоруда айтылган эки алгоритмдин аткарылышын камтыйт. Ар бири үчүн биз текстти шифрлөөнүн жана чечмелөөнүн эки жолун колдонобуз:

Көрүнүп тургандай, биз бул жерге 3 башка символду экспорттодук (Голанг жогорудагы тамга менен башталган ушул идентификаторлорду гана экспорттойт):

  • EncryptCeasar - func (int, string) Ceasar алгоритми менен текстти шифрлеген сап.
  • DecryptCeaser - Caeser алгоритмин колдонуп, тексттин кодун чечүүчү func (int, string) сап,
  • VermanCipher - vermanCipher түрүндөгү өзгөрмө, ал 2 ыкманы ишке ашырат: Encrypt: func (string) string and Decrypt: func () (* string, error)

Бул плагинди түзүү үчүн төмөнкү буйрукту аткаруу керек:

go build -buildmode = плагин -o плагин / cipher.so плагин / cipher.go

Азыр эч кандай өзгөчө эч нерсе жок - жөн гана бир нече жөнөкөй функциялар түзүлүп, -buildmode = плагин аргументин кошуп, плагин катары модуль түзүлдү.

Плагинди жүктөө жана текшерүү

Көңүл ачуу биздин колдонмодо түзүлгөн плагинди колдонууну каалаганда башталат. Жөнөкөй мисал түзөлү:

Алгач сиз Golang плагинин топтомун импорттошуңуз керек. Ал эки гана функцияны камтыйт - биринчиси - жалпы китепкананы жүктөө, экинчиси - экспорттолгон белгини табуу. Китепканаңызды жүктөө үчүн, Ачык функциясын колдонушуңуз керек, ал үчүн жалпы плагинге жол жана плагиндин кайтарым өзгөрмөсү көрсөтүлүшү керек. Эгерде китепкананы жүктөө мүмкүн болбосо (мисалы, туура эмес жол же бузулган файл), бул функция иштелип чыгышы керек болгон катаны кайтарып берет.

Кийинки кадам - ​​издөө ыкмасын колдонуу менен ар бир экспорттолгон символду жүктөө. Бир аз кемчилик - экспорттолгон ар бир функцияны өзүнчө жүктөө керек. Бирок, бир нече функцияны 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 Runtime: go1.x
Layers: cipherLayer: Path: bin / plugin шайкеш иштөө убактысы: - go1.x
Функциялары: Кыймылдаткыч: Иштеткич: bin / cipherEngine Пакети: Чыгуу: - ./** Кошуу: - ./bin/cipherEngine Катмарлары: - {Шилтеме: CipherLayerLambdaLayer}

Катмар чөйрөсүндө, биз буга чейин түзүлгөн плагинге жол менен бир катмарды аныктадык - бул Lambda функциясы менен бирге берилген. Сиз 5ке чейин ар кандай деңгээлдерди аныктай аласыз, алардын тартиби чындыгында маанилүү. Алар ошол эле / оптикалык каталогго орнотулган, андыктан көп сандагы катмарлар мурун орнотулган катмарлардагы файлдардын үстүнөн жаза алышат. Ар бир деңгээл үчүн сиз кеминде 2 параметрди көрсөтүшүңүз керек: деңгээл булагы бар каталогго жол (плагин экилик файлга жол) жана ылайыктуу иштөө убактысынын тизмеси.

Кийинки функциялар бөлүмү - бул аткарыла турган функциялардын тизмесин аныктаган жер. Ар бир функция үчүн, жок дегенде, түзүлгөн тиркемеге жолду көрсөтүү керек. Мындан тышкары, биз жогоруда аныкталган катмарга шилтеме берүү менен катмар параметрин аныкташыбыз керек. Бул автоматтык түрдө жайгаштыруу учурунда катмарды Lambda функциябызга кошот. Эң кызыгы, бул ресурска кайрылгыңыз келсе, Lambda катмарынын аталышын TitleCased'ке которуп, LambdaLayer суффиксин кошушуңуз керек. Серверсиз команда ресурстардын ар кандай түрлөрүнө байланыштуу чыр-чатакты чечүү үчүн ушундай жол менен ишке ашырган окшойт.

Serverless.yml конфигурация файлыбыз даяр болоор замат, биздин колдонмону компиляциялоо, кошуу жана жайгаштыруу керек. Бул үчүн жөнөкөй Makefile колдонсок болот:

.PHONY: BuildPlugin программасын таза орнотуу
build: 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
clean: rm -rf ./bin ./vendor Gopkg.lock
deploy: clean buildPlugin build sls deploy --verbose

Төмөнкү буйрукту иштетүү менен өз функцияларыңызды кура аласыз жана жайгаштыра аласыз:

камсыз кылуу

AWS Lambda колдонуп көрүңүз

Жогоруда айтылгандай, AWS Lambda Code окуяга жооп катары иштейт. Бирок, биз бир дагы иш-чара триггерлерин конфигурациялай элекпиз, ошондуктан алар биздин жардамыбызсыз чала албайт. Муну биз Serverless Framework же awscli куралынын жардамы менен кол менен жасашыбыз керек:

sls чалуу -f функциянын аты aws lambda invoke - функциянын аты функция аты-аталышы файл

Жоопто, биздин лямбда функциясыбыздын туура иштеп жаткандыгын жана плагиндин кошумча катмардан жүктөлгөндүгүн далилдеген мурунку көрсөткүчтү көрүшүңүз керек. Эми сиз ошол эле катмарды колдонгон башка функцияларды түзүп, ал тургай аны башка AWS эсептери менен бөлүшө аласыз.

Кыскача маалымат

Golang модулдарын колдонуу жана аларды жаңы чыккан AWS Lambda Layers менен кантип интеграциялоону текшерүү абдан кызыктуу болду. Плагиндер китепканасы чындыгында сонун, бирок аны чектелгендиктен жана Голанг спецификациясына байланыштуу айрым сценарийлерде гана колдонсо болот. Стандарттык долбоорлордун үстүндө иштеп жаткан көпчүлүк иштеп чыгуучулар үчүн плагиндер талап кылынбайт, ал тургай мүмкүн эмес деп ойлойм. Мен эки гана себеп жөнүндө ойлоно алам:

  • Башка тиркемелер колдоно турган татаал алгоритмдерди ишке ашыруу, мис. Видеону коддоо же шифрлөө алгоритмдери.
  • Алгоритмди кодду жарыя кылбастан башкалар менен бөлүшүү.