Voqealarga asoslangan arxitektura ishlatiladigan resurslarning iqtisodiy samaradorligini oshiradi, chunki ular faqat kerak bo'lganda foydalaniladi. Buni qanday amalga oshirish va ishchi ilovalar sifatida qo'shimcha bulut ob'ektlarini yaratmaslik bo'yicha ko'plab variantlar mavjud. Va bugun men FaaS haqida emas, balki webhooks haqida gapiraman. Ob'ektni saqlash veb-huklari yordamida hodisalarni boshqarishning o'quv namunasini ko'rsataman.
Ob'ektni saqlash va veb-huklar haqida bir necha so'z. Ob'ektlarni saqlash har qanday ma'lumotlarni bulutda S3 yoki HTTP/HTTPS orqali boshqa API (amalga oshirishga qarab) orqali kirish mumkin bo'lgan ob'ektlar ko'rinishida saqlash imkonini beradi. Webhuklar odatda maxsus HTTP qo'ng'iroqlaridir. Ular odatda kodning omborga ko'chirilishi yoki blogda e'lon qilingan sharh kabi voqea tomonidan qo'zg'atiladi. Voqea sodir bo'lganda, manba sayti veb-huk uchun belgilangan URL manziliga HTTP so'rovini yuboradi. Natijada siz bir saytdagi voqealarni boshqa saytdagi harakatlarni tetiklashi mumkin (Wiki). Agar manba sayt ob'ektni saqlash joyi bo'lsa, voqealar uning mazmuniga o'zgartirishlar sifatida harakat qiladi.
Bunday avtomatlashtirishdan foydalanish mumkin bo'lgan oddiy holatlarga misollar:
Boshqa bulutli xotirada barcha ob'ektlarning nusxalarini yaratish. Fayllar qo'shilgan yoki o'zgartirilganda nusxalar tezda yaratilishi kerak.
Grafik fayllarning bir qator eskizlarini avtomatik yaratish, fotosuratlarga moybo'yoqli belgilar qo'shish va boshqa tasvirni o'zgartirish.
Yangi hujjatlarning kelishi to'g'risida bildirishnoma (masalan, taqsimlangan buxgalteriya xizmati bulutga hisobotlarni yuklaydi va moliyaviy monitoring yangi hisobotlar haqida bildirishnomalarni oladi, ularni tekshiradi va tahlil qiladi).
Biroz murakkabroq holatlar, masalan, Kubernetes-ga so'rovni yaratishni o'z ichiga oladi, u zarur konteynerlar bilan podkastni yaratadi, unga vazifa parametrlarini uzatadi va ishlov berilgandan so'ng konteynerni yiqadi.
Misol tariqasida, biz Mail.ru Cloud Solutions (MCS) ob'ektlarini saqlash paqiridagi o'zgarishlar AWS ob'ektlarini saqlashda veb-huklar yordamida sinxronlashtirilganda, biz 1-topshiriqning variantini qilamiz. Haqiqiy yuklangan holatda, asinxron ish veb-huklarni navbatda ro'yxatdan o'tkazish orqali ta'minlanishi kerak, ammo o'quv topshirig'i uchun biz bu holda amalga oshiramiz.
Nashriyot xizmati, bu S3 saqlash tomonida joylashgan va webnhook ishga tushirilganda HTTP so'rovlarini nashr etadi.
Webhook qabul qiluvchi server, HTTP nashriyot xizmatidan so'rovlarni tinglaydi va tegishli harakatlarni bajaradi. Server istalgan tilda yozilishi mumkin, bizning misolimizda biz serverni Go-da yozamiz.
S3 API-da vebhuklarni amalga oshirishning o'ziga xos xususiyati veb-hukni qabul qiluvchi serverni nashriyot xizmatida ro'yxatdan o'tkazishdir. Xususan, vebhukni qabul qiluvchi server nashriyot xizmatidan xabarlarga obuna bo'lishni tasdiqlashi kerak (boshqa webhook ilovalarida odatda obunani tasdiqlash talab qilinmaydi).
Shunga ko'ra, webhook qabul qiluvchi server ikkita asosiy operatsiyani qo'llab-quvvatlashi kerak:
ro'yxatdan o'tishni tasdiqlash uchun nashriyot xizmatining so'roviga javob berish,
kiruvchi hodisalarni qayta ishlash.
Webhook qabul qiluvchi serverni o'rnatish
Webhook qabul qiluvchi serverni ishga tushirish uchun sizga Linux serveri kerak bo'ladi. Ushbu maqolada, misol sifatida, biz MCS-da o'rnatadigan virtual misoldan foydalanamiz.
Kerakli dasturiy ta'minotni o'rnatamiz va webhook qabul qiluvchi serverni ishga tushiramiz.
ubuntu@ubuntu-basic-1-2-10gb:~$ sudo apt-get install git
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
bc dns-root-data dnsmasq-base ebtables landscape-common liblxc-common
liblxc1 libuv1 lxcfs lxd lxd-client python3-attr python3-automat
python3-click python3-constantly python3-hyperlink
python3-incremental python3-pam python3-pyasn1-modules
python3-service-identity python3-twisted python3-twisted-bin
python3-zope.interface uidmap xdelta3
Use 'sudo apt autoremove' to remove them.
Suggested packages:
git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui
gitk gitweb git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
git
0 upgraded, 1 newly installed, 0 to remove and 46 not upgraded.
Need to get 3915 kB of archives.
After this operation, 32.3 MB of additional disk space will be used.
Get:1 http://MS1.clouds.archive.ubuntu.com/ubuntu bionic-updates/main
amd64 git amd64 1:2.17.1-1ubuntu0.7 [3915 kB]
Fetched 3915 kB in 1s (5639 kB/s)
Selecting previously unselected package git.
(Reading database ... 53932 files and directories currently installed.)
Preparing to unpack .../git_1%3a2.17.1-1ubuntu0.7_amd64.deb ...
Unpacking git (1:2.17.1-1ubuntu0.7) ...
Setting up git (1:2.17.1-1ubuntu0.7) ...
Jildni webhook qabul qiluvchi server bilan klonlash:
ubuntu@ubuntu-basic-1-2-10gb:~$ cd s3-webhook/
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80
Nashriyot xizmatiga obuna bo'ling
Webhook qabul qiluvchi serveringizni API yoki veb-interfeys orqali ro'yxatdan o'tkazishingiz mumkin. Oddiylik uchun biz veb-interfeys orqali ro'yxatdan o'tamiz:
Biz veb-huklarni sozlaydigan chelakka o'ting va tishli tugmani bosing:
Webhooks yorlig'iga o'ting va Qo'shish-ni bosing:
Maydonlarni to'ldiring:
ID - vebhuk nomi.
Voqea - qaysi voqealarni uzatish. Biz fayllar bilan ishlashda (qo'shish va o'chirish) sodir bo'ladigan barcha hodisalarni uzatishni o'rnatdik.
URL — vebhuk qabul qiluvchi server manzili.
Filtr prefiksi/suffiksi - bu faqat nomlari ma'lum qoidalarga mos keladigan ob'ektlar uchun veb-huklarni yaratishga imkon beruvchi filtr. Masalan, webhook faqat .png kengaytmali fayllarni ishga tushirishi uchun, in Filtr qo‘shimchasi siz "png" yozishingiz kerak.
Hozirda webhook qabul qiluvchi serverga kirish uchun faqat 80 va 443 portlar qo'llab-quvvatlanadi.
Keling, bosing Kanca qo'shing va biz quyidagilarni ko'ramiz:
Kanca qo'shildi.
Webhukni qabul qiluvchi server o'z jurnallarida kancani ro'yxatdan o'tkazish jarayonining borishini ko'rsatadi:
Ping() - URL/ping orqali javob beruvchi marshrut, tiriklik tekshiruvining eng oddiy amalga oshirilishi.
Webhook() - asosiy marshrut, URL/webhook ishlov beruvchisi:
nashriyot xizmatida ro'yxatdan o'tishni tasdiqlaydi (Obunani tasdiqlash funktsiyasiga o'ting),
kiruvchi webhuklarni qayta ishlaydi (Gorecords funktsiyasi).
HmacSha256 va HmacSha256hex funktsiyalari HMAC-SHA256 va HMAC-SHA256 shifrlash algoritmlarining amalga oshirilishi bo'lib, imzoni hisoblash uchun o'n oltilik raqamlar qatori sifatida chiqariladi.
main asosiy funksiya bo'lib, buyruq qatori parametrlarini qayta ishlaydi va URL ishlov beruvchilarini ro'yxatga oladi.
Server tomonidan qabul qilingan buyruq qatori parametrlari:
-port - bu server tinglaydigan port.
-adres - server tinglaydigan IP-manzil.
-skript - bu har bir kiruvchi kanca uchun chaqiriladigan tashqi dastur.
Keling, ba'zi funktsiyalarni batafsil ko'rib chiqaylik:
//Webhook
func Webhook(w http.ResponseWriter, req *http.Request) {
// Read body
body, err := ioutil.ReadAll(req.Body)
defer req.Body.Close()
if err != nil {
http.Error(w, err.Error(), 500)
return
}
// log request
log.Printf("[%s] incoming HTTP request from %sn", req.Method, req.RemoteAddr)
// check if we got subscription confirmation request
if strings.Contains(string(body),
""Type":"SubscriptionConfirmation"") {
SubscriptionConfirmation(w, req, body)
} else {
GotRecords(w, req, body)
}
}
Bu funksiya roʻyxatdan oʻtishni tasdiqlash soʻrovi yoki vebhuk kelganligini aniqlaydi. dan quyidagicha hujjatlar, agar ro'yxatdan o'tish tasdiqlansa, Post so'rovida quyidagi Json tuzilishi olinadi:
POST http://test.com HTTP/1.1
x-amz-sns-messages-type: SubscriptionConfirmation
content-type: application/json
{
"Timestamp":"2019-12-26T19:29:12+03:00",
"Type":"SubscriptionConfirmation",
"Message":"You have chosen to subscribe to the topic $topic. To confirm the subscription you need to response with calculated signature",
"TopicArn":"mcs2883541269|bucketA|s3:ObjectCreated:Put",
"SignatureVersion":1,
"Token":«RPE5UuG94rGgBH6kHXN9FUPugFxj1hs2aUQc99btJp3E49tA»
}
Shunga ko'ra, so'rovga qarab, ma'lumotlarni qanday qayta ishlash kerakligini tushunishingiz kerak. Ko'rsatkich sifatida kirishni tanladim "Type":"SubscriptionConfirmation", chunki u obunani tasdiqlash so'rovida mavjud va vebhukda mavjud emas. POST so'rovida ushbu yozuvning mavjudligi/yo'qligi asosida dasturning keyingi bajarilishi funksiyaga o'tadi. SubscriptionConfirmation, yoki funksiyaga kiriting GotRecords.
Biz obunani tasdiqlash funksiyasini batafsil ko'rib chiqmaymiz, u ushbu maqolada keltirilgan printsiplarga muvofiq amalga oshiriladi. hujjatlar. Ushbu funktsiyaning manba kodini quyidagi manzilda ko'rishingiz mumkin loyiha git omborlari.
GotRecords funktsiyasi kiruvchi so'rovni tahlil qiladi va har bir Record ob'ekti uchun tashqi skriptni (uning nomi -script parametrida o'tkazilgan) parametrlari bilan chaqiradi:
paqir nomi
ob'ekt kaliti
harakat:
nusxa ko'chirish - agar original so'rovda EventName = ObjectCreated | PutObject | PutObjectCopy
o'chirish - agar asl so'rovda EventName = ObjectRemoved | Ob'ektni o'chirish
Shunday qilib, ta'riflanganidek, Post so'rovi bilan ilgak kelsa oliy, va -script=script.sh parametri boʻlsa, skript quyidagicha chaqiriladi:
script.sh bucketA some-file-to-bucket copy
Shuni tushunish kerakki, ushbu veb-huk qabul qiluvchi server to'liq ishlab chiqarish yechimi emas, balki mumkin bo'lgan amalga oshirishning soddalashtirilgan namunasidir.
Ishga misol
Keling, fayllarni MCS-dagi asosiy paqirdan AWS-dagi zaxira paqirga sinxronlashtiramiz. Asosiy paqir myfiles-ash deb ataladi, zaxirasi myfiles-backup deb ataladi (AWS-dagi chelak konfiguratsiyasi ushbu maqola doirasidan tashqarida). Shunga ko'ra, fayl asosiy paqirga qo'yilganda, uning nusxasi zaxirada paydo bo'lishi kerak va u asosiydan o'chirilganda, u zaxirada o'chirilishi kerak.
Biz MCS bulutli xotirasi va AWS bulutli xotirasi bilan mos keladigan awscli yordam dasturidan foydalangan holda chelaklar bilan ishlaymiz.
ubuntu@ubuntu-basic-1-2-10gb:~$ sudo apt-get install awscli
Reading package lists... Done
Building dependency tree
Reading state information... Done
After this operation, 34.4 MB of additional disk space will be used.
Unpacking awscli (1.14.44-1ubuntu1) ...
Setting up awscli (1.14.44-1ubuntu1) ...
S3 MCS API ga kirishni sozlaymiz:
ubuntu@ubuntu-basic-1-2-10gb:~$ aws configure --profile mcs
AWS Access Key ID [None]: hdywEPtuuJTExxxxxxxxxxxxxx
AWS Secret Access Key [None]: hDz3SgxKwXoxxxxxxxxxxxxxxxxxx
Default region name [None]:
Default output format [None]:
AWS S3 API ga kirishni sozlaylik:
ubuntu@ubuntu-basic-1-2-10gb:~$ aws configure --profile aws
AWS Access Key ID [None]: AKIAJXXXXXXXXXXXX
AWS Secret Access Key [None]: dfuerphOLQwu0CreP5Z8l5fuXXXXXXXXXXXXXXXX
Default region name [None]:
Default output format [None]:
Keling, kirishlarni tekshiramiz:
AWS uchun:
ubuntu@ubuntu-basic-1-2-10gb:~$ aws s3 ls --profile aws
2020-07-06 08:44:11 myfiles-backup
MCS uchun buyruqni ishga tushirishda siz —endpoint-url-ni qo'shishingiz kerak:
Endi veb-interfeys orqali biz faylni myfiles-ash paqiridan o'chirib tashlaymiz.
Server jurnallari:
2020/07/06 09:44:46 [POST] incoming HTTP request from
95.163.216.92:58224
delete: s3://myfiles-backup/test.txt
Paqir tarkibi:
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls
myfiles-backup
ubuntu@ubuntu-basic-1-2-10gb:~$
Fayl o'chiriladi, muammo hal qilinadi.
Xulosa va topshiriq
Ushbu maqolada ishlatiladigan barcha kodlar mening omborimda. Shuningdek, veb-huklarni ro'yxatdan o'tkazish uchun skriptlar va imzolarni hisoblash misollari mavjud.
Ushbu kod o'z faoliyatingizda S3 veb-huklaridan qanday foydalanishingiz mumkinligi haqidagi misoldan boshqa narsa emas. Avval aytganimdek, agar siz ishlab chiqarishda bunday serverdan foydalanishni rejalashtirmoqchi bo'lsangiz, hech bo'lmaganda asinxron ish uchun serverni qayta yozishingiz kerak: kiruvchi veb-huklarni navbatda (RabbitMQ yoki NATS) ro'yxatdan o'tkazing va u yerdan ularni tahlil qiling va qayta ishlang. ishchi ilovalari bilan. Aks holda, veb-huklar ommaviy ravishda kelganda, vazifalarni bajarish uchun server resurslarining etishmasligiga duch kelishingiz mumkin. Navbatlarning mavjudligi server va ishchilarni taqsimlash imkonini beradi, shuningdek, ishlamay qolganda takroriy vazifalar bilan bog'liq muammolarni hal qiladi. Shuningdek, jurnalni batafsilroq va standartlashtirilganga o'zgartirish tavsiya etiladi.