ProHoster > Blog > Administrazioa > S3 objektuen biltegiratze Mail.ru Cloud Solutions-en webhooketan oinarritutako gertaeretan oinarritutako aplikazio baten adibidea
S3 objektuen biltegiratze Mail.ru Cloud Solutions-en webhooketan oinarritutako gertaeretan oinarritutako aplikazio baten adibidea
Gertaeren araberako arkitekturak erabiltzen diren baliabideen kostu-eraginkortasuna areagotzen du, behar diren unean soilik erabiltzen direlako. Aukera asko daude hau ezartzeko eta ez sortzeko hodeiko entitaterik langile-aplikazio gisa. Eta gaur ez dut FaaS-i buruz hitz egingo, webhook-ei buruz baizik. Objektuen biltegiratze webhook-ak erabiliz gertaerak kudeatzeko tutorial adibide bat erakutsiko dut.
Objektuen biltegiratzeari eta webhookei buruzko hitz batzuk. Objektuen biltegiratzeak hodeian edozein datu gordetzeko aukera ematen du objektu moduan, S3 edo beste API baten bidez eskuragarri (inplementazioaren arabera) HTTP/HTTPS bidez. Webhook-ak, oro har, HTTP dei-itzulera pertsonalizatuak dira. Gertaera batek abiarazten ditu normalean, esate baterako, kodea biltegi batera bidaltzen den edo blog batean argitaratzen den iruzkin bat. Gertaera bat gertatzen denean, jatorri guneak HTTP eskaera bidaltzen du webhook-erako zehaztutako URLra. Ondorioz, gertaerak gune batean ekintzak abiarazi ditzakezu beste batean (wiki). Iturburu-gunea objektuen biltegiratze bat den kasuan, gertaerek bere edukien aldaketa gisa jokatzen dute.
Automatizazio hori erabil daitekeen kasu errazen adibideak:
Hodeiko beste biltegiratze batean objektu guztien kopiak sortzea. Fitxategiak gehitzen edo aldatzen diren bakoitzean kopiak berehala sortu behar dira.
Fitxategi grafikoen miniatura sorta automatikoki sortzea, argazkiei ur-markak gehitzea eta beste irudi aldaketa batzuk.
Dokumentu berriak iristeari buruzko jakinarazpena (adibidez, banatutako kontabilitate-zerbitzu batek txostenak kargatzen ditu hodeira, eta finantza-jarraipena txosten berriei buruzko jakinarazpenak jasotzen ditu, horiek egiaztatu eta aztertzen ditu).
Kasu apur bat konplexuagoak dira, adibidez, Kubernetes-i eskaera bat sortzea, eta horrek beharrezko edukiontziak dituen pod bat sortzen du, ataza-parametroak pasatzen dizkio eta prozesatu ondoren edukiontzia kolapsatzen du.
Adibide gisa, 1. atazaren aldaera bat egingo dugu, Mail.ru Cloud Solutions (MCS) objektuen biltegiratze-ontziaren aldaketak AWS objektuen biltegian webhook-en bidez sinkronizatzen direnean. Benetako kargatutako kasu batean, lan asinkronoa eman beharko litzateke webhook-ak ilara batean erregistratuz, baina prestakuntza-zereginerako hori gabe inplementazioa egingo dugu.
Laneko eskema
Interakzio-protokoloa xehetasunez deskribatzen da S3 webhook-en gida MCS-n. Lan eskemak elementu hauek ditu:
Argitalpen zerbitzua, S3 biltegiratze aldean dagoena eta HTTP eskaerak argitaratzen ditu webnhook abiarazten denean.
Webhook jasotzeko zerbitzaria, HTTP argitalpen zerbitzuaren eskaerak entzuten dituena eta ekintza egokiak egiten dituena. Zerbitzaria edozein hizkuntzatan idatz daiteke; gure adibidean, zerbitzaria Go-n idatziko dugu.
Webhook-ak S3 APIan ezartzearen ezaugarri berezi bat webhook jasotzeko zerbitzaria argitalpen-zerbitzuan erregistratzea da. Bereziki, webhook jasotzeko zerbitzariak argitalpen zerbitzuko mezuetarako harpidetza berretsi behar du (beste webhook inplementazio batzuetan, normalean ez da harpidetzaren berrespena behar).
Horren arabera, webhook jasotzeko zerbitzariak bi eragiketa nagusi onartu behar ditu:
Webhook jasotzeko zerbitzaria exekutatzeko, Linux zerbitzari bat behar duzu. Artikulu honetan, adibide gisa, MCSn zabaltzen dugun instantzia birtual bat erabiltzen dugu.
Instalatu dezagun beharrezko softwarea eta abi dezagun webhook jasotzeko zerbitzaria.
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) ...
ubuntu@ubuntu-basic-1-2-10gb:~$ cd s3-webhook/
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80
Harpidetu argitalpen zerbitzura
Zure webhook jasotzeko zerbitzaria erregistratu dezakezu API edo web interfazearen bidez. Erraztasunerako, web interfazearen bidez erregistratuko gara:
Joan webhook-ak konfiguratuko ditugun ontzira eta egin klik engranajean:
Joan Webhooks fitxara eta egin klik Gehitu:
Bete eremuak:
ID β webhook-aren izena.
Gertaera - zein gertakari transmititu. Fitxategiekin lan egitean gertatzen diren gertaera guztien transmisioa ezarri dugu (gehitzea eta ezabatzea).
URL β zerbitzariaren helbidea jasotzen duen webhook.
Iragazki-aurrizkia/atzizkia webhook-ak sortzeko aukera ematen duen iragazkia da, izenak arau batzuekin bat datozen objektuetarako soilik. Adibidez, webhook-ak .png luzapena duten fitxategiak soilik abiarazteko, in Iragazki atzizkia "png" idatzi behar duzu.
Gaur egun, 80 eta 443 atakak soilik onartzen dira webhook jasotzeko zerbitzarian sartzeko.
Egin dezagun klik Gehitu amua eta honako hauek ikusiko ditugu:
Hook gehitu zuen.
Webhook jasotzeko zerbitzariak bere erregistroetan erakusten du hook erregistratzeko prozesuaren aurrerapena:
Ping() - URL/ping bidez erantzuten duen ibilbidea, bizitasun-zunda baten ezarpen errazena.
Webhook() - bide nagusia, URL/webhook kudeatzailea:
argitalpen-zerbitzuan erregistratzea berresten du (joan Harpidetza Berrespen funtziora),
sarrerako webhook-ak prozesatzen ditu (Gorecords funtzioa).
HmacSha256 eta HmacSha256hex funtzioak HMAC-SHA256 eta HMAC-SHA256 enkriptazio-algoritmoen inplementazioak dira, sinadura kalkulatzeko zenbaki hamaseitarren kate gisa irteerarekin.
main funtzio nagusia da, komando-lerroko parametroak prozesatzen ditu eta URL kudeatzaileak erregistratzen ditu.
-address - zerbitzariak entzungo duen IP helbidea.
-script kanpoko programa bat da, sarrerako kako bakoitzerako deitzen dena.
Ikus ditzagun funtzio batzuk gertutik:
//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)
}
}
Funtzio honek erregistroa berresteko eskaera edo webhook bat iritsi den zehazten du. Honen arabera dokumentazioa, erregistroa baieztatzen bada, Json egitura hau jasotzen da Post eskaeran:
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Β»
}
Horren arabera, eskaeraren arabera, datuak nola prozesatu ulertu behar duzu. Adierazle gisa sarrera aukeratu dut "Type":"SubscriptionConfirmation", harpidetza berresteko eskaeran dagoenez eta webhook-ean ez dagoelako. POST eskaeran sarrera honen presentzia/absentziaren arabera, programaren exekuzio gehiago funtziora doa. SubscriptionConfirmation, edo funtzioan sartu GotRecords.
Ez dugu Harpidetza Baieztapen funtzioa zehatz-mehatz kontuan hartuko; atalean ezarritako printzipioen arabera ezartzen da dokumentazioa. Funtzio honen iturburu-kodea hemen ikus dezakezu proiektuko git biltegiak.
GotRecords funtzioak sarrerako eskaera bat analizatzen du eta Record objektu bakoitzeko kanpoko script bat deitzen du (haren izena -script parametroan pasatu zen) parametro hauekin:
ezabatu - jatorrizko eskaeran EventName = ObjectRemoved | EzabatuObject
Horrela, amu bat Post eskaera batekin iristen bada, azaldu bezala arriba,ru, eta -script=script.sh parametroa, script-a honela deituko da:
script.sh bucketA some-file-to-bucket copy
Ulertu behar da webhook jasotzeko zerbitzari hau ez dela produkzio soluzio osoa, inplementazio posible baten adibide sinplifikatua baizik.
Lanaren adibidea
Sinkroniza ditzagun fitxategiak MCS-ko ontzi nagusitik AWS-ko babeskopia-ontzira. Kubo nagusia myfiles-ash deitzen da, babeskopia myfiles-backup (AWS-en kuboaren konfigurazioa artikulu honen esparrutik kanpo dago). Horren arabera, fitxategi bat kubo nagusian jartzen denean, haren kopia babeskopian agertu behar da, eta nagusitik ezabatzen denean, babeskopian ezabatu behar da.
Kuboekin lan egingo dugu awscli utilitatea erabiliz, MCS hodeiko biltegiratzearekin eta AWS hodeiko biltegiarekin bateragarria dena.
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) ...
Konfigura dezagun S3 MCS APIrako sarbidea:
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]:
Konfigura dezagun AWS S3 APIrako sarbidea:
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]:
Ikus ditzagun sarbideak:
AWSra:
ubuntu@ubuntu-basic-1-2-10gb:~$ aws s3 ls --profile aws
2020-07-06 08:44:11 myfiles-backup
MCSrako, komandoa exekutatzean βendpoint-url gehitu behar duzu:
Ea nola funtzionatzen duen. bidez MCS web interfazea gehitu test.txt fitxategia myfiles-ash ontzira. Kontsolaren erregistroek webhook zerbitzariari eskaera egin diotela erakusten dute:
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
Orain, web interfazearen bidez, myfiles-ash ontzitik fitxategia ezabatuko dugu.
Zerbitzariaren erregistroak:
2020/07/06 09:44:46 [POST] incoming HTTP request from
95.163.216.92:58224
delete: s3://myfiles-backup/test.txt
Kuboaren edukia:
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls
myfiles-backup
ubuntu@ubuntu-basic-1-2-10gb:~$
Fitxategia ezabatu da, arazoa konpondu da.
Ondorioa eta ToDo
Artikulu honetan erabilitako kode guztia da nire biltegian. Webhook-ak erregistratzeko scripten adibideak eta sinadurak zenbatzeko adibideak ere badaude.
Kode hau zure jardueretan S3 webhook-ak nola erabil ditzakezun erakusteko adibide bat baino ez da. Hasieran esan dudan bezala, produkzioan zerbitzari bat erabiltzeko asmoa baduzu, gutxienez zerbitzaria berridatzi behar duzu lan asinkronorako: erregistratu sarrerako webhook-ak ilara batean (RabbitMQ edo NATS), eta hortik analizatu eta prozesatu. langileen aplikazioekin. Bestela, webhook-ak masiboki iristen direnean, baliteke zereginak burutzeko zerbitzariaren baliabide falta aurkitzea. Ilarak egoteak zerbitzaria eta langileak banatzeko aukera ematen du, baita hutsegiteen kasuan zereginak errepikatzeko arazoak konpontzeko ere. Era berean, komenigarria da erregistroa zehatzago eta estandarizatuago batera aldatzea.