Event-movita arkitekturo pliigas la kostefikecon de la uzitaj resursoj ĉar ili estas uzitaj nur en la momento kiam ili estas bezonataj. Estas multaj ebloj pri kiel efektivigi ĉi tion kaj ne krei pliajn nubajn entojn kiel laboristajn aplikojn. Kaj hodiaŭ mi parolos ne pri FaaS, sed pri rethokoj. Mi montros lernilon ekzemplon pri traktado de eventoj uzante objektajn stokadretajn rethokojn.
Kelkajn vortojn pri objektostokado kaj rethokoj. Objektostokado permesas vin stoki ajnajn datumojn en la nubo en la formo de objektoj, alireblaj per S3 aŭ alia API (depende de efektivigo) per HTTP/HTTPS. Webhooks estas ĝenerale kutimaj HTTP-revokoj. Ili estas tipe ekigitaj de evento, kiel kodo puŝita al deponejo aŭ komento afiŝita en blogo. Kiam okazaĵo okazas, la originejo sendas HTTP-peton al la URL specifita por la rethoko. Kiel rezulto, vi povas fari eventojn sur unu retejo ekigi agojn sur alia (vikio). En la kazo kie la fonto retejo estas objektostokado, eventoj funkcias kiel ŝanĝoj al ĝia enhavo.
Ekzemploj de simplaj kazoj kiam tia aŭtomatigo povas esti uzita:
Krei kopiojn de ĉiuj objektoj en alia nuba stokado. Kopioj devas esti kreitaj sur la flugo kiam dosieroj estas aldonitaj aŭ ŝanĝitaj.
Aŭtomata kreado de serio de bildetoj de grafikaj dosieroj, aldonado de akvomarkoj al fotoj kaj aliaj bildaj modifoj.
Sciigo pri la alveno de novaj dokumentoj (ekzemple, distribuita kontada servo alŝutas raportojn al la nubo, kaj financa monitorado ricevas sciigojn pri novaj raportoj, kontrolas kaj analizas ilin).
Iom pli kompleksaj kazoj implikas, ekzemple, generi peton al Kubernetes, kiu kreas pod kun la necesaj ujoj, pasas taskoparametrojn al ĝi, kaj post prilaborado kolapsas la ujon.
Ekzemple, ni faros varianton de tasko 1, kiam ŝanĝoj en la objekto-stokado de Mail.ru Cloud Solutions (MCS) estas sinkronigitaj en AWS-objekta stokado per rethokoj. En vera ŝarĝita kazo, nesinkrona laboro devus esti provizita registrante rethokojn en atendovico, sed por la trejna tasko ni faros la efektivigon sen ĉi tio.
Skemo de laboro
La interaga protokolo estas detale priskribita en Gvidilo al S3-rethokoj sur MCS. La laborskemo enhavas la jenajn elementojn:
Eldonservo, kiu estas ĉe la S3-stokado kaj publikigas HTTP-petojn kiam la webnhook estas ekigita.
Webhook ricevanta servilo, kiu aŭskultas petojn de la HTTP-eldonservo kaj faras taŭgajn agojn. La servilo povas esti skribita en iu ajn lingvo; en nia ekzemplo, ni skribos la servilon en Go.
Speciala trajto de la efektivigo de rethokoj en la S3 API estas la registrado de la rethook ricevanta servilo sur la eldonservo. Aparte, la rethook ricevanta servilo devas konfirmi la abonon al mesaĝoj de la eldonservo (en aliaj rethook-efektivigoj, konfirmo de abono kutime ne estas postulata).
Sekve, la rethook ricevanta servilo devas subteni du ĉefajn operaciojn:
respondi al la peto de la eldonservo por konfirmi registradon,
prilabori venontajn eventojn.
Instalante rethook ricevan servilon
Por ruli la rethook ricevan servilon, vi bezonas Linuksan servilon. En ĉi tiu artikolo, kiel ekzemplo, ni uzas virtualan petskribon, kiun ni deplojas sur MCS.
Ni instalu la necesan programaron kaj lanĉu la rethook-ricevan servilon.
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) ...
Klonu la dosierujon kun la rethook ricevanta servilo:
Iru al la sitelo por kiu ni agordos rethokojn kaj alklaku la ilaron:
Iru al la langeto Webhooks kaj alklaku Aldoni:
Plenigu la kampojn:
ID - la nomo de la rethoko.
Evento - kiujn eventojn transdoni. Ni starigis la transdonon de ĉiuj eventoj, kiuj okazas kiam oni laboras kun dosieroj (aldono kaj forigo).
URL — rethook ricevanta serviladreson.
Filtrila prefikso/sufikso estas filtrilo, kiu ebligas al vi generi rethokojn nur por objektoj, kies nomoj kongruas kun iuj reguloj. Ekzemple, por ke la rethoko ekfunkciigu nur dosierojn kun la etendo .png, en Filtrila sufikso vi devas skribi "png".
Nuntempe, nur havenoj 80 kaj 443 estas subtenataj por aliri la rethook ricevan servilon.
Ni klaku Aldonu hokon kaj ni vidos la jenon:
Hoko aldonis.
La rethoko ricevanta servilo montras en siaj protokoloj la progreson de la hoka registra procezo:
Funkcioj HmacSha256 kaj HmacSha256hex estas efektivigoj de la ĉifrado-algoritmoj HMAC-SHA256 kaj HMAC-SHA256 kun produktaĵo kiel ĉeno de deksesuma nombroj por kalkulado de la subskribo.
ĉefa estas la ĉefa funkcio, prilaboras komandliniajn parametrojn kaj registras URL-traktilojn.
Komandliniaj parametroj akceptitaj de la servilo:
-port estas la haveno sur kiu la servilo aŭskultos.
-address - IP-adreso kiun la servilo aŭskultos.
-script estas ekstera programo kiu estas vokita por ĉiu envenanta hoko.
Ni rigardu pli detale kelkajn el la funkcioj:
//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)
}
}
Ĉi tiu funkcio determinas ĉu peto por konfirmi registradon aŭ rethoko alvenis. Kiel sekvas el dokumentado, se registriĝo estas konfirmita, la sekva Json-strukturo ricevas en la Post-peto:
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»
}
Sekve, depende de la peto, vi devas kompreni kiel prilabori la datumojn. Mi elektis la eniron kiel indikilon "Type":"SubscriptionConfirmation", ĉar ĝi ĉeestas en la abonkonfirma peto kaj ne ĉeestas en la rethoko. Surbaze de la ĉeesto/foresto de ĉi tiu eniro en la POST-peto, plua ekzekuto de la programo iras aŭ al la funkcio SubscriptionConfirmation, aŭ en la funkcion GotRecords.
Ni ne konsideros la funkcion de Abonkonfirmo detale; ĝi estas efektivigita laŭ la principoj fiksitaj en dokumentado. Vi povas vidi la fontkodon por ĉi tiu funkcio ĉe projektaj git-deponejoj.
La funkcio GotRecords analizas envenantan peton kaj por ĉiu Record-objekto vokas eksteran skripton (kies nomo estis pasigita en la parametro -script) kun la parametroj:
sitelo nomo
objekta ŝlosilo
ago:
kopii - se en la originala peto EventName = ObjektoKreita | MetuObjekton | MetuObjektonKopion
forigi - se en la originala peto EventName = ObjektoForigita | ForigiObjekton
Tiel, se hoko alvenas kun Post-peto, kiel priskribite altaj, kaj la parametro -script=script.sh tiam la skripto estos nomita jene:
script.sh bucketA some-file-to-bucket copy
Oni devas kompreni, ke ĉi tiu rethook ricevanta servilo ne estas kompleta produktadsolvo, sed simpligita ekzemplo de ebla efektivigo.
Ekzemplo de laboro
Ni sinkronigu la dosierojn de la ĉefa sitelo en MCS al la rezerva sitelo en AWS. La ĉefa sitelo nomiĝas myfiles-ash, la rezerva estas nomita myfiles-backup (agordo de sitelo en AWS estas preter la amplekso de ĉi tiu artikolo). Sekve, kiam dosiero estas metita en la ĉefa sitelo, ĝia kopio devus aperi en la rezerva, kaj kiam ĝi estas forigita de la ĉefa, ĝi devus esti forigita en la rezerva.
Ni laboros kun siteloj uzante la awscli ilon, kiu estas kongrua kun kaj MCS-nuba stokado kaj AWS-nuba stokado.
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) ...
Ni agordu aliron al la 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]:
Ni agordu aliron al la 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]:
Ni kontrolu la alirojn:
Al AWS:
ubuntu@ubuntu-basic-1-2-10gb:~$ aws s3 ls --profile aws
2020-07-06 08:44:11 myfiles-backup
Por MCS, dum vi ruliĝas la komandon, vi devas aldoni —endpoint-url:
Ni vidu kiel ĝi funkcias. Tra MCS-retinterfaco aldonu la test.txt dosieron al la myfiles-ash sitelo. La konzolaj protokoloj montras, ke peto estis farita al la rethook-servilo:
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
Ni kontrolu la enhavon de la myfiles-backup sitelo en AWS:
Nun, per la retinterfaco, ni forigos la dosieron el la myfiles-ash sitelo.
Servilaj protokoloj:
2020/07/06 09:44:46 [POST] incoming HTTP request from
95.163.216.92:58224
delete: s3://myfiles-backup/test.txt
Enhavo de sitelo:
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls
myfiles-backup
ubuntu@ubuntu-basic-1-2-10gb:~$
La dosiero estas forigita, la problemo estas solvita.
Konkludo kaj ToDo
Ĉiu kodo uzata en ĉi tiu artikolo estas en mia deponejo. Estas ankaŭ ekzemploj de skriptoj kaj ekzemploj de kalkulado de subskriboj por registri rethokojn.
Ĉi tiu kodo estas nenio pli ol ekzemplo de kiel vi povas uzi S3-retajn hokojn en viaj agadoj. Kiel mi diris komence, se vi planas uzi tian servilon en produktado, vi devas almenaŭ reverki la servilon por nesinkrona laboro: registri envenantajn rethokojn en atendovico (RabbitMQ aŭ NATS), kaj de tie analizi ilin kaj prilabori ilin. kun laboristaj aplikoj. Alie, kiam rethokoj amase alvenas, vi eble renkontos mankon de servilaj rimedoj por plenumi taskojn. La ĉeesto de vostoj permesas vin distribui la servilon kaj laboristojn, kaj ankaŭ solvi problemojn kun ripetado de taskoj en kazo de misfunkciadoj. Estas ankaŭ konsilinde ŝanĝi la registradon al pli detala kaj pli normigita.