Conto kasus prasaja nalika otomatisasi kasebut bisa digunakake:
Nggawe salinan kabeh obyek ing panyimpenan maya liyane. Salinan kudu digawe kanthi cepet nalika file ditambahake utawa diganti.
Nggawe otomatis seri gambar cilik file grafis, nambahake watermark ing foto, lan modifikasi gambar liyane.
Kabar babagan tekane dokumen anyar (contone, layanan akuntansi sing disebarake ngunggah laporan menyang awan, lan ngawasi finansial nampa kabar babagan laporan anyar, mriksa lan nganalisa).
Kasus sing rada rumit kalebu, contone, nggawe panjalukan menyang Kubernetes, sing nggawe pod karo kontaner sing dibutuhake, nglewati paramèter tugas kasebut, lan sawise diproses, wadhah kasebut ambruk.
Minangka conto, kita bakal nggawe varian saka tugas 1, nalika owah-owahan ing Mail.ru Cloud Solutions (MCS) ember panyimpenan obyek disinkronake ing panyimpenan obyek AWS nggunakake webhooks. Ing kasus sing dimuat nyata, karya asinkron kudu disedhiyakake kanthi ndhaptar webhooks ing antrian, nanging kanggo tugas latihan kita bakal nindakake implementasine tanpa iki.
Layanan penerbitan, sing ana ing sisih panyimpenan S3 lan nerbitake panjalukan HTTP nalika webnhook dipicu.
Webhook nampa server, sing ngrungokake panjalukan saka layanan penerbitan HTTP lan nindakake tumindak sing cocog. Server bisa ditulis ing basa apa wae; ing conto kita, kita bakal nulis server ing Go.
Fitur khusus saka implementasi webhooks ing S3 API yaiku registrasi server panampa webhook ing layanan penerbitan. Utamane, server panampa webhook kudu konfirmasi langganan pesen saka layanan penerbitan (ing implementasi webhook liyane, konfirmasi langganan biasane ora dibutuhake).
Mulane, server panampa webhook kudu ndhukung rong operasi utama:
nanggapi panjalukan layanan penerbitan kanggo konfirmasi registrasi,
proses acara mlebu.
Nginstal server panampa webhook
Kanggo mbukak server panampa webhook, sampeyan butuh server Linux. Ing artikel iki, minangka conto, kita nggunakake conto virtual sing disebarake ing MCS.
Ayo nginstal piranti lunak sing dibutuhake lan bukak server panampa 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) ...
Pindhah menyang ember sing bakal kita atur webhooks lan klik ing gear:
Pindhah menyang tab Webhooks banjur klik Tambah:
Isi ing kolom:
ID - jeneng webhook.
Acara - acara sing bakal dikirim. Kita wis nyetel transmisi kabeh acara sing kedadeyan nalika nggarap file (nambah lan mbusak).
URL β webhook nampa alamat server.
Ater-ater/akhiran filter yaiku saringan sing ngidini sampeyan nggawe webhooks mung kanggo obyek sing jenenge cocog karo aturan tartamtu. Contone, supaya webhook mung bisa micu file kanthi ekstensi .png, ing Saringan sufiks sampeyan kudu nulis "png".
Saiki, mung port 80 lan 443 sing didhukung kanggo ngakses server panampa webhook.
Ayo klik Tambah pancing lan kita bakal weruh ing ngisor iki:
Hook ditambahake.
Server panampa webhook nuduhake ing log kemajuan proses registrasi pancing:
Ping () - rute sing nanggapi liwat URL / ping, implementasine paling gampang saka probe liveness.
Webhook() - rute utama, URL/webhook handler:
konfirmasi registrasi ing layanan penerbitan (pindhah menyang fungsi Konfirmasi Langganan),
pangolahan webhooks mlebu (fungsi Gorecords).
Fungsi HmacSha256 lan HmacSha256hex minangka implementasi saka algoritma enkripsi HMAC-SHA256 lan HMAC-SHA256 kanthi output minangka senar saka nomer heksadesimal kanggo ngitung teken.
utama minangka fungsi utama, ngolah paramèter baris perintah lan ndhaptar panangan URL.
Parameter baris perintah sing ditampa dening server:
-port punika port kang server bakal ngrungokake.
-alamat - alamat IP sing server bakal ngrungokake.
-script iku sawijining program external sing disebut kanggo saben pancing mlebu.
Ayo dipikirake sawetara fungsi:
//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)
}
}
Fungsi iki nemtokake manawa panjalukan kanggo konfirmasi registrasi utawa webhook wis teka. Kaya ing ngisor iki saka dokumentasi, yen registrasi dikonfirmasi, struktur Json ing ngisor iki ditampa ing panjalukan 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Β»
}
Mulane, gumantung saka panyuwunan, sampeyan kudu ngerti carane ngolah data. Aku milih entri minangka indikator "Type":"SubscriptionConfirmation", amarga ana ing panjalukan konfirmasi langganan lan ora ana ing webhook. Adhedhasar anane / ora ana entri iki ing panyuwunan POST, eksekusi program luwih lanjut menyang fungsi kasebut. SubscriptionConfirmation, utawa menyang fungsi GotRecords.
Kita ora bakal nimbang fungsi Konfirmasi Langganan kanthi rinci; iki dileksanakake miturut prinsip sing ditetepake ing dokumentasi. Sampeyan bisa ndeleng kode sumber kanggo fungsi iki ing repositori project git.
Fungsi GotRecords ngurai panjalukan sing mlebu lan kanggo saben obyek Rekam nelpon skrip eksternal (sing jenenge diwarisake ing parameter -script) kanthi paramèter:
jeneng ember
tombol obyek
tumindak:
salinan - yen ing request asli EventName = ObjectCreated | PutObject | PutObjectCopy
mbusak - yen ing request asli EventName = ObjectRemoved | DeleteObject
Mangkono, yen pancing teka karo panjalukan Post, minangka diterangake luwih, lan parameter -script=script.sh banjur skrip bakal diarani kaya ing ngisor iki:
script.sh bucketA some-file-to-bucket copy
Sampeyan kudu dimangerteni manawa server panampa webhook iki ora minangka solusi produksi sing lengkap, nanging minangka conto sing gampang kanggo implementasine.
Tuladha karya
Ayo nyinkronake file saka ember utama ing MCS menyang ember serep ing AWS. Ember utama diarani myfiles-ash, sing serep diarani myfiles-backup (konfigurasi ember ing AWS ngluwihi ruang lingkup artikel iki). Mulane, nalika file diselehake ing ember utama, salinan kasebut kudu katon ing serep, lan nalika dibusak saka sing utama, kudu dibusak ing serep.
Kita bakal nggarap ember nggunakake sarana awscli, sing kompatibel karo panyimpenan maya MCS lan panyimpenan maya 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) ...
Ayo konfigurasi akses menyang 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]:
Ayo konfigurasi akses menyang API AWS S3:
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]:
Ayo priksa akses:
Kanggo AWS:
ubuntu@ubuntu-basic-1-2-10gb:~$ aws s3 ls --profile aws
2020-07-06 08:44:11 myfiles-backup
Kanggo MCS, nalika mbukak printah sampeyan kudu nambah -endpoint-url:
Ayo ndeleng carane iki bisa. Liwat antarmuka web MCS nambah file test.txt menyang ember myfiles-awu. Log konsol nuduhake manawa panyuwunan digawe menyang server 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
Saiki, liwat antarmuka web, kita bakal mbusak file saka ember myfiles-ash.
Log server:
2020/07/06 09:44:46 [POST] incoming HTTP request from
95.163.216.92:58224
delete: s3://myfiles-backup/test.txt
Isi ember:
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls
myfiles-backup
ubuntu@ubuntu-basic-1-2-10gb:~$
File wis dibusak, masalah wis ditanggulangi.
Kesimpulan lan ToDo
Kabeh kode sing digunakake ing artikel iki yaiku ing repositoriku. Ana uga conto skrip lan conto ngetang tandha tangan kanggo ndhaptar webhooks.
Kode iki ora luwih saka conto carane sampeyan bisa nggunakake webhooks S3 ing aktivitas. Kaya sing dakkandhakake ing wiwitan, yen sampeyan pengin nggunakake server kasebut ing produksi, sampeyan kudu paling ora nulis ulang server kanggo karya bedo: ndhaftar webhooks mlebu ing antrian (RabbitMQ utawa NATS), lan saka ing kono parse lan proses. karo aplikasi buruh. Yen ora, nalika webhooks teka kanthi akeh, sampeyan bisa nemoni kekurangan sumber daya server kanggo ngrampungake tugas. Ngarsane antrian ngidini sampeyan nyebarake server lan buruh, uga ngrampungake masalah kanthi mbaleni tugas yen gagal. Sampeyan uga dianjurake kanggo ngganti log menyang sing luwih rinci lan luwih standar.