ProHoster > Blogs > AdministrÄcija > PiemÄrs uz notikumu balstÄ«tai lietojumprogrammai, kuras pamatÄ ir tÄ«mekļa aizÄ·eres S3 objektu krÄtuvÄ Mail.ru Cloud Solutions
PiemÄrs uz notikumu balstÄ«tai lietojumprogrammai, kuras pamatÄ ir tÄ«mekļa aizÄ·eres S3 objektu krÄtuvÄ Mail.ru Cloud Solutions
Notikumu vadÄ«ta arhitektÅ«ra palielina izmantoto resursu izmaksu efektivitÄti, jo tie tiek izmantoti tikai tad, kad tie ir nepiecieÅ”ami. Ir daudz iespÄju, kÄ to ieviest un neveidot papildu mÄkoÅa entÄ«tijas kÄ darbinieku lietojumprogrammas. Un Å”odien es runÄÅ”u nevis par FaaS, bet par webhookiem. Es parÄdÄ«Å”u apmÄcÄ«bu piemÄru notikumu apstrÄdei, izmantojot objektu krÄtuves tÄ«mekļa aizÄ·eres.
Daži vÄrdi par objektu glabÄÅ”anu un tÄ«mekļa aizÄ·erÄm. Objektu krÄtuve ļauj saglabÄt jebkÄdus datus mÄkonÄ« objektu veidÄ, kuriem var piekļūt, izmantojot S3 vai citu API (atkarÄ«bÄ no ievieÅ”anas), izmantojot HTTP/HTTPS. TÄ«mekļa aizÄ·eres parasti ir pielÄgoti HTTP atzvani. Parasti tos aktivizÄ notikums, piemÄram, koda nosÅ«tÄ«Å”ana uz krÄtuvi vai komentÄrs, kas tiek publicÄts emuÄrÄ. Kad notiek notikums, sÄkotnÄjÄ vietne nosÅ«ta HTTP pieprasÄ«jumu uz tÄ«mekļa aizÄ·erei norÄdÄ«to URL. RezultÄtÄ varat likt notikumiem vienÄ vietnÄ aktivizÄt darbÄ«bas citÄ (Wiki). GadÄ«jumÄ, ja avota vietne ir objekta krÄtuve, notikumi darbojas kÄ izmaiÅas tÄs saturÄ.
VienkÄrÅ”u gadÄ«jumu piemÄri, kad var izmantot Å”Ädu automatizÄciju:
Visu objektu kopiju izveide citÄ mÄkoÅkrÄtuvÄ. Ikreiz, kad tiek pievienoti vai mainÄ«ti faili, ir jÄizveido kopijas.
AutomÄtiska grafisko failu sÄ«ktÄlu sÄrijas izveide, Å«denszÄ«mju pievienoÅ”ana fotogrÄfijÄm un citas attÄlu modifikÄcijas.
PaziÅojums par jaunu dokumentu ieraÅ”anos (piemÄram, izplatÄ«ts grÄmatvedÄ«bas pakalpojums augÅ”upielÄdÄ pÄrskatus mÄkonÄ«, un finanÅ”u monitorings saÅem paziÅojumus par jauniem pÄrskatiem, pÄrbauda un analizÄ tos).
Nedaudz sarežģītÄki gadÄ«jumi ietver, piemÄram, pieprasÄ«juma Ä£enerÄÅ”anu Kubernetes, kas izveido podiÅu ar nepiecieÅ”amajiem konteineriem, nodod tam uzdevuma parametrus un pÄc apstrÄdes sakļauj konteineru.
KÄ piemÄru mÄs izveidosim 1. uzdevuma variantu, kad izmaiÅas Mail.ru Cloud Solutions (MCS) objektu krÄtuves segmentÄ tiek sinhronizÄtas AWS objektu krÄtuvÄ, izmantojot tÄ«mekļa aizÄ·eres. ReÄlÄ ielÄdÄtÄ gadÄ«jumÄ asinhronais darbs bÅ«tu jÄnodroÅ”ina, reÄ£istrÄjot webhookus rindÄ, bet apmÄcÄ«bas uzdevumam izpildi veiksim bez tÄ.
IzdevniecÄ«bas pakalpojums, kas atrodas S3 krÄtuves pusÄ un publicÄ HTTP pieprasÄ«jumus, kad tiek aktivizÄta tÄ«mekļa aizÄ·ere.
Web aizÄ·eres saÅemÅ”anas serveris, kas noklausÄs HTTP publicÄÅ”anas servisa pieprasÄ«jumus un veic atbilstoÅ”as āādarbÄ«bas. Serveri var rakstÄ«t jebkurÄ valodÄ; mÅ«su piemÄrÄ mÄs rakstÄ«sim serveri Go.
ÄŖpaÅ”a tÄ«mekļa aizÄ·eru ievieÅ”anas iezÄ«me S3 API ir tÄ«mekļa aizÄ·eres saÅemÅ”anas servera reÄ£istrÄcija publicÄÅ”anas pakalpojumÄ. KonkrÄti, tÄ«mekļa aizÄ·eres saÅemÅ”anas serverim ir jÄapstiprina abonÄÅ”ana uz ziÅojumiem no publicÄÅ”anas pakalpojuma (citÄs tÄ«mekļa aizÄ·eres implementÄcijÄs abonÄÅ”anas apstiprinÄjums parasti nav nepiecieÅ”ams).
AttiecÄ«gi tÄ«mekļa aizÄ·eres saÅemÅ”anas serverim ir jÄatbalsta divas galvenÄs darbÄ«bas:
atbildÄt uz izdevÄjdarbÄ«bas dienesta pieprasÄ«jumu apstiprinÄt reÄ£istrÄciju,
Lai palaistu tÄ«mekļa aizÄ·eres saÅemÅ”anas serveri, ir nepiecieÅ”ams Linux serveris. Å ajÄ rakstÄ kÄ piemÄru mÄs izmantojam virtuÄlu gadÄ«jumu, ko izvietojam MCS.
InstalÄsim nepiecieÅ”amo programmatÅ«ru un palaidÄ«sim webhook saÅemÅ”anas serveri.
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) ...
KlonÄjiet mapi ar tÄ«mekļa aizÄ·eres saÅemÅ”anas serveri:
ubuntu@ubuntu-basic-1-2-10gb:~$ cd s3-webhook/
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80
AbonÄjiet izdevÄjdarbÄ«bas pakalpojumu
Varat reÄ£istrÄt savu tÄ«mekļa aizÄ·eres saÅemÅ”anas serveri, izmantojot API vai tÄ«mekļa saskarni. VienkÄrŔības labad mÄs reÄ£istrÄsimies, izmantojot tÄ«mekļa saskarni:
Dodieties uz spaini, kuram mÄs konfigurÄsim tÄ«mekļa aizÄ·eres, un noklikŔķiniet uz zobrata:
Dodieties uz cilni Webhooks un noklikŔķiniet uz Pievienot:
Aizpildiet laukus:
ID ā tÄ«mekļa aizÄ·eres nosaukums.
Notikums ā kÄdus notikumus pÄrraidÄ«t. MÄs esam iestatÄ«juÅ”i visu notikumu pÄrraidi, kas rodas, strÄdÄjot ar failiem (pievienojot un dzÄÅ”ot).
Filtra prefikss/sufikss ir filtrs, kas ļauj Ä£enerÄt tÄ«mekļa aizÄ·eres tikai objektiem, kuru nosaukumi atbilst noteiktiem noteikumiem. PiemÄram, lai tÄ«mekļa aizÄ·ere aktivizÄtu tikai failus ar paplaÅ”inÄjumu .png, in Filtra sufikss jums jÄraksta "png".
PaÅ”laik, lai piekļūtu tÄ«mekļa aizÄ·eres saÅemÅ”anas serverim, tiek atbalstÄ«ti tikai porti 80 un 443.
NoklikŔķinÄsim Pievienojiet ÄÄ·i un mÄs redzÄsim sekojoÅ”o:
ÄÄ·is piebilda.
TÄ«mekļa aizÄ·eres saÅemÅ”anas serveris savos žurnÄlos parÄda ÄÄ·a reÄ£istrÄcijas procesa norisi:
Funkcijas HmacSha256 un HmacSha256hex ir HMAC-SHA256 un HMAC-SHA256 Å”ifrÄÅ”anas algoritmu realizÄcijas ar izvadi kÄ heksadecimÄlo skaitļu virkni paraksta aprÄÄ·inÄÅ”anai.
galvenais ir galvenÄ funkcija, apstrÄdÄ komandrindas parametrus un reÄ£istrÄ URL apstrÄdÄtÄjus.
Komandrindas parametri, ko pieÅem serveris:
-ports ir ports, kurÄ serveris klausÄs.
-adrese - IP adrese, kuru serveris klausÄs.
-script ir ÄrÄja programma, kas tiek izsaukta katram ienÄkoÅ”ajam ÄÄ·im.
SÄ«kÄk apskatÄ«sim dažas funkcijas:
//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)
}
}
Å Ä« funkcija nosaka, vai ir saÅemts pieprasÄ«jums apstiprinÄt reÄ£istrÄciju vai tÄ«mekļa aizÄ·ere. KÄ izriet no dokumentÄcija, ja reÄ£istrÄcija tiek apstiprinÄta, pasta pieprasÄ«jumÄ tiek saÅemta Å”Äda Json struktÅ«ra:
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Ā»
}
AttiecÄ«gi, atkarÄ«bÄ no pieprasÄ«juma, jums ir jÄsaprot, kÄ apstrÄdÄt datus. Ierakstu izvÄlÄjos kÄ rÄdÄ«tÄju "Type":"SubscriptionConfirmation", jo tas ir iekļauts abonementa apstiprinÄjuma pieprasÄ«jumÄ un nav pieejams tÄ«mekļa aizÄ·erÄ. Pamatojoties uz Ŕī ieraksta esamÄ«bu/neesamÄ«bu POST pieprasÄ«jumÄ, turpmÄkÄ programmas izpilde notiek vai nu uz funkciju SubscriptionConfirmation, vai funkcijÄ GotRecords.
MÄs detalizÄti neapskatÄ«sim abonementa apstiprinÄjuma funkciju, tÄ tiek Ä«stenota saskaÅÄ ar principiem, kas izklÄstÄ«ti punktÄ dokumentÄcija. Å Ä«s funkcijas avota kodu varat apskatÄ«t vietnÄ projektu git krÄtuves.
Funkcija GotRecords parsÄ ienÄkoÅ”o pieprasÄ«jumu un katram ieraksta objektam izsauc ÄrÄju skriptu (kura nosaukums tika nodots parametrÄ -script) ar parametriem:
dzÄst ā ja sÄkotnÄjÄ pieprasÄ«jumÄ EventName = ObjectRemoved | DeleteObject
TÄdÄjÄdi, ja ÄÄ·is pienÄk ar pasta pieprasÄ«jumu, kÄ aprakstÄ«ts iepriekÅ”, un parametru -script=script.sh, tad skripts tiks izsaukts Å”Ädi:
script.sh bucketA some-file-to-bucket copy
JÄsaprot, ka Å”is webhook uztverÅ”anas serveris nav pilnÄ«gs ražoÅ”anas risinÄjums, bet gan vienkÄrÅ”ots iespÄjamÄs ievieÅ”anas piemÄrs.
Darba piemÄrs
SinhronizÄsim failus no galvenÄ MCS kopas ar AWS rezerves kopu. GalvenÄ kopa tiek saukta par myfiles-ash, rezerves kopiju sauc par myfiles-backup (kopas konfigurÄcija AWS ir Ärpus Ŕī raksta darbÄ«bas jomas). AttiecÄ«gi, ievietojot failu galvenajÄ kausÄ, tÄ kopijai jÄparÄdÄs rezerves kopijÄ, un, dzÄÅ”ot no galvenÄ, tÄ ir jÄizdzÄÅ” rezerves kopijÄ.
MÄs strÄdÄsim ar spaiÅiem, izmantojot awscli utilÄ«tu, kas ir saderÄ«ga gan ar MCS mÄkoÅkrÄtuvi, gan AWS mÄkoÅkrÄtuvi.
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) ...
KonfigurÄsim piekļuvi 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]:
KonfigurÄsim piekļuvi 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]:
PÄrbaudÄ«sim pieejas:
Uz AWS:
ubuntu@ubuntu-basic-1-2-10gb:~$ aws s3 ls --profile aws
2020-07-06 08:44:11 myfiles-backup
ApskatÄ«sim, kÄ tas darbojas. Caur MCS tÄ«mekļa saskarne pievienojiet failu test.txt mapei myfiles-ash. Konsoles žurnÄli parÄda, ka tÄ«mekļa aizÄ·eres serverim tika veikts pieprasÄ«jums:
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
PÄrbaudÄ«sim AWS manufailu dublÄjuma kausa saturu:
Tagad, izmantojot tÄ«mekļa saskarni, mÄs izdzÄsÄ«sim failu no myfiles-ash kausa.
Servera žurnÄli:
2020/07/06 09:44:46 [POST] incoming HTTP request from
95.163.216.92:58224
delete: s3://myfiles-backup/test.txt
Kausa saturs:
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls
myfiles-backup
ubuntu@ubuntu-basic-1-2-10gb:~$
Fails tiek izdzÄsts, problÄma ir atrisinÄta.
SecinÄjums un uzdevumi
Viss Å”ajÄ rakstÄ izmantotais kods ir manÄ repozitorijÄ. Ir arÄ« skriptu piemÄri un parakstu skaitÄ«Å”anas piemÄri tÄ«mekļa aizÄ·eru reÄ£istrÄÅ”anai.
Å is kods ir nekas vairÄk kÄ piemÄrs tam, kÄ savÄs darbÄ«bÄs varat izmantot S3 tÄ«mekļa aizÄ·eres. KÄ jau teicu sÄkumÄ, ja plÄnojat izmantot Å”Ädu serveri ražoÅ”anÄ, jums ir vismaz jÄpÄrraksta serveris asinhronam darbam: jÄreÄ£istrÄ ienÄkoÅ”ie tÄ«mekļa aizÄ·eri rindÄ (RabbitMQ vai NATS), un no turienes tie parsÄti un apstrÄdÄti. ar darbinieku pieteikumiem. PretÄjÄ gadÄ«jumÄ, kad tÄ«mekļa aizÄ·eres nonÄk masveidÄ, var rasties servera resursu trÅ«kums uzdevumu veikÅ”anai. Rindu klÄtbÅ«tne ļauj izplatÄ«t serveri un darbiniekus, kÄ arÄ« atrisinÄt problÄmas ar uzdevumu atkÄrtoÅ”anu kļūmju gadÄ«jumÄ. Ieteicams arÄ« mainÄ«t reÄ£istrÄÅ”anu uz detalizÄtÄku un standartizÄtÄku.