Planshetli Golang dasturini qanday yaratish va AWS Lambda Layers-dan qanday foyda olish mumkin.

Golang - nima uchun sizning e'tiboringizga loyiq?

Golang - bu Google tomonidan ishlab chiqilgan va amalga oshiriladigan ochiq manbali dasturlash tili. Zamonaviy dasturlarda, ayniqsa bulutda juda keng qo'llaniladi. Bu eng xarakterli xususiyatlar:

  • Golang statik tarzda yozilgan - u kamroq moslashuvchanlikni ta'minlaydi, ammo sizni xato qilishdan himoya qiladi,
  • Bu ob'ektga yo'naltirilgan emas. Shu bilan birga, siz tuzilmalar va interfeyslarni yaratishingiz mumkin va bu sizga OOP 4 tamoyilining 3tasini beradi: ma'lumotlarning mavhumligi, kapsülasyon va polimorfizm. Meros - etishmayotgan yagona narsa,
  • Goroutines! - men ilgari foydalangan engil iplarning eng katta ijrosi. Bu sizga go operatoridan foydalanib, juda oson tarzda yangi ipni yaratishga va kanallardan foydalangan holda turli xil gorutinlar o'rtasida aloqa o'rnatishga,
  • U barcha bog'liqliklarni hisobga olgan holda bitta ikkilikni tuzadi - boshqa paketlar ziddiyati yo'q!

Shaxsan men Golangni men kundalik foydalanadigan eng katta til deb bilaman. Biroq, ushbu maqola sizning birinchi vazifangizni yaratish yoki "Salom Dunyo" ni bosib chiqarish bilan bog'liq bo'lmaydi. Sizga biroz rivojlangan narsalarni ko'rsataman. Agar siz yangi boshlovchi bo'lsangiz va Golang haqida ko'proq bilmoqchi bo'lsangiz, uning asosiy sahifasiga tashrif buyuring.

AWS Lambda va Golang

AWS Lambda - Amazon Web Services tomonidan 2014 yil noyabr oyida chiqarilgan ommaviy bulutdagi eng mashhur serversiz hisoblash xizmatlaridan biri. Bu sizning kodingizni DynamoDB, SNS yoki HTTP triggerlari kabi hodisalarga javoban serverlarni ta'minlamasdan yoki boshqarmasdan ishlatishga imkon beradi! Bilasizmi, aslida nima buyuk? 2018 yil yanvar oyidan boshlab Golang ish vaqtini qo'llab-quvvatlaydi. AWS Lambda bilan ishlash juda oddiy - shunchaki kodlangan paketni va barcha bog'liqliklarni yuklang (Golang-dan foydalanishda bitta ikkilik).

Tezroq oldinga, 4 yildan so'ng, 2018 yilda yana: Invent AWS Lambda Layers-ni chiqaradi, bu sizga bitta yoki hatto bir nechta AWS hisoblarida turli xil funktsiyalar bo'yicha ulashilgan ma'lumotlarni saqlash va boshqarish imkonini beradi! Masalan, Python-dan foydalanganda barcha bog'liqliklarni keyinchalik boshqa Lambdalar tomonidan ishlatilishi mumkin bo'lgan qo'shimcha qatlamga qo'yish mumkin. Endi har bir yutilgan paketlarga har xil qaramlikni qo'yishning hojati yo'q! Golang dunyosida vaziyat boshqacha, chunki AWS Lambda sizdan kompilyatsiya qilingan ikkilikni yuklashni talab qiladi. AWS Lambda Layers-dan qanday foyda olishimiz mumkin? Javob oddiy - Golang plaginlari yordamida modulli dastur yarating!

Golang plaginlari - modulli dasturni yaratish usuli

Golang plaginlari - bu Go1.8-da chiqarilgan xususiyat bo'lib, u umumiy kutubxonalarni (.so fayllarini) dinamik ravishda yuklashga imkon beradi. Bu sizga ba'zi bir kodlaringizni alohida kutubxonaga eksport qilish yoki boshqa birov tomonidan tayyorlangan va tuzilgan plaginni ishlatish imkoniyatini beradi. Istiqbolli, ammo bir nechta cheklovlar mavjud:

  • Plagin bitta asosiy modul bo'lishi kerak,
  • Siz faqat ELF belgisi sifatida eksport qilinadigan funktsiyalar va o'zgaruvchilarni yuklashingiz mumkin,
  • Statik terish tufayli siz har bir yuklangan belgilarni to'g'ri turga tashlashingiz kerak. Eng yomon stsenariyda siz kodingizdagi to'g'ri interfeysni,
  • Bu faqat Linux va MacOS uchun ishlaydi. Shaxsan men buni kamchilik deb bilmayman :)

Birinchi plaginingizni yaratish va sinovdan o'tkazish

Endi bizning birinchi plaginimizni yarataylik. Misol sifatida biz simli shifrlash uchun oddiy modulni yaratamiz. Keling, asosiy narsalarga qaytaylik va ikkita oddiy shifrlash algoritmlarini - Ceasar va Vermanni amalga oshiraylik.

  • Tsezar shifri - bu birinchi marta Yuliy Kests tomonidan ishlatiladigan algoritm. U matndagi har bir xatni belgilangan pozitsiyalar soniga qarab siljitadi. Masalan, agar siz 4 ta kalit bilan golang so'zini shifrlamoqchi bo'lsangiz, siz ktpek olasiz. Shifrni ochish xuddi shu tarzda ishlaydi. Harflarni teskari yo'nalishda siljitish kerak.
  • Verman shifri xuddi shunday o'zgaruvchan g'oyaga asoslanib Ceaser-ga o'xshaydi, farq shundaki, siz har bir harfni har xil pozitsiyalar bo'yicha siljitasiz. Matnni shifrlash uchun siz matnni shifrlash uchun ishlatiladigan pozitsiyalarni o'z ichiga olgan kalitga ega bo'lishingiz kerak. Masalan, agar gangang so'zini [-1, 4, 7, 20, 4, -2] tugmachasi bilan shifrlamoqchi bo'lsangiz, kelajakka ega bo'lasiz.

Ushbu misolning to'liq bajarilishi bilan bu erda tanishishingiz mumkin.

Plaginni joriy qilish

Quyidagi parcha yuqorida keltirilgan ikkita algoritmning bajarilishini o'z ichiga oladi. Har biri uchun biz matnni shifrlash va shifrlashning 2 usulini amalga oshiramiz:

Ko'rib turganingizdek, biz bu erda 3 xil belgilarni eksport qildik (Golang faqat bosh harf bilan boshlanadigan ushbu identifikatorlarni eksport qiladi):

  • EncryptCeasar - Ceasar algoritmi yordamida matnni shifrlaydigan func (int, string) satri,
  • DecryptCeaser - Caeser algoritmi yordamida matnni shifrlaydigan funktsiya (int, satr) satri,
  • VermanCipher - 2 usulni amalga oshiruvchi vermanCipher turidagi o'zgaruvchi: Shifrlash: funktsiya (satr) satri va Decrypt: func () (* string, xato)

Ushbu plaginni kompilyatsiya qilish uchun quyidagi buyruqni bajarish kerak:

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

Hozircha hech qanday maxsus narsa yo'q - bir nechta oddiy funktsiyalar yaratilgan va modul plagin sifatida -buildmode = plagin argumentini qo'shish orqali tuzilgan.

Plaginni yuklang va tekshiring

O'yin bizning dasturimizda kompilyatsiya qilingan plaginlardan foydalanishni xohlaganimizda boshlanadi. Oddiy misol yarataylik:

Birinchidan, siz golang plagin paketini import qilishingiz kerak. U faqat ikkita funktsiyani o'z ichiga oladi - birinchisi umumiy kutubxonani yuklash uchun, ikkinchisi eksport qilingan belgini topish uchun. Kutubxonangizni yuklash uchun siz "O'rnatish" plaginiga yo'l ko'rsatishni talab qiladigan va Plugin turidagi o'zgaruvchini qaytaradigan Open funktsiyasidan foydalanishingiz kerak. Agar kutubxonani yuklash mumkin bo'lmasa (masalan, noto'g'ri yo'l yoki buzilgan fayl), bu funktsiya ishlov berilishi kerak bo'lgan xatoni qaytaradi.

Keyingi qadam, Lookup usuli yordamida har bir eksport qilingan belgilarni yuklash. Biroz noqulaylik shundaki, har bir eksport qilingan funktsiyani alohida yuklashingiz kerak. Biroq, bir nechta funktsiyalarni VermanCipher belgisi uchun bajarilganidek birlashtira olasiz. Siz ishlatmoqchi bo'lgan barcha ramzlarni yuklaganingizdan so'ng ularni to'g'ri turga tashlashingiz kerak. Golang statik yozilgan tildir, shuning uchun bu belgilarni tashlamasdan foydalanishning boshqa usuli yo'q. Esingizda bo'lsa, bir nechta usullarni amalga oshiradigan o'zgaruvchini eksport qilsangiz, uni to'g'ri interfeys turiga topshirishingiz kerak (men buni boshqarish uchun encryptionEngine interfeysini aniqlashim kerak edi). \ Newline \ newline

Ilovani kompilyatsiya qilish va ishga tushirish uchun quyidagi buyruqdan foydalaning:

App.go dasturiga o'ting
./app

Chiqishda siz shifrlangan va shifrlangan matnni algoritm to'g'ri ishlashining isboti sifatida ko'rishingiz kerak.

AWS lambda plaginidan foydalaning

AWS Lambda-dagi plaginimizdan foydalanish uchun biz dasturimizda bir nechta o'zgartirishlar kiritishimiz kerak:

  • AWS Lambda lambda konteyneridagi / opt katalogiga qatlamlarni o'rnatadi, biz plaginimizni ushbu katalogdan yuklashimiz kerak.
  • Sinov hodisamizni boshqarish uchun Lambda dvigatelidan foydalanadigan ishlov berish funktsiyasini yaratishimiz kerak.

Quyidagi parcha Lambda tomonidan foydalaniladigan bizning dasturimizni o'z ichiga oladi:

Ko'rib turganingizdek, amalga oshirish avvalgisiga juda o'xshash. Biz faqat plaginimizni yuklagan katalogni o'zgartirdik va qiymatlarni chop etish o'rniga funktsiya javobini qo'shdik. Agar Lambdasni gangangga yozish haqida ko'proq bilmoqchi bo'lsangiz, AWS hujjatlarini tekshiring.

AWS Lambda tarqatish

AWS Lambda funktsiyalari va qatlamlarini joylashtirishning ikkita usuli mavjud. Zipper paketini qo'lda yaratishingiz yoki yuklashingiz yoki yanada rivojlangan ramkadan foydalanishingiz mumkin, bu esa uni ancha oson va tez bajaradi. Ko'pgina loyihalarim uchun men Serverless platformasidan foydalanaman, shuning uchun ushbu vositadan foydalanib oddiy serverless.yml konfiguratsiya faylini tayyorlab qo'ydim:

xizmat: shifrlash xizmati
frameVersion: "> = 1.28.0 <2.0.0"
provayder:
  nomi: aws
  ish vaqti: go1.x
qatlamlar:
  shifrlagich:
    yo'l: axlat / plagin
    Mos keladiganRuntimes:
      - go1.x
vazifalari:
  dvigatel:
    ishlov beruvchi: bin / cifherEngine
    paket:
      chiqarib tashlansin:
        - ./**
      o'z ichiga oladi:
        - ./bin/cipherEngine
    qatlamlar:
      - {Manba: CipherLayerLambdaLayer}

Qatlamlar qismida biz allaqachon yaratilgan plagin bilan bir qavatni aniqladik - u lambda funktsiyasi bilan birga joylashtiriladi. Siz 5 xil qatlamlarni belgilashingiz mumkin, ular uchun buyurtma haqiqatan ham muhimdir. Ular bir xil / opt katalogiga o'rnatiladi, shuning uchun ko'proq sonli qatlamlar ilgari o'rnatilgan qatlamlarning fayllarini bekor qilishi mumkin. Har bir sath uchun siz kamida 2 ta parametrni taqdim etishingiz kerak: qatlam manbasini o'z ichiga olgan katalogga yo'l (sizning holatingizda plagin ikkiligiga yo'l) va mos keladigan ish vaqti vaqti.

Keyingi funktsiyalar bo'limi - bu joylashtirilishi kerak bo'lgan funktsiyalar ro'yxatini aniqlaydigan joy. Har bir funktsiya uchun siz hech bo'lmaganda kompilyatsiya qilingan dasturga yo'l ko'rsatishingiz kerak. Bunga qo'shimcha ravishda, biz qatlamlar parametrini yuqorida ko'rsatilgan qatlamga havola bilan aniqlashimiz kerak. Bu avtomatik ravishda qatlamni joylashtirish vaqtida Lambda funktsiyamizga biriktiradi. Qiziq tomoni shundaki, siz lambda qatlami nomini TitleCased-ga o'zgartirib, ushbu manbaga murojaat qilmoqchi bo'lsangiz LambdaLayer qo'shimchasini qo'shishingiz kerak. Aftidan, Serverless jamoasi turli xil manbalarga murojaat qilib nizoni hal qilish uchun buni shunday amalga oshirgan ko'rinadi.

Bizning serverless.yml konfiguratsiya fayli tayyor bo'lgach, oxirgi narsa dasturimizni kompilyatsiya qilish, plagin o'rnatish va o'rnatishdir. Buning uchun oddiy Makefile-dan foydalanishimiz mumkin:

.PHONY: buildPlugin-ni toza tarqatish
qurmoq:
 dep ta'minlash -v
 env GOOS = linux go build -ldflags = "- s -w" -o bin / cifherEngine cipherEngine / main.go
buildPlugin:
 env GOOS = linux go build -ldflags = "- s -w" -buildmode = plagin -o bin / plugin / cipher.so ../plugin/cipher.go
tozalash:
 rm -rf ./bin ./vendor Gopkg.lock
tarqatish: toza buildPlugin build
 sls tarqatish --verbose

Siz quyidagi buyruq yordamida o'z funktsiyangizni qurishingiz va o'rnatishingiz mumkin:

joylashtirmoq

AWS Lambda-ni sinab ko'ring

Yuqorida aytib o'tganimdek, AWS Lambda tadbirga javob sifatida kodni bajaradi. Ammo biz biron-bir voqea tetikini sozlamaganmiz, shuning uchun uni bizning yordamisiz ishlatib bo'lmaydi. Biz buni Serverless platformasi yoki awscli vositasi yordamida qo'lda qilishimiz kerak:

sls invoke -f function_name
aws lambda invoke - funktsiya nomi-funktsiya_mahsulot_fayl

Javobda siz oldingidek bir xil natijani ko'rishingiz kerak, bu bizning lambda funktsiyasining to'g'ri ishlashini va plaginni qo'shimcha qatlamdan yuklashini isbotlaydi. Endi siz bitta qatlamni ishlatadigan yoki hatto boshqa AWS hisob qaydnomalari bilan bo'lishadigan boshqa funktsiyalarni yaratishingiz mumkin.

Xulosa

Golang modullaridan foydalanish va ularni yangi chiqarilgan AWS Lambda Layers bilan qanday birlashtirishni sinab ko'rish juda qiziqarli bo'ldi. Plagin kutubxonasi haqiqatan ham juda ajoyib, ammo cheklanganligi va Golang xususiyatlari tufayli uni faqat ba'zi maxsus stsenariylarda ishlatish mumkin. Oddiy loyihalar ustida ishlayotgan ko'pchilik dasturchilar uchun plaginlardan foydalanishning hojati yo'q, deb o'ylayman. Xayolimga faqat ikkita sabab keladi:

  • Boshqa ilovalar tomonidan ishlatilishi mumkin bo'lgan murakkab algoritmlarni amalga oshirish ex. video kodlash yoki shifrlash algoritmlari.
  • Kodni e'lon qilmasdan algoritmni boshqalar bilan bo'lishish.