ProHoster > Օրագիր > Վարչակազմը > Իրադարձությունների վրա հիմնված հավելվածի օրինակ, որը հիմնված է վեբկեռիկների վրա S3 օբյեկտների պահեստում Mail.ru Cloud Solutions-ում
Իրադարձությունների վրա հիմնված հավելվածի օրինակ, որը հիմնված է վեբկեռիկների վրա S3 օբյեկտների պահեստում Mail.ru Cloud Solutions-ում
Իրադարձությունների վրա հիմնված ճարտարապետությունը մեծացնում է օգտագործվող ռեսուրսների ծախսարդյունավետությունը, քանի որ դրանք օգտագործվում են միայն այն պահին, երբ դրանք անհրաժեշտ են: Կան բազմաթիվ տարբերակներ, թե ինչպես դա իրականացնել և չստեղծել լրացուցիչ ամպային սուբյեկտներ որպես աշխատող հավելվածներ: Իսկ այսօր ես կխոսեմ ոչ թե FaaS-ի, այլ webhook-ների մասին։ Ես ցույց կտամ իրադարձությունների կառավարման ուսուցողական օրինակ՝ օգտագործելով օբյեկտների պահպանման վեբկեռիկներ:
Մի քանի խոսք օբյեկտների պահպանման և վեբ-կեռիկների մասին: Օբյեկտների պահպանումը թույլ է տալիս ցանկացած տվյալներ պահել ամպի մեջ օբյեկտների տեսքով, որոնք հասանելի են S3-ի կամ այլ API-ի միջոցով (կախված իրականացումից) HTTP/HTTPS-ի միջոցով: Webhooks-ը, ընդհանուր առմամբ, սովորական HTTP զանգեր են: Դրանք սովորաբար հրահրվում են իրադարձության հետևանքով, օրինակ՝ կոդի մուտքագրումը պահեստ կամ մեկնաբանություն, որը տեղադրվում է բլոգում: Երբ իրադարձություն է տեղի ունենում, սկզբնաղբյուր կայքը HTTP հարցում է ուղարկում վեբ-կապիկի համար նշված URL-ին: Արդյունքում, դուք կարող եք իրադարձություններ կատարել մի կայքում, որոնք գործարկում են մյուսի վրա (Վիքիփեդիա, ազատ հանրագիտարան) Այն դեպքում, երբ սկզբնաղբյուր կայքը օբյեկտի պահեստ է, իրադարձությունները գործում են որպես դրա բովանդակության փոփոխություններ:
Պարզ դեպքերի օրինակներ, երբ նման ավտոմատացումը կարող է օգտագործվել.
Բոլոր օբյեկտների պատճենների ստեղծում մեկ այլ ամպային պահեստում: Պատճենները պետք է ստեղծվեն անմիջապես, երբ ֆայլերը ավելացվեն կամ փոխվեն:
Գրաֆիկական ֆայլերի մի շարք մանրապատկերների ավտոմատ ստեղծում, լուսանկարներին ջրանիշերի ավելացում և պատկերների այլ փոփոխություններ:
Ծանուցում նոր փաստաթղթերի ժամանման մասին (օրինակ՝ բաշխված հաշվապահական ծառայությունը հաշվետվություններ է վերբեռնում ամպի մեջ, իսկ ֆինանսական մոնիտորինգը ստանում է ծանուցումներ նոր հաշվետվությունների մասին, ստուգում և վերլուծում դրանք):
Մի փոքր ավելի բարդ դեպքերը ներառում են, օրինակ, հարցում առաջացնելը Kubernetes-ին, որը ստեղծում է պատիճ՝ անհրաժեշտ բեռնարկղերով, փոխանցում է առաջադրանքի պարամետրերը և մշակումից հետո փլուզում է կոնտեյները։
Որպես օրինակ, մենք կկատարենք առաջադրանքի 1 տարբերակ, երբ Mail.ru Cloud Solutions (MCS) օբյեկտների պահեստավորման դույլի փոփոխությունները համաժամեցվեն AWS օբյեկտների պահեստում՝ օգտագործելով վեբկեռիկներ: Իրական ծանրաբեռնված դեպքում ասինխրոն աշխատանք պետք է տրամադրվի՝ հերթում գրանցելով վեբ-կեռիկներ, բայց ուսուցման առաջադրանքի համար մենք իրականացումը կկատարենք առանց դրա:
Աշխատանքային սխեման
Փոխազդեցության արձանագրությունը մանրամասն նկարագրված է S3 վեբկեռիկների ուղեցույց MCS-ում. Աշխատանքային սխեման պարունակում է հետևյալ տարրերը.
Հրատարակչական ծառայություն, որը գտնվում է S3 պահեստավորման կողմում և հրապարակում է HTTP հարցումներ, երբ գործարկվում է webnhook-ը:
Webhook ստացող սերվեր, որը լսում է HTTP հրատարակչական ծառայության հարցումները և կատարում համապատասխան գործողություններ։ Սերվերը կարող է գրվել ցանկացած լեզվով, մեր օրինակում մենք սերվերը կգրենք Go-ում:
S3 API-ում վեբ-կեռիկների ներդրման առանձնահատուկ առանձնահատկությունը հրապարակման ծառայության վրա վեբ-կեռիկներ ստացող սերվերի գրանցումն է: Մասնավորապես, webhook ստացող սերվերը պետք է հաստատի հրատարակչական ծառայության հաղորդագրությունների բաժանորդագրությունը (webhook-ի այլ իրականացումներում բաժանորդագրության հաստատումը սովորաբար չի պահանջվում):
Համապատասխանաբար, webhook ստացող սերվերը պետք է աջակցի երկու հիմնական գործողություն.
պատասխանել հրատարակչական ծառայության խնդրանքին՝ գրանցումը հաստատելու համար,
մշակել մուտքային իրադարձությունները.
Webhook ստացող սերվերի տեղադրում
Webhook ստացող սերվերը գործարկելու համար ձեզ անհրաժեշտ է Linux սերվեր: Այս հոդվածում, որպես օրինակ, մենք օգտագործում ենք վիրտուալ օրինակ, որը մենք տեղադրում ենք MCS-ում:
Եկեք տեղադրենք անհրաժեշտ ծրագրաշարը և գործարկենք webhook ընդունիչ սերվերը:
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) ...
Գնացեք այն դույլը, որի համար մենք կկարգավորենք վեբ-կեռիկներ և կտտացրեք հանդերձում.
Գնացեք Webhooks ներդիր և կտտացրեք Ավելացնել.
Լրացրեք դաշտերը.
ID - վեբ-կապիկի անվանումը:
Իրադարձություն - որ իրադարձությունները փոխանցել: Մենք սահմանել ենք բոլոր իրադարձությունների փոխանցումը, որոնք տեղի են ունենում ֆայլերի հետ աշխատելիս (ավելացնելով և ջնջելով):
URL - վեբ-կեռիկի ստացող սերվերի հասցե:
Ֆիլտրի նախածանցը / վերջածանցը ֆիլտր է, որը թույլ է տալիս ստեղծել վեբ-կեռիկներ միայն այն օբյեկտների համար, որոնց անունները համապատասխանում են որոշակի կանոններին: Օրինակ, որպեսզի webhook-ը գործարկի միայն .png ընդլայնմամբ ֆայլերը, in Զտիչի վերջածանց պետք է գրել «png»:
Ներկայումս միայն 80-րդ և 443-րդ նավահանգիստներն են աջակցվում վեբ-կեռիկներ ստացող սերվեր մուտք գործելու համար:
Եկեք սեղմենք Ավելացնել կարթ և մենք կտեսնենք հետևյալը.
Հուկը ավելացրեց.
Webhook ստացող սերվերն իր տեղեկամատյաններում ցույց է տալիս կեռիկի գրանցման գործընթացի առաջընթացը.
Ping() - երթուղի, որն արձագանքում է URL/ping-ի միջոցով, կենդանի զոնդի ամենապարզ իրականացումը:
Webhook() - հիմնական երթուղի, URL/webhook handler:
հաստատում է գրանցումը հրատարակչական ծառայության վրա (անցեք SubscriptionConfirmation ֆունկցիային),
մշակում է մուտքային վեբ-կեռիկներ (Gorecords ֆունկցիա):
HmacSha256 և HmacSha256hex գործառույթները HMAC-SHA256 և HMAC-SHA256 գաղտնագրման ալգորիթմների իրականացումն են, որոնք թողարկվում են որպես տասնվեցական թվերի շարան՝ ստորագրությունը հաշվարկելու համար:
main-ը հիմնական գործառույթն է, մշակում է հրամանի տողի պարամետրերը և գրանցում URL մշակողներին:
Սերվերի կողմից ընդունված հրամանի տողի պարամետրերը.
-պորտը այն նավահանգիստն է, որի վրա սերվերը կլսի:
-address - IP հասցե, որը սերվերը կլսի:
-script-ը արտաքին ծրագիր է, որը կանչվում է յուրաքանչյուր մուտքային կեռիկի համար:
Եկեք ավելի սերտ նայենք որոշ գործառույթներին.
//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)
}
}
Այս ֆունկցիան որոշում է, թե արդյոք գրանցումը հաստատելու հայտ է եկել, թե վեբ-կապիկ: Ինչպես հետևում է փաստաթղթավորում, եթե գրանցումը հաստատված է, հետևյալ Json կառուցվածքը ստացվում է Post հարցումում.
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»
}
Համապատասխանաբար, կախված խնդրանքից, դուք պետք է հասկանաք, թե ինչպես մշակել տվյալները: Որպես ցուցիչ ընտրել եմ մուտքը "Type":"SubscriptionConfirmation", քանի որ այն առկա է բաժանորդագրության հաստատման հարցում և առկա չէ վեբ-կապում: Ելնելով POST հարցման մեջ այս մուտքի առկայությունից/բացակայությունից, ծրագրի հետագա կատարումը գնում է կամ գործառույթին SubscriptionConfirmation, կամ ֆունկցիայի մեջ GotRecords.
Մենք մանրամասնորեն չենք դիտարկի SubscriptionConfirmation ֆունկցիան, այն իրականացվում է համաձայն շարադրված սկզբունքների. փաստաթղթավորում. Դուք կարող եք դիտել այս ֆունկցիայի սկզբնական կոդը այստեղ նախագծի git պահոցներ.
GotRecords ֆունկցիան վերլուծում է մուտքային հարցումը և յուրաքանչյուր Record օբյեկտի համար կանչում է արտաքին սկրիպտ (որի անունը փոխանցվել է -script պարամետրում) հետևյալ պարամետրերով.
դույլի անվանումը
օբյեկտի բանալին
գործողություն:
պատճեն - եթե սկզբնական հարցումում EventName = ObjectCreated | PutObject | PutObjectCopy
ջնջել - եթե սկզբնական հարցումում EventName = ObjectRemoved | Ջնջել օբյեկտը
Այսպիսով, եթե կեռիկը գալիս է Post հարցումով, ինչպես նկարագրված է վեր, և -script=script.sh պարամետրը, ապա սկրիպտը կկանչվի հետևյալ կերպ.
script.sh bucketA some-file-to-bucket copy
Պետք է հասկանալ, որ այս webhook ընդունող սերվերը ոչ թե ամբողջական արտադրական լուծում է, այլ հնարավոր իրականացման պարզեցված օրինակ:
Աշխատանքի օրինակ
Եկեք համաժամացնենք ֆայլերը MCS-ի հիմնական դույլից մինչև AWS-ի պահեստային դույլը: Հիմնական դույլը կոչվում է myfiles-ash, պահուստայինը կոչվում է myfiles-backup (AWS-ում դույլի կոնֆիգուրացիան դուրս է այս հոդվածի շրջանակներից): Ըստ այդմ, երբ ֆայլը տեղադրվում է հիմնական դույլով, դրա պատճենը պետք է հայտնվի պահուստայինում, իսկ երբ ջնջվում է հիմնականից, այն պետք է ջնջվի պահեստայինում։
Մենք կաշխատենք դույլերի հետ՝ օգտագործելով awscli կոմունալ ծրագիրը, որը համատեղելի է ինչպես MCS ամպային պահեստավորման, այնպես էլ AWS ամպային պահեստավորման հետ:
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.
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.
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]:
Եկեք ստուգենք մուտքերը.
AWS-ին.
ubuntu@ubuntu-basic-1-2-10gb:~$ aws s3 ls --profile aws
2020-07-06 08:44:11 myfiles-backup
MCS-ի համար հրամանը գործարկելիս անհրաժեշտ է ավելացնել — endpoint-url:
Տեսնենք, թե ինչպես է այն աշխատում: միջոցով MCS վեբ ինտերֆեյս ավելացրեք test.txt ֆայլը myfiles-ash դույլին: Վահանակի տեղեկամատյանները ցույց են տալիս, որ հարցում է արվել webhook սերվերին.
2020/07/06 09:43:08 [POST] incoming HTTP request from
95.163.216.92:56612
download: s3://myfiles-ash/test.txt to ../../../tmp/myfiles-ash/test.txt
upload: ../../../tmp/myfiles-ash/test.txt to
s3://myfiles-backup/test.txt
Այժմ, վեբ ինտերֆեյսի միջոցով, մենք կջնջենք ֆայլը myfiles-ash դույլից:
Սերվերի տեղեկամատյաններ.
2020/07/06 09:44:46 [POST] incoming HTTP request from
95.163.216.92:58224
delete: s3://myfiles-backup/test.txt
Դույլի պարունակությունը.
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls
myfiles-backup
ubuntu@ubuntu-basic-1-2-10gb:~$
Ֆայլը ջնջված է, խնդիրը լուծված է։
Եզրակացություն և անելիքներ
Այս հոդվածում օգտագործված բոլոր ծածկագրերն են իմ պահոցում. Կան նաև սկրիպտների և վեբ-կեռիկներ գրանցելու համար ստորագրությունների հաշվման օրինակներ:
Այս կոդը ոչ այլ ինչ է, քան օրինակ, թե ինչպես կարող եք օգտագործել S3 վեբ-կեռիկներ ձեր գործունեության մեջ: Ինչպես սկզբում ասացի, եթե դուք նախատեսում եք օգտագործել նման սերվեր արտադրության մեջ, ապա պետք է գոնե վերաշարադրեք սերվերը ասինխրոն աշխատանքի համար. գրանցեք մուտքային վեբ-կեռիկներ հերթում (RabbitMQ կամ NATS) և այնտեղից վերլուծեք դրանք և մշակեք դրանք: աշխատողների դիմումներով: Հակառակ դեպքում, երբ վեբ-կեռիկները զանգվածաբար ժամանում են, դուք կարող եք հանդիպել սերվերի ռեսուրսների բացակայությանը՝ առաջադրանքները կատարելու համար: Հերթերի առկայությունը թույլ է տալիս բաշխել սերվերը և աշխատողները, ինչպես նաև խնդիրներ լուծել անհաջողությունների դեպքում կրկնվող առաջադրանքների հետ: Ցանկալի է նաև փոխել անտառահատումները ավելի մանրամասն և ստանդարտացվածի: